| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 |
- --
- -- Copyright (c) 2012-2025 Daniele Bartolini et al.
- -- SPDX-License-Identifier: MIT
- --
- -- Based on 3rdparty/bx/scripts/toolchain.lua by Branimir Karadzic.
- local android = {};
- local function androidToolchainRoot()
- if android.toolchainRoot == nil then
- local hostTags = {
- windows = "windows-x86_64",
- linux = "linux-x86_64",
- macosx = "darwin-x86_64"
- }
- android.toolchainRoot = "$(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/" .. hostTags[os.get()]
- end
- return android.toolchainRoot;
- end
- function toolchain(build_dir, lib_dir)
- newoption
- {
- trigger = "compiler",
- value = "COMPILER",
- description = "Choose compiler",
- allowed =
- {
- { "android-arm", "Android - ARM" },
- { "android-arm64", "Android - ARM64" },
- { "linux-gcc", "Linux (GCC compiler)" },
- { "linux-clang", "Linux (Clang compiler)" },
- { "mingw-gcc", "MinGW (GCC compiler)" },
- { "wasm", "emscripten/wasm" },
- }
- }
- newoption {
- trigger = "with-32bit-compiler",
- description = "Use 32-bit compiler instead 64-bit.",
- }
- if (_ACTION == nil) then return end
- if _ACTION == "clean" then
- os.rmdir(BUILD_DIR)
- end
- local compiler32bit = false
- if _OPTIONS["with-32bit-compiler"] then
- compiler32bit = true
- end
- if _ACTION == "gmake" then
- if nil == _OPTIONS["compiler"] then
- print("Choose a compiler!")
- os.exit(1)
- end
- if "android-arm" == _OPTIONS["compiler"] then
- if not os.getenv("ANDROID_NDK_ABI") then
- print("Set ANDROID_NDK_ABI environment variable.")
- end
- if not os.getenv("ANDROID_NDK_ROOT") then
- print("Set ANDROID_NDK_ROOT environment variable.")
- end
- premake.gcc.cc = androidToolchainRoot() .. "/bin/clang"
- premake.gcc.cxx = androidToolchainRoot() .. "/bin/clang++"
- premake.gcc.ar = androidToolchainRoot() .. "/bin/llvm-ar"
- premake.gcc.llvm = true
- location(build_dir .. "projects/android-arm")
- elseif "android-arm64" == _OPTIONS["compiler"] then
- if not os.getenv("ANDROID_NDK_ABI") then
- print("Set ANDROID_NDK_ABI environment variable.")
- end
- if not os.getenv("ANDROID_NDK_ROOT") then
- print("Set ANDROID_NDK_ROOT environment variable.")
- end
- premake.gcc.cc = androidToolchainRoot() .. "/bin/clang"
- premake.gcc.cxx = androidToolchainRoot() .. "/bin/clang++"
- premake.gcc.ar = androidToolchainRoot() .. "/bin/llvm-ar"
- premake.gcc.llvm = true
- location(build_dir .. "projects/android-arm64")
- elseif "linux-gcc" == _OPTIONS["compiler"] then
- if not os.is("linux") then
- print("Action not valid in current OS.")
- end
- location(build_dir .. "projects/linux")
- elseif "linux-clang" == _OPTIONS["compiler"] then
- if not os.is("linux") then
- print("Action not valid in current OS.")
- end
- premake.gcc.cc = "clang"
- premake.gcc.cxx = "clang++"
- premake.gcc.ar = "ar"
- location(build_dir .. "projects/linux-clang")
- elseif "mingw-gcc" == _OPTIONS["compiler"] then
- if not os.getenv("MINGW") then
- print("Set MINGW environment variable.")
- os.exit(1)
- end
- local mingwToolchain = "x86_64-w64-mingw32"
- if compiler32bit then
- mingwToolchain = "i686-w64-mingw32"
- end
- premake.gcc.cc = "$(MINGW)/bin/" .. mingwToolchain .. "-gcc"
- premake.gcc.cxx = "$(MINGW)/bin/" .. mingwToolchain .. "-g++"
- premake.gcc.ar = "$(MINGW)/bin/ar"
- premake.valac.cc = premake.gcc.cc
- location(build_dir .. "projects/mingw")
- elseif "wasm" == _OPTIONS["compiler"] then
- if not os.getenv("EMSCRIPTEN") then
- print("Set EMSCRIPTEN environment variable.")
- os.exit(1)
- end
- premake.gcc.cc = "$(EMSCRIPTEN)/emcc"
- premake.gcc.cxx = "$(EMSCRIPTEN)/em++"
- premake.gcc.ar = "$(EMSCRIPTEN)/emar"
- premake.gcc.llvm = true
- location(build_dir .. "projects/wasm")
- end
- elseif _ACTION == "vs2017"
- or _ACTION == "vs2019"
- then
- if not os.is("windows") then
- print("Action not valid in current OS.")
- end
- local winKitVer = os.getenv("WindowsSDKVersion")
- if not winKitVer then
- print("Run vcvarsall.bat as part of your Visual Studio installation to set the environment variable 'WindowsSDKVersion'.")
- os.exit(1)
- end
- winKitVer = string.gsub(winKitVer, "\\", "")
- local action = premake.action.current()
- action.vstudio.windowsTargetPlatformVersion = winKitVer
- action.vstudio.windowsTargetPlatformMinVersion = winKitVer
- location(build_dir .. "projects/" .. _ACTION)
- end
- flags {
- "Cpp14",
- "StaticRuntime",
- "NoPCH",
- "NoRTTI",
- "NoExceptions",
- "NoEditAndContinue",
- "NoFramePointer",
- "Symbols",
- }
- defines {
- "__STDC_CONSTANT_MACROS",
- "__STDC_FORMAT_MACROS",
- "__STDC_LIMIT_MACROS",
- }
- configuration { "debug" }
- targetsuffix "-debug"
- configuration { "development" }
- targetsuffix "-development"
- configuration { "release" }
- targetsuffix "-release"
- configuration { "development or release" }
- flags {
- "NoBufferSecurityCheck",
- "OptimizeSpeed",
- }
- configuration { "debug or development", "linux-*" }
- linkoptions {
- "-rdynamic"
- }
- configuration { "debug or development", "wasm" }
- linkoptions {
- "-gsource-map" -- See: https://emscripten.org/docs/porting/exceptions.html?highlight=gsource%20map#stack-traces
- }
- configuration { "linux-gcc or android-arm" }
- buildoptions {
- "-Werror=return-type",
- }
- configuration { "x32", "linux-gcc" }
- targetdir (build_dir .. "linux32" .. "/bin")
- objdir (build_dir .. "linux32" .. "/obj")
- libdirs {
- lib_dir .. "../build/linux32/bin",
- }
- configuration { "x64", "linux-gcc" }
- targetdir (build_dir .. "linux64" .. "/bin")
- objdir (build_dir .. "linux64" .. "/obj")
- libdirs {
- lib_dir .. "../build/linux64/bin",
- }
- configuration { "x64", "linux-clang" }
- targetdir (build_dir .. "linux64_clang" .. "/bin")
- objdir (build_dir .. "linux64_clang" .. "/obj")
- libdirs {
- lib_dir .. "../build/linux64_clang/bin",
- }
- configuration { "x32", "vs*" }
- targetdir (build_dir .. "windows32" .. "/bin")
- objdir (build_dir .. "windows32" .. "/obj")
- libdirs {
- lib_dir .. "../build/windows32/bin",
- }
- configuration { "x64", "vs*" }
- targetdir (build_dir .. "windows64" .. "/bin")
- objdir (build_dir .. "windows64" .. "/obj")
- libdirs {
- lib_dir .. "../build/windows64/bin",
- }
- configuration { "linux-gcc* or linux-clang" }
- buildoptions {
- "-Wall",
- "-Wextra",
- "-Wundef",
- "-msse2",
- }
- links {
- "dl",
- }
- linkoptions {
- "-Wl,-rpath=\\$$ORIGIN",
- "-Wl,--no-as-needed",
- "-no-pie",
- }
- configuration { "android-*" }
- targetprefix("lib")
- flags {
- "NoImportLib"
- }
- links {
- "c",
- "dl",
- "m",
- "android",
- "log",
- "c++_shared",
- }
- buildoptions {
- "--gcc-toolchain=" .. androidToolchainRoot(),
- "--sysroot=" .. androidToolchainRoot() .. "/sysroot",
- --"-DANDROID",
- "-fPIC",
- "-no-canonical-prefixes",
- "-Wa,--noexecstack",
- "-fstack-protector-strong",
- "-ffunction-sections",
- "-Wunused-value",
- "-Wundef",
- }
- linkoptions {
- "--gcc-toolchain=" .. androidToolchainRoot(),
- "--sysroot=" .. androidToolchainRoot() .. "/sysroot",
- "-no-canonical-prefixes",
- "-Wl,--no-undefined",
- "-Wl,-z,noexecstack",
- "-Wl,-z,relro",
- "-Wl,-z,now",
- }
- configuration { "android-arm" }
- targetdir (build_dir .. "android-arm/bin")
- objdir (build_dir .. "android-arm/obj")
- buildoptions {
- "--target=armv7-none-linux-android" .. "$(ANDROID_NDK_ABI)",
- "-mthumb",
- "-march=armv7-a",
- "-mfloat-abi=softfp",
- "-mfpu=neon",
- }
- linkoptions {
- "--target=armv7-none-linux-android" .. "$(ANDROID_NDK_ABI)",
- "-march=armv7-a",
- }
- configuration { "android-arm64" }
- targetdir (build_dir .. "android-arm64/bin")
- objdir (build_dir .. "android-arm64/obj")
- buildoptions {
- "--target=aarch64-none-linux-android" .. "$(ANDROID_NDK_ABI)",
- }
- linkoptions {
- "--target=aarch64-none-linux-android" .. "$(ANDROID_NDK_ABI)",
- }
- configuration { "mingw-*" }
- defines { "WIN32" }
- includedirs { path.join(CROWN_DIR, "3rdparty/bx/include/compat/mingw") }
- buildoptions {
- "-fdata-sections",
- "-ffunction-sections",
- "-msse2",
- "-Wunused-value",
- "-Wundef",
- }
- linkoptions {
- "-Wl,--gc-sections",
- "-static",
- "-static-libgcc",
- "-static-libstdc++",
- }
- configuration { "x32", "mingw-gcc" }
- targetdir (path.join(build_dir, "mingw32/bin"))
- objdir (path.join(build_dir, "mingw32/obj"))
- libdirs {
- lib_dir .. "../build/mingw32/bin",
- }
- buildoptions {
- "-m32",
- "-mstackrealign",
- }
- configuration { "x64", "mingw-gcc" }
- targetdir (path.join(build_dir, "mingw64/bin"))
- objdir (path.join(build_dir, "mingw64/obj"))
- libdirs {
- lib_dir .. "../build/mingw64/bin",
- }
- buildoptions { "-m64" }
- configuration { "wasm" }
- targetdir (path.join(build_dir, "wasm/bin"))
- objdir (path.join(build_dir, "wasm/obj"))
- libdirs { path.join(lib_dir, "lib/wasm") }
- buildoptions {
- "-Wunused-value",
- "-Wundef",
- "-pthread",
- }
- configuration { "vs*" }
- includedirs { CROWN_DIR .. "3rdparty/bx/include/compat/msvc" }
- defines {
- "WIN32",
- "_WIN32",
- "_HAS_EXCEPTIONS=0",
- "_HAS_ITERATOR_DEBUGGING=0",
- "_SCL_SECURE=0",
- "_SECURE_SCL=0",
- "_SCL_SECURE_NO_WARNINGS",
- "_CRT_SECURE_NO_WARNINGS",
- "_CRT_SECURE_NO_DEPRECATE",
- "NOMINMAX",
- }
- buildoptions {
- "/Ob2", -- The Inline Function Expansion
- "/we4715", -- Not all control paths return a value
- "/Zc:__cplusplus", -- https://learn.microsoft.com/en-us/cpp/build/reference/zc-cplusplus?view=msvc-170
- }
- linkoptions {
- "/ignore:4199", -- LNK4199: /DELAYLOAD:*.dll ignored; no imports found from *.dll
- "/ignore:4221", -- LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
- "/ignore:4099", -- LNK4099: The linker was unable to find your .pdb file.
- }
- configuration { "x32", "vs*" }
- targetdir (build_dir .. "windows32" .. "/bin")
- objdir (build_dir .. "windows32" .. "/obj")
- configuration { "x64", "vs*" }
- defines {
- "_WIN64",
- }
- targetdir (build_dir .. "windows64" .. "/bin")
- objdir (build_dir .. "windows64" .. "/obj")
- configuration {} -- reset configuration
- end
- function strip()
- configuration { "android-*", "release"}
- postbuildcommands {
- "$(SILENT) echo Stripping symbols",
- "$(SILENT) " .. androidToolchainRoot() .. "/bin/llvm-strip -s \"$(TARGET)\""
- }
- configuration { "linux-*", "release" }
- postbuildcommands {
- "$(SILENT) echo Stripping symbols",
- "$(SILENT) strip -s \"$(TARGET)\""
- }
- configuration { "mingw*", "Release" }
- postbuildcommands {
- "$(SILENT) echo Stripping symbols.",
- "$(SILENT) $(MINGW)/bin/strip -s \"$(TARGET)\""
- }
- configuration {} -- reset configuration
- end
|