5

我正在尝试编写 CMakeLists.txt 以加快编译速度。

可执行文件取决于脚本生成的 .cpp 文件:我使用 cppcms Web 应用程序库,它有一个模板系统,其中 .tmpl 在编译期间必须转换为 .cpp 文件,如下所示:

cppcms_tmpl_cc page.tmpl -o page.cpp

有一些相关的问题涉及在 cmake 中使用 bash 命令:
如何在 CMake 生成的 Makefile 中在编译时运行命令?
CMake : how to use bash command in CMakeLists.txt
这些问题涵盖了我的大部分需求。

我现在想知道的是,每次 page.tmpl 本身发生变化时,如何告诉 cmake 运行上述命令并重新生成 page.cpp,并且只有这样?

目标显然是改善编译时间并使用最新模板获得最新的二进制文件。

(版主可以添加 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

[Edit2:我在官方 cppcms wiki 中添加了关于解决方案的注释:http://art-blog.no-ip.info/wikipp/en/page/cppcms_1x_howto#How.to.compile.the.templates.with
。制作

4

2 回答 2

5
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)

祝你好运

于 2011-01-10T04:22:27.877 回答
1

看看这个Wikipp第 66-72 行的 CMake 文件

你基本上需要这样的东西:

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。

于 2011-01-10T06:45:43.623 回答