Makefile 为源/标志/库自动生成条件附加或变量赋值

Makefile 为源/标志/库自动生成条件附加或变量赋值,makefile,autotools,automake,Makefile,Autotools,Automake,当有条件地设置包/库源或每个包/库标志(CFLAGS、LDFLAGS、LDADD等)时,是否最好有条件地附加到包的标志,例如: bin_PPROGRAMS = mypkg mypkg_SOURCES = mypkg.c if OS1 mypkg_SOURCES += os1.c else if OS2 mypkg_SOURCES += os2.c endif endif 或者有条件地分配变量并将它们全部连接到包的标志(无论是填充的还是空的),例如: 我从两个方面都看到了这一点,我也看到了各自的

当有条件地设置包/库源或每个包/库标志(CFLAGS、LDFLAGS、LDADD等)时,是否最好有条件地附加到包的标志,例如:

bin_PPROGRAMS = mypkg
mypkg_SOURCES = mypkg.c
if OS1
mypkg_SOURCES += os1.c
else
if OS2
mypkg_SOURCES += os2.c
endif
endif
或者有条件地分配变量并将它们全部连接到包的标志(无论是填充的还是空的),例如:

我从两个方面都看到了这一点,我也看到了各自的优势。对于前者,将这些标志添加到包中的实际最终操作在条件中是明确的,并且您没有在行中塞满在给定构建中实际上没有任何意义的变量。在后者中,包中实际包含的内容被合并到一行中,并且您不会在其他地方出现未看到的附加内容,但是您可能并不真正知道不透明变量名中发生了什么

我猜另一个选项是执行类似于选项2的操作,但使用configure脚本(configure.ac with ac_SUBST)分配变量。但我一直保持我的配置脚本纯粹是检测可用的功能,并选择在Makefiles中使用哪些功能


它们中有没有一个有技术上的缺点或令人讨厌的副作用?

你观察到的差异很大程度上是风格的问题,这是主观的,因此在这里基本上是离题的。但你的实际问题相当客观:

它们中有没有一种有技术上的负面影响或令人讨厌的副作用

没有,我都不知道。这两种方法都可以很好地发挥作用,至少在单独情况下是如此。一个更大的上下文可能会为选择第二种方法的变体提供理由,例如将变量与多个目标结合使用。然而,与选择源文件相比,预处理器或链接选项更可能出现这种情况


就我个人而言,我会对您提出的具体案例进行稍微不同的组织:

if OS1
os_src = os1.c
else
if OS2
os_src = os2.c
endif
endif

bin_PROGRAMS = mypkg
mypkg_SOURCES = mypkg.c $(os_src)
可以肯定的是,这是一个风格的问题,所以无论它对你有什么价值,都要接受它。这里,变量的使用与条件的结构相匹配:
OS1
OS2
是可选的,因此它们之间只控制一个变量的值。因此,无论是在设定变量值时还是在使用变量时,该变量的含义都更加明确


多个变量对于多个不同的、不相关的条件更有意义。

我想添加一些更典型的模式:

os1_src = os1.c
os2_src = os2.c
if OS1
  myos = os1
endif
if OS2
  myos = os12
endif

mypkg_SOURCES = mypkg.c $($(myos)_src)
另一个:

如果OS1 os1=是 os2=否 恩迪夫 如果OS2 os1=否 os2=是 恩迪夫 $(os1)src=os1.c $(os2)src=os2.c

mypkg_SOURCES = mypkg.c $(yessrc)
同样的方法也可用于提供特定于操作系统、处理器或配置的构建标志。通常,有一些通用设置用于多个模块,而其他标志是特定于模块的

每种方法都可能被误用并导致恶劣后果

主要风险是一个模块的某些标志或设置无法正确重置,而另一个模块的某些设置会无意中“溢出”。但是,一些模块可能会丢失一些公共标志


为了降低这些风险,即使您的构建包含许多模块,也要尝试使用相同的技术。

这是一个完美的答案,谢谢。这也是一个很好的见解——如果有一个资产是由许多选项中的一个提供的,那么用一个变量来表示它们。
mypkg_SOURCES = mypkg.c $(yessrc)