我正在对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。
1条答案
按热度按时间yshpjwxd1#
这看起来像下面的例子。引用
ExternalProject_Add
at the section titled "Build Step Options"的文档:一米一米一x一米二米一x
启用此选项可强制始终运行生成步骤。这可能是可靠地确保评估外部项目自己的生成依赖项(而不是依赖默认的基于成功时间戳的方法)的最简单方法。***通常不需要此选项,除非开发人员需要以无法通过步骤目标依赖项检测到的方式修改外部项目的生成所依赖的内容(例如,使用SOURCE_DIR时没有下载方法,开发人员可能会修改SOURCE_DIR中的源代码)***。
如果是这种情况,解决方案是将
BUILD_ALWAYS
参数添加到ExternalProject_Add
调用中,如下所示。如果您确认这解决了问题,您可能希望将此问题作为一个问题提交给openEMS的维护者。
还要注意的是,由于外部项目使用CMake作为构建系统,您也可以将
CONFIGURE_HANDLED_BY_BUILD TRUE
添加到参数列表中。