makefile无法正确生成“所有”目标

时间:2011-05-22 19:04:50

标签: makefile

我一直在研究带有参数化目标的makefile。在我的OpenSUSE PC上,它在给定make all时成功运行,但是(奇怪的是)如果只提供clean没有额外参数,则运行make all而不是make。更糟糕的是,在我的Ubuntu PC上,make all根本不起作用,而在浏览make -pn all | less时,all甚至不会被生成为目标。

显然我在生成all目标时做错了。这是makefile:

# 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"/' > $$@
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 $$@ $$^ $$(ldflags_$(2)) -ldl -lm -lpopt
impaler$(1).o: impaler.c impaler.h util.h makefile
    $$(cc_impaler_$(2)) -o $$@ $$< -c
util$(1).o: util.c util.h makefile
    $$(cc_impaler_$(2)) -o $$@ $$< -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 $$@ $$^ -shared $$(ldflags_$(2))
iters-$(1)-$(2).c.o: iters.c impaler.h version-$(1) makefile
    $$(cc_iters_$(1)_$(2)) $$(cflags) -o $$@ $$< -c
iters-$(1)-$(2).cpp.o: iters.cpp impaler.h version-$(1) makefile
    $$(cc_iters_$(1)_$(2)) $$(cxxflags) -o $$@ $$< -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))

任何提示都将不胜感激。感谢。


编辑:

即使我将makefile减少到以下内容:

define dimpaler =
all: impaler
impaler: impaler.o
    gcc -o $$@ $$^
impaler.o: impaler.c
    gcc -o $$@ $$< -c
endef

$(eval $(call dimpaler))

仍然没有生成“全部”。


编辑:

http://www.gnu.org/software/make/manual/make.html#Reading-Makefiles中非常清楚解释的语法相反,显然在定义后添加=会使一切都无声地失败,省略=会使makefile表现得更好。

现在我遇到了另一个问题:make all有效,但make没有。

1 个答案:

答案 0 :(得分:3)

正如您所说,在=之后移除define会使其更好用。这可能会改变=中处理define的方式。

至于其他问题,make不起作用,因为all未定义为第一条规则。尝试在开头添加一个空的all:规则。还应该有一种建立默认目标规则的方法,但我会查看文档,因为我现在还不记得了。

修改

似乎是变量.DEFAULT_TARGET