summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCzarek Nakamoto <cyjan@mrcyjanek.net>2026-02-22 11:57:00 +0100
committerCzarek Nakamoto <cyjan@mrcyjanek.net>2026-02-22 11:57:00 +0100
commit218e34c4ad7aaa3ef01ac1e869999c309588502b (patch)
treecf039321984f9ba0d104614cd286347090974c8c
parenta8b70857baddea2a6078a80c5c4d6a08203b5981 (diff)
fix: toolchain
-rw-r--r--contrib/depends/Makefile2
-rwxr-xr-xcontrib/depends/gen_toolchain.cmake.sh204
2 files changed, 205 insertions, 1 deletions
diff --git a/contrib/depends/Makefile b/contrib/depends/Makefile
index 46450a1..e391b6b 100644
--- a/contrib/depends/Makefile
+++ b/contrib/depends/Makefile
@@ -2,7 +2,7 @@
HOST ?=
-PACKAGES = native/cmake,native/python@3.14,native/git,native/_,native/make,boost,zeromq,unbound,sodium,openssl,zlib
+PACKAGES = native/cmake,native/python@3.14,native/git,native/_,native/make,native/cmake-toolchain,boost,zeromq,unbound,sodium,openssl,zlib
SIMPLYBS_HASH = 9adf984c68dd37da38d4e9aa905610dda54be7a4
all: simplybs $(if $(HOST),sbs-build-$(HOST),)
diff --git a/contrib/depends/gen_toolchain.cmake.sh b/contrib/depends/gen_toolchain.cmake.sh
index 25cf17e..0810cf4 100755
--- a/contrib/depends/gen_toolchain.cmake.sh
+++ b/contrib/depends/gen_toolchain.cmake.sh
@@ -257,4 +257,208 @@ endif()
#Create a new global cmake flag that indicates building with depends
set (DEPENDS true)
+
+# github.com/mrcyjanek/cmake-toolchain
+
+if(DEFINED ENV{HOST})
+ string(TOLOWER "$ENV{HOST}" _host)
+ message(STATUS "toolchain: HOST = ${_host}")
+
+ if(_host MATCHES "darwin")
+ set(CMAKE_SYSTEM_NAME Darwin)
+ if(_host MATCHES "aarch64")
+ set(CMAKE_SYSTEM_PROCESSOR arm64)
+ endif()
+ if(_host MATCHES "x86_64")
+ set(CMAKE_SYSTEM_PROCESSOR x86_64)
+ endif()
+
+ elseif(_host MATCHES "ios")
+ set(CMAKE_SYSTEM_NAME iOS)
+ if(_host MATCHES "aarch64")
+ set(CMAKE_SYSTEM_PROCESSOR arm64)
+ endif()
+ if(_host MATCHES "x86_64")
+ set(CMAKE_SYSTEM_PROCESSOR x86_64)
+ endif()
+ if(_host MATCHES "simulator")
+ set(_ios_simulator TRUE)
+ endif()
+
+ elseif(_host MATCHES "linux")
+ set(CMAKE_SYSTEM_NAME Linux)
+ if(_host MATCHES "aarch64")
+ set(CMAKE_SYSTEM_PROCESSOR aarch64)
+ endif()
+ if(_host MATCHES "armv7")
+ set(CMAKE_SYSTEM_PROCESSOR armv7)
+ endif()
+ if(_host MATCHES "x86_64")
+ set(CMAKE_SYSTEM_PROCESSOR x86_64)
+ endif()
+
+ elseif(_host MATCHES "android")
+ set(CMAKE_SYSTEM_NAME Android)
+
+ if(_host MATCHES "aarch64")
+ set(CMAKE_SYSTEM_PROCESSOR aarch64)
+ endif()
+ if(_host MATCHES "armv7")
+ set(CMAKE_SYSTEM_PROCESSOR armv7)
+ endif()
+ if(_host MATCHES "x86_64")
+ set(CMAKE_SYSTEM_PROCESSOR x86_64)
+ endif()
+
+ set(CMAKE_ANDROID_STL_TYPE c++_static)
+ set(BUILD_SHARED_LIBS OFF)
+ set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
+
+ elseif(_host MATCHES "mingw" OR _host MATCHES "w64")
+ set(CMAKE_SYSTEM_NAME Windows)
+ if(_host MATCHES "x86_64")
+ set(CMAKE_SYSTEM_PROCESSOR x86_64)
+ endif()
+ if(_host MATCHES "i686")
+ set(CMAKE_SYSTEM_PROCESSOR i686)
+ endif()
+ endif()
+endif()
+
+function(_set_compiler_from_env LANG ENVNAME CMAKE_COMPILER_VAR CMAKE_FLAGS_VAR)
+ if(NOT DEFINED ENV{\${ENVNAME}})
+ return()
+ endif()
+
+ separate_arguments(_tokens UNIX_COMMAND "\$ENV{\${ENVNAME}}")
+ list(LENGTH _tokens _tlen)
+ if(_tlen EQUAL 0)
+ return()
+ endif()
+
+ list(GET _tokens 0 _exe)
+ list(REMOVE_AT _tokens 0) # remaining tokens are flags
+
+ if(NOT IS_ABSOLUTE "\${_exe}")
+ find_program(_found_exe "\${_exe}")
+ if(_found_exe)
+ set(_exe "\${_found_exe}")
+ endif()
+ endif()
+
+ set(\${CMAKE_COMPILER_VAR} "\${_exe}" CACHE PATH "" FORCE)
+
+ if(_tokens)
+ string(REPLACE ";" " " _token_flags "\${_tokens}")
+ else()
+ set(_token_flags "")
+ endif()
+
+ if("\${ENVNAME}" STREQUAL "CC")
+ set(_env_flags "\$ENV{CFLAGS}")
+ elseif("\${ENVNAME}" STREQUAL "CXX")
+ set(_env_flags "\$ENV{CXXFLAGS}")
+ else()
+ set(_env_flags "")
+ endif()
+
+ if(_token_flags AND _env_flags)
+ set(_final_flags "\${_token_flags} \${_env_flags}")
+ elseif(_token_flags)
+ set(_final_flags "\${_token_flags}")
+ elseif(_env_flags)
+ set(_final_flags "\${_env_flags}")
+ else()
+ set(_final_flags "")
+ endif()
+
+ if(_final_flags)
+ set(\${CMAKE_FLAGS_VAR} "\${_final_flags}" CACHE STRING "" FORCE)
+ endif()
+
+ message(STATUS "toolchain: \${CMAKE_COMPILER_VAR} = \${_exe}")
+ if(_final_flags)
+ message(STATUS "toolchain: \${CMAKE_FLAGS_VAR} = \${_final_flags}")
+ endif()
+endfunction()
+
+_set_compiler_from_env("C" "CC" "CMAKE_C_COMPILER" "CMAKE_C_FLAGS_INIT")
+_set_compiler_from_env("CXX" "CXX" "CMAKE_CXX_COMPILER" "CMAKE_CXX_FLAGS_INIT")
+
+if(NOT DEFINED CMAKE_C_FLAGS_INIT AND DEFINED ENV{CFLAGS})
+ set(CMAKE_C_FLAGS_INIT "\$ENV{CFLAGS}" CACHE STRING "" FORCE)
+ message(STATUS "toolchain: fallback CMAKE_C_FLAGS_INIT = \$ENV{CFLAGS}")
+endif()
+if(NOT DEFINED CMAKE_CXX_FLAGS_INIT AND DEFINED ENV{CXXFLAGS})
+ set(CMAKE_CXX_FLAGS_INIT "\$ENV{CXXFLAGS}" CACHE STRING "" FORCE)
+ message(STATUS "toolchain: fallback CMAKE_CXX_FLAGS_INIT = \$ENV{CXXFLAGS}")
+endif()
+
+if(DEFINED ENV{LDFLAGS})
+ set(CMAKE_EXE_LINKER_FLAGS_INIT "\$ENV{LDFLAGS}" CACHE STRING "" FORCE)
+ set(CMAKE_SHARED_LINKER_FLAGS_INIT "\$ENV{LDFLAGS}" CACHE STRING "" FORCE)
+ set(CMAKE_MODULE_LINKER_FLAGS_INIT "\$ENV{LDFLAGS}" CACHE STRING "" FORCE)
+ message(STATUS "toolchain: LDFLAGS = \$ENV{LDFLAGS}")
+endif()
+
+foreach(var AR RANLIB STRIP NM INSTALL_NAME_TOOL LIBTOOL OTOOL)
+ if(DEFINED ENV{\${var}})
+ # some CMake variables are named CMAKE_AR, CMAKE_RANLIB etc.
+ set(CMAKE_\${var} "\$ENV{\${var}}" CACHE PATH "" FORCE)
+ message(STATUS "toolchain: tool \${var} = \$ENV{\${var}}")
+ endif()
+endforeach()
+
+if(DEFINED ENV{SDK_PATH})
+ set(CMAKE_SYSROOT "\$ENV{SDK_PATH}" CACHE PATH "" FORCE)
+ # also set OSX-specific variable (useful for Apple targets)
+ set(CMAKE_OSX_SYSROOT "\$ENV{SDK_PATH}" CACHE PATH "" FORCE)
+ message(STATUS "toolchain: SDK_PATH -> CMAKE_SYSROOT = \$ENV{SDK_PATH}")
+elseif(DEFINED ENV{SYSROOT})
+ set(CMAKE_SYSROOT "\$ENV{SYSROOT}" CACHE PATH "" FORCE)
+ set(CMAKE_OSX_SYSROOT "\$ENV{SYSROOT}" CACHE PATH "" FORCE)
+ message(STATUS "toolchain: SYSROOT -> CMAKE_SYSROOT = \$ENV{SYSROOT}")
+else()
+ # if this is an iOS simulator/native iOS mapping and no SDK_PATH was set,
+ # set the logical name so CMake + Apple toolchain can pick it up if available
+ if(_ios_simulator)
+ set(CMAKE_OSX_SYSROOT iphonesimulator CACHE STRING "" FORCE)
+ elseif(DEFINED _ios_simulator AND NOT _ios_simulator)
+ set(CMAKE_OSX_SYSROOT iphoneos CACHE STRING "" FORCE)
+ endif()
+endif()
+
+if(DEFINED ENV{OSX_MIN_VERSION})
+ set(CMAKE_OSX_DEPLOYMENT_TARGET "\$ENV{OSX_MIN_VERSION}" CACHE STRING "" FORCE)
+ message(STATUS "toolchain: CMAKE_OSX_DEPLOYMENT_TARGET = \$ENV{OSX_MIN_VERSION}")
+endif()
+
+if(DEFINED ENV{PREFIX})
+ set(CMAKE_FIND_ROOT_PATH "\$ENV{PREFIX}" CACHE PATH "" FORCE)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+ message(STATUS "toolchain: CMAKE_FIND_ROOT_PATH = \$ENV{PREFIX}")
+endif()
+
+if(DEFINED ENV{PKG_CONFIG_PATH})
+ set(ENV{PKG_CONFIG_PATH} "\$ENV{PKG_CONFIG_PATH}")
+ message(STATUS "toolchain: PKG_CONFIG_PATH = \$ENV{PKG_CONFIG_PATH}")
+endif()
+
+if(DEFINED CMAKE_C_COMPILER)
+ if(NOT EXISTS "\${CMAKE_C_COMPILER}")
+ message(WARNING "toolchain: C compiler '\${CMAKE_C_COMPILER}' does not exist on filesystem; if it is a program name it must be in PATH.")
+ endif()
+else()
+ message(WARNING "toolchain: C compiler not set (ENV{CC} missing).")
+endif()
+
+if(DEFINED CMAKE_CXX_COMPILER)
+ if(NOT EXISTS "\${CMAKE_CXX_COMPILER}")
+ message(WARNING "toolchain: C++ compiler '\${CMAKE_CXX_COMPILER}' does not exist on filesystem; if it is a program name it must be in PATH.")
+ endif()
+else()
+ message(WARNING "toolchain: C++ compiler not set (ENV{CXX} missing).")
+endif()
EOF