CMake усекает значения, переданные в функцию - PullRequest
1 голос
/ 26 апреля 2019

Я создал функцию в CMake, которая должна принимать два параметра, один из которых является строкой, а другой - списком исходных файлов. Проблема в том, что CMake усекает список переменных, переданных в функцию, и я получаю только первый файл:

set(
  INCLUDES
    ${PROJECT_SOURCE_DIR}/include/smthcore/Interface.hpp
)

set(
  SRC
    ${PROJECT_SOURCE_DIR}/src/Interface.cpp
    ${PROJECT_SOURCE_DIR}/src/detail/Class.hpp
    ${PROJECT_SOURCE_DIR}/src/detail/Class.cpp
)

set(
  TO_FORMAT
    ${INCLUDES} 
    ${SRC}
)

message("111 " ${TO_FORMAT})
include(ClangFormat)
format_source(src ${TO_FORMAT})

где message отпечатки

/mnt/c/Users/Desktop/smth.Core/include/smthcore/Interface.hpp/mnt/c/Users/Desktop/smth.Core/src/Interface.cpp/mnt/c/Users/Desktop/smth.Core/src/detail/Class.hpp/mnt/c/Users/Desktop/smth.Core/src/detail/Class.cpp

но внутри format_source у меня

function(FORMAT_SOURCE trgt to_format)
message("222 " ${trgt})
message("333 " ${to_format})
endfunction(FORMAT_SOURCE trgt to_format)

и 333 отпечатка

333 /mnt/c/Users/Desktop/smth.Core/include/smthcore/Interface.hpp

Я очень смущен. Помощь

1 Ответ

2 голосов
/ 26 апреля 2019

При написании сценариев CMake важно помнить, что в текстовом вводе CMake пробел и ; являются допустимыми разделителями аргументов (1) .Другими словами, вы вызываете не функцию с 2 аргументами, а с 5 из них (каждый элемент списка TO_FORMAT становится отдельным аргументом для format_source).

Существует несколько способоврешить это.Минимальное - заключить в кавычки расширение TO_FORMAT, чтобы превратить его в один аргумент, например:

format_source(src "${TO_FORMAT}")

Однако это подвержено ошибкам и не соответствует стилю, используемому большинством родных CMake.команды.Поэтому я бы предложил другой подход, чтобы заставить format_source принять произвольное количество аргументов (аналогично тому, как команды CMake, такие как add_executable или target_link_libraries do):

function(FORMAT_SOURCE trgt)
message("222 " ${trgt})
message("333 " ${ARGN})
endfunction()

(1) Обратите внимание, что вы можете заметить это в самом поведении message(), которое по умолчанию печатает прямую конкатенацию своих аргументов.Когда вы называете это так:

message("111 " ${TO_FORMAT})

между элементами TO_FORMAT нет разделителей: каждый из них формирует отдельный аргумент для message.Однако, если бы вы назвали это так:

message("111 " "${TO_FORMAT}")

, то элементы будут разделены точками с запятой, потому что весь список (который точно такой же , что и точка с запятой).разделенная строка) становится одним аргументом message.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...