mar*_*ril 8 bash makefile build
几天前,我在堆栈溢出中发布了一个关于如何编写分层make(http://stackoverflow.com/questions/1498213/make-hierarchical-make-file)的答案.答案被删除了,因此我认为这是完全错误的或偏离主题(或两者兼而有之).
我想知道如何编写分层Makefile.这是一个Makefile,可以在子目录中调用多个Makefile.我假设一个目录结构,如:
- project
|--module1
|--Makefile
|--...
|--module2
|--Makefile
|--module2.1
|--module2.2
|--...
|--module3
|--Makefile
|--...
|--etc
Run Code Online (Sandbox Code Playgroud)
我还假设项目成员只同意了一组最小的makefile目标,例如:all(默认),clean,install等等.因此,包括make标志在内的以下命令将传播到模块:
cd project
make clean
make -k
make install
#etc
Run Code Online (Sandbox Code Playgroud)
以下项目Makefile有什么问题:
PACKAGES = \
module1 \
module2 \
emodule3
VIRTUAL_PACKAGES = $(addsuffix /.virtual.Makefile,${PACKAGES})
TARGETS=clean install all
.PHONY: $(TARGETS)
default: all
FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS))
$(TARGETS): $(VIRTUAL_PACKAGES)
$(VIRTUAL_PACKAGES):
$(MAKE) $(FLAGS) -C $(@D) $(MAKECMDGOALS)
Run Code Online (Sandbox Code Playgroud)
是的,Makefile中的$ VIRTUAL_PACKAGES看起来很奇怪.混合for循环的替代方案有点短但我不确定它是否更好(因为我需要依赖bash):PACKAGES =\module1\module2\emodule3
TARGETS=clean install all
.PHONY: $(TARGETS)
default: all
FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS))
$(TARGETS):
for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p $@ || break; done
Run Code Online (Sandbox Code Playgroud)
谢谢!
这里有"龙".它可以做到,但其含义可能很棘手.
Google,"Recursive make Considered Harmful".您将获得非常好(简单)的插图,确切地说明您想要的内容(例如,层次结构 - 制作),以及对陷阱/问题的良好解释.一些"回应"将讨论可能的"最佳实践"以及缓解问题的方法.然后,您可以决定所提出的问题是否对您的申请有吸引力.
原始论文:
http://miller.emu.id.au/pmiller/books/rmch/
其他一些链接:
http://c2.com/cgi/wiki?RecursiveMakeConsideredHarmful
http://dbaspot.com/configuration-management/194597-thoughts-recursive-make-considered-harmful.html
| 归档时间: |
|
| 查看次数: |
3303 次 |
| 最近记录: |