2016-09-02 4 views
0

У меня есть следующие строки, которые выполняются без проблем, когда я их использую, как они есть в главном файле CMakeLists.txt.cmake: выполнить команды cmake во время установки

set (git_cmd git) 
set (git_arg rev-parse --verify HEAD) 
message(STATUS \"git cmd: ${git_cmd}\") 
execute_process(COMMAND ${git_cmd} ${git_arg} 
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 
    RESULT_VARIABLE git_result 
    OUTPUT_VARIABLE git_ver) 

message(STATUS \"git ver[${git_result}]: ${git_ver}\") 

и я получаю следующий результат, когда я исполняю Cmake

-- "gitcmd:git" 
-- "gitver[0]:3268845bbbda4af12c951d75c25913d014da48ef 

Но то, что я действительно хочу, чтобы выполнить, что заказы на время установки, когда я буду выполнять «сделать установку»

Таким образом, я прилагаю эти строки внутри установки: в качестве установки (код "LINES")

install(CODE 
       " 
set (git_cmd git) 
set (git_arg rev-parse --verify HEAD) 
message(STATUS \"git cmd: ${git_cmd}\") 
execute_process(COMMAND ${git_cmd} ${git_arg} 
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 
    RESULT_VARIABLE git_result 
    OUTPUT_VARIABLE git_ver) 

message(STATUS \"git ver[${git_result}]: ${git_ver}\") 
     " 
) 

Однако й е выходной, когда я выполняю «сделать установку», кажется, указывает Тар git_cmd не был установлен

-- git cmd: 
CMake Error at cmake_install.cmake:196 (execute_process): 
    execute_process given COMMAND argument with no value. 

Что я делаю неправильно?

Спасибо!

+0

Чтобы быть уверенным: вы понимаете, что его средства ... для ** установки ** вашего продукта, вам нужен доступ к вашему ** git ** репозиторию? Другими словами: эта установка предназначена только для разработчиков? – GhostCat

+0

@GhostCat, так как шаг установки подразумевает запуск cmake раньше, это действительно не имеет никакого значения. Если это будет опубликовано, ему понадобится _alternate_ подход для поиска версии из того, что будет включено в опубликованный пакет. Но зависит ли команда от времени настройки или времени установки, поскольку оба они работают на одном компьютере. –

ответ

1

Вы устанавливаете переменные внутри установочного скрипта, но расширяете их уже в скрипте configure!

Есть четыре варианта, как вы можете это исправить:

  1. Решают и жёстко значения во время конфигурирования:

    set (git_cmd git) 
    set (git_arg "rev-parse --verify HEAD") 
    install(CODE 
           " 
    message(STATUS \"git cmd: ${git_cmd}\") 
    execute_process(COMMAND ${git_cmd} ${git_arg} 
        WORKING_DIRECTORY \${PROJECT_SOURCE_DIR} 
        RESULT_VARIABLE git_result 
        OUTPUT_VARIABLE git_ver) 
    
    message(STATUS \"git ver[\${git_result}]: \${git_ver}\") 
         " 
    ) 
    
  2. Побег фрагмент правильно:

    install(CODE 
           " 
    set (git_cmd git) 
    set (git_arg rev-parse --verify HEAD) 
    message(STATUS \"git cmd: \${git_cmd}\") 
    execute_process(COMMAND \${git_cmd} \${git_arg} 
        WORKING_DIRECTORY \${PROJECT_SOURCE_DIR} 
        RESULT_VARIABLE git_result 
        OUTPUT_VARIABLE git_ver) 
    
    message(STATUS \"git ver[\${git_result}]: \${git_ver}\") 
         " 
    ) 
    
  3. Задайте переменные заранее, но разворачивайте их только при вставке Высокое время тоже. Я не уверен, есть ли они быть в кэше, но я подозреваю, что они делают, так что я могу добавить, что:

    set (git_cmd git CACHE "" INTERNAL) 
    set (git_arg rev-parse --verify HEAD CACHE "" INTERNAL) 
    install(CODE 
           " 
    message(STATUS \"git cmd: \${git_cmd}\") 
    execute_process(COMMAND \${git_cmd} \${git_arg} 
        WORKING_DIRECTORY \${PROJECT_SOURCE_DIR} 
        RESULT_VARIABLE git_result 
        OUTPUT_VARIABLE git_ver) 
    
    message(STATUS \"git ver[\${git_result}]: \${git_ver}\") 
         " 
    ) 
    
  4. Вместо того, чтобы пытаться получить процитировать правильно, используйте install(SCRIPT форму и поместить команды в отдельном файле.

Обратите внимание, что:

  1. В обоих случаях я избежали $ в последней строке, потому что эти переменные всегда определяются только внутри сценария и
  2. Я также избежал ${PROJECT_SOURCE_DIR}, но я я не совсем уверен, что кеш загружен. Если это не так, вам придется избегать его как \"${PROJECT_SOURCE_DIR}\" (и надеемся, что в значении не будет ").
  3. Также в первом случае я помещал значение git_arg в кавычки, потому что список будет расширяться, разделенный ; s, и это не будет правильно прочитано.

Из-за проблемы со специальными символами при повторной обработке я НЕ рекомендую первый вариант.

+0

Это все объясняет. Благодаря! –

Смежные вопросы