标签: cmake-language

如何忽略子目录中的所有 cmake dev 警告?

我正在使用一些外部库,这些库作为 git 子模块包含在该add_subdirectory命令中。其中一些正在使用旧版本的 cmake,并发出有关策略 CMP0048 和 CMP0077 的警告。

有没有办法关闭这些库的所有 cmake 警告?

我尝试在包含项目之前明确设置策略,OLD但没有帮助。

我不想编辑 git 子模块中的任何文件,因为当有人必须克隆我的项目的存储库并在他们的计算机上构建它时,就会有额外的步骤。

cmake cmake-modules cmake-language

9
推荐指数
1
解决办法
666
查看次数

CMake - if() 命令如何处理符号?作为字符串还是作为变量?

我不确定 CMakeif()命令是否会将条件子句中的符号视为变量字符串文字。所以我做了一些实验。

脚本1.cmake

cmake_minimum_required(VERSION 3.15)

set(XXX "YYY") #<========== HERE!!

if(XXX STREQUAL "XXX")
    message("condition 1 is true") # If reach here, XXX is treated as string
elseif(XXX STREQUAL "YYY")
    message("condition 2 is true") # If reach here, XXX is treated as variable
endif()
Run Code Online (Sandbox Code Playgroud)

输出是:

condition 2 is true
Run Code Online (Sandbox Code Playgroud)

所以我得出结论1

对于条件子句中的符号:

  • 如果之前将符号定义为变量,CMake 会将其视为变量并使用其值进行评估。
  • 如果之前没有将符号定义为变量,CMake 会将其视为字符串。

然后我又做了一个实验。

set(ON "OFF")
if(ON)
    message("condition 3 is true") # If reach here, ON …
Run Code Online (Sandbox Code Playgroud)

cmake cmake-language

6
推荐指数
1
解决办法
679
查看次数

CMake 中的 INTERFACE IMPORTED 库是什么?它的用途是什么?

到目前为止,我已经看到INTERFACE用于描述仅标头库的库类型,因为它不编译源代码并且不生成库工件。我见过的库类型IMPORTED较少,但从我读到的内容来看,它用于描述已经在磁盘上的预编译库。

我最近看到一些带有IMPORTED INTERFACE库类型的代码,并且对为什么使用它感到困惑。这种类型有哪些属性,这种类型的一些典型用例是什么?

cmake cmake-language

5
推荐指数
1
解决办法
3772
查看次数

带有使用多个值的生成器表达式的 CMake set_property 命令

我将 CMake v3.13.4 与Visual Studio 2017 Win64生成器一起使用,我需要修改 Visual Studio Librarian(对于 CMake 对象库)的命令行选项。

\n\n

为了实现这一点,CMake 提供了可以通过and命令STATIC_LIBRARY_OPTIONS设置的目标属性。set_propertyset_target_properties

\n\n

文档指出STATIC_LIBRARY_OPTIONS支持生成器表达式:

\n\n
\n

的内容STATIC_LIBRARY_OPTIONS可以使用 \xe2\x80\x9c 生成器表达式\xe2\x80\x9d 和\n 语法$<...>。有关可用表达式,请参阅cmake-generator-expressions(7) \n 手册。有关定义构建系统属性的更多信息,请参阅cmake-buildsystem(7) \n 手册。

\n
\n\n

但是:无论我尝试什么,这些值都没有正确转义\xc2\xb4,例如

\n\n
set_property(TARGET object_library PROPERTY STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Visual Studio 中会导致以下结果:

\n\n
All Options: `/OUT:"..." /LTCG /MACHINE:X64 /NOLOGO \nAdditional Options: %(AdditionalOptions) /machine:x64 ""$"<1:/WX" "/ERRORREPORT:NONE>"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试了以下方法,但似乎都失败了。

\n\n
set_property(TARGET object_library PROPERTY\n  STATIC_LIBRARY_OPTIONS …
Run Code Online (Sandbox Code Playgroud)

build cmake visual-studio cmake-language

4
推荐指数
1
解决办法
4526
查看次数

如何在 CMake 中使用分号值创建列表?

我认为它应该是非常微不足道的,但似乎不支持它......在 CMake 中是否有可能让列表的一个值包含分号?

原因非常简单 - 因为我在 Windows 上运行,而在 Windows 上,分号是一个环境变量中两个或多个文件夹之间的分隔符(即PATH)。

    list(
      APPEND
      MY_TEST_ENVIRONMENT
      "MY_FLAG=1"
    )

    # <...>

    list(
      APPEND
      MY_TEST_ENVIRONMENT
      "PATH=first_folder_path;second_folder_path"
    #                        ^--- here is the problem
    )

    # <...>


   set_property(TEST MyTests PROPERTY ENVIRONMENT ${MY_TEST_ENVIRONMENT})
Run Code Online (Sandbox Code Playgroud)

我尝试删除和添加双引号,我尝试转义\;,我尝试添加相同的环境变量两次 - 但这些都不起作用!

windows makefile list cmake cmake-language

4
推荐指数
1
解决办法
3151
查看次数

如何在CMake中查询目标是否是INTERFACE库

在现代 CMake 中,可以将库指定为INTERFACE:它不生成构建输出,但它可以具有与其关联的属性,尽管并非所有属性都可以设置(例如FOLDER不支持该属性)。假设我有一个通用 CMake 宏为通用库目标设置属性,有没有办法告诉输入目标是接口库,以便我可以仅跳过该目标不受支持的属性?

cmake cmake-language

3
推荐指数
1
解决办法
1782
查看次数

为什么我的 INCLUDE_DIRECTORIES 和 INTERFACE_INCLUDE_DIRECTORIES 属性在 Cmake 中为空?

target_include_directories在此代码中,我在属性 INCLUDE_DIRECTORIES 和 INTERFACE_INCLUDE_DIRECTORIES 中添加字符串“${PROJECT_BINARY_DIR}”。但是,当我运行 Cmake 时,我发现命令中message这两个属性为空。

cmake_minimum_required(VERSION 3.10)

# set the project name and version
project(Tutorial VERSION 1.0)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# configure a header file to pass some of the CMake settings
# to the source code
configure_file(TutorialConfig.h.in TutorialConfig.h)

# add the executable
add_executable(Tutorial tutorial.cxx)

# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
target_include_directories(Tutorial
                            PUBLIC "${PROJECT_BINARY_DIR}"
                           )

get_property(inc_dirs …
Run Code Online (Sandbox Code Playgroud)

cmake cmake-language

3
推荐指数
1
解决办法
318
查看次数

我可以控制 CMake 中 target_sources 的源排除吗?

我是 CMake 的新手,我想知道是否有可能target_sources()根据变量排除某些来源。

假设我在下面有这个

target_sources(myTarget
    PUBLIC
    PRIVATE
        myDir1/src/a.c
        myDir2/src/b.c
        myDir3/src/c.c      
    INTERFACE
)

target_include_directories(myTarget
    PUBLIC
    PRIVATE       
        myDir1/inc
        myDir2/inc
        myDir3/inc  
    INTERFACE
)
Run Code Online (Sandbox Code Playgroud)

我想根据名为 ie 的标志从 myDir3 中排除/包含源/目录myFlag。我怎样才能做到这一点?

target_sources(myTarget
    PUBLIC
    PRIVATE
        myDir1/src/a.c
        myDir2/src/b.c
        if(DEFINED myFlag)
           myDir3/src/c.c
        endif()
    INTERFACE
)

target_include_directories(myTarget
    PUBLIC
    PRIVATE        
        myDir1/inc
        myDir2/inc
        if(DEFINED myFlag)
           myDir3/inc  
        endif()
    INTERFACE
)
Run Code Online (Sandbox Code Playgroud)

cmake cmake-language cmakelists-options

1
推荐指数
1
解决办法
108
查看次数

CMake add_custom_command() POST_BUILD 生成器表达式扩展不起作用

我想在构建后运行 POST_BUILD 操作(但仅在调试配置中)。

在阅读了add_custom_command 文档可能的解决方案后,我明白我可以将我的命令“包装”到$<CONFIG:Debug>生成器表达式中(以确保它在发布模式下为“空”)。

我尝试了以下方法:

cmake_minimum_required(VERSION 3.18)

project(post-build CXX)
file(WRITE main.cxx "int main() {}")
add_executable(foo main.cxx)

add_custom_command(
  TARGET foo POST_BUILD
  COMMAND $<$<CONFIG:Debug>:${CMAKE_COMMAND} -E echo "hi there from debug build">
)
Run Code Online (Sandbox Code Playgroud)

但这给了我 CMake 配置时警告和构建时的硬故障(使用 Ninja 生成器):

(...) && "$<1:C:\Program Files\CMake\bin\cmake.exe" -E echo "hi there from debug build" >""
[build] The system cannot find the path specified.
[build] ninja: build stopped: subcommand failed.
[build] Build finished with exit code 1
Run Code Online (Sandbox Code Playgroud)

我尝试了许多可能的引号组合(包括转义引号):
COMMAND $<$<CONFIG:Debug>:"${CMAKE_COMMAND} …

cmake cmake-language

0
推荐指数
1
解决办法
1197
查看次数