makefile无法正确生成“文件”;“全部”;目标

makefile无法正确生成“文件”;“全部”;目标,makefile,Makefile,我一直在研究一个带有参数化目标的makefile。在我的OpenSUSE PC上,当给定make all时,它会成功运行,但(奇怪的是)如果只提供make而不提供额外参数,它会运行clean而不是make all。更糟糕的是,在我的Ubuntu PC上,make-all根本不起作用,通过浏览make-pn-all | less,all甚至没有被生成为目标 显然,我在生成all目标时出错了。以下是生成文件: # To see predefined preprocessor macros: # gc

我一直在研究一个带有参数化目标的makefile。在我的OpenSUSE PC上,当给定
make all
时,它会成功运行,但(奇怪的是)如果只提供
make
而不提供额外参数,它会运行
clean
而不是
make all
。更糟糕的是,在我的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"/' > $$@
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))
#要查看预定义的预处理器宏:
#gcc-dM-E-&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$$(调用数据项,$(1),O0))
$$(eval$$(调用数据项,$(1),O1))
$$(eval$$(调用数据项,$(1),O2))
$$(eval$$(调用数据项,$(1),O3))
恩德夫
定义dimpaler=
cc_impaler_$(2)=gcc$$(标志_gcc_$(2))$$(cflags)
全部: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
清洁::
rm-f穿刺者美元(1)
恩德夫
定义数据采集器=
cc_iters_$(1)$(2)=$(1)$(flags_$(1)$(2))
所有:国际热核实验堆-$(1)-(2)。所以
国际热核实验反应炉-$(1)-(2).so:iters-$(1)-(2).c.o国际热核实验反应炉-$(1)-(2).cpp.o
$$(cc_iters_$(1)$(2))-o$$@$^-共享$$(ldflags_$(2))
iters-$(1)-(2).c.o:iters.c impaler.h版本-$(1)makefile
$$(cc_iters_$(1)$(2))$$(cflags)-o$$@$<-c
iters-$(1)-(2).cpp.o:iters.cpp impaler.h版本-$(1)makefile
$$(cc_iters_$(1)$(2))$$(cxflags)-o$$@$<-c
恩德夫
清洁::
rm-f*.o*.so版本-*
$(eval$(调用dimpaler,-debug,O0))
$(eval$(调用dimpaler,,O3))
$(eval$(调用dcompiler,gcc))
$(eval$(调用dcompiler,icc))
$(eval$(调用dcompiler,opencc))
$(eval$(调用dcompiler,叮当声))
如有任何提示,将不胜感激。谢谢


编辑:

即使我将makefile缩减为以下内容:

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

$(eval $(call dimpaler))
define dimpaler=
所有人:刺客
刺穿者:刺穿者
gcc-o$$@$$^
o:impaler.c
gcc-o$$@$$<-c
恩德夫
$(eval$(调用dimpaler))
“全部”仍然没有生成


编辑:

与中解释得非常清楚的语法相反,显然,在定义之后添加
=
会使所有操作都以静默方式失败,而省略
=
则会使生成文件表现得更好


现在我剩下另一个问题:
make all
有效,但
make
无效。

正如您所说,在
定义后删除
=
会使它工作得更好。这可能是在
定义
中处理
=
的方式发生了变化

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

编辑


似乎是变量
。默认\u目标

,正如您所说,在
定义
之后删除
=
会使它工作得更好。这可能是在
定义
中处理
=
的方式发生了变化

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

编辑


似乎是变量
。默认\u TARGET

我只能说“啊啊!”-我通常会在这里尝试提供关于提问的帮助,但一看这个就会让我感觉不舒服。也许您可以解释一下它试图做什么?“impaler”是一个程序,它比较使用不同标志从不同编译器编译的迭代代码的性能。“dcompiler”是一个为每次调用的编译器执行一次的函数。“dimpaler”是为主程序调用的函数,可用于调试和发布变体。“diter”是为编译器和优化级别的每个组合调用的函数。我同意这很糟糕。我只能说“啊啊!”-我通常会在提问时提供帮助,但看一眼就会觉得不舒服。也许您可以解释一下它试图做什么?“impaler”是一个程序,它比较使用不同标志从不同编译器编译的迭代代码的性能。“dcompiler”是一个为每次调用的编译器执行一次的函数。“dimpaler”是为主程序调用的函数,可用于调试和发布变体。“diter”是为编译器和优化级别的每个组合调用的函数。我同意这很糟糕。改变顺序,让
all:
首先出现确实解决了问题。发牢骚发牢骚制造仇恨改变顺序