CMake 如何处理通过 externalProject_add 检索到的文件的依赖关系
CMake how to handle dpendencies to files retrieved via externalProject_add
我正在使用 externalProject_add
命令直接从 github 检索整个 glfm 项目。作为此结帐的一部分,将通过 git 检索两个文件。需要将这两个文件(glad.c 和 glad.h)添加为我的项目的源依赖项。
不幸的是,CMake 在生成过程中发现这些文件丢失了,这是正确的,因为稍后将在构建过程中下载这些文件。
错误信息:
CMake Error at CMakeLists.txt:79 (add_executable):
Cannot find source file:
H:/Documents/Visual Studio 2013/Projects/BuildCMakeExternalOpenGL/glfw -prefix/src/glfw/deps/glad/glad.h
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx
CMake Error: CMake can not determine linker language for target: CMakeExternalTemplate
Generating done
我该如何解决这个问题?
我的 CMake 文件:
cmake_minimum_required(VERSION 2.8.4)
project(CMakeExternalTemplate)
include(ExternalProject)
set(EXTERNAL_LIB_DIR ${PROJECT_BINARY_DIR}/libs)
#CMakeExternalTemplate
# -- Vars
set(CMakeExternalTemplate_SOURCE_FILES main.cpp)
set(CMakeExternalTemplate_INCLUDE_DIRS)
# -- GLM
set(glm_INSTALL_DIR ${EXTERNAL_LIB_DIR}/glm)
externalProject_add(glm
GIT_REPOSITORY https://github.com/g-truc/glm.git
GIT_TAG 0.9.8.1
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${glm_INSTALL_DIR}")
ExternalProject_Get_Property(glm source_dir)
set(GLM_SRC_DIR ${source_dir})
#GLFW
# -- Vars
set(glfw_INSTALL_DIR ${EXTERNAL_LIB_DIR}/glfw)
set(glfw_INCLUDE_DIRS ${glfw_INSTALL_DIR}/include)
externalProject_add(glfw
GIT_REPOSITORY https://github.com/glfw/glfw.git
GIT_TAG 3.2.1
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${glfw_INSTALL_DIR}")
ExternalProject_Get_Property(glfw source_dir)
set(GLFW_SRC_DIR ${source_dir})
#Glad
set(GLAD "${GLFW_SRC_DIR}/deps/glad/glad.h"
"${GLFW_SRC_DIR}/deps/glad.c")
include_directories(${GLM_SRC_DIR})
include_directories(${glfw_INCLUDE_DIRS} ${GLFW_SRC_DIR}/deps )
# -- -- CMakeExternalTemplate
include_directories(${CMakeExternalTemplate_INCLUDE_DIRS})
# -- Compile
add_executable(${PROJECT_NAME} ${CMakeExternalTemplate_SOURCE_FILES} ${GLAD})
外部项目不应该以这种方式使用。它创建编译目标。
它将下载这些库并构建它们,因此不需要包含它们的源文件。
你应该做的是 link 针对他们创建的库(参见 target_link_library
和 link_directories
。)如果你只需要 glad.c
的结果,你可能可以link针对它的目标文件。
您还需要添加一个手动依赖项,以确保这些库的下载和编译在之前完成
add_dependency(${PROJECT_NAME} glfw glm)
如果出于某种原因您需要明确地将源文件放在那里,则不能使用 External_project
。您必须在 cmake 配置期间使用 execute_process(git clone ... )
和您需要的其他命令手动执行此操作。
您正在寻找的是 CMake 超级构建方法。 Superbuild 将进行设置,以便您执行两个嵌套的 CMake 层 - 第一层将拉下外部项目,如果需要可选择编译它们。
然后,它将自己称为另一个外部项目,传递下载的外部目录,然后您可以根据需要在项目定义中使用它们。这有点麻烦,而且实际上仍然没有为您整齐地自动填充 IDE 中的所有内容。
搜索 github/google cmake 超级构建模板并试用它们 - 这并不理想,但您确实在开发和 CI 环境中获得了一致的构建。
我正在使用 externalProject_add
命令直接从 github 检索整个 glfm 项目。作为此结帐的一部分,将通过 git 检索两个文件。需要将这两个文件(glad.c 和 glad.h)添加为我的项目的源依赖项。
不幸的是,CMake 在生成过程中发现这些文件丢失了,这是正确的,因为稍后将在构建过程中下载这些文件。
错误信息:
CMake Error at CMakeLists.txt:79 (add_executable):
Cannot find source file:
H:/Documents/Visual Studio 2013/Projects/BuildCMakeExternalOpenGL/glfw -prefix/src/glfw/deps/glad/glad.h
Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
.hxx .in .txx
CMake Error: CMake can not determine linker language for target: CMakeExternalTemplate
Generating done
我该如何解决这个问题?
我的 CMake 文件:
cmake_minimum_required(VERSION 2.8.4)
project(CMakeExternalTemplate)
include(ExternalProject)
set(EXTERNAL_LIB_DIR ${PROJECT_BINARY_DIR}/libs)
#CMakeExternalTemplate
# -- Vars
set(CMakeExternalTemplate_SOURCE_FILES main.cpp)
set(CMakeExternalTemplate_INCLUDE_DIRS)
# -- GLM
set(glm_INSTALL_DIR ${EXTERNAL_LIB_DIR}/glm)
externalProject_add(glm
GIT_REPOSITORY https://github.com/g-truc/glm.git
GIT_TAG 0.9.8.1
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${glm_INSTALL_DIR}")
ExternalProject_Get_Property(glm source_dir)
set(GLM_SRC_DIR ${source_dir})
#GLFW
# -- Vars
set(glfw_INSTALL_DIR ${EXTERNAL_LIB_DIR}/glfw)
set(glfw_INCLUDE_DIRS ${glfw_INSTALL_DIR}/include)
externalProject_add(glfw
GIT_REPOSITORY https://github.com/glfw/glfw.git
GIT_TAG 3.2.1
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${glfw_INSTALL_DIR}")
ExternalProject_Get_Property(glfw source_dir)
set(GLFW_SRC_DIR ${source_dir})
#Glad
set(GLAD "${GLFW_SRC_DIR}/deps/glad/glad.h"
"${GLFW_SRC_DIR}/deps/glad.c")
include_directories(${GLM_SRC_DIR})
include_directories(${glfw_INCLUDE_DIRS} ${GLFW_SRC_DIR}/deps )
# -- -- CMakeExternalTemplate
include_directories(${CMakeExternalTemplate_INCLUDE_DIRS})
# -- Compile
add_executable(${PROJECT_NAME} ${CMakeExternalTemplate_SOURCE_FILES} ${GLAD})
外部项目不应该以这种方式使用。它创建编译目标。
它将下载这些库并构建它们,因此不需要包含它们的源文件。
你应该做的是 link 针对他们创建的库(参见 target_link_library
和 link_directories
。)如果你只需要 glad.c
的结果,你可能可以link针对它的目标文件。
您还需要添加一个手动依赖项,以确保这些库的下载和编译在之前完成
add_dependency(${PROJECT_NAME} glfw glm)
如果出于某种原因您需要明确地将源文件放在那里,则不能使用 External_project
。您必须在 cmake 配置期间使用 execute_process(git clone ... )
和您需要的其他命令手动执行此操作。
您正在寻找的是 CMake 超级构建方法。 Superbuild 将进行设置,以便您执行两个嵌套的 CMake 层 - 第一层将拉下外部项目,如果需要可选择编译它们。
然后,它将自己称为另一个外部项目,传递下载的外部目录,然后您可以根据需要在项目定义中使用它们。这有点麻烦,而且实际上仍然没有为您整齐地自动填充 IDE 中的所有内容。
搜索 github/google cmake 超级构建模板并试用它们 - 这并不理想,但您确实在开发和 CI 环境中获得了一致的构建。