CMake переходить по символическим ссылкам во время установки - PullRequest
4 голосов
/ 14 февраля 2012

Короткий вопрос: Можно ли настроить CMake на использование символических ссылок при копировании файлов во время установки, и если да, то как это сделать?

Подробности: Я использую CMake для сборки и установки LLVM. В моем исходном дереве LLVM в каталоге include у меня есть символическая ссылка на другой подпроект, который разрабатывается для LLVM. Кажется, все работает, за исключением того, что я заметил, что когда я запустил «cmake install», он скопировал каталог include, не следуя символическим ссылкам. Проблема, которая у меня есть, заключается в том, что мои символические ссылки имеют относительный путь (потому что он находится внутри git-репо). Поэтому, когда символические ссылки копируются (вместо того, чтобы следовать и копировать содержимое), они больше не указывают на правильные файлы. Например, у меня есть dsa -> ../../llvm-poolalloc/include/dsa/ Я хотел бы скопировать содержимое этой ссылки, когда я делаю установку, а не просто копировать ссылку. Но я пока не нашел флаг cmake для этого.

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

Обратите внимание, что я работаю в Linux (Ubuntu 10.04) и использую LLVM 2.6 (которую я компилирую из исходного кода вместе с llvm-gcc). Также я использую CMake версии 2.8.

Edit:

Вот исходный код из файла CMakeLists.txt, который связан с инструкцией по установке:

install(DIRECTORY include
  DESTINATION .
  PATTERN ".svn" EXCLUDE
  PATTERN "*.cmake" EXCLUDE
  PATTERN "*.in" EXCLUDE
  PATTERN "*.tmp" EXCLUDE
  )

install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include
  DESTINATION .
  )

каталог для включаемого каталога:

dsa -> ../../llvm-poolalloc/include/dsa/
llvm
llvm-c
poolalloc -> ../../llvm-poolalloc/include/poolalloc

Я хочу, чтобы каталоги dsa и poolalloc копировались, а не просто копировались символические ссылки. Причина, по которой я не использую абсолютные пути в символических ссылках, заключается в том, что я проверил их в git-репо. Таким образом, мой абсолютный путь будет отличаться от тех, кто работает над проектом, когда они извлекают деньги из репо.

1 Ответ

4 голосов
/ 15 февраля 2012

Хм, давайте попробуем это:

get_filename_component(ABS_DIR include REALPATH)

install(DIRECTORY ${ABS_DIR}
  DESTINATION .
  PATTERN ".svn" EXCLUDE
  PATTERN "*.cmake" EXCLUDE
  PATTERN "*.in" EXCLUDE
  PATTERN "*.tmp" EXCLUDE
  )

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

file(GLOB INCLUDES include/*) # filter there .svn and others

install(FILES ${INCLUDES}
  DESTINATION include
)

Наконец, сделайте символическую ссылку абсолютной.

...