CMake无法在更改时重新构建ExternalProject

11

我有以下的CMakeLists.txt:

cmake_minimum_required( VERSION 3.0)
project(addProject)
include (ExternalProject)

set(ExternalProjectCMakeArgs
  -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
  -DCMAKE_INSTALL_PREFIX=${PROJECT_BINARY_DIR}/external/genLib
)

ExternalProject_Add(genLib
SOURCE_DIR ${PROJECT_SOURCE_DIR}/external/genLib
BINARY_DIR ${PROJECT_BINARY_DIR}/external/genLib
INSTALL_COMMAND ""
INSTALL_DIR ${PROJECT_BINARY_DIR}/external
CMAKE_ARGS ${ExternalProjectCMakeArgs}
)
add_custom_command( OUTPUT "generated.cpp"
COMMAND ${PROJECT_BINARY_DIR}/external/genLib/genLib "generated.cpp"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

add_executable(add main.cpp ${CMAKE_CURRENT_BINARY_DIR}/generated.cpp)
add_dependencies (add genLib)

第一次建立总是正确的:

mkdir build; cd build; cmake -GNinja ../; ninja

输出以下结果:

-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler using: Ninja
-- Check for working C compiler using: Ninja -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler using: Ninja
-- Check for working CXX compiler using: Ninja -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Devel/scratc/testingExternalProject2/build
41% 5/12@2.7 0: Performing configure step for 'genLib'
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler using: Ninja
-- Check for working C compiler using: Ninja -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler using: Ninja
-- Check for working CXX compiler using: Ninja -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Devel/scratc/testingExternalProject2/build/external/genLib
50% 6/12@3.0 0: Performing build step for 'genLib'
50% 1/2@? 1: Building CXX object CMakeFiles/genLib.dir/genLib.cpp.o
100% 2/2@40.2 1: Linking CXX executable genLib
100% 12/12@5.6 0: Linking CXX executable add

如果我修改了外部项目中的源文件:

touch ../external/genLib/genLib.cpp

然后重新编译:

ninja

没有任何更改:

ninja: no work to do.

我已经使用make进行了测试,结果与Ninja完全相同。

我还尝试在自定义命令中添加DEPENDS子句,它可以针对单个文件工作,但是对于整个项目则不起作用(并且似乎非常hacky,需要将所有外部项目的源文件添加为DEPENDS子句...)

有没有人有更多使用外部项目的经验,并可以解释cmake决定是否重建依赖关系的行为?

1个回答

17
如果您至少可以使用cmake 3.1版本,尝试将BUILD_ALWAYS 1添加到您的ExternalProject_Add命令中:
ExternalProject_Add(genLib
    SOURCE_DIR ${PROJECT_SOURCE_DIR}/external/genLib
    BINARY_DIR ${PROJECT_BINARY_DIR}/external/genLib
    BUILD_ALWAYS 1
    INSTALL_COMMAND ""
    INSTALL_DIR ${PROJECT_BINARY_DIR}/external
    CMAKE_ARGS ${ExternalProjectCMakeArgs}
)

根据ExternalProject_Add命令的文档,
启用此选项将强制运行构建步骤。这可能是最简单的方法,可以稳健地确保评估外部项目自身的构建依赖项,而不是依赖于默认的成功时间戳方法。通常不需要此选项,除非预计开发人员会以无法通过步骤目标依赖项检测到的方式修改外部项目的构建依赖项(例如,在没有下载方法的情况下使用SOURCE_DIR并且开发人员可能会修改SOURCE_DIR中的源代码)。

如何在更改其参数时触发外部项目的重新构建?例如:启用第一次构建时未启用的部分。 - taranaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接