2016-03-07 2 views
4

Кажется, этот вопрос задавался очень часто, но ни одно из решений, похоже, не применяется в моем случае.Установить путь поиска компоновщика для сборки в CMake

Я в среде CMake/Linux и должен запускать исполняемый двоичный файл во время сборки (в частности, protoc).

Этот бинарный нуждается в библиотеке, но это не установлен (и не может быть) в в стандартных каталогах, как /usr, так что библиотека не может быть найден.

К сожалению, я не могу манипулировать вызовом protoc, потому что он встроен в сторонний скрипт.

Теперь я могу установить LD_LIBRARY_PATH перед каждым make или установить его в системном режиме, но это очень неудобно, особенно если речь идет о IDE, в которых происходит сборка или распределенные сценарии сборки с непрерывной средой сборки.

Я попытался установить LD_LIBRARY_PATH через

set(ENV{LD_LIBRARY_PATH} "/path/to/library/dir") 

, но это, кажется, не имеет никакого эффекта во время стадии сборки.

Итак, мой вопрос: могу ли я установить путь поиска библиотеки в CMake, который используется во время сборки?

+0

Может ли это http://stackoverflow.com/a/30455909/ помочь вам? –

+0

, к сожалению, не потому, что как библиотека, так и исполняемый исполняются в другом месте. – frans

+0

Возможно, нашел способ: попробуйте добавить к скрипту 'Cmake':' execute_process (COMMAND export LD_LIBRARY_PATH = "/ path/to/library/dir: $ LD_LIBRARY_PATH") 'Надеюсь,' Cmake' запустит ваш сторонний скрипт в subhell/current shell - тогда на него повлияет 'export'. –

ответ

0

Попробуйте

SET(ENV{LD_LIBRARY_PATH} "/path/to/library/dir:$ENV{LD_LIBRARY_PATH}") 

Я также использовал эту пакость временного изменения некоторых переменных окружения:

LD_LIBRARY_PATH="/path/to/library/dir:$LD_LIBRARY_PATH" cmake ... 

После выполнения этой строки LD_LIBRARY_PATH не изменяется в текущей оболочке.

Кроме того, я не считаю, что плохо изменить LD_LIBRARY_PATH перед вызовом cmake: export LD_LIBRARY_PATH=...

Это ничего не изменит в масштабах всей системы, но она будет использоваться для текущей оболочки, текущий процесс сборки. То же самое относится и к сборкам CI. Вы можете сохранить переменные и восстановить его после cmake вызова:

MY_LD=$LD_LIBRARY_PATH 
export LD_LIBRARY_PATH=... 
cmake... 
export LD_LIBRARY_PATH=$MY_LD 
+1

Я написал это в своем вопросе - я вас неправильно понял? :) – frans

+0

Заметьте, я добавил '$ ENV {LD_LIBRARY_PATH}' в правую часть. :) –

+1

О, и попробуйте БОЛЬШИЕ символы 'SET'. Самые большие символы, которые у вас есть;) –

0

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

add_custom_command(
    OUTPUT some_output 
    COMMAND some_command 
    ARGS some_args 
    DEPENDS some_dependencies 
    COMMENT "Running some_command some_args to produce some_output" 
    ) 

стал бы:

set(my_some_command_with_environment "source my_environment_script.sh && some_command") 
add_custom_command(
    OUTPUT some_output 
    COMMAND bash 
    ARGS -c "${my_some_command_with_environment} some_args" 
    DEPENDS some_dependencies 
    COMMENT "Running some_command some_args to produce some_output" 
    VERBATIM 
    ) 

Очевидно, что это имеет некоторые недостатки:

  • Он опирается на оболочку Баш будучи доступны.

  • Он создает сценарий среды для каждого вызова команды (проблема с производительностью), и вам придется изменять все вызовы команд, которые полагаются на переменные среды.

  • Он меняет нормальный синтаксис, когда команда выполняется командой COMMAND, а аргументы следуют за ARGS, так как теперь настоящая команда является частью ARGS.

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