diff options
Diffstat (limited to 'docs/release/scripts/genie.lua')
-rw-r--r-- | docs/release/scripts/genie.lua | 1579 |
1 files changed, 1579 insertions, 0 deletions
diff --git a/docs/release/scripts/genie.lua b/docs/release/scripts/genie.lua new file mode 100644 index 00000000000..aea60a45cc5 --- /dev/null +++ b/docs/release/scripts/genie.lua @@ -0,0 +1,1579 @@ +-- license:BSD-3-Clause +-- copyright-holders:MAMEdev Team +STANDALONE = false + +-- Big project specific +premake.make.makefile_ignore = true +premake._checkgenerate = false + +newoption { + trigger = 'build-dir', + description = 'Build directory name', +} + +premake.check_paths = true +premake.make.override = { "TARGET" } + +premake.xcode.parameters = { 'CLANG_CXX_LANGUAGE_STANDARD = "c++14"', 'CLANG_CXX_LIBRARY = "libc++"' } + +MAME_DIR = (path.getabsolute("..") .. "/") +--MAME_DIR = string.gsub(MAME_DIR, "(%s)", "\\%1") +local MAME_BUILD_DIR = (MAME_DIR .. _OPTIONS["build-dir"] .. "/") +local naclToolchain = "" + +newoption { + trigger = "precompile", + description = "Precompiled headers generation.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + +function backtick(cmd) + result = string.gsub(string.gsub(os.outputof(cmd), "\r?\n$", ""), " $", "") + return result +end + +function str_to_version(str) + local val = 0 + if (str == nil or str == '') then + return val + end + local cnt = 10000 + for word in string.gmatch(str, '([^.]+)') do + val = val + tonumber(word) * cnt + cnt = cnt / 100 + end + return val +end + +function findfunction(x) + assert(type(x) == "string") + local f=_G + for v in x:gmatch("[^%.]+") do + if type(f) ~= "table" then + return nil, "looking for '"..v.."' expected table, not "..type(f) + end + f=f[v] + end + if type(f) == "function" then + return f + else + return nil, "expected function, not "..type(f) + end +end + +function layoutbuildtask(_folder, _name) + return { MAME_DIR .. "src/".._folder.."/".. _name ..".lay" , GEN_DIR .. _folder .. "/".._name..".lh", + { MAME_DIR .. "scripts/build/complay.py" }, {"@echo Compressing src/".._folder.."/".._name..".lay...", PYTHON .. " $(1) $(<) $(@) layout_".._name }}; +end + +function precompiledheaders() + if _OPTIONS["precompile"]==nil or (_OPTIONS["precompile"]~=nil and _OPTIONS["precompile"]=="1") then + configuration { "not xcode4" } + pchheader("emu.h") + configuration { } + end +end + +function addprojectflags() + local version = str_to_version(_OPTIONS["gcc_version"]) + if _OPTIONS["gcc"]~=nil and string.find(_OPTIONS["gcc"], "gcc") then + if version >= 50100 then + buildoptions_cpp { + "-Wsuggest-override", + } + end + if version >= 60000 then + buildoptions_cpp { + "-flifetime-dse=1", + } + end + end +end + +CPUS = {} +SOUNDS = {} +MACHINES = {} +VIDEOS = {} +BUSES = {} +FORMATS = {} + +newoption { + trigger = "with-tools", + description = "Enable building tools.", +} + +newoption { + trigger = "with-tests", + description = "Enable building tests.", +} + +newoption { + trigger = "with-benchmarks", + description = "Enable building benchmarks.", +} + +newoption { + trigger = "osd", + description = "Choose OSD layer implementation", +} + +newoption { + trigger = "targetos", + description = "Choose target OS", + allowed = { + { "android", "Android" }, + { "asmjs", "Emscripten/asm.js" }, + { "freebsd", "FreeBSD" }, + { "netbsd", "NetBSD" }, + { "openbsd", "OpenBSD" }, + { "pnacl", "Native Client - PNaCl" }, + { "linux", "Linux" }, + { "ios", "iOS" }, + { "macosx", "OSX" }, + { "windows", "Windows" }, + { "haiku", "Haiku" }, + { "solaris", "Solaris SunOS" }, + { "steamlink", "Steam Link" }, + { "rpi", "Raspberry Pi" }, + { "ci20", "Creator-Ci20" }, + }, +} + +newoption { + trigger = 'with-bundled-sdl2', + description = 'Build bundled SDL2 library', +} + +newoption { + trigger = "distro", + description = "Choose distribution", + allowed = { + { "generic", "generic" }, + { "debian-stable", "debian-stable" }, + { "ubuntu-intrepid", "ubuntu-intrepid" }, + }, +} + +newoption { + trigger = "target", + description = "Building target", +} + +newoption { + trigger = "subtarget", + description = "Building subtarget", +} + +newoption { + trigger = "gcc_version", + description = "GCC compiler version", +} + +newoption { + trigger = "CC", + description = "CC replacement", +} + +newoption { + trigger = "CXX", + description = "CXX replacement", +} + +newoption { + trigger = "LD", + description = "LD replacement", +} + +newoption { + trigger = "TOOLCHAIN", + description = "Toolchain prefix" +} + +newoption { + trigger = "PROFILE", + description = "Enable profiling.", +} + +newoption { + trigger = "SYMBOLS", + description = "Enable symbols.", +} + +newoption { + trigger = "SYMLEVEL", + description = "Symbols level.", +} + +newoption { + trigger = "PROFILER", + description = "Include the internal profiler.", +} + +newoption { + trigger = "OPTIMIZE", + description = "Optimization level.", +} + +newoption { + trigger = "ARCHOPTS", + description = "Additional options for target C/C++/Objective-C/Objective-C++ compilers and linker.", +} + +newoption { + trigger = "ARCHOPTS_C", + description = "Additional options for target C++ compiler.", +} + +newoption { + trigger = "ARCHOPTS_CXX", + description = "Additional options for target C++ compiler.", +} + +newoption { + trigger = "ARCHOPTS_OBJC", + description = "Additional options for target Objective-C compiler.", +} + +newoption { + trigger = "ARCHOPTS_OBJCXX", + description = "Additional options for target Objective-C++ compiler.", +} + +newoption { + trigger = "OPT_FLAGS", + description = "OPT_FLAGS.", +} + +newoption { + trigger = "LDOPTS", + description = "Additional linker options", +} + +newoption { + trigger = "MAP", + description = "Generate a link map.", +} + +newoption { + trigger = "NOASM", + description = "Disable implementations based on assembler code", + allowed = { + { "0", "Enable assembler code" }, + { "1", "Disable assembler code" }, + }, +} + +newoption { + trigger = "BIGENDIAN", + description = "Build for big endian target", + allowed = { + { "0", "Little endian target" }, + { "1", "Big endian target" }, + }, +} + +newoption { + trigger = "FORCE_DRC_C_BACKEND", + description = "Force DRC C backend.", +} + +newoption { + trigger = "NOWERROR", + description = "NOWERROR", +} + +newoption { + trigger = "DEPRECATED", + description = "Generate deprecation warnings during compilation.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + +newoption { + trigger = "LTO", + description = "Clang link time optimization.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + +newoption { + trigger = "SSE2", + description = "SSE2 optimized code and SSE2 code generation.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + +newoption { + trigger = "SSE3", + description = "SSE3 optimized code and SSE3 code generation.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + +newoption { + trigger = "OPENMP", + description = "OpenMP optimized code.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + +newoption { + trigger = "FASTDEBUG", + description = "Fast DEBUG.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + +newoption { + trigger = "SEPARATE_BIN", + description = "Use separate bin folders.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + +newoption { + trigger = "PYTHON_EXECUTABLE", + description = "Python executable.", +} + +newoption { + trigger = "SHADOW_CHECK", + description = "Shadow checks.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + +newoption { + trigger = "STRIP_SYMBOLS", + description = "Symbols stripping.", + allowed = { + { "0", "Disabled" }, + { "1", "Enabled" }, + } +} + + +newoption { + trigger = "SHLIB", + description = "Generate shared libs.", + allowed = { + { "0", "Static libs" }, + { "1", "Shared libs" }, + } +} + +newoption { + trigger = "SOURCES", + description = "List of sources to compile.", +} + +newoption { + trigger = "PLATFORM", + description = "Target machine platform (x86,arm,...)", +} + +newoption { + trigger = "DEBUG_DIR", + description = "Default directory for debugger.", +} + +newoption { + trigger = "DEBUG_ARGS", + description = "Arguments for running debug build.", +} + +newoption { + trigger = "WEBASSEMBLY", + description = "Produce WebAssembly output when building with Emscripten.", +} + +newoption { + trigger = "SANITIZE", + description = "Specifies the santizer(s) to use." +} + +newoption { + trigger = "PROJECT", + description = "Select projects to be built. Will look into project folder for files.", +} + +dofile ("extlib.lua") + +if _OPTIONS["SHLIB"]=="1" then + LIBTYPE = "SharedLib" +else + LIBTYPE = "StaticLib" +end + +PYTHON = "python" + +if _OPTIONS["PYTHON_EXECUTABLE"]~=nil then + PYTHON = _OPTIONS["PYTHON_EXECUTABLE"] +end + +if not _OPTIONS["BIGENDIAN"] then + _OPTIONS["BIGENDIAN"] = "0" +end + +if _OPTIONS["NOASM"]=="1" and not _OPTIONS["FORCE_DRC_C_BACKEND"] then + _OPTIONS["FORCE_DRC_C_BACKEND"] = "1" +end + +if(_OPTIONS["TOOLCHAIN"] == nil) then + _OPTIONS['TOOLCHAIN'] = "" +end + +GEN_DIR = MAME_BUILD_DIR .. "generated/" + +if (_OPTIONS["target"] == nil) then return false end +if (_OPTIONS["subtarget"] == nil) then return false end + +if (_OPTIONS["target"] == _OPTIONS["subtarget"]) then + solution (_OPTIONS["target"]) +else + if (_OPTIONS["subtarget"]=="mess") then + solution (_OPTIONS["subtarget"]) + else + solution (_OPTIONS["target"] .. _OPTIONS["subtarget"]) + end +end + + +configurations { + "Debug", + "Release", +} + +if _ACTION == "xcode4" then + platforms { + "x64", + } +else + platforms { + "x32", + "x64", + "Native", -- for targets where bitness is not specified + } +end + +language "C++" + +flags { + "StaticRuntime", +} + +configuration { "vs20*" } + buildoptions { + "/bigobj", + } + flags { + "NoPCH", + "ExtraWarnings", + } + if not _OPTIONS["NOWERROR"] then + flags{ + "FatalWarnings", + } + end + + +configuration { "Debug", "vs20*" } + flags { + "Symbols", + "NoMultiProcessorCompilation", + } + +configuration { "Release", "vs20*" } + flags { + "Optimize", + "NoEditAndContinue", + "NoIncrementalLink", + } + +configuration { "vsllvm" } + buildoptions { + "/bigobj", + } + flags { + "NoPCH", + "ExtraWarnings", + } + if not _OPTIONS["NOWERROR"] then + flags{ + "FatalWarnings", + } + end + + +configuration { "Debug", "vsllvm" } + flags { + "Symbols", + "NoMultiProcessorCompilation", + } + +configuration { "Release", "vsllvm" } + flags { + "Optimize", + "NoEditAndContinue", + "NoIncrementalLink", + } + +-- Force VS2015/17 targets to use bundled SDL2 +if string.sub(_ACTION,1,4) == "vs20" and _OPTIONS["osd"]=="sdl" then + if _OPTIONS["with-bundled-sdl2"]==nil then + _OPTIONS["with-bundled-sdl2"] = "1" + end +end +-- Build SDL2 for Android +if _OPTIONS["targetos"] == "android" then + _OPTIONS["with-bundled-sdl2"] = "1" +end + +configuration {} + +if _OPTIONS["osd"] == "uwp" then + windowstargetplatformversion("10.0.14393.0") + windowstargetplatformminversion("10.0.14393.0") + premake._filelevelconfig = true +end + +msgcompile ("Compiling $(subst ../,,$<)...") + +msgcompile_objc ("Objective-C compiling $(subst ../,,$<)...") + +msgresource ("Compiling resources $(subst ../,,$<)...") + +msglinking ("Linking $(notdir $@)...") + +msgarchiving ("Archiving $(notdir $@)...") + +msgprecompile ("Precompiling $(subst ../,,$<)...") + +messageskip { "SkipCreatingMessage", "SkipBuildingMessage", "SkipCleaningMessage" } + +if (_OPTIONS["PROJECT"] ~= nil) then + PROJECT_DIR = path.join(path.getabsolute(".."),"projects",_OPTIONS["PROJECT"]) .. "/" + if (not os.isfile(path.join("..", "projects", _OPTIONS["PROJECT"], "scripts", "target", _OPTIONS["target"],_OPTIONS["subtarget"] .. ".lua"))) then + error("File definition for TARGET=" .. _OPTIONS["target"] .. " SUBTARGET=" .. _OPTIONS["subtarget"] .. " does not exist") + end + dofile (path.join(".." ,"projects", _OPTIONS["PROJECT"], "scripts", "target", _OPTIONS["target"],_OPTIONS["subtarget"] .. ".lua")) +end +if (_OPTIONS["SOURCES"] == nil and _OPTIONS["PROJECT"] == nil) then + if (not os.isfile(path.join("target", _OPTIONS["target"],_OPTIONS["subtarget"] .. ".lua"))) then + error("File definition for TARGET=" .. _OPTIONS["target"] .. " SUBTARGET=" .. _OPTIONS["subtarget"] .. " does not exist") + end + dofile (path.join("target", _OPTIONS["target"],_OPTIONS["subtarget"] .. ".lua")) +end + +configuration { "gmake or ninja" } + flags { + "SingleOutputDir", + } + +dofile ("toolchain.lua") + +if _OPTIONS["targetos"]=="windows" then + configuration { "x64" } + defines { + "X64_WINDOWS_ABI", + } + configuration { } +end + +-- Avoid error when invoking genie --help. +if (_ACTION == nil) then return false end + +-- define PTR64 if we are a 64-bit target +configuration { "x64 or android-*64"} + defines { "PTR64=1" } + +-- define MAME_DEBUG if we are a debugging build +configuration { "Debug" } + defines { + "MAME_DEBUG", + "MAME_PROFILER", +-- "BGFX_CONFIG_DEBUG=1", + } + +if _OPTIONS["FASTDEBUG"]=="1" then + defines { + "MAME_DEBUG_FAST", + "NDEBUG", + } +end + +configuration { } + +if _OPTIONS["PROFILER"]=="1" then + defines{ + "MAME_PROFILER", -- define MAME_PROFILER if we are a profiling build + } +end + +configuration { "Release" } + defines { + "NDEBUG", + } + +configuration { } + +-- CR/LF setup: use on win32, CR only on everything else +if _OPTIONS["targetos"]=="windows" then + defines { + "CRLF=3", + } +else + defines { + "CRLF=2", + } +end + + +if _OPTIONS["BIGENDIAN"]=="1" then + if _OPTIONS["targetos"]=="macosx" then + defines { + "OSX_PPC", + } + buildoptions { + "-Wno-unused-label", + "-flax-vector-conversions", + } + if _OPTIONS["SYMBOLS"] then + buildoptions { + "-mlong-branch", + } + end + configuration { "x64" } + buildoptions { + "-arch ppc64", + } + linkoptions { + "-arch ppc64", + } + configuration { "x32" } + buildoptions { + "-arch ppc", + } + linkoptions { + "-arch ppc", + } + configuration { } + end +else + defines { + "LSB_FIRST", + } + if _OPTIONS["targetos"]=="macosx" then + configuration { "x64" } + buildoptions { + "-arch x86_64", + } + linkoptions { + "-arch x86_64", + } + configuration { "x32" } + buildoptions { + "-arch i386", + } + linkoptions { + "-arch i386", + } + configuration { } + end +end + +if _OPTIONS["with-system-jpeg"]~=nil then + defines { + "XMD_H", + } +end + +if not _OPTIONS["with-system-flac"]~=nil then + defines { + "FLAC__NO_DLL", + } +end + +if not _OPTIONS["with-system-pugixml"] then + defines { + "PUGIXML_HEADER_ONLY", + } +else + links { + ext_lib("pugixml"), + } +end + +if _OPTIONS["NOASM"]=="1" then + defines { + "MAME_NOASM" + } +end + +if not _OPTIONS["FORCE_DRC_C_BACKEND"] then + if _OPTIONS["BIGENDIAN"]~="1" then + configuration { "x64" } + defines { + "NATIVE_DRC=drcbe_x64", + } + configuration { "x32" } + defines { + "NATIVE_DRC=drcbe_x86", + } + configuration { } + end +end + + defines { + "LUA_COMPAT_ALL", + "LUA_COMPAT_5_1", + "LUA_COMPAT_5_2", + } + + if _ACTION == "gmake" or _ACTION == "ninja" then + + --we compile C-only to C99 standard with GNU extensions + + buildoptions_c { + "-std=gnu99", + } + +local version = str_to_version(_OPTIONS["gcc_version"]) +if string.find(_OPTIONS["gcc"], "clang") and ((version < 30500) or (_OPTIONS["targetos"]=="macosx" and (version <= 60000))) then + buildoptions_cpp { + "-x c++", + "-std=c++1y", + } + + buildoptions_objcpp { + "-x objective-c++", + "-std=c++1y", + } +else + buildoptions_cpp { + "-x c++", + "-std=c++14", + } + + buildoptions_objcpp { + "-x objective-c++", + "-std=c++14", + } +end +-- this speeds it up a bit by piping between the preprocessor/compiler/assembler + if not ("pnacl" == _OPTIONS["gcc"]) then + buildoptions { + "-pipe", + } + end +-- add -g if we need symbols, and ensure we have frame pointers +if _OPTIONS["SYMBOLS"]~=nil and _OPTIONS["SYMBOLS"]~="0" then + buildoptions { + "-g" .. _OPTIONS["SYMLEVEL"], + "-fno-omit-frame-pointer", + "-fno-optimize-sibling-calls", + } +end + +--# we need to disable some additional implicit optimizations for profiling +if _OPTIONS["PROFILE"] then + buildoptions { + "-mno-omit-leaf-frame-pointer", + } +end +-- add -v if we need verbose build information +if _OPTIONS["VERBOSE"] then + buildoptions { + "-v", + } +end + +-- only show shadow warnings when enabled +if (_OPTIONS["SHADOW_CHECK"]=="1") then + buildoptions { + "-Wshadow" + } +end + +-- only show deprecation warnings when enabled +if _OPTIONS["DEPRECATED"]=="0" then + buildoptions { + "-Wno-deprecated-declarations" + } +end + +-- add profiling information for the compiler +if _OPTIONS["PROFILE"] then + buildoptions { + "-pg", + } + linkoptions { + "-pg", + } +end + +if _OPTIONS["SYMBOLS"]~=nil and _OPTIONS["SYMBOLS"]~="0" then + flags { + "Symbols", + } +end + +-- add the error warning flag +if _OPTIONS["NOWERROR"]==nil then + buildoptions { + "-Werror", + } +end + +-- if we are optimizing, include optimization options +if _OPTIONS["OPTIMIZE"] then + buildoptions { + "-O".. _OPTIONS["OPTIMIZE"], + "-fno-strict-aliasing" + } + if _OPTIONS["OPT_FLAGS"] then + buildoptions { + _OPTIONS["OPT_FLAGS"] + } + end + if _OPTIONS["LTO"]=="1" then + buildoptions { +-- windows native mingw GCC 5.2 fails with -flto=x with x > 1. bug unfixed as of this commit + "-flto=1", +-- if ld fails, just buy more RAM or uncomment this! +-- "-Wl,-no-keep-memory", + "-Wl,-v", +-- silence redefine warnings from discrete.c. + "-Wl,-allow-multiple-definition", + "-fuse-linker-plugin", +-- these next flags allow MAME to compile in GCC 5.2. odr warnings should be fixed as LTO randomly crashes otherwise +-- some GCC 4.9.x on Windows do not have -Wodr and -flto-odr-type-merging enabled. adjust accordingly... +-- no-fat-lto-objects is faster to compile and uses less memory, but you can't mix with a non-lto .o/.a without rebuilding + "-fno-fat-lto-objects", + "-flto-odr-type-merging", + "-Wodr", + "-flto-compression-level=0", -- lto doesn't work with anything <9 on linux with < 12G RAM, much slower if <> 0 +-- "-flto-report", -- if you get an error in lto after [WPA] stage, but before [LTRANS] stage, you need more memory! +-- "-fmem-report-wpa","-fmem-report","-fpre-ipa-mem-report","-fpost-ipa-mem-report","-flto-report-wpa","-fmem-report", +-- this six flag combo lets MAME compile with LTO=1 on linux with no errors and ~2% speed boost, but compile time is much longer +-- if you are going to wait on lto, you might as well enable these for GCC +-- "-fdevirtualize-at-ltrans","-fgcse-sm","-fgcse-las", +-- "-fipa-pta","-fipa-icf","-fvariable-expansion-in-unroller", + } +-- same flags are needed by linker + linkoptions { + "-flto=1", +-- "-Wl,-no-keep-memory", + "-Wl,-v", + "-Wl,-allow-multiple-definition", + "-fuse-linker-plugin", + "-fno-fat-lto-objects", + "-flto-odr-type-merging", + "-Wodr", + "-flto-compression-level=0", -- lto doesn't work with anything <9 on linux with < 12G RAM, much slower if <> 0 +-- "-flto-report", -- if you get an error in lto after [WPA] stage, but before [LTRANS] stage, you need more memory! +-- "-fmem-report-wpa","-fmem-report","-fpre-ipa-mem-report","-fpost-ipa-mem-report","-flto-report-wpa","-fmem-report", +-- this six flag combo lets MAME compile with LTO=1 on linux with no errors and ~2% speed boost, but compile time is much longer +-- if you are going to wait on lto, you might as well enable these for GCC +-- "-fdevirtualize-at-ltrans","-fgcse-sm","-fgcse-las", +-- "-fipa-pta","-fipa-icf","-fvariable-expansion-in-unroller", + + } + + end +end + +configuration { "mingw-clang" } + buildoptions { + "-Xclang -flto-visibility-public-std", -- workround for __imp___ link errors + } +configuration { } + +if _OPTIONS["ARCHOPTS"] then + buildoptions { + _OPTIONS["ARCHOPTS"] + } + linkoptions { + _OPTIONS["ARCHOPTS"] + } +end + +if _OPTIONS["ARCHOPTS_C"] then + buildoptions_c { + _OPTIONS["ARCHOPTS_C"] + } +end + +if _OPTIONS["ARCHOPTS_CXX"] then + buildoptions_cpp { + _OPTIONS["ARCHOPTS_CXX"] + } +end + +if _OPTIONS["ARCHOPTS_OBJC"] then + buildoptions_objc { + _OPTIONS["ARCHOPTS_OBJC"] + } +end + +if _OPTIONS["ARCHOPTS_OBJCXX"] then + buildoptions_objcpp { + _OPTIONS["ARCHOPTS_OBJCXX"] + } +end + +if _OPTIONS["SHLIB"] then + buildoptions { + "-fPIC" + } +end + +if _OPTIONS["SSE2"]=="1" then + buildoptions { + "-msse", + "-msse2" + } +end + +if _OPTIONS["SSE3"]=="1" then + buildoptions { + "-msse", + "-msse2", + "-msse3" + } +end + + +if _OPTIONS["OPENMP"]=="1" then + buildoptions { + "-fopenmp", + } + linkoptions { + "-fopenmp" + } + defines { + "USE_OPENMP=1", + } + +else + buildoptions { + "-Wno-unknown-pragmas", + } +end + +if _OPTIONS["LDOPTS"] then + linkoptions { + _OPTIONS["LDOPTS"] + } +end + +if _OPTIONS["MAP"] then + if (_OPTIONS["target"] == _OPTIONS["subtarget"]) then + linkoptions { + "-Wl,-Map," .. "../../../../" .. _OPTIONS["target"] .. ".map" + } + else + linkoptions { + "-Wl,-Map," .. "../../../../" .. _OPTIONS["target"] .. _OPTIONS["subtarget"] .. ".map" + } + + end +end + + +-- add a basic set of warnings + buildoptions { + "-Wall", + "-Wcast-align", + "-Wundef", + "-Wformat-security", + "-Wwrite-strings", + "-Wno-sign-compare", + "-Wno-conversion", + "-Wno-error=deprecated-declarations", + } +-- warnings only applicable to C compiles + buildoptions_c { + "-Wpointer-arith", + "-Wstrict-prototypes", + } + +if _OPTIONS["targetos"]~="freebsd" then + buildoptions_c { + "-Wbad-function-cast", + } +end + +-- warnings only applicable to OBJ-C compiles + buildoptions_objcpp { + "-Wpointer-arith", + } + +-- warnings only applicable to C++ compiles + buildoptions_cpp { + "-Woverloaded-virtual", + } + +if _OPTIONS["SANITIZE"] then + buildoptions { + "-fsanitize=".. _OPTIONS["SANITIZE"] + } + linkoptions { + "-fsanitize=".. _OPTIONS["SANITIZE"] + } + if string.find(_OPTIONS["SANITIZE"], "address") then + buildoptions { + "-fsanitize-address-use-after-scope" + } + linkoptions { + "-fsanitize-address-use-after-scope" + } + end + if string.find(_OPTIONS["SANITIZE"], "undefined") then + -- 'function' produces errors without delegates by design + -- 'alignment' produces a lot of errors which we are not interested in + buildoptions { + "-fno-sanitize=function", + "-fno-sanitize=alignment" + } + linkoptions { + "-fno-sanitize=function", + "-fno-sanitize=alignment" + } + end +end + +--ifneq (,$(findstring thread,$(SANITIZE))) +--CCOMFLAGS += -fPIE +--endif + + + + local version = str_to_version(_OPTIONS["gcc_version"]) + if string.find(_OPTIONS["gcc"], "clang") or string.find(_OPTIONS["gcc"], "pnacl") or string.find(_OPTIONS["gcc"], "asmjs") or string.find(_OPTIONS["gcc"], "android") then + if (version < 30400) then + print("Clang version 3.4 or later needed") + os.exit(-1) + end + buildoptions { + "-Wno-cast-align", + "-Wno-tautological-compare", + "-Wno-unused-value", + "-Wno-constant-logical-operand", + "-Wno-missing-braces", -- clang is not as permissive as GCC about std::array initialization + "-fdiagnostics-show-note-include-stack", + } + if (version >= 30500) then + buildoptions { + "-Wno-unknown-warning-option", + "-Wno-extern-c-compat", + "-Wno-unknown-attributes", + "-Wno-ignored-qualifiers" + } + end + if (version >= 60000) then + buildoptions { + "-Wno-pragma-pack" -- clang 6.0 complains when the packing change lifetime is not contained within a header file. + } + end + else + if (version < 50000) then + print("GCC version 5.0 or later needed") + os.exit(-1) + end + buildoptions { + "-Wno-unused-result", -- needed for fgets,fread on linux + -- array bounds checking seems to be buggy in 4.8.1 (try it on video/stvvdp1.c and video/model1.c without -Wno-array-bounds) + "-Wno-array-bounds", + } + if (version >= 80000) then + buildoptions { + "-Wno-format-overflow", -- try machine/bfm_sc45_helper.cpp in GCC 8.0.1, among others + "-Wno-stringop-truncation", -- ImGui again + "-Wno-stringop-overflow", -- formats/victor9k_dsk.cpp bugs the compiler + } + buildoptions_cpp { + "-Wno-class-memaccess", -- many instances in ImGui and BGFX + } + end + end + end + +if (_OPTIONS["PLATFORM"]=="alpha") then + defines { + "PTR64=1", + } +end + +if (_OPTIONS["PLATFORM"]=="arm") then + buildoptions { + "-Wno-cast-align", + } +end + +if (_OPTIONS["PLATFORM"]=="arm64") then + buildoptions { + "-Wno-cast-align", + } + defines { + "PTR64=1", + } +end + +if (_OPTIONS["PLATFORM"]=="riscv64") then + defines { + "PTR64=1", + } +end + +if (_OPTIONS["PLATFORM"]=="mips64") then + defines { + "PTR64=1", + } +end + +local subdir +if (_OPTIONS["target"] == _OPTIONS["subtarget"]) then + subdir = _OPTIONS["osd"] .. "/" .. _OPTIONS["target"] +else + subdir = _OPTIONS["osd"] .. "/" .. _OPTIONS["target"] .. _OPTIONS["subtarget"] +end + +if not toolchain(MAME_BUILD_DIR, subdir) then + return -- no action specified +end + +configuration { "asmjs" } + buildoptions { + "-std=gnu89", + "-Wno-implicit-function-declaration", + "-s USE_SDL_TTF=2", + } + buildoptions_cpp { + "-x c++", + "-std=c++14", + } + linkoptions { + "-Wl,--start-group", + } + archivesplit_size "20" + +configuration { "android*" } + buildoptions { + "-Wno-undef", + "-Wno-typedef-redefinition", + "-Wno-unknown-warning-option", + "-Wno-incompatible-ms-struct", + } + buildoptions_cpp { + "-x c++", + "-std=c++14", + "-Wno-extern-c-compat", + "-Wno-tautological-constant-out-of-range-compare", + "-Wno-tautological-pointer-compare", + } + archivesplit_size "20" + +configuration { "android-arm64" } + buildoptions { + "-Wno-asm-operand-widths", + } + +configuration { "pnacl" } + buildoptions { + "-std=gnu89", + "-Wno-inline-new-delete", + } + buildoptions_cpp { + "-x c++", + "-std=c++14", + } + archivesplit_size "20" + +configuration { "linux-* or rpi or ci20"} + links { + "dl", + "rt", + } + if _OPTIONS["distro"]=="debian-stable" then + defines + { + "NO_AFFINITY_NP", + } + end + + + +configuration { "steamlink" } + links { + "dl", + "EGL", + "GLESv2", + "SDL2", + } + defines { + "EGL_API_FB", + } + +configuration { "rpi" } + links { + "SDL2", + "fontconfig", + "X11", + "GLESv2", + "EGL", + "bcm_host", + "vcos", + "vchiq_arm", + "pthread", + } + + +configuration { "ci20" } + links { + "SDL2", + "asound", + "fontconfig", + "freetype", + "pthread", + } + + +configuration { "osx* or xcode4" } + links { + "pthread", + } + +configuration { "mingw*" } + if _OPTIONS["osd"]~="sdl" + then + linkoptions { + "-static", + } + end + linkoptions { + "-Wl,--start-group", + } + links { + "user32", + "winmm", + "advapi32", + "shlwapi", + "wsock32", + "ws2_32", + "psapi", + "iphlpapi", + "shell32", + "userenv", + } + +configuration { "mingw-clang" } + local version = str_to_version(_OPTIONS["gcc_version"]) + if _OPTIONS["gcc"]~=nil and string.find(_OPTIONS["gcc"], "clang") and ((version < 30900)) then + linkoptions { + "-pthread", + } + end + +configuration { "vsllvm" } + defines { + "XML_STATIC", + "WIN32", + "_WIN32", + "_CRT_NONSTDC_NO_DEPRECATE", + "_CRT_SECURE_NO_DEPRECATE", + "_CRT_STDIO_LEGACY_WIDE_SPECIFIERS", + } + includedirs { + MAME_DIR .. "3rdparty/dxsdk/Include" + } + +configuration { "vs20*" } + defines { + "XML_STATIC", + "WIN32", + "_WIN32", + "_CRT_NONSTDC_NO_DEPRECATE", + "_CRT_SECURE_NO_DEPRECATE", + "_CRT_STDIO_LEGACY_WIDE_SPECIFIERS", + } + +-- Windows Store/Phone projects already link against the available libraries. +if _OPTIONS["vs"]==nil or not (string.startswith(_OPTIONS["vs"], "winstore8") or string.startswith(_OPTIONS["vs"], "winphone8")) then + links { + "user32", + "winmm", + "advapi32", + "shlwapi", + "wsock32", + "ws2_32", + "psapi", + "iphlpapi", + "shell32", + "userenv", + } +end + + buildoptions { + "/WX", -- Treats all compiler warnings as errors. + "/wd4025", -- warning C4025: 'number' : based pointer passed to function with variable arguments: parameter number + "/wd4003", -- warning C4003: not enough actual parameters for macro 'xxx' + "/wd4018", -- warning C4018: 'x' : signed/unsigned mismatch + "/wd4061", -- warning C4061: enumerator 'xxx' in switch of enum 'xxx' is not explicitly handled by a case label + "/wd4100", -- warning C4100: 'xxx' : unreferenced formal parameter + "/wd4127", -- warning C4127: conditional expression is constant + "/wd4131", -- warning C4131: 'xxx' : uses old-style declarator + "/wd4141", -- warning C4141: 'xxx' : used more than once + "/wd4146", -- warning C4146: unary minus operator applied to unsigned type, result still unsigned + "/wd4150", -- warning C4150: deletion of pointer to incomplete type 'xxx'; no destructor called + "/wd4189", -- warning C4189: 'xxx' : local variable is initialized but not referenced + "/wd4191", -- warning C4191: 'type cast' : unsafe conversion from 'xxx' to 'xxx' // 64-bit only + "/wd4201", -- warning C4201: nonstandard extension used : nameless struct/union + "/wd4232", -- warning C4232: nonstandard extension used : 'xxx' : address of dllimport 'xxx' is not static, identity not guaranteed + "/wd4242", -- warning C4242: 'x' : conversion from 'xxx' to 'xxx', possible loss of data + "/wd4244", -- warning C4244: 'argument' : conversion from 'xxx' to 'xxx', possible loss of data + "/wd4250", -- warning C4250: 'xxx' : inherits 'xxx' via dominance + "/wd4255", -- warning C4255: 'xxx' : no function prototype given: converting '()' to '(void)' + "/wd4296", -- warning C4296: 'x' : expression is always false + "/wd4306", -- warning C4306: 'xxx': conversion from 'type1' to 'type2' of greater size // 64-bit only + "/wd4310", -- warning C4310: cast truncates constant value + "/wd4312", -- warning C4312: 'type cast' : conversion from 'xxx' to 'xxx' of greater size + "/wd4324", -- warning C4324: 'xxx' : structure was padded due to __declspec(align()) + "/wd4347", -- warning C4347: behavior change: 'xxx' is called instead of 'xxx' // obsolete VS2005 - VS2010 only + "/wd4435", -- warning C4435: 'xxx' : Object layout under /vd2 will change due to virtual base 'xxx' + "/wd4510", -- warning C4510: 'xxx' : default constructor could not be generated + "/wd4512", -- warning C4512: 'xxx' : assignment operator could not be generated + "/wd4514", -- warning C4514: 'xxx' : unreferenced inline function has been removed + "/wd4521", -- warning C4521: 'xxx' : multiple copy constructors specified + "/wd4571", -- warning C4611: interaction between '_setjmp' and C++ object destruction is non-portable + "/wd4610", -- warning C4619: #pragma warning : there is no warning number 'xxx' + "/wd4611", -- warning C4571: Informational: catch(...) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught + "/wd4619", -- warning C4610: struct 'xxx' can never be instantiated - user defined constructor required + "/wd4625", -- warning C4625: 'xxx' : copy constructor could not be generated because a base class copy constructor is inaccessible or deleted + "/wd4626", -- warning C4626: 'xxx' : assignment operator could not be generated because a base class assignment operator is inaccessible or deleted + "/wd4640", -- warning C4640: 'xxx' : construction of local static object is not thread-safe + "/wd4668", -- warning C4668: 'xxx' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' + "/wd4702", -- warning C4702: unreachable code + "/wd4706", -- warning C4706: assignment within conditional expression + "/wd4710", -- warning C4710: 'xxx' : function not inlined + "/wd4711", -- warning C4711: function 'xxx' selected for automatic inline expansion // optimized only + "/wd4805", -- warning C4805: 'x' : unsafe mix of type 'xxx' and type 'xxx' in operation + "/wd4820", -- warning C4820: 'xxx' : 'x' bytes padding added after data member 'xxx' + "/wd4826", -- warning C4826: Conversion from 'type1 ' to 'type_2' is sign-extended. This may cause unexpected runtime behavior. // 32-bit only + "/wd4365", -- warning C4365: 'action' : conversion from 'type_1' to 'type_2', signed/unsigned mismatch + "/wd4389", -- warning C4389: 'operator' : signed/unsigned mismatch + "/wd4245", -- warning C4245: 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch + "/wd4388", -- warning C4388: signed/unsigned mismatch + "/wd4267", -- warning C4267: 'var' : conversion from 'size_t' to 'type', possible loss of data + "/wd4005", -- warning C4005: The macro identifier is defined twice. The compiler uses the second macro definition + "/wd4350", -- warning C4350: behavior change: 'member1' called instead of 'member2' + "/wd4996", -- warning C4996: 'function': was declared deprecated + "/wd4191", -- warning C4191: 'operator/operation' : unsafe conversion from 'type of expression' to 'type required' + "/wd4060", -- warning C4060: switch statement contains no 'case' or 'default' labels + "/wd4065", -- warning C4065: switch statement contains 'default' but no 'case' labels + "/wd4640", -- warning C4640: 'instance' : construction of local static object is not thread-safe + "/wd4290", -- warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow) + "/wd4355", -- warning C4355: 'this' : used in base member initializer list + "/wd4800", -- warning C4800: 'type' : forcing value to bool 'true' or 'false' (performance warning) + "/wd4371", -- warning C4371: layout of class may have changed from a previous version of the compiler due to better packing of member 'member' + "/wd4548", -- warning C4548: expression before comma has no effect; expected expression with side-effect + } +if _OPTIONS["vs"]=="intel-15" then + buildoptions { + "/Qwd9", -- remark #9: nested comment is not allowed + "/Qwd82", -- remark #82: storage class is not first + "/Qwd111", -- remark #111: statement is unreachable + "/Qwd128", -- remark #128: loop is not reachable + "/Qwd177", -- remark #177: function "xxx" was declared but never referenced + "/Qwd181", -- remark #181: argument of type "UINT32={unsigned int}" is incompatible with format "%d", expecting argument of type "int" + "/Qwd185", -- remark #185: dynamic initialization in unreachable code + "/Qwd280", -- remark #280: selector expression is constant + "/Qwd344", -- remark #344: typedef name has already been declared (with same type) + "/Qwd411", -- remark #411: class "xxx" defines no constructor to initialize the following + "/Qwd869", -- remark #869: parameter "xxx" was never referenced + "/Qwd2545", -- remark #2545: empty dependent statement in "else" clause of if - statement + "/Qwd2553", -- remark #2553: nonstandard second parameter "TCHAR={WCHAR = { __wchar_t } } **" of "main", expected "char *[]" or "char **" extern "C" int _tmain(int argc, TCHAR **argv) + "/Qwd2557", -- remark #2557: comparison between signed and unsigned operands + "/Qwd3280", -- remark #3280: declaration hides member "attotime::seconds" (declared at line 126) static attotime from_seconds(INT32 seconds) { return attotime(seconds, 0); } + + "/Qwd170", -- error #170: pointer points outside of underlying object + "/Qwd188", -- error #188: enumerated type mixed with another type + + "/Qwd63", -- warning #63: shift count is too large + "/Qwd177", -- warning #177: label "xxx" was declared but never referenced + "/Qwd186", -- warning #186: pointless comparison of unsigned integer with zero + "/Qwd488", -- warning #488: template parameter "_FunctionClass" is not used in declaring the parameter types of function template "device_delegate<_Signature>::device_delegate<_FunctionClass>(delegate<_Signature>: + "/Qwd1478", -- warning #1478: function "xxx" (declared at line yyy of "zzz") was declared deprecated + "/Qwd1879", -- warning #1879: unimplemented pragma ignored + "/Qwd3291", -- warning #3291: invalid narrowing conversion from "double" to "int" + "/Qwd1195", -- error #1195: conversion from integer to smaller pointer + "/Qwd47", -- error #47: incompatible redefinition of macro "xxx" + "/Qwd265", -- error #265: floating-point operation result is out of range + -- these occur on a release build, while we can increase the size limits instead some of the files do require extreme amounts + "/Qwd11074", -- remark #11074: Inlining inhibited by limit max-size / remark #11074: Inlining inhibited by limit max-total-size + "/Qwd11075", -- remark #11075: To get full report use -Qopt-report:4 -Qopt-report-phase ipo + } +end + + linkoptions { + "/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 + } + includedirs { + MAME_DIR .. "3rdparty/dxsdk/Include" + } +configuration { "vs201*" } + buildoptions { + "/wd4334", -- warning C4334: '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) + "/wd4456", -- warning C4456: declaration of 'xxx' hides previous local declaration + "/wd4457", -- warning C4457: declaration of 'xxx' hides function parameter + "/wd4458", -- warning C4458: declaration of 'xxx' hides class member + "/wd4459", -- warning C4459: declaration of 'xxx' hides global declaration + "/wd4838", -- warning C4838: conversion from 'xxx' to 'yyy' requires a narrowing conversion + "/wd4091", -- warning C4091: 'typedef ': ignored on left of '' when no variable is declared + "/wd4463", -- warning C4463: overflow; assigning 1 to bit-field that can only hold values from -1 to 0 + "/wd4297", -- warning C4297: 'xxx::~xxx': function assumed not to throw an exception but does + "/wd4319", -- warning C4319: 'operator' : zero extending 'type' to 'type' of greater size + "/wd4592", -- warning C4592: symbol will be dynamically initialized (implementation limitation) + } +configuration { "winphone8* or winstore8*" } + linkoptions { + "/ignore:4264" -- LNK4264: archiving object file compiled with /ZW into a static library; note that when authoring Windows Runtime types it is not recommended to link with a static library that contains Windows Runtime metadata + } +configuration { "vsllvm" } + buildoptions { + "-Wno-tautological-constant-out-of-range-compare", + "-Wno-ignored-qualifiers", + "-Wno-missing-field-initializers", + "-Wno-ignored-pragma-optimize", + "-Wno-unknown-warning-option", + "-Wno-unused-function", + "-Wno-unused-label", + "-Wno-unused-local-typedef", + "-Wno-unused-const-variable", + "-Wno-unused-parameter", + "-Wno-unneeded-internal-declaration", + "-Wno-unused-private-field", + "-Wno-missing-braces", + "-Wno-unused-variable", + "-Wno-tautological-pointer-compare", + "-Wno-nonportable-include-path", + "-Wno-enum-conversion", + "-Wno-pragma-pack", + "-Wno-new-returns-null", + "-Wno-sign-compare", + "-Wno-switch", + "-Wno-tautological-undefined-compare", + "-Wno-deprecated-declarations", + "-Wno-macro-redefined", + "-Wno-narrowing", + } + + +-- adding this till we sort out asserts in debug mode +configuration { "Debug", "gmake" } + buildoptions_cpp { + "-Wno-terminate", + } + +configuration { } + +if (_OPTIONS["SOURCES"] ~= nil) then + local str = _OPTIONS["SOURCES"] + for word in string.gmatch(str, '([^,]+)') do + if (not os.isfile(path.join(MAME_DIR ,word))) then + print("File " .. word.. " does not exist") + os.exit() + end + end + OUT_STR = os.outputof( PYTHON .. " " .. MAME_DIR .. "scripts/build/makedep.py " .. MAME_DIR .. " " .. _OPTIONS["SOURCES"] .. " target " .. _OPTIONS["subtarget"]) + load(OUT_STR)() + os.outputof( PYTHON .. " " .. MAME_DIR .. "scripts/build/makedep.py " .. MAME_DIR .. " " .. _OPTIONS["SOURCES"] .. " drivers " .. _OPTIONS["subtarget"] .. " > ".. GEN_DIR .. _OPTIONS["target"] .. "/" .. _OPTIONS["subtarget"]..".flt") +end + +group "libs" + +if (not os.isfile(path.join("src", "osd", _OPTIONS["osd"] .. ".lua"))) then + error("Unsupported value '" .. _OPTIONS["osd"] .. "' for OSD") +end +dofile(path.join("src", "osd", _OPTIONS["osd"] .. ".lua")) +dofile(path.join("src", "lib.lua")) +if (MACHINES["NETLIST"]~=null or _OPTIONS["with-tools"]) then +dofile(path.join("src", "netlist.lua")) +end +--if (STANDALONE~=true) then +dofile(path.join("src", "formats.lua")) +formatsProject(_OPTIONS["target"],_OPTIONS["subtarget"]) +--end + +group "3rdparty" +dofile(path.join("src", "3rdparty.lua")) + + +group "core" + +dofile(path.join("src", "emu.lua")) + +if (STANDALONE~=true) then + dofile(path.join("src", "mame", "frontend.lua")) +end + +group "devices" +dofile(path.join("src", "devices.lua")) +devicesProject(_OPTIONS["target"],_OPTIONS["subtarget"]) + +if (STANDALONE~=true) then + group "drivers" + findfunction("createProjects_" .. _OPTIONS["target"] .. "_" .. _OPTIONS["subtarget"])(_OPTIONS["target"], _OPTIONS["subtarget"]) +end + +group "emulator" +dofile(path.join("src", "main.lua")) +if (_OPTIONS["SOURCES"] == nil) then + if (_OPTIONS["target"] == _OPTIONS["subtarget"]) then + startproject (_OPTIONS["target"]) + else + if (_OPTIONS["subtarget"]=="mess") then + startproject (_OPTIONS["subtarget"]) + else + startproject (_OPTIONS["target"] .. _OPTIONS["subtarget"]) + end + end +else + startproject (_OPTIONS["subtarget"]) +end +mainProject(_OPTIONS["target"],_OPTIONS["subtarget"]) +strip() + +if _OPTIONS["with-tools"] then + group "tools" + dofile(path.join("src", "tools.lua")) +end + +if _OPTIONS["with-tests"] then + group "tests" + dofile(path.join("src", "tests.lua")) +end + +if _OPTIONS["with-benchmarks"] then + group "benchmarks" + dofile(path.join("src", "benchmarks.lua")) +end |