cmake_minimum_required(VERSION 3.9) set(OUT_FILE "wasm3") set(APP_DIR "platforms/app") if(CLANG OR CLANG_SUFFIX) set(CMAKE_C_COMPILER "clang${CLANG_SUFFIX}") set(CMAKE_CXX_COMPILER "clang++${CLANG_SUFFIX}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=lld") endif() if(CLANG_CL) set(CMAKE_C_COMPILER "clang-cl") set(CMAKE_CXX_COMPILER "clang-cl") set(CMAKE_LINKER "lld-link") endif() if(EMSCRIPTEN) set(CMAKE_C_COMPILER "emcc") set(CMAKE_CXX_COMPILER "em++") set(OUT_FILE "wasm3.html") set(APP_DIR "platforms/emscripten") endif() if(WASIENV) set(CMAKE_C_COMPILER "wasicc") set(CMAKE_CXX_COMPILER "wasic++") set(OUT_FILE "wasm3.wasm") set(APP_DIR "platforms/emscripten") endif() if(M EQUAL 32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") endif() if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "set build type to Release") endif() project(wasm3) message("----") message("Generator: ${CMAKE_GENERATOR}") message("Compiler: ${CMAKE_C_COMPILER_ID}") message("Build Type: ${CMAKE_BUILD_TYPE}") include(CheckIPOSupported) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED YES) set(CMAKE_C_EXTENSIONS NO) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED YES) set(CMAKE_CXX_EXTENSIONS NO) file(GLOB M3_SRC "source/*.c" "source/*.cpp" "${APP_DIR}/*.c") add_executable(${OUT_FILE} ${M3_SRC}) include_directories("./source/") #-fno-optimize-sibling-calls set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3AllocateLinearMemory=1") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG=1") if(EMSCRIPTEN) set(CMAKE_C_FLAGS_RELEASE "-O2 -flto -Wfatal-errors") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2 --lto-O3 --closure 1 --strip-all --gc-sections") # --emrun if(WASM_TCO) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Xclang -target-feature -Xclang +tail-call") endif() elseif(WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS /WX- /diagnostics:column") string(REGEX REPLACE "/W[0-4]" "/W0" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") if (CMAKE_C_COMPILER_ID MATCHES "MSVC") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oxs /Oy /GS- /Zi /Zo /arch:AVX2") # Uncomment this if you want to disassemble the release build, # for example: dumpbin /DISASM wasm3.exe /out:wasm3.S #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG:FULL") else() set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Oxs /Oy /GS- /Qvec -Clang -O3") endif() else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasWASI") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wstrict-aliasing -Wno-unused-function -Wno-unused-variable -Wno-unused-parameter -Wno-missing-field-initializers") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb -O0") set(CMAKE_C_FLAGS_RELEASE "-O3 -march=native -Wfatal-errors -fstrict-aliasing") #-fno-inline set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-O0") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-O3") target_link_libraries(${OUT_FILE} m) endif() check_ipo_supported(RESULT result) if(result) set_property(TARGET ${OUT_FILE} PROPERTY INTERPROCEDURAL_OPTIMIZATION True) message("LTO: ON") else() message("LTO: OFF") endif() message("Flags: ${CMAKE_C_FLAGS}") message("Debug flags: ${CMAKE_C_FLAGS_DEBUG}") message("Release flags: ${CMAKE_C_FLAGS_RELEASE}") message("----")