我有一个源文件benchmark.c
,我想用每个编译器优化级别构建它。
有没有办法自动实现这一点,而不是像这样手动提供每一个标志?
all:
gcc benchmark.c -o benchmark-O0 -O0
gcc benchmark.c -o benchmark-O1 -O1
gcc benchmark.c -o benchmark-O2 -O2
gcc benchmark.c -o benchmark-O3 -O3
我想要一个更通用的方法。 提前谢谢。
答案 0 :(得分:1)
您是否考虑过for循环?
all:
for level in O0 O1 O2 O3; do \
gcc benchmark.c -$level benchmark-$level \
done
答案 1 :(得分:1)
您可以遍历一个单词列表,每个单词都包含设置优化选项的数字,每次调用一个调用相应命令的固定配方:
LIST := 0 1 2 3
define RUN
gcc benchmark.c -o benchmark-O$1 -O$1
endef
all:
$(foreach variable,$(LIST),$(call RUN,$(variable)))
答案 2 :(得分:1)
由于您正在使用GNU make,因此您可以使用GNU功能,例如函数。这是你可以做的工作的一种方式,在我看来是一个合理的类似成语:
baseexe := benchmark
levels := 0 1 2 3 s
files := $(foreach level,$(levels),$(baseexe)-O$(level))
all: $(files)
$(files): $(baseexe).c
gcc $(subst $(baseexe),,$@) $< -o $@
那里有两三个魔法:
files
make变量的定义使用GNU的foreach
make函数从基本名称和优化级别列表构建目标文件列表。
(关注您)目标文件的名称对优化选项进行编码,因此
构建配方可以并且确实使用GNU的subst
make函数从每个目标名称中提取优化选项。
你必须判断这个有点神秘的8行(包括两个空白)makefile是否比你开始时更适合你的目的。至于我,我会采用简单易用的起始版本。