cmake add_custom_command не работает
Я пытаюсь бежать gperf
из cmake
файл.
Я создал очень минимальный 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)
1 ответ
Файлы, созданные генераторами исходных файлов(например, 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
скрипт).