При написании сценариев 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
.