mirror of
https://github.com/holub/mame
synced 2025-04-26 02:07:14 +03:00

fundamental change to show device delegates are configured. Device delegates are now aware of the current device during configuration and will resolve string tags relative to it. This means that device delegates need a device to be supplied on construction so they can find the machine configuration object. There's a one-dimensional array helper to make it easier to construct arrays of device delegates with the same owner. (I didn't make an n-dimensional one because I didn't hit a use case, but it would be a simple addition.) There's no more bind_relative_to member - just call resolve() like you would for a devcb. There's also no need to cast nullptr when creating a late bind device delegate. The flip side is that for an overloaded or non-capturing lambda you'll need to cast to the desired type. There is one less conditional branch in the hot path for calls for delegates bound to a function pointer of member function pointer. This comes at the cost of one additional unconditional branch in the hot path for calls to delegates bound to functoids (lambdas, functions that don't take an object reference, other callable objects). This applies to all delegates, not just device delegates. Address spaces will now print an error message if a late bind error is encountered while installing a handler. This will give the range and address range, hopefully making it easier to guess which memory map is faulty. For the simple case of allowing a device_delegate member to be configured, use a member like this: template <typename... T> void set_foo(T &&...args) { m_foo_cb.set(std::forward<T>(args)...); } For a case where different delegates need to be used depending on the function signature, see src/emu/screen.h (the screen update function setters). Device delegates now take a target specification and function pointer. The target may be: * Target omitted, implying the current device being configured. This can only be used during configuration. It will work as long as the current device is not removed/replaced. * A tag string relative to the current device being configured. This can only be used during configuration. It will not be callable until .resolve() is called. It will work as long as the current device is not removed/replaced. * A device finder (required_device/optional_device). The delegate will late bind to the current target of the device finder. It will not be callable until .resolve() is called. It will work properly if the target device is replaced, as long as the device finder's base object isn't removed/replaced. * A reference to an object. It will be callable immediately. It will work as long as the target object is not removed/replaced. The target types and restrictions are pretty similar to what you already have on object finders and devcb, so it shouldn't cause any surprises. Note that dereferencing a device finder will changes the effect. To illustrate this: ... required_device<some_device> m_dev; ... m_dev(*this, "dev") ... // will late bind to "dev" relative to *this // will work if "dev" hasn't been created yet or is replaced later // won't work if *this is removed/replaced // won't be callable until resolve() is called cb1.set(m_dev, FUNC(some_device::w)); ... // will bind to current target of m_dev // will not work if m_dev is not resolved // will not work if "dev" is replaced later // will be callable immediately cb2.set(*m_dev, FUNC(some_device::w)); ... The order of the target and name has been reversed for functoids (lambdas and other callable objects). This allows the NAME macro to be used on lambdas and functoids. For example: foo.set_something(NAME([this] (u8 data) { m_something = data; })); I realise the diagnostic messages get ugly if you use NAME on a large lambda. You can still give a literal name, you just have to place it after the lambda rather than before. This is uglier, but it's intentional. I'm trying to drive developers away from a certain style. While it's nice that you can put half the driver code in the memory map, it detracts from readability. It's hard to visualise the memory range mappings if the memory map functions are punctuated by large lambdas. There's also slightly higher overhead for calling a delegate bound to a functoid. If the code is prettier for trivial lambdas but uglier for non-trivial lambdas in address maps, it will hopefully steer people away from putting non-trivial lambdas in memory maps. There were some devices that were converted from using plain delegates without adding bind_relative_to calls. I fixed some of them (e.g. LaserDisc) but I probably missed some. These will likely crash on unresolved delegate calls. There are some devices that reset delegates at configuration complete or start time, preventing them from being set up during configuration (e.g. src/devices/video/ppu2c0x.cpp and src/devices/machine/68307.cpp). This goes against the design principles of how device delegates should be used, but I didn't change them because I don't trust myself to find all the places they're used. I've definitely broken some stuff with this (I know about asterix), so report issues and bear with me until I get it all fixed.
1599 lines
41 KiB
Lua
1599 lines
41 KiB
Lua
-- 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
|
|
if(tonumber(word) == nil) then
|
|
return val
|
|
end
|
|
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 precompiledheaders_novs()
|
|
precompiledheaders()
|
|
if string.sub(_ACTION,1,4) == "vs20" then
|
|
--print("Disabling pch for Visual Studio")
|
|
flags {
|
|
"NoPCH"
|
|
}
|
|
end
|
|
end
|
|
|
|
function addprojectflags()
|
|
local version = str_to_version(_OPTIONS["gcc_version"])
|
|
if _OPTIONS["gcc"]~=nil and string.find(_OPTIONS["gcc"], "gcc") then
|
|
buildoptions_cpp {
|
|
"-Wsuggest-override",
|
|
"-flifetime-dse=1",
|
|
}
|
|
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 {
|
|
"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 {
|
|
"-std=c++1y",
|
|
}
|
|
|
|
buildoptions_objcpp {
|
|
"-std=c++1y",
|
|
}
|
|
else
|
|
buildoptions_cpp {
|
|
"-std=c++14",
|
|
}
|
|
|
|
buildoptions_objcpp {
|
|
"-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
|
|
"-Wno-nonportable-include-path", -- workround for clang 9.0.0 case sensitivity bug when including GL/glext.h
|
|
}
|
|
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 {
|
|
"-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 {
|
|
"-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 {
|
|
"-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
|
|
|
|
if _OPTIONS["vs"]=="clangcl" then
|
|
buildoptions {
|
|
"-Wno-enum-conversion",
|
|
"-Wno-ignored-qualifiers",
|
|
"-Wno-missing-braces",
|
|
"-Wno-missing-field-initializers",
|
|
"-Wno-new-returns-null",
|
|
"-Wno-nonportable-include-path",
|
|
"-Wno-pointer-bool-conversion",
|
|
"-Wno-pragma-pack",
|
|
"-Wno-switch",
|
|
"-Wno-tautological-constant-out-of-range-compare",
|
|
"-Wno-tautological-pointer-compare",
|
|
"-Wno-unknown-warning-option",
|
|
"-Wno-unused-const-variable",
|
|
"-Wno-unused-function",
|
|
"-Wno-unused-label",
|
|
"-Wno-unused-local-typedef",
|
|
"-Wno-unused-private-field",
|
|
"-Wno-unused-variable",
|
|
}
|
|
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",
|
|
}
|
|
|
|
|
|
configuration { }
|
|
|
|
if (_OPTIONS["SOURCES"] ~= nil) then
|
|
local str = _OPTIONS["SOURCES"]
|
|
local sourceargs = ""
|
|
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
|
|
sourceargs = sourceargs .. " " .. word
|
|
end
|
|
OUT_STR = os.outputof( PYTHON .. " " .. MAME_DIR .. "scripts/build/makedep.py sourcesproject -r " .. MAME_DIR .. " -t " .. _OPTIONS["subtarget"] .. sourceargs )
|
|
load(OUT_STR)()
|
|
os.outputof( PYTHON .. " " .. MAME_DIR .. "scripts/build/makedep.py sourcesfilter" .. sourceargs .. " > ".. 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
|