我一直在使用参数化目标的生成文件。在我的OpenSUSE PC上,它运行成功时给出make all
,但(奇怪)运行clean
而不是make all
如果您只提供make
没有额外的参数。更糟糕的是,在我的Ubuntu PC上,make all
完全不起作用,并且从浏览make -pn all | less
时,all
甚至没有被生成为目标。生成文件无法正确生成“所有”目标
很明显,我在生成all
目标时做错了什么。这里是生成文件:
# To see predefined preprocessor macros:
# gcc -dM -E - < /dev/null | sort | less
# After a default installation of opencc, you might need to run:
# sudo ln -s /opt/x86_open64-4.2.5/lib/gcc-lib /usr/lib/gcc-lib
allflags = -Wall -pipe
cflags = -std=c99
cxxflags =
flags_O0 = -O0 -ggdb
flags_O1 = -O1
flags_O2 = -O2
flags_O3 = -O3 -fomit-frame-pointer
flags_opt_gcc = -march=native -s
flags_opt_icc = -march=native -s
flags_opt_opencc = -march=auto -s
flags_opt_clang = -march=native
ldflags_O0 = $(cflags_O0)
ldflags_O1 = $(cflags_O1) -Wl,-s -Wl,-O,1
ldflags_O2 = $(cflags_O2) -Wl,-s -Wl,-O,2
ldflags_O3 = $(cflags_O3) -Wl,-s -Wl,-O,3
define dcompiler =
version-$(1):
$(1) --version 2>&1 | sed 's/.*/"&\\n"/' > [email protected]
flags_$(1)_O0 = $$(allflags) $$(flags_O0) $$(flags_$(1))
flags_$(1)_O1 = $$(allflags) $$(flags_O1) $$(flags_$(1)) $$(flags_opt_$(1))
flags_$(1)_O2 = $$(allflags) $$(flags_O2) $$(flags_$(1)) $$(flags_opt_$(1))
flags_$(1)_O3 = $$(allflags) $$(flags_O3) $$(flags_$(1)) $$(flags_opt_$(1))
$$(eval $$(call diter,$(1),O0))
$$(eval $$(call diter,$(1),O1))
$$(eval $$(call diter,$(1),O2))
$$(eval $$(call diter,$(1),O3))
endef
define dimpaler =
cc_impaler_$(2) = gcc $$(flags_gcc_$(2)) $$(cflags)
all: impaler$(1)
impaler$(1): impaler$(1).o util$(1).o
$$(cc_impaler_$(2)) -o [email protected] $$^ $$(ldflags_$(2)) -ldl -lm -lpopt
impaler$(1).o: impaler.c impaler.h util.h makefile
$$(cc_impaler_$(2)) -o [email protected] $$< -c
util$(1).o: util.c util.h makefile
$$(cc_impaler_$(2)) -o [email protected] $$< -c
clean::
rm -f impaler$(1)
endef
define diter =
cc_iters_$(1)_$(2) = $(1) $$(flags_$(1)_$(2))
all: iters-$(1)-$(2).so
iters-$(1)-$(2).so: iters-$(1)-$(2).c.o iters-$(1)-$(2).cpp.o
$$(cc_iters_$(1)_$(2)) -o [email protected] $$^ -shared $$(ldflags_$(2))
iters-$(1)-$(2).c.o: iters.c impaler.h version-$(1) makefile
$$(cc_iters_$(1)_$(2)) $$(cflags) -o [email protected] $$< -c
iters-$(1)-$(2).cpp.o: iters.cpp impaler.h version-$(1) makefile
$$(cc_iters_$(1)_$(2)) $$(cxxflags) -o [email protected] $$< -c
endef
clean::
rm -f *.o *.so version-*
$(eval $(call dimpaler,-debug,O0))
$(eval $(call dimpaler,,O3))
$(eval $(call dcompiler,gcc))
$(eval $(call dcompiler,icc))
$(eval $(call dcompiler,opencc))
$(eval $(call dcompiler,clang))
任何提示,将不胜感激。谢谢。
编辑:
即使当我减少生成文件到以下几点:
define dimpaler =
all: impaler
impaler: impaler.o
gcc -o [email protected] $$^
impaler.o: impaler.c
gcc -o [email protected] $$< -c
endef
$(eval $(call dimpaler))
“所有” 依然没有发生。
编辑:
相反的是非常清楚的解释http://www.gnu.org/software/make/manual/make.html#Reading-Makefiles语法,显然添加=
一个限定使得后一切默默地消失,且省略了=
,使生成文件表现得更加出色。
现在我剩下的另一个问题:make all
工程,但make
没有。
我能说的只是“aaargh!” - 我通常会尝试在这里提出问题,但看到这一点让我感觉不舒服。也许你可以解释它想做什么? – 2011-05-22 19:08:16
“impaler”是一个程序,用于比较从使用各种标志的各种编译器编译的一段迭代代码的性能。 “dcompiler”是为每个调用的编译器执行一次的函数。 “dimpaler”是为主程序调用的函数,为调试和发布变体执行。 “diter”是针对编译器和优化级别的每个组合而调用的函数。我同意这很讨厌。 – Reinderien 2011-05-22 19:13:22