我需要编写一个快速的makefile来构建我的所有项目.这是C++代码,我正在使用gmake.
假设我有一个目录列表,我想cd到每个目录,发出gmake命令,如果成功,请转到下一个,依此类推.
我通过查看gmake手册来烹饪
.PHONY: all clean dirs $(DIRS)
dirs: $(DIRS)
$(DIRS): \n\t
$(MAKE) -C $@
Run Code Online (Sandbox Code Playgroud)
它适用于"所有"目标 - 如果我只输入gmake,它就是正确的.但如果我做gmake清洁它什么都不做.
我正在学习gmake,所以我肯定在做傻事:)
谢谢你的帮助.
我有一个makefile,取决于一些属性设置vpath并生成一个源文件列表到一个变量.我需要在不编译任何内容的情况下运行makefile(编译实际上是由不同的makefile处理),并且根据vpath设置查看文件名匹配的真实文件.
我有一个包含两个函数的c ++程序文件.如果我单独更改第一个函数,为什么它们都必须重新编译?是否有任何构建系统单独重新编译第一个并将其放回同一个目标文件中?这可能吗?一个功能的说明不应该依赖于其他权利?由于gmake重新编译整个文件,需要花费很多时间,这是不可避免的?将第二个函数放在一个单独的文件中并不是一个好主意,因为它涉及创建不需要的不需要的文件.
我想在其中一个头文件中定义一个宏.我可以通过makefile设置它吗?
例如,我想设置一个宏"PAGING_ON",我想成为源文件的预处理器宏.(项目在C中.)是否可以通过Makefile设置它?
我需要一些帮助调试Makefile系统.我有一个相当庞大的Makefile依赖树,实际上是Android源码makefile系统.
在某些时候,构建失败,因为文件丢失:
/bin/bash: out/host/linux-x86/bin/mkfs.ubifs: No such file or directory
Run Code Online (Sandbox Code Playgroud)
该文件mkfs.ubifs应该在make过程中"构建",如果我这样做,它确实有效:
make out/host/linux-x86/bin/mkfs.ubifs
Run Code Online (Sandbox Code Playgroud)
该mkfs.ubifs是构建和一切工作,直到我再次清洁的一切,从头开始构建.
这告诉我,某处缺少依赖.所以我的问题是,我该如何调试呢?如何准确发现缺少依赖项的目标?我可以为make提供哪些选项,这将为我提供有关错误位置的线索?
任何其他建议也将不胜感激.谢谢.:)
更新
使用make -d提供了相当多的输出.我究竟如何确定从哪个make目标(源文件和行)和错误发生?
我正试图define在GNU make中使用.在这个测试上运行make Makefile回应"虚拟":
define FOO =
$$(error foo $(1))
endef
$(eval $(call FOO,bar))
all:
@echo dummy
Run Code Online (Sandbox Code Playgroud)
如果我删除了=,那么它会foo bar按照我的意图出错.
GNU make手册包含所有定义示例,使用带有等号的表单.为什么这对我来说似乎被忽略了?
这是我的makefile的一部分:
PATH := $(shell pwd)
EDIR := impl
EFFECTS := $(filter-out $(EDIR), $(shell find $(EDIR) -maxdepth 1 -type d))
ALLMAKES := $(patsubst %, $(PATH)/%, $(EFFECTS))
all:
$(foreach c,$(ALLMAKES),$(MAKE) -C $(c))
Run Code Online (Sandbox Code Playgroud)
基本上,我想为"impl"目录中的所有目录调用make而不使用"impl"本身.我知道make会记住上次使用-C参数调用时的最后一个目录,这就是我每次都给出绝对路径的原因.是什么让回声看起来像我想要的:
make -C <projectdir>/impl/thing1 make -C <projectdir>/impl/thing2 make -C <projectdir>/impl/thing3
Run Code Online (Sandbox Code Playgroud)
问题是make不能完成命令并只是打印:
make: make: Command not found.
Run Code Online (Sandbox Code Playgroud)
我可以在makefile之外单独调用每个目录的"make -C <path>",但它在foreach调用中不起作用.我试过这个,但它也不起作用:
$(foreach c,$(ALLMAKES),$(shell make -C $(c)))
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我想使用ifeq检查makefile中的条件,并且不确定如何去做:
ifeq ( cond1 = yes || cond2 = yes )
set value x = 1;
else
set value x = 2;
endif
Run Code Online (Sandbox Code Playgroud)
请提出正确的做法吗?
注意:这个问题最初是由一个现已删除的用户发布的,但是这个咆哮背后有一个有效的问题; 这是我试图提供答案.
鉴于Makefile:
ifeq "$(MAKELEVEL)" "0"
# Override the command-line specification of "foo".
override foo=replaced
export foo
all::
@echo outer: foo is "$(foo)"
@$(MAKE)
else
# Variable 'foo' was "exported" from the top-level Makefile.
all::
@echo inner: foo is "$(foo)"
endif
Run Code Online (Sandbox Code Playgroud)
期望是export foo会导致make导出override声明中定义的值.但它没有:
$ make -s foo=original
outer: foo is replaced
inner: foo is original
Run Code Online (Sandbox Code Playgroud) 在GNU中Makefile,有两种类型的变量:
# simple variable (immediate evaluation):
VAR := some_assignment
# recursively expanded variable (deferred evaluation):
VAR = some_assignment
Run Code Online (Sandbox Code Playgroud)
可以使用以下方法将其追加到递归扩展的变量中:
IMMEDIATE += DEFERRED or IMMEDIATE
Run Code Online (Sandbox Code Playgroud)
对于追加运算符'+ =',如果先前已将该变量设置为简单变量(':='或':: ='),则认为右侧是立即数,否则推迟。
有没有什么办法来预先考虑到递归扩展变量?
我的激励示例是在以下方面引入一个新的库$(LDLIBS):
# Unfortunately, newlib gets added to the end rather than the beginning.
LDLIBS += $(if $(later_condition),newlib.a)
# Unfortunately, the expression is evaluated now rather than being deferred.
LDLIBS := $(if $(later_condition),newlib.a) $(LDLIBS)
Run Code Online (Sandbox Code Playgroud)