2011-09-19 50 views
3

假设我想让生成makefile向g ++传递一些特定的头文件路径。使用autoconf/automake时,如何指定包含文件路径?

我需要将什么添加到configure.ac或Makefile.am中来指定它?

(注意 - 我不希望它的./configure传入CPPFLAGS我想这一步之前出炉的这些路径。)

编辑: 具体来说,我想包括我们说的/ usr/include/freetype和/ mypath/include。

我把AC_CHECK_HEADERS([freetype/config/ftheader.h]),它通过,但似乎并没有将它添加到-I传递给g ++。我也尝试添加CPPFLAGS = -I。:/ usr/include/freetype:/ mypath/include,但它拧紧并放置-I两次,第一次作为-I。它忽略了第二个 - 我。

+1

看起来这是错误的做法。 '。/ configure'是找出你正在编译的系统上的东西的步骤,所以它也是允许编译用户告诉它头文件路径的非默认位置在哪里的步骤。 – reinierpost

+1

CPPFLAGS不是冒号分隔列表。你想要CPPFLAGS =' - I/usr/include/freetype -I/mypath/include' –

回答

8

硬编码路径到包文件绝对是错误的做法。如果您选择这样做,那么您需要意识到您违反了使用自动工具构建软件包的基本规则。如果在软件包文件中指定了/ mypath/include,则需要在适用于所有机器的软件包中指定特定于您机器的东西;显然这是错误的。它看起来像你想要的是为你的包(当你的机器上构建时)在/ mypath中查找头文件。这很容易完成,而不会混淆你的包裹。有(至少)3种方法:

1)使用config.site文件。在/usr/local/share/config.site(创建这个文件,如果有必要),添加一行:

 
CPPFLAGS="$CPPFLAGS -I/mypath/include" 

现在使用的autoconf任何包生成与默认前缀(在/ usr /本地)配置脚本将-I/mypath/include附加到CPPFLAGS,并找到/ mypath/include中的标头。

2)如果您想对所有要进行的分配建立(不只是那些被安装在/ usr /本地),您可以使用此:

把同一线上$ HOME指定CPPFLAGS/config.site,并在默认shell的环境中设置CONFIG_SITE = $ HOME/config.site。现在,无论何时运行autoconf生成的配置脚本,都将创建$ HOME/config.site中的任务。

3)只需在默认shell的环境中指定CPPFLAGS即可。

所有这些解决方案与修改构建文件相比有两个主要优势。首先,它们将适用于所有autoconf生成的软件包(只要它们遵循规则,而不需要在构建文件中分配诸如CPPFLAGS之类的用户变量)。其次,他们不会将机器的特定信息放入适用于所有机器的软件包中。

+0

听起来不错,但是,...由configure生成的Makefile生成的编译语句不引用环境CFLAGS或CPPFLAGS env变量。 – Cheeso

+0

如果包是使用automake构建的,则默认规则应该在适当的位置包含'$(CFLAGS)'和'$(CPPFLAGS)'。如果没有,包维护者正在严重滥用automake。也许你正在看的包使用手工编写的'Makefile.in'。 –

8

由于问题是关于如何放置在automake文件中,因此我认为AM_CPPFLAGS是用于为所有C/C++编译添加include和定义的正确变量。见http://www.gnu.org/software/automake/manual/html_node/Program-Variables.html

例子:

AM_CPPFLAGS = -I/usr/local/custom/include/path 
+0

我同意这是对问题最直接的实际答案。只需在Makefile.am中添加一行,就可以为构建目标指定自定义包含路径。 – Tchakabam

相关问题