# # 源码编译安装通用模版、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()