如果需要,可以预先构建SDL2(以及其他依赖项)

时间:2014-12-26 17:55:57

标签: cmake

实际上,我很高兴SDL2在使用GCC作为编译器调用CMake时开箱即用。软件应该总是如此简单,但我想要更多。

假设我在目录树中拥有我的所有软件:

F:/GIT/SDL2_0_3
F:/GIT/myProject

我想要实现的目标是调用CMake

F:/GIT/myProject/build/XXX> cmake ../../ -G "GeneratorName"

并获得

F:/GIT/myProject/bin/XXX/libMyProject.dll
F:/GIT/myProject/bin/XXX/libSDL2.dll
F:/GIT/myProject/build/XXX/projectfile 

XXX是目标的名称(我添加的变量):

-DTARGET_NAME:STRING="XXX"

是否可以" add_subdirectory(SDL)"所以我可以将所有内容委托给

F:/GIT/SDL2_0_3/CMakeLists.txt

实际上我必须将SDL分开,但是进入X文件夹有一些不同的SDL二进制文件(并且每次依赖都重复X,因为我不仅限于SDL,实际上是批处理)脚本正在为我做这个,但我想从便携式移动到Cmake。

我有一个文件夹,其中包含我使用的所有库和项目(F:/ GIT),因此我无法在以下位置使用CMakeLists.txt文件:

F:/GIT/CMakeLists.txt

所以这个问题不是重复:Depending on another CMake project(我需要一个不同的答案,因为另一个是不够的)

P.S:

我特别需要多个目标,因为我正在交叉编译并支持某些编译器的几个版本(因为不同编译器版本的二进制文件只会崩溃...... GCC u.u)

1 个答案:

答案 0 :(得分:0)

好的,终于找到了答案:

add_subdirectory( ../SDL2_0_3 ${CMAKE_BINARY_DIR}/SDL2)

首先我必须使用相对路径,所以我使用../返回1目录级别,然后指定我感兴趣的文件夹SDL2_0_3。然后由于源目录在我的项目之外,我必须指定一个新的二进制目录(add_subdirectory的第二个参数)。

我无法使用:

${CMAKE_BINARY_DIR}

因为我会得到同名的Cmake的元文件(因此每一个都会覆盖另一个),所以我必须更深入一点

${CMAKE_BINARY_DIR}/SDL2

但现在问题是共享库很稀疏,所以我必须在需要的地方复制DLL。

在构建目录中:

add_custom_command(TARGET SDL2 POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:SDL2> 
    "../../build/${TARGET_NAME}/$<TARGET_FILE_NAME:SDL2>"
)

在测试目录中:

add_custom_command(TARGET SDL2 POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:SDL2> 
    "../../build/${TARGET_NAME}/tests/$<TARGET_FILE_NAME:SDL2>"
)

在二进制发布目录中:

add_custom_command(TARGET SDL2 POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:SDL2> 
    "../../bin/${TARGET_NAME}/$<TARGET_FILE_NAME:SDL2>"
)

唯一不好的一点是,从CMake-Gui构建SDL需要10秒钟,而从脚本构建它需要大约5分钟(我想因为从GUI开始统一构建)。我不想搞乱SDL脚本,所以我希望他们能尽快解决这个问题。