自动为预处理器定义的所有组合构建二进制文件

时间:2014-04-23 07:54:34

标签: makefile cmake c-preprocessor

我有一个具有多个功能的项目,可以通过预处理器定义启用,如#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。或者是否存在可以帮助我完成这项任务的其他工具?

2 个答案:

答案 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 ++程序,我们可以假装是你的测试源 可以为功能AB

的4种变体构建
#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中列出的可执行文件。