0

试图将其构建系统堵塞的遗留代码库迁移到 CMake。

分治它,检查是否有规定是否有规定从cmake调用jamfile和jamrule,反之亦然。

一种选择是添加一个自定义目标调用果酱程序。是否也可以使用 jamfile / .jam 文件中定义的 jamrule

4

1 回答 1

0

免责声明:有几种果酱口味。答案适用于 Perforce Jam 及其一些兼容的后代。

正如您已经提到的那样,从 cmake 调用 jam 可以使用add_custom_target/来完成add_custom_command,这样就可以回答您问题的第一部分。

由于阻塞规则(或者更确切地说是动作)可以调用任意命令,因此另一个方向当然也是可能的。cmake它本身通常不是您为构建目标而调用的工具。因此,根据您的生成器,您实际上需要调用make, ninja,...

在您的问题中,您对迁移方法不是很具体。假设您从一个包含多个库和跨依赖关系图的可执行目标的 jam 构建系统开始,并且您希望逐个组件迁移构建系统组件。如果您从一个没有依赖关系的库开始自下而上(希望其源代码存在于它们自己的子目录中),您将替换构建库的规则调用 - 例如Library libfoo : foo.c bar.c ;- 由调用 eg make- like的规则调用替换Make libfoo$(SUFLIB) ;。该规则可以定义(例如 in Jamrules)为:

rule Make
{
    # tell jam where the target will be created
    MakeLocate $(1) : $(LOCATE_TARGET) ;

    # always invoke the actions, since we don't let jam check the target's dependencies
    Always $(1) ;

    # we need the source dir in the actions
    SOURCE_DIR on $(1) = $(SUBDIR) ;
}

actions Make
{
    # get absolute source dir path
    sourceDir=`cd $(SOURCE_DIR) && pwd`

    # cd into the output directory
    cd $(LOCATE)

    # generate Makefile, if not done yet
    if [ ! -e Makefile ]; then
        cmake -G "Unix Makefiles" $(sourceDir) ;
    fi

    # make the target
    make `basename $(1)`
}

如果您需要将来自 jam 的其他信息传递给 cmake(如构建类型或某些构建选项),请定义相应的目标变量(如SOURCE_DIR示例中)以使它们在操作中可用。

于 2020-03-30T21:45:31.167 回答