Переменная CMake ENV принимает только одно значение - PullRequest
0 голосов
/ 06 апреля 2020

Я новичок в CMake. Я пытаюсь создать список исходных файлов C ++ и создать исполняемый файл с использованием этих исходных файлов. Чтобы избежать прохождения списка по одному уровню за раз, я использую переменную окружения. Однако не все перечисленные источники добавляются в env var, только первый.

Вот что у меня есть:

Структура каталогов:

<root>
├─ build
│  ├─ <snip>
├─ src
│  ├─ something
│  │  ├─ CMakeLists.txt
│  │  ├─ a.cpp
│  │  ├─ a.h
│  │  ├─ b.cpp
│  │  └─ b.h
│  ├─ CMakeLists.txt
│  └─ main.cpp
├─ CMakeLists.txt

root / CMakeLists.txt:

cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR)

project(samplecpp VERSION "0.1.0" LANGUAGES CXX)

# ---- SOURCES ----

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)

set(ENV{MY_SOURCES} "")

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src)

message(STATUS "MY_SOURCES = " $ENV{MY_SOURCES})

# ---- EXECUTABLE ----

add_executable(samplecpp ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp $ENV{MY_SOURCES})

root / src / CMakeLists.txt:

add_subdirectory(something)

root / src / что-то / CMakeLists.txt:

set(
    ENV{MY_SOURCES}
    $ENV{MY_SOURCES}
    ${CMAKE_CURRENT_SOURCE_DIR}/a.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b.cpp
)

Выполняется cmake должен напечатать сообщение MY_SOURCES = root/src/something/a.cpproot/src/something/b.cpp, но я получу только MY_SOURCES = root/src/something/a.cpp. Из-за этого cmake --build завершается с ошибкой:

<root>/src/main.cpp:11: undefined reference to `B::do_b()'

Что я делаю не так?

На всякий случай вот пример на github

1 Ответ

2 голосов
/ 06 апреля 2020

Это не указано в документации , но установка переменной environment допускает только значение single :

set(ENV{name} value)

Before Версия 3.14 CMake беззвучно игнорирует другие значения.

Начиная с версии 3.14 CMake выдает предупреждение , когда передано более одного значения:

При установке переменной среды используется только первый аргумент значения.

Источник: Source / cmSetCommand.cxx


Назначение по-прежнему возможно список переменной среды, используя строку , разделенную точкой с запятой представление:

# Don't work: assigns only 'a' and emits warning in CMake 4.14+
set(ENV{MY_SOURCES} a b c)
# Works: assign list of 'a', 'b', 'c' elements
set(ENV{MY_SOURCES} "a;b;c")
# The same but using intermediate CMake variable
set(MY_SOURCES_TMP a b c)
set(ENV{MY_SOURCES} "${MY_SOURCES_TMP}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...