CMake и странное поведение при вызове пользовательской функции - PullRequest
0 голосов
/ 01 октября 2018

У меня большой проект.В корневом каталоге я создал файл CMake\optionalsource.cmake (в каталоге CMake находятся другие вспомогательные файлы), который содержит определения этой функции:

cmake_minimum_required(VERSION 3.5)
# cmake_parse_arguments needs cmake 3.5

##
# This function always adds sources to target, but when "WHEN" condition is not meet
# source is excluded from build process.
# This doesn't break build, but source is always visible for the project, what is 
# very handy when working with muti-platform project with sources needed
# only for specific platform
#
# Usage:
#      target_optional_sources(WHEN <condition> 
#                              TARGET <target>
#                              <INTERFACE|PUBLIC|PRIVATE> [items2...]
#                              [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
##
function(target_optional_sources)
    set(options OPTIONAL "")
    set(oneValueArgs WHEN TARGET)
    set(multiValueArgs PUBLIC PRIVATE INTERFACE)

    cmake_parse_arguments(target_optional_sources 
                          "${options}" "${oneValueArgs}" "${multiValueArgs}"
                          ${ARGN})

    # for debugging purposes 
    message("TARGET ${target_optional_sources_TARGET}")
    message("PUBLIC ${target_optional_sources_PUBLIC}")
    message("PRIVATE ${target_optional_sources_PRIVATE}")
    message("INTERFACE ${target_optional_sources_INTERFACE}")
    message("WHEN ${target_optional_sources_WHEN} ${${target_optional_sources_WHEN}}")

    target_sources(${target_optional_sources_TARGET}
                   PUBLIC ${target_optional_sources_PUBLIC}
                   PRIVATE ${target_optional_sources_PRIVATE}
                   INTERFACE ${target_optional_sources_INTERFACE})

    if (NOT ${target_optional_sources_WHEN})

        set_source_files_properties(${target_optional_sources_PUBLIC}
                                    PROPERTIES HEADER_FILE_ONLY TRUE)
        set_source_files_properties(${target_optional_sources_PRIVATE}
                                    PROPERTIES HEADER_FILE_ONLY TRUE)
        set_source_files_properties(${target_optional_sources_INTERFACE}
                                    PROPERTIES HEADER_FILE_ONLY TRUE)

    endif(NOT ${target_optional_sources_WHEN})

endfunction(target_optional_sources)

Он входит в корневой каталог CMakeLists.txt.Теперь эта функция довольно проста.Это было мотивировано этим хорошим SO-ответом и этим запросом функции для CMake .

Теперь у меня возникла странная проблема.Мой проект содержит много целей (libs / dlls / execs), я использовал эту функцию в одном месте, например:

add_library(CommonLibrary STATIC
    <list of mutliplatform sources>
)  

message("=== function CommonLibrary ===")
target_optional_sources(WHEN APPLE 
                        TARGET  CommonLibrary
                        PUBLIC
                                macos/CFUtils.cpp
                                macos/CFUtils.h
                                MacMachineData.mm
                                MacMachineData.h
                                macos/MacAutoreleasePool.mm
                                macos/MacAutoreleasePool.h
                        )

И в журналах я вижу это:

1>=== function CommonLibrary ===
1>TARGET CommonLibrary
1>PUBLIC macos/CFUtils.cpp;macos/CFUtils.h;MacMachineData.mm;MacMachineData.h;macos/MacAutoreleasePool.mm;macos/MacAutoreleasePool.h
1>PRIVATE
1>INTERFACE
1>WHEN APPLE

Нониже я вижу следующие сообщения об ошибках:

1>CMake Error at SomeOtherLib1/CMakeLists.txt:34 (add_executable):
1>  Cannot find source file:
1>
1>    macos/CFUtils.cpp
1>
1>  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .m .M .mm .h .hh .h++ .hm
1>  .hpp .hxx .in .txx
1>
1>
1>CMake Error at SomeOtherLib2/CMakeLists.txt:11 (add_executable):
1>  Cannot find source file:
1>
1>    macos/CFUtils.cpp
1>
1>  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .m .M .mm .h .hh .h++ .hm
1>  .hpp .hxx .in .txx
1>
1>
1>CMake Error at UnitTests/CMakeLists.txt:11 (add_executable):
1>  Cannot find source file:
1>
1>    macos/CFUtils.cpp
1>
1>  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .m .M .mm .h .hh .h++ .hm
1>  .hpp .hxx .in .txx
1>

macos/CFUtils.cpp был добавлен только путем вызова моей пользовательской функции, так как, возможно, что другие файлы CMakeLists.txt были затронуты успешным вызовом функции?Когда я переупорядочиваю файлы в сообщениях об ошибках вызова функций, следуют за этим изменением.

Что более странно в Visual Studio, эти ошибки приводят к появлению отчета об ошибках, но файлы проекта успешно восстанавливаются, и все работает.Я не могу жить так, как есть, так как это вызовет проблемы со сборкой на компьютере Jenkins.


Редактировать :

Вот как CommonLibrary связанок другим целям, например:

add_executable(TestApp
    <Test app sources>
)

target_link_libraries(TestApp
    PRIVATE
        fmt::fmt-header-only
        CommonLibrary
        SomeOtherLibrary
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...