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