在CMake中,为没有生成器表达式的单配置生成器写一次代码,然后为多配置生成器写一次代码,这是必要的还是有用的?

06odsfpq  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(136)

我一直在摆弄CMake有一段时间了,试图尽可能多地学习这个工具。我不得不承认,单配置环境(Makefiles,Ninja)与多配置环境(Visual Studio,XCode等)和生成器表达式的概念确实让我感到困惑。所以,这是我的问题在一个简短的格式:
在CMake中,检查是否是一个好主意(例如:if条件)来查看我们正在处理的环境,并从那里继续执行特定的命令?(例如,检查我们是否正在处理多配置环境,并仅在此情况下使用生成器表达式)
或者,不管我们处理的是什么,对它们都使用生成器表达式是可能的,还是更好的?

n9vozmp4

n9vozmp41#

或者,不管我们处理的是什么,对它们都使用生成器表达式是可能的,还是更好的?
通常是的我建议你尽可能多地这样做。如果你支持多配置生成器,你通常只是免费获得单配置生成器支持。
在CMake中,检查是否是一个好主意(例如:if条件)来查看我们正在处理的环境,并从那里继续执行特定的命令?(例如,检查我们是否正在处理多配置环境,并仅在此情况下使用生成器表达式)
根据我上面所说的,我希望这只会导致无用的重复,降低可读性和维护负担。我建议只有在你别无选择的情况下才这样做,以实现某些特定的功能。例如,如果你想为多配置生成一些文件到每个配置的配置文件,但不想为单配置添加额外的中间配置文件(我想不出为什么有人会想这样做,所以这可能不是一个很好的例子,但这是我想到的)。
另请参阅https://stackoverflow.com/a/73562787/11107541,其中讨论了the global property called GENERATOR_IS_MULTI_CONFIG
好吧,出于兴趣的目的,我浏览了我自己的一个项目,并搜索了我在哪里使用GENERATOR_IS_MULTI_CONFIG,我在三个地方使用它(我不是说我在这里知道最好的,我正在做最聪明的事情-可能有更好的方法来获得我想要的东西,我只是不知道-只是试图提出一些更现实的例子):

  • 为像CMAKE_RUNTIME_OUTPUT_DIRECTORY和它的朋友这样的变量定义“默认值”,这样每个配置都有一个中间值来分隔它们的输出,但对于单一配置生成器则没有。
  • 如果生成器是单配置的,只为CMAKE_BUILD_TYPE定义docstring和STRINGS属性(这只是我的用户的生活质量问题,以避免CMAKE_BUILD_TYPE对多配置生成器是否有意义(它没有)的常见混淆)。
  • 定义一个变量,该变量与CMake为目标放置对象文件的目录相匹配,该目录有一个仅用于多重配置的中间目录。请注意,关心CMake将配置目标文件放在哪里是一件非常奇怪的事情。我需要它为-fprofile-prefix-path定制PGO构建配置。

相关问题