mirror of https://github.com/H-uru/korman.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
323 lines
11 KiB
323 lines
11 KiB
# This file is part of Korman. |
|
# |
|
# Korman is free software: you can redistribute it and/or modify |
|
# it under the terms of the GNU General Public License as published by |
|
# the Free Software Foundation, either version 3 of the License, or |
|
# (at your option) any later version. |
|
# |
|
# Korman is distributed in the hope that it will be useful, |
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
# GNU General Public License for more details. |
|
# |
|
# You should have received a copy of the GNU General Public License |
|
# along with Korman. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
set(korman_EXTERNAL_STAGING_DIR "${PROJECT_BINARY_DIR}/external" CACHE PATH "External project staging directory") |
|
mark_as_advanced(korman_EXTERNAL_STAGING_DIR) |
|
|
|
set(korman_HARVEST_DIR "${PROJECT_BINARY_DIR}/harvest" CACHE PATH "") |
|
|
|
cmake_dependent_option( |
|
korman_HARVEST_VCREDIST |
|
"Harvest the vcredist executable as part of Korman's build process" |
|
ON |
|
"MSVC" |
|
OFF |
|
) |
|
|
|
cmake_dependent_option( |
|
korman_HARVEST_PYTHON22 |
|
"Harvest (read: download) the Python 2.2.3 installer as part of Korman's build process" |
|
ON |
|
"WIN32" # If we ever decide to allow NSIS installers, NSIS can run on non-Windows. |
|
OFF |
|
) |
|
|
|
# Since we are (ideally) building everything static, inline right here, we can use IPO on |
|
# all of the static libraries for a uuuuge file size win. Most libs do not do the correct |
|
# CMake magic to turn this on. |
|
include(CheckIPOSupported) |
|
check_ipo_supported( |
|
RESULT _IPO_SUPPORTED |
|
OUTPUT _IPO_OUTPUT |
|
) |
|
message(STATUS "Checking for IPO: ${_IPO_SUPPORTED} ${_IPO_OUTPUT}") |
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ${_IPO_SUPPORTED} CACHE BOOL "") |
|
|
|
if(WIN32) |
|
set(_BUILD_SYSTEM_LIBS ON) |
|
else() |
|
set(_BUILD_SYSTEM_LIBS OFF) |
|
endif() |
|
|
|
option(korman_BUILD_HSPLASMA "Build libHSPlasma as part of Korman's build process" ON) |
|
option(korman_BUILD_JPEG "Build libpjeg-turbo as part of Korman's build process" ${_BUILD_SYSTEM_LIBS}) |
|
option(korman_BUILD_OGGVORBIS "Build libogg and libvorbis as part of Korman's build process" ${_BUILD_SYSTEM_LIBS}) |
|
option(korman_BUILD_PNG "Build libpng as part of Korman's build process" ${_BUILD_SYSTEM_LIBS}) |
|
option(korman_BUILD_ZLIB "Build zlib as part of Korman's build process" ${_BUILD_SYSTEM_LIBS}) |
|
option(korman_BUILD_STRING_THEORY "Build string_theory as part of Korman's build process" ON) |
|
option(korman_BUILD_ALWAYS_UPDATE "Always run the update phase for external dependencies" OFF) |
|
|
|
if(korman_BUILD_HSPLASMA) |
|
list(APPEND korlib_DEPENDS HSPlasma) |
|
endif() |
|
if(korman_BUILD_JPEG) |
|
list(APPEND HSPlasma_DEPENDS libjpeg-turbo) |
|
endif() |
|
if(korman_BUILD_OGGVORBIS) |
|
list(APPEND korlib_DEPENDS libvorbis) |
|
list(APPEND libvorbis_DEPENDS libogg) |
|
endif() |
|
if(korman_BUILD_STRING_THEORY) |
|
list(APPEND HSPlasma_DEPENDS string_theory) |
|
endif() |
|
if(korman_BUILD_PNG) |
|
list(APPEND HSPlasma_DEPENDS libpng) |
|
endif() |
|
if(korman_BUILD_ZLIB) |
|
list(APPEND HSPlasma_DEPENDS zlib) |
|
list(APPEND libpng_DEPENDS zlib) |
|
endif() |
|
|
|
set(_ExternalProjectCMakeCache |
|
-DCMAKE_INSTALL_PREFIX:PATH=${korman_HARVEST_DIR} |
|
-DCMAKE_POLICY_DEFAULT_CMP0069:STRING=NEW |
|
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION:BOOL=${CMAKE_INTERPROCEDURAL_OPTIMIZATION} |
|
) |
|
|
|
include(ExternalProject) |
|
include(FetchContent) |
|
|
|
function(korman_rewrite_url) |
|
cmake_parse_arguments( |
|
PARSE_ARGV 0 _kru |
|
"" |
|
"RESULT_VARIABLE;URL" |
|
"" |
|
) |
|
|
|
# SourceForge's mirrors are unstable, and CI keeps failing when the standard URL picks a |
|
# particularly unstable mirror. So, rewrite any implicit SourceForge (meaning, no specific mirror |
|
# has been selected) download URLs to use known stable mirrors. This should prevent spurious |
|
# CI failures. |
|
if(_kru_URL MATCHES [[^https:\/\/sourceforge.net\/projects\/[^\/]+\/files\/[^\/]+\/[^\/]+\/[^\/]+\/download$]]) |
|
# Borrowed from vcpkg |
|
set(sourceforge_mirrors |
|
cfhcable # United States |
|
pilotfiber # New York, NY |
|
gigenet # Chicago, IL |
|
versaweb # Las Vegas, NV |
|
ayera # Modesto, CA |
|
netactuate # Durham, NC |
|
phoenixnap # Tempe, AZ |
|
astuteinternet # Vancouver, BC |
|
freefr # Paris, France |
|
netcologne # Cologne, Germany |
|
deac-riga # Latvia |
|
excellmedia # Hyderabad, India |
|
iweb # Montreal, QC |
|
jaist # Nomi, Japan |
|
jztkft # Mezotur, Hungary |
|
managedway # Detroit, MI |
|
nchc # Taipei, Taiwan |
|
netix # Bulgaria |
|
ufpr # Curitiba, Brazil |
|
tenet # Wynberg, South Africa |
|
) |
|
foreach(mirror IN LISTS sourceforge_mirrors) |
|
message(DEBUG "SF: ${_kru_URL}?use_mirror=${mirror}") |
|
list(APPEND _result "${_kru_URL}?use_mirror=${mirror}") |
|
endforeach() |
|
else() |
|
set(_result ${_kru_URL}) |
|
endif() |
|
|
|
set(${_kru_RESULT_VARIABLE} ${${_kru_RESULT_VARIABLE}};${_result} PARENT_SCOPE) |
|
endfunction() |
|
|
|
function(korman_add_external_project TARGET) |
|
set(_args ${ARGN}) |
|
|
|
# Lookup any argument for URL so we can apply any santitation rules needed. |
|
list(FIND _args "URL" _url_args_idx) |
|
if(_url_args_idx GREATER_EQUAL 0) |
|
math(EXPR _url_pos "${_url_args_idx} + 1") |
|
while(TRUE) |
|
list(GET _args ${_url_pos} _url) |
|
if(NOT _url MATCHES [[^https?:\/\/]]) |
|
break() |
|
endif() |
|
list(REMOVE_AT _args ${_url_pos}) |
|
korman_rewrite_url( |
|
RESULT_VARIABLE "_fixed_urls" |
|
URL "${_url}" |
|
) |
|
endwhile() |
|
list(INSERT _args ${_url_pos} ${_fixed_urls}) |
|
endif() |
|
|
|
if("GIT_REPOSITORY" IN_LIST _args) |
|
list(APPEND _args GIT_PROGRESS TRUE) |
|
if(NOT "GIT_SHALLOW" IN_LIST _args) |
|
list(APPEND _args GIT_SHALLOW TRUE) |
|
endif() |
|
endif() |
|
|
|
list(FIND _args "CMAKE_CACHE_ARGS" _cache_args_idx) |
|
if(_cache_args_idx EQUAL -1) |
|
list(APPEND _args CMAKE_CACHE_ARGS ${_ExternalProjectCMakeCache}) |
|
else() |
|
math(EXPR _cache_insert_pos "${_cache_args_idx} + 1") |
|
list(INSERT _args ${_cache_insert_pos} ${_ExternalProjectCMakeCache}) |
|
endif() |
|
|
|
set(_builddir "${korman_EXTERNAL_STAGING_DIR}/${TARGET}/src/build") |
|
if(CMAKE_GENERATOR_PLATFORM) |
|
string(APPEND _builddir "-${CMAKE_GENERATOR_PLATFORM}") |
|
endif() |
|
|
|
list(APPEND _args |
|
PREFIX "${korman_EXTERNAL_STAGING_DIR}" |
|
BINARY_DIR "${_builddir}" |
|
DEPENDS ${${TARGET}_DEPENDS} |
|
) |
|
|
|
ExternalProject_Add(${TARGET} ${_args}) |
|
endfunction() |
|
|
|
if(korman_BUILD_JPEG) |
|
korman_add_external_project(libjpeg-turbo |
|
GIT_REPOSITORY "https://github.com/libjpeg-turbo/libjpeg-turbo.git" |
|
GIT_TAG 3.0.3 |
|
CMAKE_CACHE_ARGS |
|
-DBUILD_SHARED_LIBS:BOOL=OFF |
|
-DENABLE_SHARED:BOOL=FALSE |
|
-DENABLE_STATIC:BOOL=TRUE |
|
-DWITH_CRT_DLL:BOOL=ON # WTF libjpeg-turbo, this is a smell. |
|
-DWITH_JAVA:BOOL=FALSE |
|
-DWITH_TURBOJPEG:BOOL=FALSE |
|
) |
|
endif() |
|
|
|
if(korman_BUILD_OGGVORBIS) |
|
korman_add_external_project(libogg |
|
GIT_REPOSITORY "https://github.com/xiph/ogg.git" |
|
GIT_TAG v1.3.5 |
|
CMAKE_CACHE_ARGS |
|
-DBUILD_SHARED_LIBS:BOOL=OFF |
|
-DBUILD_TESTING:BOOL=OFF |
|
-DINSTALL_DOCS:BOOL=OFF |
|
) |
|
korman_add_external_project(libvorbis |
|
GIT_REPOSITORY "https://github.com/xiph/vorbis.git" |
|
GIT_TAG v1.3.7 |
|
CMAKE_CACHE_ARGS |
|
-DBUILD_SHARED_LIBS:BOOL=OFF |
|
) |
|
endif() |
|
|
|
if(korman_BUILD_STRING_THEORY) |
|
# Woe betide us if comaptibility breaks... |
|
if(MSVC AND MSVC_VERSION LESS 1900) |
|
set(_string_theory_tag 2.4) |
|
else() |
|
set(_string_theory_tag 3.7) |
|
endif() |
|
|
|
korman_add_external_project(string_theory |
|
GIT_REPOSITORY "https://github.com/zrax/string_theory.git" |
|
GIT_TAG ${_string_theory_tag} |
|
CMAKE_CACHE_ARGS |
|
-DST_BUILD_TESTS:BOOL=OFF |
|
-DST_BUILD_STATIC:BOOL=ON # string_theory < 3.0 |
|
) |
|
endif() |
|
|
|
if(korman_BUILD_ZLIB) |
|
# Using zlib-ng instead of zlib because the latter's CMakeLists is a pile of steaming garbage |
|
# in that it always produces a shared library if BUILD_SHARED_LIBS=OFF, and bad problems when |
|
# `if(UNIX)` -> TRUE. Grrr. |
|
if(MSVC AND MSVC_TOOLSET_VERSION LESS 140) |
|
list(APPEND _zlib_extra_args |
|
-DCMAKE_C_FLAGS:STRING=/Dinline=__inline # VS2013's C99 support is incomplete. |
|
-DWITH_AVX2:BOOL=OFF # Triggers downstream linker errors |
|
-DWITH_SSE2:BOOL=OFF # Broken |
|
) |
|
endif() |
|
korman_add_external_project(zlib |
|
GIT_REPOSITORY "https://github.com/zlib-ng/zlib-ng.git" |
|
GIT_TAG 2.1.7 |
|
CMAKE_CACHE_ARGS |
|
-DBUILD_SHARED_LIBS:BOOL=OFF |
|
-DZLIB_COMPAT:BOOL=ON |
|
-DZLIB_ENABLE_TESTS:BOOL=OFF |
|
${_zlib_extra_args} |
|
) |
|
endif() |
|
|
|
if(korman_BUILD_PNG) |
|
korman_add_external_project(libpng |
|
URL "https://sourceforge.net/projects/libpng/files/libpng16/1.6.43/libpng-1.6.43.tar.gz/download" |
|
DOWNLOAD_NAME "libpng-1.6.43.tar.gz" |
|
URL_HASH "SHA256=e804e465d4b109b5ad285a8fb71f0dd3f74f0068f91ce3cdfde618180c174925" |
|
CMAKE_CACHE_ARGS |
|
-DBUILD_SHARED_LIBS:BOOL=OFF |
|
-DPNG_EXECUTABLES:BOOL=OFF |
|
-DPNG_SHARED:BOOL=OFF |
|
-DPNG_TESTS:BOOL=OFF |
|
) |
|
endif() |
|
|
|
if(korman_BUILD_HSPLASMA) |
|
korman_add_external_project(HSPlasma |
|
GIT_REPOSITORY "https://github.com/H-uru/libhsplasma.git" |
|
# Be sure to increase this as the feature set used by Korman increases |
|
GIT_TAG f372a43a8ce78b056fe21c7ed372f04a88b20e98 |
|
# We can only do shallow checkouts if the above is a branch or tag. |
|
GIT_SHALLOW FALSE |
|
CMAKE_CACHE_ARGS |
|
-DCMAKE_UNITY_BUILD:BOOL=ON |
|
-DENABLE_NET:BOOL=OFF |
|
-DENABLE_PHYSX:BOOL=OFF |
|
-DENABLE_PYTHON:BOOL=ON |
|
-DENABLE_TOOLS:BOOL=OFF |
|
-DPython3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE} |
|
-DPython3_INCLUDE_DIR:PATH=${Python3_INCLUDE_DIRS} |
|
-DPython3_LIBRARY:FILEPATH=${Python3_LIBRARIES} |
|
) |
|
endif() |
|
|
|
korman_add_external_project(korlib |
|
SOURCE_DIR "${PROJECT_SOURCE_DIR}/korlib" |
|
CMAKE_CACHE_ARGS |
|
-Dkorlib_PYTHON_VERSION:STRING=${Blender_PYTHON_VERSION} |
|
-DPython3_ROOT:PATH=${Python3_ROOT} # Passthru helper |
|
) |
|
|
|
if(korman_HARVEST_VCREDIST) |
|
find_package(VCRedist COMPONENTS Executable REQUIRED) |
|
set(_vcredist_destination "${korman_HARVEST_DIR}/bin/${VCRedist_NAME}") |
|
add_custom_target(VCRedist |
|
ALL |
|
COMMAND "${CMAKE_COMMAND}" -E make_directory "${korman_HARVEST_DIR}" |
|
COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${VCRedist_EXECUTABLE}" "${_vcredist_destination}" |
|
BYPRODUCTS "${_vcredist_destination}" |
|
) |
|
install( |
|
PROGRAMS |
|
"${_vcredist_destination}" |
|
DESTINATION "." |
|
) |
|
endif() |
|
|
|
FetchContent_Declare(Python22 |
|
URL "https://www.python.org/ftp/python/2.2.3/Python-2.2.3.exe" |
|
URL_HASH MD5=d76e774a4169794ae0d7a8598478e69e |
|
DOWNLOAD_DIR "${korman_HARVEST_DIR}/bin" |
|
DOWNLOAD_NAME "Python-2.2.3.exe" |
|
DOWNLOAD_NO_EXTRACT TRUE # Why is this not a flag? Yes, that bit me. |
|
) |
|
if(korman_HARVEST_PYTHON22 AND NOT Python22_POPULATED) |
|
FetchContent_Populate(Python22) |
|
endif()
|
|
|