CMake可以识别具有另一个名称(CMakeLists_nightly.txt)的CMakeLists.txt吗?

6mzjoqzu  于 2024-01-09  发布在  其他
关注(0)|答案(3)|浏览(221)

我想创建CMakeLists.txt文件,更具体地命名为如“CMakeLists_nightly.txt”,“CMakeLists_weekly.txt”等。我想这样做的原因是减少我的项目的文件夹层次结构混乱。我可以很容易地把这些文件中的每一个在自己的文件夹与后缀我上面显示,但我不想这样做。
我可以告诉cmake以另一个名称获取CMakeLists.txt文件吗?我以前在另一个论坛上看到过这个问题(http://www.cmake.org/pipermail/cmake/2007-August/016036.html),但那是在2007年,答案是否定的。

t5fffqht

t5fffqht1#

实际上不是,但是你可以通过将CMakeLists.txt放在单独的目录中来模拟这一点,例如continous/CMakeLists.txtnightly/CMakeLists.txt。使用INCLUDE为每个构建脚本包含适当的脚本。
考虑一下这是否真的是正确的方法--完全分离夜间脚本和连续脚本是一个非常糟糕的主意,因为这将导致重复和非常容易出错的构建设置。

s71maibg

s71maibg2#

当我阅读Larsmoa的一个回答并思考了一会儿时,答案出现在我的脑海中:
(this这并不完全是对CMakeLists.txt不同名称问题的回答,而是对“如何在同一目录中拥有两个不同的CMake配置文件”的回答。
您可以避免创建多个目录并将CMakeLists.txt存储在那里(如果您希望脚本成为所有内容的父目录,这也可能会有问题)。我的想法是,您可以使用任何名称来创建两个“包含”cmake文件。然后在CMakeLists.txt中,您可能会有一个set(CACHE),它控制,实际上应该包含哪个包含脚本。
通过这种设置,您可以有两个构建目录:一个配置了选项的一个值,另一个配置了另一个。根据这一点,在哪个构建目录中进行构建,将使用相应的构建定义。
它可以看起来像这样:
CMakeLists.txt:

set(
    MY_BUILD_KIND BUILD_A CACHE STRING 
    "Select build kind: BUILD_A or BUILD_B"
)

if ( MY_BUILD_KIND strequal "BUILD_A" )
    include(build_a.cmake)
elseif (MY_BUILD_KIND strequal "BUILD_B")
    include(build_b.cmake)
else ()
    message ( FATAL_ERROR "Unknown build kind: ${MY_BUILD_KIND}" )
endif ()

字符串

背景(为什么我需要它?):我的情况有点奇怪,我猜。我有一个C++项目,它的不同部分使用两个不同的编译器。它的一部分,需要由他们每个人构建。所以目录结构是这样的:

  • 项目
  • 企业简介
  • 公司简介
  • CommonProjects

在这里,“CommonProjects”被包含为“CommonAProjects”的一部分,也被包含为“CommonBProjects”的一部分。现在我们尝试集成cmake,我在想,我们如何保持结构,但用CMake进行构建。如果我把CMakeLists.txt放在根目录下,那么我不明白,如何区分两个编译器。如果我没有根项目,那么它就不清楚了,如何引用“兄弟”项目。所以我想到了这个想法,我可以根据当前的编译器包含子目录。然后我决定,实际上这是不必要的,编译器是驱动因素,我们可以使用set(CACHE)代替。我们不受限制地选择,我们选择哪个子目录,但也可以包含“.cmake”文件。

o7jaxewo

o7jaxewo3#

不可以,CMake只识别名为CMakeLists.txt的CMakeLists.txt文件

你自己看:它被硬编码在CMake二进制文件源代码的几个地方(包括Source/cmake.cxx中的cmake::DoPreConfigureChecksSource/cmMakefile.cxx中的cmMakefile::ConfigureSubDirectory)以及CMake内置模块脚本(包括FetchContent)中。
我想提出一个框架挑战:您可以定义选项变量,供调用项目配置的人员使用(他们可以使用-D通过命令行定义缓存变量,或配置预置中的cacheVariables).你的项目配置可以读取这些变量,并根据这些选项变量做任何它想改变自己的事情。例如。参见the if command和条件生成器表达式。您还可以使用optionset(... CACHE ...)为这些选项变量设置默认值和文档字符串。

相关问题