试图将其构建系统堵塞的遗留代码库迁移到 CMake。
分治它,检查是否有规定是否有规定从cmake调用jamfile和jamrule,反之亦然。
一种选择是添加一个自定义目标调用果酱程序。是否也可以使用 jamfile / .jam 文件中定义的 jamrule
试图将其构建系统堵塞的遗留代码库迁移到 CMake。
分治它,检查是否有规定是否有规定从cmake调用jamfile和jamrule,反之亦然。
一种选择是添加一个自定义目标调用果酱程序。是否也可以使用 jamfile / .jam 文件中定义的 jamrule
免责声明:有几种果酱口味。答案适用于 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
示例中)以使它们在操作中可用。