2017-03-07 43 views
0

我有一个源文件benchmark.c,我想用每个编译器优化级别来构建它。 有没有办法自动实现这一点,而不是像这样手动提供每一个标志?如何使用gcc编译为每个优化级别的二进制文件?

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

您可以通过单词的列表迭代,每个包含设置优化选项的数字,每一次调用罐装配方,它能直接调用相应的命令:

LIST := 0 1 2 3 

define RUN 

gcc benchmark.c -o benchmark-O$1 -O$1 

endef 

all: 
    $(foreach variable,$(LIST),$(call RUN,$(variable))) 
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),,[email protected]) $< -o [email protected] 

有神奇的两个或三个位有:

  • 的定义files使变量使用GNU的foreach使函数从基本名称和优化级别列表构建目标文件的列表。

  • (以下你)目标文件的名称编码的优化选项,所以

  • 构建配方可以和不使用GNU的subst进行函数来提取的每个目标名称的优化选项。

您将不得不判断这个有点神秘的8行(包括两个空白)的makefile对于您的目的而言是否比您开始使用时更好。至于我,我会把你简单明了的初始版本。