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 скрипт).

Другие вопросы по тегам