Как заставить CMake target_include_directories () использовать абсолютный путь - PullRequest
1 голос
/ 11 июля 2020

Как заставить функцию CMake target_include_directories() обрабатывать значение как абсолютный путь?

Например, я хочу, чтобы эта строка кода:

target_include_directories(foobar  PRIVATE   "%FOOBAR_INCLUDE%")

просто добавляла %FOOBAR_INCLUDE% в список включаемых каталогов.

Однако на самом деле мы получаем c:\path\to\foobar\%FOOBAR_INCLUDE%.

I знаю , что я мог бы сделать

target_include_directories(foobar  PRIVATE   "$ENV{FOOBAR_INCLUDE}")

но я не этого хочу. Это расширит значение переменной среды и вставит текущую настройку значения FOOBAR_INCLUDE.

Нам нужно, чтобы она просто pu sh переменная среды, а затем во время разработки разработчики изменят значение FOOBAR_INCLUDE вручную без необходимости каждый раз перезапускать CMake.

1 Ответ

1 голос
/ 11 июля 2020

Невозможно таким образом добавить что-то похожее на относительный каталог (например, "%FOOBAR_INCLUDE%") в подключаемые каталоги. CMake всегда будет пытаться преобразовать их в абсолютные пути. Это более или менее указано в документации include_directories:

Относительные пути интерпретируются относительно текущего исходного каталога.

но применимо и к команде target_include_directories().

Даже если вы попытаетесь обойти это и установить свойство INCLUDE_DIRECTORIES цели вручную:

set_target_properties(foobar PROPERTIES
    INCLUDE_DIRECTORIES "%FOOBAR_INCLUDE%"
)

CMake выдаст ошибка на этапе генерации:

CMake Error in CMakeLists.txt:
  Found relative path while evaluating include directories of "foobar":

    "%FOOBAR_INCLUDE%"

Вы могли пойти на компромисс, предоставив полный путь, но позволив переменной %FOOBAR_INCLUDE% остаться:

target_include_directories(foobar PRIVATE "C:/%FOOBAR_INCLUDE%")

, но это привязывает вас и ваших коллег-разработчиков к диску C:.

Я бы порекомендовал следовать предложенному вами пути, используя переменную среды:

target_include_directories(foobar  PRIVATE   "$ENV{FOOBAR_INCLUDE}")

или создав переменную FOOBAR_INCLUDE CMake cache , которую каждый разработчик может заполнить перед тем, как они перезапустите CMake. Если среда каждого разработчика отличается, CMake следует перенастроить для соответствия этой среде.

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