【问题标题】:cmake doesnt rebuild externalProject on changescmake 不会在更改时重建 externalProject
【发布时间】:2018-07-09 09:51:19
【问题描述】:

我有以下 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

现在,如果我在外部项目中修改源文件: 触摸../external/genLib/genLib.cpp

然后重新编译 忍者 没有什么变化: 忍者:无事可做。

我已经使用 make 而不是 Ninja 对其进行了测试,其行为完全相同。 我还测试了在我的 custom_command 中添加 DEPENDS 子句,该子句适用于单个文件,但不适用于整个项目(将外部项目的所有源文件添加为 DEPENDS 子句似乎非常棘手......)

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

    如果您至少可以使用 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 中的源)。

    【讨论】:

    • 如何触发外部项目在其参数更改时重建?例如:启用第一次构建时未启用的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多