cmake在手动编辑其源代码后不重建非下载外部项目

hyrbngr7  于 2022-12-18  发布在  其他
关注(0)|答案(1)|浏览(149)

我正在对openEMS project进行一些修改。这个项目使用cmake来构建它的所有组件。顶层CMakeLists.txt文件包含以下内容:

# ...
ExternalProject_Add( openEMS
  DEPENDS     fparser CSXCAD
  SOURCE_DIR  ${PROJECT_SOURCE_DIR}/openEMS
  CMAKE_ARGS  -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DFPARSER_ROOT_DIR=${CMAKE_INSTALL_PREFIX} -DCSXCAD_ROOT_DIR=${CMAKE_INSTALL_PREFIX} -DWITH_MPI=${WITH_MPI} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
)
# ...

在openEMS目录中,还有另一个CMakeLists.txt,其内容如下:

# ...
set(SOURCES
  openems.cpp
)
# ...
add_library( openEMS SHARED ${SOURCES})
# ...

成功构建项目一次后,make不会重新构建任何内容,例如,修改openems.cpp时。为什么?

$ mkdir build
$ cd build
$ cmake -DBUILD_APPCSXCAD=NO
$ make
[builds all files]

$ touch ../openEMS/openems.cpp
$ make
[ 33%] Built target fparser
[ 66%] Built target CSXCAD
[100%] Built target openEMS
(noting is built)

我已经检查过了,openems.cpp的修改日期比目标更新了。即使删除安装目录和构建目录中生成的库文件和二进制文件,也不会导致它重建任何东西。唯一能让它重建的方法是删除构建目录中的所有内容,然后重新运行cmake,当然,这会重建 everything

yshpjwxd

yshpjwxd1#

这看起来像下面的例子。引用ExternalProject_Add at the section titled "Build Step Options"的文档:
一米一米一x一米二米一x
启用此选项可强制始终运行生成步骤。这可能是可靠地确保评估外部项目自己的生成依赖项(而不是依赖默认的基于成功时间戳的方法)的最简单方法。***通常不需要此选项,除非开发人员需要以无法通过步骤目标依赖项检测到的方式修改外部项目的生成所依赖的内容(例如,使用SOURCE_DIR时没有下载方法,开发人员可能会修改SOURCE_DIR中的源代码)***。
如果是这种情况,解决方案是将BUILD_ALWAYS参数添加到ExternalProject_Add调用中,如下所示。

ExternalProject_Add( openEMS
  DEPENDS     fparser CSXCAD
  SOURCE_DIR  ${PROJECT_SOURCE_DIR}/openEMS
  CMAKE_ARGS  -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DFPARSER_ROOT_DIR=${CMAKE_INSTALL_PREFIX} -DCSXCAD_ROOT_DIR=${CMAKE_INSTALL_PREFIX} -DWITH_MPI=${WITH_MPI} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
  BUILD_ALWAYS TRUE
)

如果您确认这解决了问题,您可能希望将此问题作为一个问题提交给openEMS的维护者。
还要注意的是,由于外部项目使用CMake作为构建系统,您也可以将CONFIGURE_HANDLED_BY_BUILD TRUE添加到参数列表中。

相关问题