# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
# CANN Open Software License Agreement Version 2.0 (the "License").
# Please refer to the License for details. You may not use this file except in compliance with the License.
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
# See LICENSE in the root of the software repository for the full text of the License.
# ------------------------------------------------------------------------------------------------------------
# makeself.cmake - 自定义 makeself 打包脚本
# 设置 makeself 路径
set(MAKESELF_EXE ${CPACK_CMAKE_BINARY_DIR}/makeself/makeself.sh)
set(MAKESELF_HEADER_EXE ${CPACK_CMAKE_BINARY_DIR}/makeself/makeself-header.sh)
if(NOT MAKESELF_EXE)
message(FATAL_ERROR "makeself not found! Install it with: apt install makeself")
endif()
# 创建临时安装目录
set(STAGING_DIR "${CPACK_CMAKE_BINARY_DIR}/${CPACK_PKG_NAME}")
file(MAKE_DIRECTORY "${STAGING_DIR}")
# 生成安装配置文件
set(CSV_OUTPUT ${CPACK_CMAKE_BINARY_DIR}/filelist.csv)
execute_process(
COMMAND python3 ${CPACK_CMAKE_SOURCE_DIR}/scripts/package/package.py --pkg_name ${CPACK_PKG_NAME} --feature_list ${CPACK_FEATURE_LIST} --chip_name ${CPACK_SOC} --os_arch ${CPACK_OS_VERSION}-${CPACK_ARCH}
WORKING_DIRECTORY ${CPACK_CMAKE_BINARY_DIR}
OUTPUT_VARIABLE result
ERROR_VARIABLE error
RESULT_VARIABLE code
OUTPUT_STRIP_TRAILING_WHITESPACE
)
message(STATUS "package.py result: ${code}")
if (NOT code EQUAL 0)
message(FATAL_ERROR "Filelist generation failed, execution result: ${result}, error: ${error}")
else ()
message(STATUS "Filelist generated successfully: ${result}")
if (NOT EXISTS ${CSV_OUTPUT})
message(FATAL_ERROR "Output file not created: ${CSV_OUTPUT}")
endif ()
endif ()
set(SCENE_OUT_PUT
${CPACK_CMAKE_BINARY_DIR}/scene.info
)
configure_file(
${SCENE_OUT_PUT}
${STAGING_DIR}/${CPACK_PKG_SCENE_INFO_INSTALL_PATH}
COPYONLY
)
# makeself打包
if("${CPACK_SOC}" STREQUAL "ascend910B")
set(FIND_PACKAGE_NAME "Ascend-hdk-910b-driver")
if("${CPACK_SOC_EX}" STREQUAL "ascend910_93")
set(PACKAGE_PREFIX "Ascend-hdk-A3-driver")
else()
set(PACKAGE_PREFIX "Ascend-hdk-910b-driver")
endif()
elseif("${CPACK_SOC}" STREQUAL "ascend950")
set(FIND_PACKAGE_NAME "Ascend-hdk-950-driver")
set(PACKAGE_PREFIX "Ascend-hdk-950-driver")
else()
message(FATAL_ERROR "Unknown: soc=${CPACK_SOC}")
endif()
file(STRINGS ${CPACK_CMAKE_BINARY_DIR}/makeself.txt script_output)
string(REPLACE " " ";" makeself_param_string "${script_output}")
string(REPLACE "${FIND_PACKAGE_NAME}" "${PACKAGE_PREFIX}" makeself_param_string "${makeself_param_string}")
string(REGEX MATCH "${PACKAGE_PREFIX}.*\\.run" package_name "${makeself_param_string}")
message(STATUS "script output: ${script_output}")
message(STATUS "makeself: ${makeself_param_string}")
message(STATUS "package: ${package_name}")
execute_process(COMMAND bash ${MAKESELF_EXE}
--header ${MAKESELF_HEADER_EXE}
--help-header ${CPACK_PKG_HELP_INFO_INSTALL_PATH}
${makeself_param_string} ${CPACK_PKG_INSTALL_SH_INSTALL_PATH}
WORKING_DIRECTORY ${STAGING_DIR}
RESULT_VARIABLE EXEC_RESULT
ERROR_VARIABLE EXEC_ERROR
)
if(NOT EXEC_RESULT EQUAL 0)
message(FATAL_ERROR "makeself packaging failed: ${EXEC_ERROR}")
endif()
execute_process(
COMMAND mkdir -p ${CPACK_PACKAGE_DIRECTORY}
COMMAND mv ${STAGING_DIR}/${package_name} ${CPACK_PACKAGE_DIRECTORY}/
COMMAND echo "Move ${STAGING_DIR}/${package_name} to ${CPACK_PACKAGE_DIRECTORY}/"
WORKING_DIRECTORY ${STAGING_DIR}
)