2015-10-13 3 views
2

Я пытаюсь запустить gperf из файла cmake.cmake add_custom_command не работает

Я создал (был) минимально CMakeLists.txt.

Когда я запускаю его

$ cmake . 
$ make 

Это не создает файл example.hpp

Что может быть проблема с ниже CMakeLists.txt?

cmake_minimum_required(VERSION 2.6) 

function(gperf_generate_new source target) 

     add_custom_target(${target} echo "Creating ${target}") 

     add_custom_command(
       SOURCE ${source} 
       TARGET ${target} 
       COMMAND gperf -L c++ ${source} > ${target} 
       OUTPUTS ${target} 
       DEPENDS ${source} 
       ) 

endfunction() 

gperf_generate_new(command_options.new.gperf example.hpp) 
+0

Проверьте [это] (http://stackoverflow.com/questions/2354473/cmake-add-custom-command?rq=1) и [это] (http://stackoverflow.com/questions/17696872/cmake -add-custom-command-that-is-execute-on-every-build? rq = 1) Q/As. Вероятно, ваш вопрос является дубликатом. – user3159253

+0

Проблема с вашим файлом CMakeLists.txt заключается в том, что вы используете неправильные опции для 'add_custom_command': опция' SOURCE' полностью не связана с этой командой, 'OUTPUTS' должна быть' OUTPUT' и не должна смешиваться с опцией 'TARGET' ('OUTPUT' и' TARGET' используются для * разных потоков * этой команды). ** CMake [documentation] (https://cmake.org/cmake/help/cmake2.6docs.html#section_Commands) точно описывает сигнатуры команд **, не нужно угадывать, какая дополнительная опция может принять ту или иную команду. – Tsyvarev

ответ

3

Файлы, произведенный источник-файлы генераторов (как gpref) редко нужны как автономные. Вместо этого эти исходные файлы обычно используются для создания исполняемых файлов или библиотек внутри проекта.

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

# Call add_custom_command() with appropriate arguments for generate output file 
# Note, that *gperf* will work in the build tree, 
# so for file in the source tree full path should be used. 
function(gperf_generate_new input output) 
    add_custom_command(
     OUTPUT ${output} 
     COMMAND gperf -L c++ ${input} > ${output} 
     DEPENDS ${input} 
     COMMENT "Generate ${output}" # Just for nice message during build 
    ) 
endfunction() 

# Generate *example.hpp* file ... 
gperf_generate_new(${CMAKE_CURRENT_SOURCE_DIR}/command_options.new.gperf example.hpp) 

# ... for use it in executable 
add_executable(my_program ${CMAKE_CURRENT_BINARY_DIR}/example.hpp <other sources>) 

Если вы хотите только проверить генерирует ли example.hpp, вместо add_executable() использования

add_custom_target(my_target 
    ALL # Force target to be built with default build target. 
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/example.hpp 
) 

Примечание , эта связь между add_custom_command и add_custom_target выражается с использованием того же имени файла в их OUTPUT и DEPENDS вариантах соответственно. При таком порядке ссылок эти команды несущественны (но обе команды должны вызываться из того же сценария CMakeLists.txt).

+0

на моей системе сборки она работала только тогда, когда я изменил его на add_custom_target (my_target целевой ALL # Force будет построен с целью сборки по умолчанию. ЗАВИСИТ $ {CMAKE_CURRENT_BINARY_DIR} /example.hpp ) –

+1

Для меня это работает неизмененной, но CMake явно не документирует использование относительных путей в опции 'DEPENDS' для' add_custom_target'. Я исправил свой пост. – Tsyvarev