Cmake "set" не работает с той же переменной после вызова "find_path" - PullRequest
3 голосов
/ 15 февраля 2011

В модуле Cmake я пытаюсь найти разные пути. При некоторых обстоятельствах я хотел бы «установить» переменную после того, как я первоначально назвал «find_path» с той же самой переменной:

# general search for this include dir
find_path(LIBRARY_INCLUDE_DIR
  NAMES LibraryName/LibraryHeader.h
)

# specific option enabled by user
if(USE_OTHER_LIB)
find_path(OTHER_LIB_ROOT_DIR
  NAMES OtherLib/OtherLib.h
)
set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include)
endif(USE_OTHER_LIB)

Этот подход отлично работал в Windows XP (CMake 2.8.1). Тем не менее, он не работал под Mac OS 10.6 (CMake 2.8.3). Кто-нибудь знает, есть ли разница между версией mac / windows и как ее решить?

Большое спасибо!

1 Ответ

5 голосов
/ 22 февраля 2011

Это распространенное заблуждение о переменных «set» и CMake.

Строка:

set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include)

устанавливает локальное значение переопределения для LIBRARY_INCLUDE_DIR, которое вступает в силу для оставшейся частиобработка файла CMakeLists, но это не влияет на переменную кэша с тем же именем.Следовательно, он не виден в программах редактирования кэша cmake-gui или ccmake.

Если вы хотите сделать его видимым, вам придется принудительно ввести его значение в переменную кэшато же имя, возможно, вот так:

set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include)
set(LIBRARY_INCLUDE_DIR ${LIBRARY_INCLUDE_DIR} CACHE FILEPATH "" FORCE)

Однако это, как правило, неодобрительно, потому что тогда, когда конечный пользователь изменяет значение в программе cmake-gui, ваш код перезапишет выбор пользователя с помощью FORCE.-d значение.Итак ... Я бы порекомендовал просто использовать строку, которую вы использовали: противостоять FORCE.

Чтобы увидеть, что это действительно вступает в силу, просто добавьте этот код в конце CMakeLists.txt:

message(STATUS "LIBRARY_INCLUDE_DIR='${LIBRARY_INCLUDE_DIR}'")

Итак ... учитывая, что ваш код правильный, должно быть что-то еще, что заставляет вас думать, что что-то не так.Мне интересно, что это может быть ... возможно, ваш следующий вопрос переполнения стека.

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