Initial commit

This commit is contained in:
root
2026-06-14 23:45:57 +08:00
commit e13621a510
48 changed files with 4304 additions and 0 deletions

67
cmake/Common.cmake Normal file
View 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
View 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
View 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
View 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
View 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()