我有一个具有多个功能的项目,可以通过预处理器定义启用,如#define ENABLE_FEATURE_A
。为了测试项目,我使用GoogleTest。因此,我定义了应该启用哪些功能,构建GoogleTest二进制文件并运行它。
为了测试所有可能的组合,我想用不同的预处理器定义自动构建项目并运行生成的应用程序。
例如,我只有2个功能可以启用或禁用。因此,我有四种可能的组合:
make test
make test CFLAGS=-DENABLE_FEATURE_A
make test CFLAGS=-DENABLE_FEATURE_B
make test CFLAGS=-DENABLE_FEATURE_A -DENABLE_FEATURE_B
我可以使用make或cmake自动执行此操作,因此我只需要调用make tests
。或者是否存在可以帮助我完成这项任务的其他工具?
答案 0 :(得分:1)
使用CMake存在,例如,config.h.in(将转换为config.h)文件。对于每个组合,您可以创建config.h.in1,config.h.in2等,然后编写将重复执行后续步骤的批处理文件: 1)将config.h.inX复制到config.h.in 2)制造&& make install。
在config.h.inX中,您可以为二进制文件选择目的地(或将它们放在一个文件夹中,但为每个组合更改其名称),因此,您将获得所需的二进制文件列表。
这看起来不是很好的解决方案,更像是秒杀,但如果没有其他建议,这可能会有所帮助。
答案 1 :(得分:1)
这是一个玩具C ++程序,我们可以假装是你的测试源
可以为功能A
,B
:
#include <iostream>
using namespace std;
int main()
{
#ifdef ENABLE_FEATURE_A
cout << "With Feature A" << endl;
#endif
#ifdef ENABLE_FEATURE_B
cout << "With Feature B" << endl;
#endif
return 0;
}
这是一个GNU makefile,可以构建所有变种(在Linux上)
在与main.cpp
相同的目录中运行:
variants = tester tester_A tester_B tester_AB
objs = main.o
tests:
$(foreach variant,$(variants),$(MAKE) clean_obj $(variant);)
tester_A: CXXFLAGS += -DENABLE_FEATURE_A
tester_B: CXXFLAGS += -DENABLE_FEATURE_B
tester_AB: CXXFLAGS += -DENABLE_FEATURE_A -DENABLE_FEATURE_B
$(variants): $(objs)
g++ $(LDFLAGS) -o $@ $<
clean_obj:
rm -f $(objs)
clean: clean_obj
rm -f $(variants)
产生的4个可执行文件是variants
中列出的可执行文件。