C++ Makefile条件语句

C++ Makefile条件语句,c++,makefile,gnu-make,C++,Makefile,Gnu Make,情景: 考虑一个源目录,它有多个创建静态库的“.cpp”文件 考虑文件:XYZ.CPP和ABC.CPP(具体使用基于下面描述的条件)以及PQR.cpp、JKL.CPP等。输出库名称不在。 这里p(是一个环境变量),其值如果与q匹配, out.a应使用XYZ.cpp创建,否则应使用ABC.cpp创建 比如说,像这样的事情 ifeq($p, q) SRC = XYZ.cpp else SRC = ABC.cpp endif SRC += PQR.cpp \ JKL.cpp \

情景:

考虑一个源目录,它有多个创建静态库的“.cpp”文件 考虑文件:XYZ.CPP和ABC.CPP(具体使用基于下面描述的条件)以及PQR.cpp、JKL.CPP等。输出库名称不在。 这里p(是一个环境变量),其值如果与q匹配, out.a应使用XYZ.cpp创建,否则应使用ABC.cpp创建

比如说,像这样的事情

ifeq($p, q)
SRC = XYZ.cpp
else
SRC = ABC.cpp
endif
SRC += PQR.cpp \
       JKL.cpp \
       MNO.cpp
如何在Makefile中优化执行相同的操作


提前感谢您的帮助……

几乎就是这样。您只需要在
ifeq
后面加一个空格(以及
p
周围的一些括号,以防您想使用长度超过一个字母的变量名):


尽管贝塔的答案是相当正确的,但你也可以考虑构造变量名。在我看来,它们导致了更干净、更可读的makefile。例如:

# if p is not set, default to "default"
p ?= default

q_SRC = XYZ.cpp
default_SRC = ABC.cpp

SRC = $($(p)_SRC) PQR.cpp JKL.cpp MNO.cpp

等等。特别是如果你有很多选择,这可能会更容易理解(同样,IMO)。

但是,如果,例如,我做了
make p=xyz
,如果
如果。。。否则…
construct至少仍会指定某种默认值,即使它不是正确的…您可以使用
ifeq($($(p)\u SRC),)
查看是否已设置该值;如果不是的话,你就知道这是假的。您可以使用默认值,也可以使用
$(错误…
。这也可以,但在我的情况下,不会为文件名设置p。还是谢谢你,我能理解你想表达的意思。
# if p is not set, default to "default"
p ?= default

q_SRC = XYZ.cpp
default_SRC = ABC.cpp

SRC = $($(p)_SRC) PQR.cpp JKL.cpp MNO.cpp