Cmake: как запустить команду bash только при обновлении файла? - PullRequest
5 голосов
/ 10 января 2011

Я пытаюсь написать CMakeLists.txt для ускорения компиляции.

Исполняемый файл зависит от сгенерированного скриптом файла .cpp: я использую библиотеку веб-приложений cppcms, в которой есть система шаблонов, где .tmpl должен быть преобразован в файлы .cpp во время компиляции следующим образом:

cppcms_tmpl_cc page.tmpl -o page.cpp

Есть связанные вопросы, которые касаются использования команд bash в cmake:
Как запустить команду во время компиляции в Makefile, сгенерированном CMake?
CMake: как использовать команду bash в CMakeLists.txt
Эти вопросы покрывают большинство моих потребностей.

Теперь я хочу узнать, как заставить cmake выполнить указанную выше команду и заново генерировать page.cpp при каждом изменении самого page.tmpl, и только после этого?

Очевидно, что цель состоит в том, чтобы улучшить время компиляции и получить обновленный двоичный файл с последним шаблоном.

(может ли модератор добавить тег cppcms?)

[Edit: я на самом деле пытаюсь преобразовать следующий Makefile в cmake:

LIBS=-lcppcms -lconfig++ -lboost_filesystem-mt

all: clean gitbrowser

gitbrowser: main.cpp view.cpp content.hpp gitbrowser.cpp
       $(CXX) -Wall main.cpp gitbrowser.cpp view.cpp -o run ${LIBS}

view.cpp: page.tmpl content.hpp
       cppcms_tmpl_cc page.tmpl -o view.cpp

[Edit2: я добавил примечание о решении в официальной вики cppcms:
http://art -blog.no-ip.info / wikipp / EN / страница / cppcms_1x_howto # How.to.compile.the.templates.with.cmake .

Ответы [ 2 ]

4 голосов
/ 10 января 2011
now = get_now_time()
time = get_last_upd_time()
if (now > time)
  set (LAST_UPD_TIME time CACHE INTERNAL "Defines last update time of the file" FORCE)
  # run bash command here
endif (now > time)

get_now_time и get_last_upd_time - вымышленные функции, возвращающие временные метки (я думаю, вы можете использовать команды bash для получения этих временных меток).Затем вы можете сравнить их и сохранить метку времени последнего изменения в кеше.

Однако это решение выглядит для меня безобразно, так как я знаю, правильно ли вы определите цели и зависимости между ними.только измененные файлы, не так ли?Не могли бы вы показать мне определения целей?

edit

Вы можете использовать следующий файл CMakeLists.txt (хотя я не уверен, что он основан на моем проекте):

# add main target, the executable file
ADD_EXECUTABLE(gitbrowser main.cpp view.cpp content.hpp gitbrowser.cpp)
# linking it with necessary libraries
TARGET_LINK_LIBRARIES(gitbrowser "cppcms config++ boost_filesystem-mt")

# add page.cpp target
ADD_CUSTOM_COMMAND(
    OUTPUT page.cpp 
    COMMAND "cppcms_tmpl_cc page.tmpl -o view.cpp" 
    DEPENDS page.tmpl content.hpp
)
# and finally add dependency of the main target
ADD_DEPENDENCIES(gitbrowser page.cpp)

Удачи

1 голос
/ 10 января 2011

Взгляните на этот CMake файл Wikipp строк 66-72

Вам в основном нужно что-то вроде этого:

add_custom_command(
   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/view.cpp
   COMMAND cppcms_tmpl_cc
               view.tmpl
               -o ${CMAKE_CURRENT_BINARY_DIR}/view.cpp
   DEPENDS view.tmpl) 

Редактировать: Также, если вы хотите улучшить скорость компиляции, вы можете скомпилировать просмотр общего объекта и его динамическая загрузка.

Это также позволит вам не перезапускать приложение, если вы только изменили представление, общий объект после перекомпиляции будет автоматически перезагружен.

См. http://art -blog.no-ip.info / wikipp / en / page / cppcms_1x_config # views для получения более подробной информации.

...