clion запускать cmake на каждой сборке

Я не уверен, что это возможно сделать с помощью clion, я тестировал программу и с удовольствием использовал ее для написания кода на C, потому что поддержка ctags и etags действительно хороша.

Я копирую некоторые файлы из исходного дерева cmake в расположение корзины в каждой сборке. При использовании clion, если я обновляю некоторые файлы, которые я копирую, результаты не обновляются в clion.

Если вместо этого я вернусь к терминалу и просто выполню типичные шаги cmake

cmake ../ && make && bin/./program

который копирует обновленные файлы, и я могу видеть свои результаты.

Это команда CMake, которую я использую в своей сборке.

FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/resources/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/bin/resources/)

Возможно, я смогу реструктурировать команду cmake, чтобы она копировалась каждый раз, или это может быть просто проблема clion. Я не уверен и хотел бы иметь возможность позаботиться обо всем этом из clion, вместо того, чтобы возвращаться к терминалу, чтобы запустить команду cmake, чтобы обновления вступили в силу.


person user1610950    schedule 05.08.2015    source источник


Ответы (1)


Если вы хотите, чтобы CMake выполнял какое-либо действие при изменении какого-либо файла, вы должны создать правило, используя add_custom_command, и передать файл через аргумент DEPENDS. Обратите внимание, что CMake поддерживает только зависимости на уровне файлов, для создания зависимости от каталога вам необходимо перечислить все файлы в нем.

# Collect list of files within directory.
FILES(GLOB files_list RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/resources/
    "${CMAKE_CURRENT_SOURCE_DIR}/resources/*") 
# This will contain full paths to files in binary directory. 
set(binary_files_list)
foreach(file ${files_list})
    set(source_file ${CMAKE_CURRENT_SOURCE_DIR}/resources/${file})
    set(binary_file ${CMAKE_CURRENT_BINARY_DIR}/bin/resources/${file})
    add_custom_command(OUTPUT ${binary_file}
        COMMAND cmake -E ${source_file} ${binary_file}
        DEPENDS ${source_file})
    list(APPEND binary_files_list ${binary_file})
endforeach()
add_custom_target(resources DEPENDS ${binary_files_list})

Обратите внимание, что в случае добавления/удаления файлов вы должны запускать cmake явно. Вот почему жестко заданный список файлов предпочтительнее, чем GLOBing.

person Tsyvarev    schedule 05.08.2015
comment
один рудный вопрос, так как я знаю, к каким файлам я обращаюсь в своем исходном коде. Есть ли способ составить список файлов и передать их в cmake, который затем можно использовать? например, в моем коде C я ссылаюсь на filea.txt, могу ли я передать его обратно в cmake? Тогда вместо того, чтобы подбирать файлы, у меня просто сборка автоматически считывает список файлов и обновляет их соответствующим образом? - person user1610950; 05.08.2015
comment
Вы можете создать файл, который выглядит как set(files_list ...) и include из CMakeLists.txt. Всякий раз, когда этот файл будет изменен (например, при сборке проекта), следующий вызов make вызовет этап перенастройки. Если вам нужна более подробная информация, пожалуйста, задайте новый вопрос. - person Tsyvarev; 05.08.2015
comment
спасибо, я задам новый вопрос, если я не могу разобраться. - person user1610950; 05.08.2015