Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 为预处理器定义的所有组合自动生成二进制文件_Makefile_Cmake_C Preprocessor - Fatal编程技术网

Makefile 为预处理器定义的所有组合自动生成二进制文件

Makefile 为预处理器定义的所有组合自动生成二进制文件,makefile,cmake,c-preprocessor,Makefile,Cmake,C Preprocessor,我有一个具有多个功能的项目,可以通过预处理器定义(如#define ENABLE_FEATURE_a)来启用。为了测试这个项目,我使用GoogleTest。因此,我定义应该启用哪些功能,构建GoogleTest二进制文件并运行它 为了测试所有可能的组合,我想用不同的预处理器定义自动构建项目,并运行生成的应用程序 例如,我只有两个可以启用或禁用的功能。因此,我有四种可能的组合: make test make test CFLAGS=-DENABLE_FEATURE_A make test CFLA

我有一个具有多个功能的项目,可以通过预处理器定义(如
#define ENABLE_FEATURE_a
)来启用。为了测试这个项目,我使用GoogleTest。因此,我定义应该启用哪些功能,构建GoogleTest二进制文件并运行它

为了测试所有可能的组合,我想用不同的预处理器定义自动构建项目,并运行生成的应用程序

例如,我只有两个可以启用或禁用的功能。因此,我有四种可能的组合:

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自动执行此操作,因此我只需调用
进行测试
。或者存在其他可以帮助我完成该任务的工具吗?

使用CMake存在,例如config.h.in(将转换为config.h)文件。对于每个组合,您可以创建config.h.in1、config.h.in2等,然后编写批处理文件,重复执行以下步骤: 1) 将config.h.inX复制到config.h.in 2) 制作和制作安装

在config.h.inX中,您可以选择二进制文件的目的地(或者将它们放在一个文件夹中,但更改每个组合的名称),因此,您将有一个要删除的二进制文件列表


这看起来不像是好的解决方案,更像是Spple,但是如果没有其他建议,这会有帮助。

< P>这是一个我们可以假装是你的测试源的玩具C++程序。 可为功能部件
A
B
内置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;
}

产生的4个可执行文件是
变体中列出的那些文件

您确实意识到,当您拥有8个功能时,您将最终拥有256个不同的组合,在16个功能时,它将是65536个,依此类推-每个新功能将使构建数量增加一倍。我建议您的测试方法在未来至少需要一些认真的重新设计,即使功能集现在是可管理的…@twalberg:是的,我确实意识到可执行文件的数量将是指数级的。这就是我不想手工定义所有测试的原因。但我愿意就如何改进测试提出建议。
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)