include_guard() include(CheckCXXCompilerFlag) ########################################## # System identification set(OSX OFF) set(LINUX OFF) set(WIN OFF) if(CMAKE_SYSTEM_NAME MATCHES "Linux") set(LINUX ON) elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") set(OSX ON) elseif(CMAKE_SYSTEM_NAME MATCHES "Windows") set(WIN ON) endif() ########################################## cmake_policy(SET CMP0069 NEW) set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) set(CMAKE_POSITION_INDEPENDENT_CODE ON) ########################################## # MinGW LTO will cause errors in compile stage # We just disable it if(MINGW) set(MINGW_WARNING_SHOWED FALSE) if (NOT ${MINGW_WARNING_SHOWED}) set(MINGW_WARNING_SHOWED TRUE) message(STATUS "!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!") message(STATUS "!!! Cross compile with MinGW is not fully tested !!!") message(STATUS "!!! Compile will continue after 10 seconds !!!") message(STATUS "!!! to stop compile. !!!") message(STATUS "!!! USE AT YOUR OWN RISK, YOU HAVE BEEN WARNED !!!") message(STATUS "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 10) endif() set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF) elseif(NOT CMAKE_SYSTEM_NAME MATCHES "Emscripten") set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) endif() ########################################## if(MOMO_BUILD_AS_LIBRARY) add_compile_definitions(MOMO_BUILD_AS_LIBRARY=1) else() add_compile_definitions(MOMO_BUILD_AS_LIBRARY=0) endif() ########################################## if(MOMO_ENABLE_RUST_CODE) add_compile_definitions(MOMO_ENABLE_RUST_CODE=1) else() add_compile_definitions(MOMO_ENABLE_RUST_CODE=0) endif() ########################################## if(UNIX) momo_add_c_and_cxx_compile_options( -fvisibility=hidden -ftrivial-auto-var-init=zero ) endif() ########################################## if(LINUX) add_link_options( -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,now -Wl,-z,noexecstack -static-libstdc++ ) momo_add_c_and_cxx_compile_options( -ffunction-sections -fdata-sections -fstack-protector-strong -fdiagnostics-color=always ) add_compile_definitions( _REENTRANT _THREAD_SAFE ) if(NOT MOMO_ENABLE_SANITIZER) add_compile_definitions( _FORTIFY_SOURCE=2 ) endif() set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie") endif() ########################################## if(CMAKE_SYSTEM_NAME MATCHES "Emscripten") momo_add_c_and_cxx_compile_options( -fexceptions -ftrivial-auto-var-init=zero -Wno-dollar-in-identifier-extension ) add_link_options( -fexceptions -sALLOW_MEMORY_GROWTH=1 -sASSERTIONS -sWASM_BIGINT -sUSE_OFFSET_CONVERTER -sMAXIMUM_MEMORY=4gb #-sEXCEPTION_CATCHING_ALLOWED=[..] -sEXIT_RUNTIME -sASYNCIFY ) if(MOMO_EMSCRIPTEN_SUPPORT_NODEJS) add_link_options( -lnodefs.js -sNODERAWFS=1 -sENVIRONMENT=node --pre-js ${CMAKE_CURRENT_LIST_DIR}/misc/node-pre-script.js ) else() add_link_options( -lidbfs.js -sENVIRONMENT=worker -sINVOKE_RUN=0 -sEXPORTED_RUNTIME_METHODS=['callMain'] ) endif() endif() ########################################## if(MSVC) string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") string(REPLACE "/EHs" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") momo_add_c_and_cxx_compile_options( /sdl /GS /Gy /EHa #/guard:cf ) momo_add_compile_options(CXX /Zc:__cplusplus ) add_link_options( /INCREMENTAL:NO ) add_compile_definitions( _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS ) endif() ########################################## if(MOMO_ENABLE_AVX2 AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Android")) set(CMAKE_REQUIRED_FLAGS -Werror) check_cxx_compiler_flag(-mavx2 COMPILER_SUPPORTS_MAVX2) set(CMAKE_REQUIRED_FLAGS "") check_cxx_compiler_flag(/arch:AVX2 COMPILER_SUPPORTS_ARCH_AVX2) if(COMPILER_SUPPORTS_MAVX2) momo_add_c_and_cxx_compile_options(-mavx2) endif() if (COMPILER_SUPPORTS_ARCH_AVX2) momo_add_c_and_cxx_compile_options(/arch:AVX2) endif() endif() ########################################## if(MOMO_ENABLE_SANITIZER) momo_add_c_and_cxx_compile_options(-fsanitize=address) add_link_options(-fsanitize=address) endif() ########################################## # Must be a dynamic runtime (/MD or /MDd) to enforce # shared allocators between emulator and implementation set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$:Debug>DLL) ########################################## if(MSVC) add_link_options( $<$>:/NODEFAULTLIB:libcmt.lib> $<$>:/NODEFAULTLIB:msvcrt.lib> $<$>:/NODEFAULTLIB:libcmtd.lib> $<$>:/NODEFAULTLIB:msvcrtd.lib> ) endif() ########################################## if(CMAKE_GENERATOR MATCHES "Visual Studio") momo_add_c_and_cxx_compile_options(/MP) endif()