让 CMake 不要对它不理解的来源保持沉默?

Mat*_* G. 6 cmake

假设你有一个非常简单的 CMakeLists.txt

add_executable(silent T.cpp A.asm)
Run Code Online (Sandbox Code Playgroud)

silentCMake 会愉快地生成一个用于构建, 的C++ 目标T.cpp,但会默默地删除对 的所有引用A.asm,因为它不知道如何处理后缀。

有没有办法让 CMake 大声抱怨它不理解的源文件(以帮助将 Makefile 移植到 CMake)。

Flo*_*ian 4

不幸的是,忽略未知的文件扩展名是设计使然。

如果我查看cmGeneratorTarget::ComputeKindedSources()任何未知的代码,最终都会被分类为SourceKindExtra(将其添加到生成的 IDE 文件中)。

因此,我进行了一些测试,并提出了以下脚本,该脚本通过覆盖add_executable()自身来评估可执行目标源文件的有效文件扩展名:

cmake_minimum_required(VERSION 3.3)

project(silent CXX)

file(WRITE T.cpp "int main() { return 0; }")
file(WRITE T.h "")
file(WRITE A.asm "")

function(add_executable _target)
    _add_executable(${_target} ${ARGN})

    get_property(_langs GLOBAL PROPERTY ENABLED_LANGUAGES)
    foreach(_lang IN LISTS _langs)
        list(APPEND _ignore "${CMAKE_${_lang}_IGNORE_EXTENSIONS}")
    endforeach()

    get_target_property(_srcs ${_target} SOURCES)
    foreach(_src IN LISTS _srcs)
        get_source_file_property(_lang "${_src}" LANGUAGE)
        get_filename_component(_ext "${_src}" EXT)
        string(SUBSTRING "${_ext}" 1 -1 _ext) # remove leading dot
        if (NOT _lang AND NOT _ext IN_LIST _ignore)
            message(FATAL_ERROR "Target ${_target}: Unknown source file type '${_src}'")
        endif()
    endforeach()
endfunction()

add_executable(silent T.cpp T.h A.asm)
Run Code Online (Sandbox Code Playgroud)

由于您希望 CMake 大声抱怨,因此我FATAL_ERROR在此示例实现中声明了它。