Initial commit
This commit is contained in:
67
cmake/Common.cmake
Normal file
67
cmake/Common.cmake
Normal file
@@ -0,0 +1,67 @@
|
||||
#
|
||||
# 全局变量、路径、日志、工具函数
|
||||
#
|
||||
|
||||
# 日志宏
|
||||
macro(DEPLOY_MSG MSG)
|
||||
message(STATUS "[DEPLOY] ${MSG}")
|
||||
endmacro()
|
||||
|
||||
# 校验 root 权限(系统包/系统目录需要)
|
||||
function(CHECK_ROOT)
|
||||
execute_process(
|
||||
COMMAND id -u
|
||||
OUTPUT_VARIABLE CURRENT_UID
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if(NOT CURRENT_UID STREQUAL "0")
|
||||
message(FATAL_ERROR "Please run cmake/make with root privileges!")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# ===================== 编译器自动检测&安装 =====================
|
||||
function(CheckAndInstallCompiler)
|
||||
DEPLOY_MSG("Checking GCC/G++ compiler...")
|
||||
|
||||
# 查找 gcc g++
|
||||
find_program(GCC_EXEC gcc)
|
||||
find_program(GXX_EXEC g++)
|
||||
|
||||
if(NOT GCC_EXEC OR NOT GXX_EXEC)
|
||||
DEPLOY_MSG("GCC/G++ not found, start installing via dnf...")
|
||||
CHECK_ROOT()
|
||||
|
||||
# dnf 安装 gcc gcc-c++
|
||||
execute_process(
|
||||
COMMAND dnf install -y gcc gcc-c++
|
||||
RESULT_VARIABLE COMP_RET
|
||||
OUTPUT_VARIABLE COMP_OUT
|
||||
ERROR_VARIABLE COMP_ERR
|
||||
)
|
||||
|
||||
if(NOT COMP_RET EQUAL 0)
|
||||
message(FATAL_ERROR "Failed to install GCC/G++: ${COMP_ERR}")
|
||||
endif()
|
||||
|
||||
DEPLOY_MSG("GCC/G++ installed successfully")
|
||||
|
||||
# 重新刷新程序查找,让CMake识别新安装的编译器
|
||||
find_program(GCC_EXEC gcc REQUIRED)
|
||||
find_program(GXX_EXEC g++ REQUIRED)
|
||||
else()
|
||||
DEPLOY_MSG("Found compiler: ${GCC_EXEC}, ${GXX_EXEC}")
|
||||
endif()
|
||||
|
||||
# 赋值给全局 CMake 编译器变量
|
||||
set(CMAKE_C_COMPILER ${GCC_EXEC} CACHE FILEPATH "C compiler" FORCE)
|
||||
set(CMAKE_CXX_COMPILER ${GXX_EXEC} CACHE FILEPATH "CXX compiler" FORCE)
|
||||
endfunction()
|
||||
|
||||
# 统一安装路径拼接
|
||||
function(SET_INSTALL_PATH NAME VER OUT_PATH)
|
||||
set(${OUT_PATH} "${INSTALL_ROOT}/${NAME}/${VER}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# 基础编译参数
|
||||
set(CMAKE_C_FLAGS "-O2" CACHE STRING "C flags")
|
||||
set(CMAKE_CXX_FLAGS "-O2" CACHE STRING "C++ flags")
|
||||
47
cmake/DnfInstall.cmake
Normal file
47
cmake/DnfInstall.cmake
Normal file
@@ -0,0 +1,47 @@
|
||||
#
|
||||
# dnf/yum 系统包安装通用模块
|
||||
#
|
||||
|
||||
# 函数:DNF 安装系统包
|
||||
# 参数:PKG_NAME - 包名
|
||||
function(DnfInstall PKG_NAME)
|
||||
CHECK_ROOT()
|
||||
DEPLOY_MSG ("Start install system package: ${PKG_NAME}")
|
||||
|
||||
if(ENABLE_DEBUG)
|
||||
execute_process(
|
||||
COMMAND dnf install -y ${PKG_NAME}
|
||||
RESULT_VARIABLE DNF_RET
|
||||
OUTPUT_VARIABLE DNF_OUT
|
||||
ERROR_VARIABLE DNF_ERR
|
||||
)
|
||||
message(STATUS "[Debug] Output: ${DNF_OUT}")
|
||||
message(STATUS "[Debug] Errors: ${DNF_ERR}")
|
||||
else()
|
||||
execute_process(
|
||||
COMMAND dnf install -y ${PKG_NAME}
|
||||
RESULT_VARIABLE DNF_RET
|
||||
OUTPUT_VARIABLE DNF_OUT
|
||||
ERROR_VARIABLE DNF_ERR
|
||||
)
|
||||
set(DNF_ERR "")
|
||||
endif()
|
||||
|
||||
if(NOT DNF_RET EQUAL 0)
|
||||
message(FATAL_ERROR "Install ${PKG_NAME} failed: ${DNF_ERR}")
|
||||
endif()
|
||||
DEPLOY_MSG ("Install ${PKG_NAME} success")
|
||||
endfunction()
|
||||
|
||||
# 函数:DNF 卸载系统包
|
||||
function(DnfRemove PKG_NAME)
|
||||
CHECK_ROOT()
|
||||
DEPLOY_MSG ("Start remove system package: ${PKG_NAME}")
|
||||
execute_process(
|
||||
COMMAND dnf remove -y ${PKG_NAME}
|
||||
RESULT_VARIABLE DNF_RET
|
||||
)
|
||||
if(NOT DNF_RET EQUAL 0)
|
||||
message(WARNING "Remove ${PKG_NAME} failed")
|
||||
endif()
|
||||
endfunction()
|
||||
65
cmake/ModuleEnv.cmake
Normal file
65
cmake/ModuleEnv.cmake
Normal file
@@ -0,0 +1,65 @@
|
||||
#
|
||||
# Environment Module 环境模块生成脚本
|
||||
#
|
||||
|
||||
# 生成 module 环境文件
|
||||
# MOD_NAME:模块名 SOFT_PATH:软件安装路径
|
||||
function(GenerateModule MOD_NAME MOD_VERS SOFT_PATH)
|
||||
set(MOD_FILE ${MODULES_ROOT}/${MOD_NAME}/${MOD_VERS})
|
||||
DEPLOY_MSG("Generate module name: ${MOD_NAME}")
|
||||
DEPLOY_MSG("Generate module vers: ${MOD_VERS}")
|
||||
DEPLOY_MSG("Generate module file: ${MOD_FILE}")
|
||||
|
||||
get_filename_component(MOD_DIR ${MOD_FILE} DIRECTORY)
|
||||
file(MAKE_DIRECTORY ${MOD_DIR})
|
||||
|
||||
string(TOUPPER ${MOD_NAME} MOD_NAME_UPPER)
|
||||
|
||||
# 写入 module 模板
|
||||
file(WRITE ${MOD_FILE}
|
||||
"#%Module1.0
|
||||
proc ModulesHelp { } {
|
||||
puts stderr \"Load ${MOD_NAME} environment\"
|
||||
}
|
||||
module-whatis \"Sets up software ${MOD_NAME} \"
|
||||
|
||||
set soft_name \"${MOD_NAME}\"
|
||||
set soft_vers \"${MOD_VERS}\"
|
||||
set soft_root \"${SOFT_PATH}\"
|
||||
|
||||
prepend-path PATH \$soft_root/bin
|
||||
|
||||
prepend-path LIBRARY_PATH \$soft_root/lib
|
||||
prepend-path LD_LIBRARY_PATH \$soft_root/lib
|
||||
|
||||
prepend-path LIBRARY_PATH \$soft_root/lib64
|
||||
prepend-path LD_LIBRARY_PATH \$soft_root/lib64
|
||||
|
||||
prepend-path CPATH \$soft_root/include
|
||||
prepend-path MANPATH \$soft_root/share/man
|
||||
prepend-path PKG_CONFIG_PATH \$soft_root/lib/pkgconfig
|
||||
|
||||
setenv ${MOD_NAME_UPPER}_HOME \$soft_root
|
||||
|
||||
if { \[ module-info mode load \] } {
|
||||
puts stderr \"\${soft_name}_name: \$soft_name - \$soft_vers\"
|
||||
puts stderr \"\${soft_name}_root: \$soft_root\"
|
||||
}
|
||||
")
|
||||
|
||||
if(MOD_NAME STREQUAL "openmpi")
|
||||
file(APPEND ${MOD_FILE}
|
||||
"
|
||||
setenv OMPI_ALLOW_RUN_AS_ROOT 1
|
||||
setenv OMPI_ALLOW_RUN_AS_ROOT_CONFIRM 1
|
||||
")
|
||||
endif()
|
||||
|
||||
if(MOD_NAME STREQUAL "fftw")
|
||||
file(APPEND ${MOD_FILE}
|
||||
"
|
||||
setenv OMPI_ALLOW_RUN_AS_ROOT 0
|
||||
setenv OMPI_ALLOW_RUN_AS_ROOT_CONFIRM 0
|
||||
")
|
||||
endif()
|
||||
endfunction()
|
||||
42
cmake/Software.cmake
Normal file
42
cmake/Software.cmake
Normal file
@@ -0,0 +1,42 @@
|
||||
|
||||
|
||||
# ===================== 全局配置 =====================
|
||||
set(INSTALL_ROOT "/share/apps/soft" CACHE PATH "Software install root")
|
||||
set(MODULES_ROOT "/share/apps/mods" CACHE PATH "Environment Module path")
|
||||
|
||||
# ========== 1. 大分组总开关 ==========
|
||||
set(ENABLE_SOFT_GROUP OFF CACHE BOOL "Enable core software group")
|
||||
set(ENABLE_TOOL_GROUP OFF CACHE BOOL "Enable system tool group")
|
||||
set(ENABLE_ASST_GROUP OFF CACHE BOOL "Enable assist & module env group")
|
||||
|
||||
# ========== 2. 软件组:单个软件细粒度开关 ==========
|
||||
set(INSTALL_OPENMPI OFF CACHE BOOL "Install OpenMPI")
|
||||
set(INSTALL_MPICH OFF CACHE BOOL "Install MPICH")
|
||||
set(INSTALL_VASP OFF CACHE BOOL "Install VASP")
|
||||
set(INSTALL_FFTW OFF CACHE BOOL "Install FFTW")
|
||||
set(INSTALL_AMBER OFF CACHE BOOL "Install Amber")
|
||||
|
||||
# ========== 3. 工具组:单个系统服务开关 ==========
|
||||
set(INSTALL_DHCPD OFF CACHE BOOL "Install DHCP Server")
|
||||
set(INSTALL_HTTPD OFF CACHE BOOL "Install HTTPD")
|
||||
|
||||
# ========== 4. 辅助组开关(module 环境文件) ==========
|
||||
set(GENERATE_MODULE_FILES ON CACHE BOOL "Generate environment module files")
|
||||
set(ENABLE_DEBUG OFF CACHE BOOL "Enable Debug")
|
||||
|
||||
# 源码软件版本 & 下载地址
|
||||
set(OPENMPI_VER "4.1.8" CACHE STRING "OpenMPI version")
|
||||
set(MPICH_VER "4.2.1" CACHE STRING "MPICH version")
|
||||
set(VASP_VER "6.4.0" CACHE STRING "VASP version")
|
||||
set(FFTW_VER "3.3.10" CACHE STRING "FFTW version")
|
||||
set(AMBER_VER "22" CACHE STRING "Amber version")
|
||||
|
||||
# 系统包名称(dnf 安装)
|
||||
set(SYS_DHCPD_PKG "dhcp-server")
|
||||
set(SYS_HTTPD_PKG "httpd")
|
||||
|
||||
# 编译并行线程
|
||||
set(BUILD_JOBS "$ENV{MAKEJOBS}" CACHE STRING "Make jobs count")
|
||||
if(NOT BUILD_JOBS)
|
||||
set(BUILD_JOBS 4)
|
||||
endif()
|
||||
60
cmake/SrcBuild.cmake
Normal file
60
cmake/SrcBuild.cmake
Normal file
@@ -0,0 +1,60 @@
|
||||
#
|
||||
# 源码编译安装通用模版、mpi/vasp等
|
||||
#
|
||||
|
||||
# 源码编译安装通用函数
|
||||
# NAME: 软件名 VER:版本 URL:在线下载地址
|
||||
function(SrcBuild NAME VER URL)
|
||||
SET_INSTALL_PATH(${NAME} ${VER} SOFT_INSTALL_DIR)
|
||||
DEPLOY_MSG("Build ${NAME}-${VER} , install to: ${SOFT_INSTALL_DIR}")
|
||||
|
||||
# 1. 定义离线包路径 & 编译临时目录
|
||||
set(OFFLINE_PKG_DIR "${CMAKE_SOURCE_DIR}/files")
|
||||
set(PKG_FILENAME "${NAME}-${VER}.tar.gz")
|
||||
set(LOCAL_TAR "${OFFLINE_PKG_DIR}/${PKG_FILENAME}")
|
||||
set(BUILD_DIR "${CMAKE_BINARY_DIR}/build_${NAME}")
|
||||
|
||||
file(MAKE_DIRECTORY ${BUILD_DIR})
|
||||
set(TAR_FILE "${BUILD_DIR}/${PKG_FILENAME}")
|
||||
|
||||
# 2. 优先使用本地离线包
|
||||
if(EXISTS ${LOCAL_TAR})
|
||||
DEPLOY_MSG("Found offline package: ${LOCAL_TAR}, use local file")
|
||||
# 拷贝离线包到编译目录(避免源目录被修改)
|
||||
file(COPY ${LOCAL_TAR} DESTINATION ${BUILD_DIR})
|
||||
else()
|
||||
DEPLOY_MSG("Offline package not found, start download: ${URL}")
|
||||
file(DOWNLOAD ${URL} ${TAR_FILE} SHOW_PROGRESS)
|
||||
endif()
|
||||
|
||||
# 3. 解压源码
|
||||
execute_process(
|
||||
COMMAND tar -xf ${TAR_FILE} -C ${BUILD_DIR}
|
||||
RESULT_VARIABLE TAR_RET
|
||||
)
|
||||
if(NOT TAR_RET EQUAL 0)
|
||||
message(FATAL_ERROR "Extract ${NAME} package failed")
|
||||
endif()
|
||||
|
||||
set(SRC_DIR "${BUILD_DIR}/${NAME}-${VER}")
|
||||
|
||||
# 4. configure
|
||||
execute_process(
|
||||
COMMAND ./configure --prefix=${SOFT_INSTALL_DIR}
|
||||
WORKING_DIRECTORY ${SRC_DIR}
|
||||
RESULT_VARIABLE CONF_RET
|
||||
)
|
||||
if(NOT CONF_RET EQUAL 0)
|
||||
message(FATAL_ERROR "${NAME} configure failed")
|
||||
endif()
|
||||
|
||||
# 5. 编译 + 安装
|
||||
execute_process(COMMAND make -j${BUILD_JOBS} WORKING_DIRECTORY ${SRC_DIR})
|
||||
execute_process(COMMAND make install WORKING_DIRECTORY ${SRC_DIR})
|
||||
|
||||
DEPLOY_MSG("${NAME}-${VER} build & install done")
|
||||
endfunction()
|
||||
|
||||
if(CMAKE_SCRIPT_MODE_FILE)
|
||||
SrcBuild(${NAME} ${VER} ${URL})
|
||||
endif()
|
||||
Reference in New Issue
Block a user