XNSim/XNInterfaceGenServer/CMakeListsGen.cpp

108 lines
4.3 KiB
C++

#include "CMakeListsGen.h"
bool CMakeListsGen::generateCMakeLists(const AllInterfaceData &interfaceData,
const std::string &idlPath, const std::string &configName)
{
std::string idlDirPath = fs::path(idlPath).parent_path().string();
std::string cmakefilePath = idlDirPath + "/CMakeLists.txt";
// 1. 生成CMakeLists.txt文件
std::ofstream cmakeFile(cmakefilePath);
if (!cmakeFile.is_open()) {
return false;
}
cmakeFile << "cmake_minimum_required(VERSION 3.16)" << std::endl;
cmakeFile << "project(" << configName << "_Interface LANGUAGES CXX)" << std::endl;
cmakeFile << "set(CMAKE_CXX_STANDARD 17)" << std::endl;
cmakeFile << "set(CMAKE_CXX_STANDARD_REQUIRED ON)" << std::endl;
cmakeFile << "set(CMAKE_POSITION_INDEPENDENT_CODE ON)" << std::endl;
// 设置默认构建类型为Release
cmakeFile << "if(NOT CMAKE_BUILD_TYPE)" << std::endl;
cmakeFile << "\tset(CMAKE_BUILD_TYPE Release CACHE STRING "
<< "\"Choose the type of build (Debug, Release, RelWithDebInfo, MinSizeRel)\""
<< " FORCE)" << std::endl;
cmakeFile << "endif()" << std::endl;
// Release模式优化设置
cmakeFile << "if(CMAKE_BUILD_TYPE STREQUAL \"Release\")" << std::endl;
cmakeFile << "\tset(CMAKE_CXX_FLAGS_RELEASE \"${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG\")"
<< std::endl;
cmakeFile << "\tset(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -O3 -DNDEBUG\")"
<< std::endl;
cmakeFile << "endif()" << std::endl;
// 获取环境变量
cmakeFile << "if(DEFINED ENV{XNCore})" << std::endl;
cmakeFile << "\tset(XNCore_PATH $ENV{XNCore})" << std::endl;
cmakeFile << "else()" << std::endl;
cmakeFile << "\tmessage(FATAL_ERROR \"Environment variable XNCore is not set.\")" << std::endl;
cmakeFile << "endif()" << std::endl;
// 添加 XNCore_PATH 下的 include 目录为包含目录
cmakeFile << "include_directories(${XNCore_PATH}/include)" << std::endl;
cmakeFile << "if(NOT fastcdr_FOUND)" << std::endl;
cmakeFile << "\tfind_package(fastcdr 2 REQUIRED)" << std::endl;
cmakeFile << "endif()" << std::endl;
cmakeFile << "if(NOT fastdds_FOUND)" << std::endl;
cmakeFile << "\tfind_package(fastdds 3 REQUIRED)" << std::endl;
cmakeFile << "endif()" << std::endl;
cmakeFile << "find_package(OpenSSL REQUIRED)" << std::endl;
cmakeFile << "set(ALL_SUBDIR_SOURCES \"\")" << std::endl;
for (const auto &ataInterfaceData : interfaceData.ataInterfaceData) {
std::string ataName = ataInterfaceData.ataName;
cmakeFile << "add_subdirectory(" << ataName << ")" << std::endl;
}
cmakeFile << "add_library(" << configName << "_Interface SHARED" << std::endl;
cmakeFile << " " << configName << ".hpp" << std::endl;
cmakeFile << " " << configName << "CdrAux.hpp" << std::endl;
cmakeFile << " " << configName << "CdrAux.ipp" << std::endl;
cmakeFile << " " << configName << "PubSubTypes.hpp" << std::endl;
cmakeFile << " " << configName << "PubSubTypes.cxx" << std::endl;
cmakeFile << " " << configName << "TypeObjectSupport.hpp" << std::endl;
cmakeFile << " " << configName << "TypeObjectSupport.cxx" << std::endl;
cmakeFile << " " << configName << "_Interface.h" << std::endl;
cmakeFile << " ${ALL_SUBDIR_SOURCES}" << std::endl;
cmakeFile << ")" << std::endl;
cmakeFile << "target_link_libraries(" << configName << "_Interface PRIVATE" << std::endl;
cmakeFile << " fastcdr fastdds OpenSSL::SSL OpenSSL::Crypto" << std::endl;
cmakeFile << " ${XNCore_PATH}/lib/libXNCore.so" << std::endl;
cmakeFile << ")" << std::endl;
cmakeFile << "target_compile_definitions(" << configName << "_Interface PRIVATE "
<< toUpper(configName) << "_INTERFACE_LIBRARY)" << std::endl;
cmakeFile << "if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)" << std::endl;
cmakeFile
<< "\tset(CMAKE_INSTALL_PREFIX \"${XNCore_PATH}\" CACHE PATH \"Install path prefix\" FORCE)"
<< std::endl;
cmakeFile << "endif()" << std::endl;
cmakeFile << "include(GNUInstallDirs)" << std::endl;
cmakeFile << "install(TARGETS " << configName << "_Interface" << std::endl;
cmakeFile << " RUNTIME DESTINATION ." << std::endl;
cmakeFile << " LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}" << std::endl;
cmakeFile << " ARCHIVE DESTINATION ." << std::endl;
cmakeFile << ")" << std::endl;
cmakeFile.close();
return true;
}
std::string CMakeListsGen::toUpper(const std::string &str)
{
std::string result = str;
for (auto &c : result) {
c = std::toupper(c);
}
return result;
}