Как автоматически запускать функцию CMake при изменении папки - PullRequest
0 голосов
/ 18 октября 2018

У меня есть CMakeLists.txt как этот:

cmake_minimum_required (VERSION 3.10.0)

project (sqlsession)

# Creates C resources file from files in given directory
function(create_resources dir output)
    # Create UUID header guard define
    set(UUID_QUERY_NAMESPACE 6ba7b810-9dad-11d1-80b4-00c04fd430c8)
    string(
        UUID QUERY_UUID
        NAMESPACE ${UUID_QUERY_NAMESPACE}
        NAME "sqlite-query"
        TYPE MD5
    )
    string (REPLACE "-" "_" QUERY_UUID ${QUERY_UUID})
    # Create empty output file
    file(WRITE ${output} "")
    # Write headers guard start
    file(APPEND ${output} "#ifndef QUERY_${QUERY_UUID}\n#define QUERY_${QUERY_UUID}\n\n")
    # Collect input files
    file(GLOB bins ${dir}/*)
    # Iterate through input files
    foreach(bin ${bins})
        # Get short filename
        string(REGEX MATCH "([^/]+)$" filename ${bin})
        # Replace filename spaces & extension separator for C compatibility
        string(REGEX REPLACE "\\.| |-" "_" filename ${filename})
        # Read hex data from file
        file(READ ${bin} filedata HEX)
        # Convert hex data for C compatibility
        string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," filedata ${filedata})
        # Append data to output file
        file(APPEND ${output} "const char ${filename}[] = {${filedata}0x00};\nconst unsigned ${filename}_size = sizeof(${filename});\n")
    endforeach()
    file(APPEND ${output} "#endif // !QUERY_${QUERY_UUID}\n")
endfunction()

# Create Queries.hpp file that embeds all files that are contained into
# a Queries folder.
create_resources( ${CMAKE_SOURCE_DIR}/resources/${PROJECT_NAME}/Queries ${CMAKE_BINARY_DIR}/${PROJECT_NAME}/Queries/Queries.hpp)


set (CMAKE_INCLUDE_CURRENT_DIR ON)
include_directories (${CMAKE_BINARY_DIR}/${PROJECT_NAME}/Queries/)

set (PROJECT_SRC
  Session.cpp
  )

add_library (${PROJECT_NAME} SHARED ${PROJECT_SRC})

Есть функция create_resources, которую я взял из этого поста : она принимает в качестве аргумента aпапка, в которой находятся файлы и имя файла заголовка C, в который встроены файлы.Это решение, которое мне нравится, для встраивания файлов кросс-платформенным способом и без использования других систем (я знаю ресурсы Qt, но Qt не используются в этом проекте).

В этом случае я встраиваю файлы, которыенаходятся внутри папки Queries, набора файлов .sql.

Проблема в том, что когда я добавляю, удаляю или обновляю файл .sql, мне нужно повторно запустить CMake вручную, иначе файл заголовкане обновляется (обычно я прикасаюсь к файлу CMakeLists.txt и перезапускаю сборку).

Есть ли способ автоматического запуска CMake при внесении изменений в папку Queries?Поэтому мне не нужно запускать его каждый раз, когда я что-то меняю в запросах (в основном, когда я играю с Git checkout).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...