在使用Autotools构建的C程序中查找数据文件

时间:2011-06-30 12:27:03

标签: c autotools

我有一个使用Autotools构建的C程序。在src/Makefile.am中,我定义了一个宏,其中包含已安装数据文件的路径:

AM_CPPFLAGS = -DAM_INSTALLDIR='"$(pkgdatadir)"'

问题是我需要运行make install才能测试二进制文件(因为它需要能够找到数据文件)。

我可以使用源树的路径定义另一个宏,以便可以定位数据文件而无需安装:

AM_CPPFLAGS = -DAM_INSTALLDIR='"$(pkgdatadir)"' -DAM_TOPDIR='"$(abs_top_srcdir)"'

现在,我想要以下行为:

  1. 如果二进制文件是通过make install安装的,请使用AM_INSTALLDIR获取数据文件。
  2. 如果未安装二进制文件,请使用AM_TOPDIR获取数据文件。
  3. 这可能吗?有没有更好的方法解决这个问题?

3 个答案:

答案 0 :(得分:5)

我所做的(在https://http://rhdunn.github.com/cainteoir/中)是:

const char *basedir = getenv("CAINTEOIR_DATADIR");
if (!basedir)
    basedir = DATADIR "/" PACKAGE; // e.g. /usr/share/cainteoir-engine

然后运行它(在tests / harness.py中):

CAINTEOIR_DATADIR=`pwd`/data src/apps/metadata/metadata test_file.epub

然后,用户可以根据需要更改获取数据的位置。

答案 1 :(得分:3)

使程序能够使用reece提出的运行时配置是一个很好的解决方案。如果由于某种原因你不希望它在运行时可配置,一个常见的解决方案是构建一个测试二进制文件与安装的二进制文件不同(还有其他与此相关的问题,特别是确保你正在测试的程序有与安装的程序一致的行为。)这样做的简单方法如下:

bin_PROGRAMS = foo
check_PROGRAMS = test-foo
test_foo_SOURCES = $(foo_SOURCES)
AM_CPPFLAGS = -DINSTALLDIR='"$(pkgdatadir)"'
test_foo_CPPFLAGS = -DINSTALLDIR='"$(abs_top_srcdir)"'

您可能希望拥有一个专用的测试目录,并使用与原始名称相同的名称构建程序,而不是使用具有不同名称的二进制文件。

请注意,我已将名称从AM_INSTALLDIR更改为INSTALLDIR。 Automake保留名称 以“AM_”开头供自己使用,并且通过使用该名称,您正在踩踏Automake 命名空间。

答案 2 :(得分:0)

首先是一些额外的信息:数据文件正在积极开发中,我有各种脚本需要使用本地数据文件调用二进制文件,而安装的二进制文件应该使用稳定的已安装数据文件。

我的原始解决方案使用了reece提出的环境变量。但我不想管理在各个地方设置环境变量,我不希望由于错误而挑选错误的数据文件。

因此我最终得到的解决方案是在构建时为两个位置定义宏,并向二进制文件添加一个标志(-local)以强制使用本地数据文件。