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

时间:2017-07-05 15:28:36

标签: cmake

Suppose you have a very simple CMakeLists.txt

add_executable(silent T.cpp A.asm)

CMake很乐意生成一个用于构建silent的C ++目标,其中包含T.cpp,但会默默地删除对A.asm的所有引用,因为它不知道该怎么做做后缀。

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

2 个答案:

答案 0 :(得分:3)

根据您的情况,忽略未知的文件扩展名 - 按设计。

如果我查看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)

由于你想要一个CMake的大声抱怨,我在这个示例实现中声明它是FATAL_ERROR

答案 1 :(得分:1)

CMake不仅会删除add_executable()中的未知文件。

如果与

一起
add_executable(silent T.cpp A.asm)

你有

add_custom_command(OUTPUT A.asm COMMAND <...>
    DEPENDS <dependees>)

然后每当<dependees>更改时,CMake将在编译可执行文件之前重新运行create A.asm命令。

请注意,自动标头扫描不提供此类功能:如果您的可执行文件包含foo.h,则仅当foo.h 本身改变了。创建此标头的任何自定义命令都将被忽略

但是,您可以通过重新定义来更改<{em}} {/ em>行为。有关此类重新定义的示例,请参阅@ Florian的答案。