mirror of https://github.com/axmolengine/axmol.git
146 lines
5.4 KiB
CMake
146 lines
5.4 KiB
CMake
#
|
|
# the 1k fetch functions
|
|
# require predefine variable:
|
|
# _1kfetch_cache_dir
|
|
# _1kfetch_manifest
|
|
#
|
|
|
|
### 1kdist url
|
|
find_program(PWSH_COMMAND NAMES pwsh powershell NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH)
|
|
|
|
function(_1kfetch_init)
|
|
execute_process(COMMAND ${PWSH_COMMAND} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/fetchurl.ps1
|
|
-name "1kdist"
|
|
-manifest ${_1kfetch_manifest}
|
|
OUTPUT_VARIABLE _1kdist_url
|
|
)
|
|
string(REPLACE "#" ";" _1kdist_url ${_1kdist_url})
|
|
list(GET _1kdist_url 0 _1kdist_base_url)
|
|
list(GET _1kdist_url 1 _1kdist_ver)
|
|
set(_1kdist_base_url "${_1kdist_base_url}/v${_1kdist_ver}" PARENT_SCOPE)
|
|
set(_1kdist_ver ${_1kdist_ver} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# fetch prebuilt from 1kdist
|
|
# param package_name
|
|
function(_1kfetch_dist package_name)
|
|
set(_prebuilt_root ${CMAKE_CURRENT_LIST_DIR}/_x)
|
|
if(NOT IS_DIRECTORY ${_prebuilt_root})
|
|
set (package_store "${_1kfetch_cache_dir}/1kdist/v${_1kdist_ver}/${package_name}.zip")
|
|
if (NOT EXISTS ${package_store})
|
|
set (package_url "${_1kdist_base_url}/${package_name}.zip")
|
|
message(AUTHOR_WARNING "Downloading ${package_url}")
|
|
file(DOWNLOAD ${package_url} ${package_store} STATUS _status LOG _logs SHOW_PROGRESS)
|
|
list(GET _status 0 status_code)
|
|
list(GET _status 1 status_string)
|
|
if(NOT status_code EQUAL 0)
|
|
file(REMOVE ${package_store})
|
|
message(FATAL_ERROR "Download ${package_url} fail, ${status_string}, logs: ${_logs}")
|
|
endif()
|
|
endif()
|
|
file(ARCHIVE_EXTRACT INPUT ${package_store} DESTINATION ${CMAKE_CURRENT_LIST_DIR}/)
|
|
if (IS_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/${package_name})
|
|
file(RENAME ${CMAKE_CURRENT_LIST_DIR}/${package_name} ${_prebuilt_root})
|
|
else() # download may fail
|
|
file(REMOVE ${package_store})
|
|
message(FATAL_ERROR "The package ${package_store} is malformed, please try again!")
|
|
endif()
|
|
endif()
|
|
|
|
# set platform specific path, PLATFORM_NAME provided by user: win32,winrt,mac,ios,android,tvos,watchos,linux
|
|
set(_prebuilt_lib_dir "${_prebuilt_root}/lib/${PLATFORM_NAME}")
|
|
if(ANDROID OR WIN32)
|
|
set(_prebuilt_lib_dir "${_prebuilt_lib_dir}/${ARCH_ALIAS}")
|
|
endif()
|
|
set(${package_name}_INC_DIR ${_prebuilt_root}/include PARENT_SCOPE)
|
|
set(${package_name}_LIB_DIR ${_prebuilt_lib_dir} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
function(_1kfetch uri)
|
|
set(oneValueArgs NAME)
|
|
cmake_parse_arguments(opt "" "${oneValueArgs}" "" ${ARGN})
|
|
|
|
set(_pkg_name)
|
|
if(opt_NAME)
|
|
set(_pkg_name ${opt_NAME})
|
|
else()
|
|
# parse pkg name for pkg_store due to we can't get from execute_process properly
|
|
string(REGEX REPLACE "#.*" "" _trimmed_uri ${uri})
|
|
get_filename_component(_pkg_name ${_trimmed_uri} NAME_WE)
|
|
endif()
|
|
|
|
set(_pkg_store "${_1kfetch_cache_dir}/${_pkg_name}")
|
|
execute_process(COMMAND ${PWSH_COMMAND} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/fetch.ps1
|
|
-uri "${uri}"
|
|
-prefix "${_1kfetch_cache_dir}"
|
|
-manifest "${_1kfetch_manifest}"
|
|
-name "${_pkg_name}"
|
|
RESULT_VARIABLE _errorcode
|
|
)
|
|
if (_errorcode)
|
|
message(FATAL_ERROR "fetch content ${uri} failed")
|
|
endif()
|
|
set(${_pkg_name}_SOURCE_DIR ${_pkg_store} PARENT_SCOPE)
|
|
set(source_dir ${_pkg_store} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# for example: _1kcm_add_pkg("gh:yasio/yasio#4.2.1")
|
|
function(_1kcm_add_pkg uri)
|
|
_1kfetch(${uri} ${ARGN})
|
|
|
|
set(optValueArgs EXCLUDE_FROM_ALL)
|
|
set(oneValueArgs OPTIONS)
|
|
cmake_parse_arguments(opt "${optValueArgs}" "${oneValueArgs}" "" ${ARGN})
|
|
foreach(OPTION ${opt_OPTIONS})
|
|
_1k_parse_option("${OPTION}")
|
|
set(${OPTION_KEY} "${OPTION_VALUE}" CACHE BOOL "" FORCE)
|
|
endforeach()
|
|
set(binary_dir "")
|
|
if(IS_ABSOLUTE ${source_dir})
|
|
string(LENGTH "${_AX_ROOT}/cache/" _offset)
|
|
string(LENGTH ${source_dir} _len)
|
|
math(EXPR _len "${_len} - ${_offset}" OUTPUT_FORMAT DECIMAL)
|
|
string(SUBSTRING ${source_dir} ${_offset} ${_len} _path)
|
|
set(binary_dir "${CMAKE_BINARY_DIR}/1kiss/${_path}")
|
|
endif()
|
|
|
|
if (opt_EXCLUDE_FROM_ALL)
|
|
add_subdirectory(${source_dir} ${binary_dir} EXCLUDE_FROM_ALL)
|
|
else()
|
|
add_subdirectory(${source_dir} ${binary_dir})
|
|
endif()
|
|
endfunction()
|
|
|
|
function(_1klink src dest)
|
|
file(TO_NATIVE_PATH "${src}" _srcDir)
|
|
file(TO_NATIVE_PATH "${dest}" _dstDir)
|
|
execute_process(COMMAND ${PWSH_COMMAND} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/fsync.ps1 -s "${_srcDir}" -d "${_dstDir}" -l 1)
|
|
endfunction()
|
|
|
|
function(_1k_parse_option OPTION)
|
|
string(REGEX MATCH "^[^ ]+" OPTION_KEY "${OPTION}")
|
|
string(LENGTH "${OPTION}" OPTION_LENGTH)
|
|
string(LENGTH "${OPTION_KEY}" OPTION_KEY_LENGTH)
|
|
if(OPTION_KEY_LENGTH STREQUAL OPTION_LENGTH)
|
|
# no value for key provided, assume user wants to set option to "ON"
|
|
set(OPTION_VALUE "ON")
|
|
else()
|
|
math(EXPR OPTION_KEY_LENGTH "${OPTION_KEY_LENGTH}+1")
|
|
string(SUBSTRING "${OPTION}" "${OPTION_KEY_LENGTH}" "-1" OPTION_VALUE)
|
|
endif()
|
|
set(OPTION_KEY
|
|
"${OPTION_KEY}"
|
|
PARENT_SCOPE
|
|
)
|
|
set(OPTION_VALUE
|
|
"${OPTION_VALUE}"
|
|
PARENT_SCOPE
|
|
)
|
|
endfunction()
|
|
|
|
if(PWSH_COMMAND)
|
|
_1kfetch_init()
|
|
else()
|
|
message(WARNING "fetch.cmake: PowerShell is missing, the fetch functions not work, please install from https://github.com/PowerShell/PowerShell/releases")
|
|
endif()
|