我正在尝试编写一个CMakeLists.txt来加速编译。
可执行文件依赖于脚本生成的.cpp文件:我使用的cppcms Web应用程序库有一个模板系统,其中.tmpl必须在编译期间转换为.cpp文件,如下所示:
cppcms_tmpl_cc page.tmpl -o page.cpp
有一些相关问题涉及在cmake中使用bash命令:
How to run a command at compile time within Makefile generated by CMake?
CMake : how to use bash command in CMakeLists.txt
这些问题涵盖了我的大部分需求。
现在,我想知道如何告诉cmake每次运行上面的命令并重新生成page.cpp.tmpl本身已经改变了,只有这样?
目标显然是改善编译时间并使用最新模板获得最新二进制文件。
(主持人可以添加cppcms标签吗?)
[编辑:我实际上是在尝试将以下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
[编辑2:我在官方cppcms维基中添加了关于解决方案的说明:
http://art-blog.no-ip.info/wikipp/en/page/cppcms_1x_howto#How.to.compile.the.templates.with.cmake。
答案 0 :(得分:4)
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命令来获取这些时间戳)。然后,您可以比较它们并将最后修改时间戳存储到缓存中。
然而,这个解决方案对我来说看起来很难看,因为我知道如果你正确定义它们之间的目标和依赖关系,CMake本身将负责重建仅修改过的文件,不是吗?你能告诉我目标定义吗?
修改强>
您可以使用以下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 :(得分:1)
看一下这条CMake file of 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。