通过生成器表达式设置CMAKE_SYSROOT

时间:2018-12-27 00:11:14

标签: cmake

在我们的项目中,我们根据所选配置设置CMAKE_SYSROOT。之所以如此,是因为配置(其中包括)表示目标平台(交叉编译-不仅如此,而且行为上也有细微差别)。

我们想用generator expression表示这一点,以便对多配置IDE友好。

但是,我们还没有找到一种方法。首先,您会注意到CMAKE_SYSROOT甚至都没有提到这种可能性。我们仍然尝试将其设置为这样的值(不是精确值-只是一个示例!):

set(CMAKE_SYSROOT $<IF:$<CONFIG:hw1>,path1,path2>)

希望在支持generator expressions的上下文中使用该值。但显然不是。相反,似乎在--sysroot参数(--sysroot="\$<IF:\$<CONFIG:hw1>,path1,path2>")中提供了逐字值。在值周围添加引号不会改变任何内容。

我们还有其他选择吗?


我还要在CMAKE_TOOLCHAIN_FILE的文档中提到的CMAKE_SYSROOT上添加注释。

grepcmake -DCMAKE_BUILD_TYPE=hw1 ../生成的文件以及我们自己的来源中,CMAKE_TOOLCHAIN_FILE并没有设置为任何东西。

显然,CMAKE_SYSROOT没有指向我们设置CMAKE_TOOLCHAIN_FILE的文件。但是,--sysroot参数仍设置为期望值。 (只有generator expression才行!)因此,它确实可以以某种方式起作用


我希望其他变量也会遇到相同的问题:

无论如何(在我们的例子中),最后两个依赖于CMAKE_SYSROOT

1 个答案:

答案 0 :(得分:3)

如果您真的想将不同的--sysroot标志传递给多配置生成器上的链接器,则只需使用生成器表达式通过target_link_options来传递它。但是,那么您可能必须自己更新rpath个项目,但是我不确定。

在构建时不使用变量,并且生成器表达式的文档规定: Generator expressions are allowed in the context of many target properties...

set命令中没有看到任何阻止将CMAKE_SYSROOT设置在工具链文件之外的内容。我猜短语This variable may only be set in a toolchain file应该是This variable is normally used in a toolchain file

似乎您正在尝试使用构建类型作为两个不同工具链之间的切换。如果是这种情况,那么我看不到如何使用多配置生成器正常工作。您要设置的大部分内容都是在配置时确定的,而不是在构建时使用的。