project(thirdparty) option(OPT_BOX2D_OPTIMIZED "" OFF) option(AX_WITH_BOX2D "Build with internal Box2D support" ON) option(AX_WITH_CHIPMUNK "Build with internal chipmunk support" ON) option(AX_WITH_RECAST "Build with internal recast support" ON) option(AX_WITH_BULLET "Build with internal bullet support" ON) option(AX_WITH_JPEG "Build with internal jpeg support" ON) option(AX_WITH_WEBP "Build with internal webp support" ON) option(AX_WITH_CLIPPER2 "Build with internal Clipper2 support" ON) option(AX_WITH_POLY2TRI "Build with internal poly2tri support" ON) option(AX_WITH_FASTLZ "Build with internal fastlz support" ON) option(AX_WITH_LZ4 "Build with internal lz4 support" OFF) option(AX_WITH_CURL "Build with internal curl support" ON) option(AX_WITH_UNZIP "Build with internal unzip support" ON) option(AX_WITH_ASTCENC "Build with internal ASTCENC support" ON) option(AX_WITH_CARES "Build with internal c-ares support" OFF) option(AX_WITH_YAML_CPP "Build with yaml-cpp support" OFF) option(AX_WITH_KCP "Build with internal kcp support" OFF) option(AX_WITH_OBOE "Build with oboe support" OFF) # by default, enable ios,macOS openal-soft framework for legal license LGPL-2.1 option(ALSOFT_OSX_FRAMEWORK "" ON) set(ANDROID_SHARED_LOADS "" CACHE INTERNAL "The android shared libraries load source code" ) set(ANDROID_SHARED_LOAD_FILE_NAME "SharedLoader.java" CACHE INTERNAL "The android shared load java file name" ) set(ANDROID_SHARED_LOAD_FILE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${ANDROID_SHARED_LOAD_FILE_NAME}.in" CACHE INTERNAL "The android shared libraries load config code file" ) cmake_policy(SET CMP0079 NEW) include(CheckIncludeFile) include(CheckCCompilerFlag) include(CheckCSourceCompiles) include(CheckCXXSourceCompiles) # Note: we set default AX_ISA_LEVEL to 2 for sse4.1 for axmol app can runs on large amount devices # If you want axmol app runs on more old devices, you can specify in cmake cmdline `-DAX_ISA_LEVEL=1`, # otherwise, host compiler generated instructions will crash on old devices which not support high level # SIMD instructions. set(AX_ISA_LEVEL 2 CACHE STRING "SIMD Instructions Acceleration Level") # SIMD instrinsics detetion when AX_ISA_LEVEL not 0 if(AX_ISA_LEVEL) ### check -msse2 flag set(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) if(MSVC) set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} /WX") check_c_compiler_flag("/arch:SSE2" AX_HAVE_SSE2_SWITCH) else() set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Werror") check_c_compiler_flag(-msse2 AX_HAVE_SSE2_SWITCH) endif() if (AX_HAVE_SSE2_SWITCH) set(AX_HAVE_SSE2_INTRINSICS 1) endif() ### end check -msse2 flag macro(ax_check_c_source source outputVar) if (NOT CMAKE_CROSSCOMPILING) check_c_source_runs("${source}" ${outputVar}) else() check_c_source_compiles("${source}" ${outputVar}) endif() endmacro(ax_check_c_source source var) # Checking intel SIMD Intrinsics include(CheckCSourceRuns) if(APPLE) set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mpopcnt") endif() ax_check_c_source("#include int main() { __m256 m = _mm256_set_ps(0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f); return (int)*(float*)&m; }" AX_HAVE_AVX2_INTRINSICS) ax_check_c_source("#include int main() { unsigned int v = 0; return (int)_mm_popcnt_u32(v); }" AX_HAVE_SSE42_INTRINSICS) ax_check_c_source("#include int main() { __m128i shuf = _mm_set_epi8(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0); return *(int*)&shuf; }" AX_HAVE_SSE41_INTRINSICS) if (NOT AX_HAVE_SSE2_INTRINSICS) ax_check_c_source("#include int main() { __m128d m = _mm_set_sd(0.0); return (int)*(double*)&m; }" AX_HAVE_SSE2_INTRINSICS) endif() set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS}) ### Checking ARM SIMD neon if (NOT WASM) # wasm neon stupid not work, so skipped check_include_file(arm_neon.h AX_HAVE_ARM_NEON_H) if(AX_HAVE_ARM_NEON_H) check_c_source_compiles("#include int main() { int32x4_t ret4 = vdupq_n_s32(0); return vgetq_lane_s32(ret4, 0); }" AX_HAVE_NEON_INTRINSICS) endif() endif() set(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS}) unset(OLD_REQUIRED_FLAGS) ### set AX_ISA_SIMD if(AX_HAVE_AVX2_INTRINSICS AND AX_ISA_LEVEL GREATER_EQUAL 4) set(AX_ISA_SIMD "avx2" CACHE STRING "" FORCE) elseif(AX_HAVE_SSE42_INTRINSICS AND AX_ISA_LEVEL GREATER_EQUAL 3) set(AX_ISA_SIMD "sse4.2" CACHE STRING "" FORCE) elseif(AX_HAVE_SSE41_INTRINSICS AND AX_ISA_LEVEL GREATER_EQUAL 2) set(AX_ISA_SIMD "sse4.1" CACHE STRING "" FORCE) elseif(AX_HAVE_SSE2_INTRINSICS AND AX_ISA_LEVEL) set(AX_ISA_SIMD "sse2" CACHE STRING "" FORCE) elseif(AX_HAVE_NEON_INTRINSICS AND AX_ISA_LEVEL) set(AX_ISA_SIMD "neon" CACHE STRING "" FORCE) else() set(AX_ISA_SIMD "null") endif() message(AUTHOR_WARNING "AX_ISA_SIMD=${AX_ISA_SIMD}") if (WINDOWS) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if (AX_HAVE_SSE41_INTRINSICS AND AX_ISA_LEVEL GREATER_EQUAL 2) add_compile_options("-msse4.1") endif() endif() endif() endif() if (WINRT) add_definitions(-D_CRT_SECURE_NO_WARNINGS=1) endif() if(NOT DEFINED AX_USE_LUAJIT) set(AX_USE_LUAJIT FALSE CACHE INTERNAL "Use luajit instead plainlua") endif() if(NOT AX_USE_LUAJIT) message(STATUS "Using plainlua https://lua.org") set (AX_LUA_ENGINE "plainlua" CACHE INTERNAL "") else() message(STATUS "Using luajit https://luajit.org") set (AX_LUA_ENGINE "luajit" CACHE INTERNAL "") endif() add_library(thirdparty INTERFACE) set(_1kfetch_cache_dir "${CMAKE_CURRENT_LIST_DIR}/_deps" CACHE STRING "" FORCE) set(_1kfetch_manifest "${CMAKE_CURRENT_LIST_DIR}/manifest.json" CACHE STRING "" FORCE) # fetch prebuilts of 1k_dist and git sources include(${_AX_ROOT}/1k/fetch.cmake) function(xpm_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() function(ax_add_3rd source_dir) set(options EXCLUDE_FROM_ALL NO_LINK) set(multiValueArgs TARGETS OPTIONS) cmake_parse_arguments(opt "${options}" "" "${multiValueArgs}" ${ARGN}) foreach(OPTION ${opt_OPTIONS}) xpm_parse_option("${OPTION}") set(${OPTION_KEY} "${OPTION_VALUE}" CACHE BOOL "" FORCE) endforeach() if (opt_EXCLUDE_FROM_ALL) add_subdirectory(${source_dir} EXCLUDE_FROM_ALL) else() add_subdirectory(${source_dir}) endif() if(NOT opt_TARGETS) # if opt_TARGETS not specified use source_dir as target name list(APPEND opt_TARGETS ${source_dir}) endif() foreach(tgt ${opt_TARGETS}) get_target_property(tgt_type ${tgt} TYPE) if (NOT ${opt_NO_LINK}) if(tgt_type STREQUAL "STATIC_LIBRARY" OR tgt_type STREQUAL "SHARED_LIBRARY" OR tgt_type STREQUAL "INTERFACE_LIBRARY") target_link_libraries(thirdparty INTERFACE ${tgt}) endif() else() add_dependencies(thirdparty ${tgt}) endif() get_target_property(is_imported_lib ${tgt} IMPORTED) if ((NOT is_imported_lib) AND (NOT (tgt_type STREQUAL "INTERFACE_LIBRARY"))) set_target_properties(${tgt} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" FOLDER "ThirdParty" ) endif() endforeach() endfunction() # bellow are header only libs target_include_directories(thirdparty INTERFACE "robin-map/include" ) if (ANDROID) target_include_directories(thirdparty INTERFACE "jni.hpp/include" ) endif() ax_add_3rd(fmt EXCLUDE_FROM_ALL TARGETS fmt-header-only) # bellow are non header only libs # cpufeatures if(ANDROID) add_subdirectory(android-specific/cpufeatures) endif() if(NOT EMSCRIPTEN) ax_add_3rd(zlib) endif(NOT EMSCRIPTEN) # libpng ax_add_3rd(png) if(AX_WITH_BOX2D) set(box2d_opts "BOX2D_BUILD_UNIT_TESTS OFF" "BOX2D_BUILD_TESTBED OFF") if(OPT_BOX2D_OPTIMIZED) _1kfetch(box2d-optimized "https://github.com/mtsamis/box2d-optimized.git") ax_add_3rd(${box2d-optimized_SOURCE_DIR} TARGETS box2d-optimized OPTIONS ${box2d_opts}) else() ax_add_3rd(box2d OPTIONS ${box2d_opts}) endif() endif(AX_WITH_BOX2D) if(AX_WITH_CHIPMUNK) ax_add_3rd(chipmunk OPTIONS "CP_BUILD_SHARED OFF" "CP_BUILD_STATIC ON" "CP_BUILD_DEMOS OFF" "CP_INSTALL_STATIC OFF" ) set_target_properties(chipmunk PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/chipmunk/include" ) # !important axmol not use double precision target_compile_definitions(chipmunk PUBLIC CP_USE_CGTYPES=0) target_compile_definitions(chipmunk PUBLIC CP_USE_DOUBLES=0) endif(AX_WITH_CHIPMUNK) ax_add_3rd(freetype OPTIONS "FT_WITH_ZLIB ON" "DISABLE_FORCE_DEBUG_POSTFIX ON" "SKIP_INSTALL_ALL TRUE" "FT_DISABLE_HARFBUZZ TRUE" "FT_DISABLE_BROTLI TRUE" "FT_DISABLE_BZIP2 TRUE" ) if (WINRT) target_compile_definitions(freetype PUBLIC "generic=GenericFromFreeTypeLibrary") endif() target_include_directories(thirdparty INTERFACE "freetype/include") if(AX_WITH_RECAST) ax_add_3rd(recast) endif(AX_WITH_RECAST) if(AX_WITH_BULLET) ax_add_3rd(bullet) endif(AX_WITH_BULLET) if(AX_WITH_JPEG AND NOT WINRT AND NOT EMSCRIPTEN) ax_add_3rd(jpeg-turbo) endif() add_subdirectory(openssl) if(ANDROID OR LINUX) target_link_libraries(OpenSSL::SSL INTERFACE OpenSSL::Crypto) target_link_libraries(thirdparty INTERFACE OpenSSL::SSL) else() target_link_libraries(thirdparty INTERFACE OpenSSL::Crypto INTERFACE OpenSSL::SSL) endif() target_compile_definitions(thirdparty INTERFACE OPENSSL_SUPPRESS_DEPRECATED=1) if(AX_WITH_WEBP) ax_add_3rd(webp) endif(AX_WITH_WEBP) ax_add_3rd(pugixml) ax_add_3rd(xxhash) if (AX_WITH_FASTLZ) ax_add_3rd(fastlz) endif() if(AX_WITH_LZ4) if (NOT BUILD_SHARED_LIBS) set(lz4_tgt lz4_static) else() set(lz4_tgt lz4_shared) endif() _1kfetch(lz4 "https://github.com/lz4/lz4.git") ax_add_3rd(${lz4_SOURCE_DIR}/build/cmake TARGETS ${lz4_tgt} OPTIONS "LZ4_BUILD_CLI OFF" "LZ4_BUILD_LEGACY_LZ4C OFF" ) endif() if(AX_WITH_CLIPPER2) ax_add_3rd(clipper2) endif(AX_WITH_CLIPPER2) ax_add_3rd(ConvertUTF) if(AX_WITH_POLY2TRI) ax_add_3rd(poly2tri) target_compile_definitions(poly2tri PUBLIC P2T_STATIC_EXPORTS) endif(AX_WITH_POLY2TRI) if(AX_WITH_ASTCENC) ax_add_3rd(astcenc) endif(AX_WITH_ASTCENC) # use lua/js specific libs by property to prevent conflict if(AX_ENABLE_EXT_LUA) add_subdirectory(lua/${AX_LUA_ENGINE}) add_subdirectory(lua/tolua) add_subdirectory(lua/lua-cjson) set_property(TARGET thirdparty APPEND PROPERTY AX_LUA_DEPEND ${AX_LUA_ENGINE} tolua lua-cjson ) if (AX_USE_LUAJIT) target_compile_definitions(lua-cjson PRIVATE USING_LUAJIT=1) endif() endif() if(AX_WITH_CURL AND NOT EMSCRIPTEN) ax_add_3rd(curl) if(ANDROID OR LINUX) target_link_libraries(curl INTERFACE OpenSSL::SSL) endif() endif() # The openal-soft(LGPL 2.1) if(AX_USE_ALSOFT AND NOT EMSCRIPTEN) set(alsoft_opts "ALSOFT_DLOPEN OFF" "ALSOFT_UTILS OFF" "ALSOFT_EXAMPLES OFF" "ALSOFT_INSTALL OFF") if (ANDROID) if(AX_WITH_OBOE) _1kfetch(oboe "https://github.com/google/oboe.git") set(ALSOFT_BACKEND_OPENSL OFF CACHE BOOL "Enable OpenSL backend" FORCE) set(OBOE_SOURCE "${oboe_SOURCE_DIR}" CACHE STRING "Source directory for Oboe." FORCE) endif() list(APPEND alsoft_opts "ALSOFT_RTKIT OFF") set(ALSOFT_RTKIT OFF CACHE BOOL "Enable RTKit support" FORCE) endif() if(WINDOWS) list(APPEND alsoft_opts "ALSOFT_BACKEND_WASAPI ON" "ALSOFT_BACKEND_WAVE OFF" "ALSOFT_BACKEND_DSOUND OFF" "ALSOFT_BACKEND_WINMM OFF") endif() ax_add_3rd(openal EXCLUDE_FROM_ALL TARGETS alcommon;OpenAL OPTIONS ${alsoft_opts}) target_include_directories(thirdparty INTERFACE openal) target_compile_definitions(thirdparty INTERFACE AX_USE_ALSOFT=1) set_target_properties(OpenAL alcommon PROPERTIES CXX_STANDARD ${_AX_CXX_STD}) if(ANDROID) set(ANDROID_SHARED_LOADS "${ANDROID_SHARED_LOADS}System.loadLibrary(\"openal\");" CACHE INTERNAL "Android Shared Loads" ) endif() endif() # The ogg decoder ax_add_3rd(ogg) if(WINDOWS OR LINUX OR ANDROID OR WASM) ax_add_3rd(glad) endif() if((WINDOWS AND NOT WINRT) OR MACOSX OR LINUX) ax_add_3rd(glfw OPTIONS "GLFW_BUILD_DOCS OFF" "GLFW_INSTALL OFF" ) set_target_properties(glfw PROPERTIES OUTPUT_NAME glfw) if(NOT WINDOWS) target_link_libraries(thirdparty INTERFACE pthread) endif() target_include_directories(thirdparty INTERFACE "glfw/include/GLFW") endif() # unzip depend on zlib if(AX_WITH_UNZIP) ax_add_3rd(unzip) endif(AX_WITH_UNZIP) if(AX_WITH_CARES) ax_add_3rd(c-ares) target_compile_definitions(thirdparty INTERFACE YASIO_USE_CARES=1) endif(AX_WITH_CARES) ax_add_3rd(llhttp) # libvlc if (AX_ENABLE_VLC_MEDIA AND (NOT _AX_HAVE_VLC)) message(STATUS "Using axmol prebuilt libvlc") ax_add_3rd(vlc TARGETS VLC::vlc;VLC::vlccore) endif() # yaml if(AX_WITH_YAML_CPP) _1kfetch(yaml-cpp "https://github.com/jbeder/yaml-cpp.git") ax_add_3rd(${yaml-cpp_SOURCE_DIR} NO_LINK TARGETS yaml-cpp OPTIONS "YAML_CPP_BUILD_TESTS OFF" "YAML_CPP_BUILD_TOOLS OFF" "YAML_CPP_BUILD_CONTRIB OFF" "YAML_CPP_INSTALL OFF" "YAML_CPP_CLANG_FORMAT_EXE OFF" ) endif() # kcp if(AX_WITH_KCP) set(BUILD_TESTING OFF) _1kfetch(kcp "https://github.com/skywind3000/kcp.git") ax_add_3rd(${kcp_SOURCE_DIR} TARGETS kcp) endif() if (WIN32) if (WINRT) ax_add_3rd(angle TARGETS angle::GLESv2;angle::EGL) else() add_subdirectory(angle) endif() endif() ax_add_3rd(simdjson) if (ANDROID) function(config_android_shared_libs package_name target_folder) string(REPLACE "." "/" package_path ${package_name}) set(ANDROID_PACKAGE_NAME ${package_name}) configure_file(${ANDROID_SHARED_LOAD_FILE_PATH} ${target_folder}/${package_path}/${ANDROID_SHARED_LOAD_FILE_NAME} @ONLY) endfunction() endif()