我的项目中有一个子项目,用于生成项目中使用的代码,但我希望使用ExternalProject将其包含在内,以便可以构建和运行它,而不管我为主项目使用的工具链如何。
除了我不知道如何在add_custom_command
中使用它之外,它基本上可以工作,因为我希望它使用文档中指定的目标规则:
如果COMMAND指定了一个可执行文件目标名称(由add_executable()命令创建),它将自动替换为在构建时创建的可执行文件的位置[...]
复制问题的项目设置的简单示例:https://godbolt.org/z/of8G4c4Gf
用一个简单的add_subdirectory
替换ExternalProject_Add
可以让它工作,但是在使用不同的工具链的情况下,它不会做我想要的事情。
1条答案
按热度按时间xxe27gdn1#
ExternalProject_Add
将添加codegen
目标。但是,CMake不知道该目标在做什么以及它将提供什么输出,因为该信息现在隐藏在外部CMake运行中。因此外部CMake运行不知道该步骤生成的codegen
二进制文件以及它将位于何处。您需要手动提供add_custom_command
可执行文件的完整路径。ExternalProject_Add
将构建codegen
并将生成的二进制文件放在构建目录的子目录中。确切位置取决于工具链,因此重建完整的目标路径可能会很棘手。解决此问题最可靠的方法是:1.在
codegen
项目中添加一个安装步骤,这将允许您方便地指定安装的二进制文件将在相对于安装根目录的路径中结束。1.将
ExternalProject_Add
上的INSTALL_DIR
选项设置为PROJECT_BINARY_DIR
内的子目录。1.在外部CMake项目的自定义命令中硬编码已安装的
codegen
二进制文件的完整路径。要在多个平台上工作,您可能需要使用theCMAKE_EXECUTABLE_SUFFIX
variable。