如何使用Autotools将测试目录文本文件复制到build/test目录?
解决Autotools构建时测试数据文件未复制到构建目录的问题
Autotools默认只会处理编译相关的源文件(比如.c),测试用的文本数据文件需要显式配置才能同步到构建目录,以下两种方案可以解决你的问题:
方案一:让测试程序直接从源码目录读取数据
这种方式无需复制文件,通过传递源码目录路径给测试程序即可:
- 在
Makefile.am中添加环境变量传递:
TESTS_ENVIRONMENT = TOP_SRCDIR=$(top_srcdir)
- 在
testfile.c中读取环境变量拼接数据文件路径:
#include <stdlib.h> #include <stdio.h> int main() { const char *top_srcdir = getenv("TOP_SRCDIR"); if (!top_srcdir) { fprintf(stderr, "TOP_SRCDIR environment variable not set\n"); return 1; } char a_txt_path[256]; snprintf(a_txt_path, sizeof(a_txt_path), "%s/test/a.txt", top_srcdir); // 这里可以对a.txt进行操作 // ... return 0; }
方案二:显式复制数据文件到构建目录
如果必须将数据文件复制到build/test目录,可通过以下配置实现:
方法A:利用check_DATA自动复制
# 声明需要包含在分发包中的测试数据文件 EXTRA_DIST = test/a.txt test/b.txt # 定义check阶段需要同步的文件 check_DATA = test/a.txt test/b.txt # 指定文件要复制到构建目录下的test子目录 checkdir = $(top_builddir)/test
执行make test时,Autotools会自动把check_DATA中的文件复制到checkdir指定的路径。
方法B:自定义依赖规则精细控制
如果需要更灵活的触发时机,可添加自定义复制规则:
testfile_SOURCES = test/testfile.c check_PROGRAMS = testfile TESTS = testfile # 列出所有需要复制的测试数据文件 TEST_DATA_FILES = test/a.txt test/b.txt # 生成构建目录下的目标文件路径 BUILT_TEST_DATA = $(addprefix $(builddir)/test/, $(notdir $(TEST_DATA_FILES))) # 添加文件复制规则 $(builddir)/test/%.txt: $(srcdir)/test/%.txt @mkdir -p $(builddir)/test $(CP) $< $@ # 让测试程序依赖复制后的文件,确保测试前文件已就位 testfile_DEPENDENCIES += $(BUILT_TEST_DATA)
注意事项
make test是make check的别名,上述配置均针对check阶段生效;- 确保
configure.ac中包含正确的Autotools初始化语句,比如AM_INIT_AUTOMAKE([foreign]),保证规则能被正确解析。
内容的提问来源于stack exchange,提问作者Alabaster
相关产品推荐
相关产品推荐

