Automake条件附加或源/标志/库的变量赋值

问题描述:

有条件地设置package/lib _SOURCES或per-package/lib标志(CFLAGS,LDFLAGS,LDADD等)时,是否有条件地附加到包的标志如:Automake条件附加或源/标志/库的变量赋值

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脚本(configure.ac和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) 

可以肯定,这是一个风格问题,所以把它不管它是值得你。在这里,变量的使用与条件的结构匹配:OS1OS2替代,所以他们之间他们控制只有一个变量的值。因此,该变量的含义因此更清晰,无论是在其值被设置的位置还是在被使用的位置。

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

+0

这是一个完美的答案,谢谢。这也是一个很好的见解 - 如果有资产由多种选择中的一种交替提供,则用一个变量来表示它们。 –

我想补充一些比较典型的模式:

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 = YES OS2 =无 ENDIF 如果OS2 OS1 =无 OS2 = YES ENDIF $(os1)src = os1.c $(os2)src = os2.c

mypkg_SOURCES = mypkg.c $(yessrc) 

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

每种方法都可能被滥用,并导致不良后果。

主要风险是一个模块的某些标志或设置不能正确重置,另一个模块的某些设置会无意中“溢出”。而且,一些模块可能会错过一些常见的标志。

为了减少这些风险,即使您的版本包含很多模块,也要尽量使用相同的技术。