sources/flags/libs 的 Automake 条件追加或变量赋值

Automake conditional append or variable assignment for sources/flags/libs

当有条件地设置 package/lib _SOURCES 或每个 package/lib 标志(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

或者有条件地分配变量并将它们全部连接到包的标志中(无论是填充的还是空的),例如:

if OS1
os1_src = os1.c
else
if OS2
os2_src = os2.c
endif
endif

bin_PROGRAMS = mypkg
mypkg_SOURCES = mypkg.c $(os1_src) $(os2_src)

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

我猜另一种选择是做类似于选项 2 的事情,但是使用配置脚本分配变量(configure.ac 和 AC_SUBST)。但我一直让我的配置脚本纯粹检测可用功能,并选择在 Makefile 中使用哪些功能。

其中之一是否有技术上的缺点或令人讨厌的副作用?

您观察到的差异主要是风格问题,这是主观的,因此在这里很大程度上是题外话。但你的实际问题很漂亮 objective:

Does one of them have a technical downside or nasty side-effect?

没有,none 据我所知。任何一种方法都可以正常工作,至少在孤立的情况下是这样。更大的上下文可能会提供更喜欢第二种方法的变体的理由,例如将变量与多个目标结合使用。但是,与选择源文件相比,预处理器或 link 选项更有可能出现这种情况。


就个人而言,我会以不同的方式构建您提出的特定案例:

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

bin_PROGRAMS = mypkg
mypkg_SOURCES = mypkg.c $(os_src)

可以肯定的是,这是一个风格问题,所以不管它对你有什么价值,都可以接受它。在这里,变量的用法与条件的结构相匹配:OS1OS2选择,因此它们之间只控制一个变量的值。因此,无论是在设置它的值还是在使用它的时候,该变量的含义都更加清晰。

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

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

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)

可以使用相同的方法来提供 os- 或处理器- 或特定于配置的构建标志。通常,有一些通用设置用于多个模块,而其他标志是特定于模块的。

每种方法都可能被滥用并导致严重后果。

主要风险是一个模块的某些标志或设置不会正确重置,而另一个模块的某些设置会 'spill' 无意中。而且,一些模块可能会遗漏一些常见的标志。

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