119 lines
4.4 KiB
Markdown
119 lines
4.4 KiB
Markdown
---
|
||
title: 编写CMake实现构建多版本工程
|
||
date: 2022-08-09 13:55:15
|
||
tags: Maya CMake
|
||
rating: ⭐️⭐️
|
||
---
|
||
# 编写CMake实现构建多版本工程
|
||
1. 点击Configure与Generate根据当前年份与起始年份生成对应的子项目CMakeList.txt。
|
||
2. 填入所要生成版本的Devkit路径。
|
||
3. 再次点击Configure与Generate,即可生成项目。
|
||
|
||
## 知识点
|
||
### 变量共享
|
||
在set中增加**CACHE**关键字就可以到主模块与子模块变量共享的目的。比如:
|
||
> set("Maya${CURRENT_YEAR}_DEVKIT_LOCATION" "" CACHE PATH "")
|
||
|
||
### 子模块
|
||
调用**add_subdirectory**添加含有CMakeList.txt的文件夹即可。
|
||
|
||
### CMake生成文件
|
||
使用**file(GENERATE OUTPUT Path CONTENT Code)** 就可以生成文本文件了。这样就做到让CMake生成子CMakeList.txt的功能。代码如下(xxx为文本内容):
|
||
```cmake
|
||
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Maya${CURRENT_YEAR}/CMakeLists.txt" CONTENT XXXX)
|
||
```
|
||
|
||
需要注意代码中的${},需要将他们拆开放置它转义。
|
||
|
||
### winsock库报错问题
|
||
>在cmake里加上一行:**link_libraries(ws2_32)**
|
||
|
||
或者在VisualStudio的Linker->Input->AdditionalDependencies中添加 Ws2_32.lib即可。
|
||
|
||
## 具体代码
|
||
具体代码如下:
|
||
```cmake
|
||
cmake_minimum_required(VERSION 3.24)
|
||
project(DrivenByUE4)
|
||
|
||
# 取得现在是XX年,之后计算Maya最新版本
|
||
string(TIMESTAMP COMPILE_TIME %Y)
|
||
math(EXPR THIS_YEAR "${COMPILE_TIME} + 1")
|
||
set(START_YEAR 2018)
|
||
set(CURRENT_YEAR "${START_YEAR}")
|
||
|
||
# 生成设置变量
|
||
while(CURRENT_YEAR LESS_EQUAL THIS_YEAR)
|
||
set("Maya${CURRENT_YEAR}_DEVKIT_LOCATION" "" CACHE PATH "")
|
||
set("Maya${CURRENT_YEAR}_LOCATION" "" CACHE PATH "")
|
||
math(EXPR CURRENT_YEAR "${CURRENT_YEAR} + 1")
|
||
# message(STATUS "result:${CURRENT_YEAR}")
|
||
endwhile()
|
||
|
||
# 不存在子项目则生成
|
||
if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/Maya${CURRENT_YEAR}/CMakeLists.txt")
|
||
set(CURRENT_YEAR "${START_YEAR}")
|
||
while(CURRENT_YEAR LESS_EQUAL THIS_YEAR)
|
||
# 防止生成文件把${}进行转义
|
||
set(ENV_String "$")
|
||
string(APPEND ENV_String "ENV{PATH}")
|
||
string(APPEND ENV_String "\$ENV")
|
||
string(APPEND ENV_String "{MAYA_LOCATION}/bin;")
|
||
set(ENV_String2 "$")
|
||
string(APPEND ENV_String2 "ENV{DEVKIT_LOCATION}")
|
||
set(ENV_String3 "$")
|
||
string(APPEND ENV_String3 "{PROJECT_NAME}")
|
||
|
||
# 因为生成文件会在Generate按钮按下后执行,所以需要执行2遍Configure与Generate
|
||
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Maya${CURRENT_YEAR}/CMakeLists.txt" CONTENT
|
||
"project(\"DrivenByUE4_Maya${CURRENT_YEAR}\")
|
||
|
||
set(ENV{DEVKIT_LOCATION} \"${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}\")
|
||
set(ENV{MAYA_LOCATION} \"${Maya${CURRENT_YEAR}_LOCATION}\")
|
||
set(ENV{PATH} \"${ENV_String}\")
|
||
|
||
include(${ENV_String2}/cmake/pluginEntry.cmake)
|
||
set(SOURCE_FILES
|
||
../DBU_AddMesh.cpp
|
||
../DBU_AddMesh.h
|
||
../DBU_ScenePrimitiveCollector.cpp
|
||
../DBU_ScenePrimitiveCollector.h
|
||
../DBU_ControlCmd.cpp
|
||
../DBU_ControlCmd.h
|
||
../DBU_TCPSocket.cpp
|
||
../DBU_TCPSocket.h
|
||
../PluginRegister.cpp)
|
||
set(LIBRARIES OpenMaya Foundation)
|
||
|
||
set(PDB_OUTPUT_DIRECTORY ${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}/plug-ins/plug-ins/DrivenByUE4.pdb)
|
||
link_libraries(ws2_32)
|
||
|
||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}/plug-ins/plug-ins)
|
||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}/plug-ins/plug-ins)
|
||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}/plug-ins/plug-ins)
|
||
|
||
set(VS_DEBUGGER_COMMAND ${Maya${CURRENT_YEAR}_LOCATION}/bin/mayabatch.exe)
|
||
|
||
set(INCLUDE_DIRS \"\")
|
||
set(DEVKIT_BASE_DIR \"${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}\")
|
||
set(LIBRARY_DIRS \"${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}/lib\")
|
||
set(Foundation_PATH \"${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}/lib/Foundation.lib\")
|
||
set(OpenMaya_PATH \"${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}/lib/OpenMaya.lib\")
|
||
|
||
build_plugin()
|
||
set_target_properties(${ENV_String3} PROPERTIES OUTPUT_NAME \"DrivenByUE4\")")
|
||
|
||
math(EXPR CURRENT_YEAR "${CURRENT_YEAR} + 1")
|
||
endwhile()
|
||
endif()
|
||
|
||
set(CURRENT_YEAR "${START_YEAR}")
|
||
|
||
while(CURRENT_YEAR LESS_EQUAL THIS_YEAR)
|
||
if(NOT "${Maya${CURRENT_YEAR}_DEVKIT_LOCATION}" STREQUAL "" AND EXISTS "${CMAKE_CURRENT_BINARY_DIR}/Maya${CURRENT_YEAR}/CMakeLists.txt")
|
||
add_subdirectory("Maya${CURRENT_YEAR}" "Maya${CURRENT_YEAR}")
|
||
endif()
|
||
|
||
math(EXPR CURRENT_YEAR "${CURRENT_YEAR} + 1")
|
||
endwhile()
|
||
``` |