我如何使用$(MAKEFLAGS)(或以其他方式将在命令行上定义的变量传递给sub-make)以支持从shell调用的方式使用make VAR=val和make -args?
我需要我的子项目可配置,但我讨厌autotools,所以我正在使用make变量,例如从shell调用:
$ make USE_SSE3=1
Run Code Online (Sandbox Code Playgroud)
并且USE_SSE3需要应用于所有子makefile中的所有构建.
手册指出:
如果你做'make -ks'那么MAKEFLAGS获得值'ks'.
因此我-$(MAKEFLAGS)在Makefile中使用(带有破折号前缀).
但是,当使用没有标志的变量时,它会扩展为无效参数.如果我跑:
$ make FOO=bar
Run Code Online (Sandbox Code Playgroud)
然后sub-make变得无效-FOO=bar.没有破折号前缀变量定义的OTOH工作,然后make -s等等.
是否有语法/变量/ hack使得传递参数和单独的变量定义与子makefile一起使用?
遗产$(MKFLAGS)没有奇怪的短划线前缀问题,但它也不包括变量定义.我已经尝试修复变量$(patsubst),但这只会通过修剪空白使事情变得更糟.
我需要的解决方案与Mac OS X Mavericks附带的过时的GNU Make 3.81兼容.
foo:
$(MAKE) -C subproject -$(MAKEFLAGS)
Run Code Online (Sandbox Code Playgroud)
$ make foo -s # MAKEFLAGS = 's'
$ make foo BAR=baz # MAKEFLAGS = 'BAR=baz'
$ make foo -j8 # MAKEFLAGS = …Run Code Online (Sandbox Code Playgroud) 我的makefile文件中包含以下内容。其为GNUmakefile,因此支持其他制造功能:
# Undefined Behavior Sanitzier (Clang and G++)
ifeq ($(findstring ubsan,$(MAKECMDGOALS)),ubsan)
CXXFLAGS += -fsanitize=undefined
MAKECMDGOALS := $(subst ubsan,,$(MAKECMDGOALS))
endif # UBsan
Run Code Online (Sandbox Code Playgroud)
运行它会导致:
make ubsan
make: *** No rule to make target 'ubsan'. Stop.
Run Code Online (Sandbox Code Playgroud)
我知道代码路径正在执行中(通过在块中引入错误)。如何从命令目标中删除目标?
我想在 make 退出时执行一个 shell 命令,不管它构建的是什么目标。似乎 make 没有办法直接做到这一点。但是,这里有一个在启动时执行 shell 命令的示例,无论目标如何:
是否有任何类似的 hack 在退出前执行一次 shell 命令?我可以将命令放在每个目标的底部,但是 a) 它会被执行多次,并且 b) 这很丑陋且难以管理。
我尝试以下 makefile:
MAKEFLAGS += s
MAKEFLAGS += r
configure:
Run Code Online (Sandbox Code Playgroud)
然后,当我运行 make 时,出现以下错误,就好像它想根据某些默认隐式规则编译“配置”一样:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation …Run Code Online (Sandbox Code Playgroud) 如何检测是否使用rake指定了--quiet选项.
意图是根据类别过滤自定义消息.
class Category
INFO = 1
WARNING = 2
ERROR = 3
end
@trace = true
task :silent do
@trace = false
end
def trace(msg, category=Category::INFO)
return if (@trace == nil)
return if ((@trace == false) && (category == Category::INFO))
puts msg
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果指定了--quiet选项,我想添加一个案例来过滤掉trace.