mirror of
https://github.com/mamedev/mame.git
synced 2024-11-16 07:48:32 +01:00
673 lines
12 KiB
Lua
673 lines
12 KiB
Lua
premake.check_paths = true
|
|
premake.make.override = { "TARGET" }
|
|
MAME_DIR = (path.getabsolute("..") .. "/")
|
|
local MAME_BUILD_DIR = (MAME_DIR .. ".build/")
|
|
local naclToolchain = ""
|
|
|
|
|
|
function includeosd()
|
|
includedirs {
|
|
MAME_DIR .. "src/osd",
|
|
}
|
|
if _OPTIONS["osd"]=="windows" then
|
|
includedirs {
|
|
MAME_DIR .. "src/osd/windows",
|
|
}
|
|
else
|
|
includedirs {
|
|
MAME_DIR .. "src/osd/sdl",
|
|
}
|
|
end
|
|
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
|
|
|
|
CPUS = {}
|
|
SOUNDS = {}
|
|
MACHINES = {}
|
|
VIDEOS = {}
|
|
BUSES = {}
|
|
|
|
newoption {
|
|
trigger = "with-tools",
|
|
description = "Enable building tools.",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "osd",
|
|
description = "Choose target OSD",
|
|
allowed = {
|
|
{ "osdmini", "mini dummy OSD" },
|
|
{ "sdl", "SDL" },
|
|
{ "windows", "Windows" },
|
|
},
|
|
}
|
|
|
|
newoption {
|
|
trigger = "targetos",
|
|
description = "Choose target OS",
|
|
allowed = {
|
|
{ "android", "Android" },
|
|
{ "asmjs", "Emscripten/asm.js" },
|
|
{ "freebsd", "FreeBSD" },
|
|
{ "linux", "Linux" },
|
|
{ "ios", "iOS" },
|
|
{ "nacl", "Native Client" },
|
|
{ "macosx", "OSX" },
|
|
{ "windows", "Windows" },
|
|
},
|
|
}
|
|
|
|
newoption {
|
|
trigger = "target",
|
|
description = "Building target",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "subtarget",
|
|
description = "Building subtarget",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "gcc_version",
|
|
description = "GCC compiler version",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "os_version",
|
|
description = "OS version",
|
|
value = "",
|
|
}
|
|
|
|
local os_version = str_to_version(_OPTIONS["os_version"])
|
|
USE_BGFX = 1
|
|
if (_OPTIONS["targetos"]=="macosx" and os_version < 100700) then
|
|
USE_BGFX = 0
|
|
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
|
|
solution (_OPTIONS["target"] .. _OPTIONS["subtarget"])
|
|
end
|
|
configurations {
|
|
"Debug",
|
|
"Release",
|
|
}
|
|
|
|
platforms {
|
|
"x32",
|
|
"x64",
|
|
"Native", -- for targets where bitness is not specified
|
|
}
|
|
|
|
language "C++"
|
|
|
|
flags {
|
|
"StaticRuntime",
|
|
"Unicode",
|
|
"NoPCH",
|
|
}
|
|
|
|
configuration { "vs*" }
|
|
flags {
|
|
"ExtraWarnings",
|
|
"FatalWarnings",
|
|
}
|
|
|
|
configuration {}
|
|
|
|
msgcompile ("Compiling $(subst ../../../,,$<)...")
|
|
|
|
msgcompile_objc ("Objective-C compiling $(subst ../../../,,$<)...")
|
|
|
|
msgresource ("Compiling resources $(subst ../../../,,$<)...")
|
|
|
|
msglinking ("Linking $(notdir $@)...")
|
|
|
|
msgarchiving ("Archiving $(notdir $@)...")
|
|
|
|
messageskip { "SkipCreatingMessage", "SkipBuildingMessage", "SkipCleaningMessage" }
|
|
|
|
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"))
|
|
|
|
configuration { "gmake" }
|
|
flags {
|
|
"SingleOutputDir",
|
|
}
|
|
|
|
configuration { "x64", "Release" }
|
|
targetsuffix "64"
|
|
|
|
configuration { "x64", "Debug" }
|
|
targetsuffix "64d"
|
|
|
|
configuration { "x32", "Release" }
|
|
targetsuffix ""
|
|
|
|
configuration { "x32", "Debug" }
|
|
targetsuffix "d"
|
|
|
|
configuration { "Native", "Release" }
|
|
targetsuffix ""
|
|
|
|
configuration { "Native", "Debug" }
|
|
targetsuffix "d"
|
|
|
|
configuration { }
|
|
|
|
dofile ("toolchain.lua")
|
|
|
|
|
|
if _OPTIONS["osd"]=="windows" then
|
|
forcedincludes {
|
|
MAME_DIR .. "src/osd/windows/winprefix.h"
|
|
}
|
|
elseif _OPTIONS["osd"]=="sdl" then
|
|
forcedincludes {
|
|
MAME_DIR .. "src/osd/sdl/sdlprefix.h"
|
|
}
|
|
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" }
|
|
defines { "PTR64=1" }
|
|
|
|
-- map the INLINE to something digestible by GCC
|
|
configuration { "gmake" }
|
|
buildoptions_cpp {
|
|
"-DINLINE=\"static inline\"",
|
|
}
|
|
buildoptions_objc {
|
|
"-DINLINE=\"static inline\"",
|
|
}
|
|
configuration { "vs*" }
|
|
defines {
|
|
"INLINE=static inline",
|
|
}
|
|
|
|
-- define MAME_DEBUG if we are a debugging build
|
|
configuration { "Debug" }
|
|
defines {
|
|
"MAME_DEBUG",
|
|
"MAME_PROFILER", -- define MAME_PROFILER if we are a profiling build
|
|
}
|
|
configuration { "Release" }
|
|
defines {
|
|
"NDEBUG",
|
|
}
|
|
|
|
configuration { }
|
|
-- CR/LF setup: use both on win32/os2, CR only on everything else
|
|
if _OPTIONS["targetos"]=="windows" or _OPTIONS["targetos"]=="os2" then
|
|
defines {
|
|
"CRLF=3",
|
|
}
|
|
else
|
|
defines {
|
|
"CRLF=2",
|
|
}
|
|
end
|
|
|
|
|
|
-- define LSB_FIRST if we are a little-endian target
|
|
defines {
|
|
"LSB_FIRST",
|
|
}
|
|
|
|
-- define USE_NETWORK if networking is enabled (not OS/2 and hasn't been disabled)
|
|
if not _OPTIONS["targetos"]=="os2" then
|
|
defines {
|
|
"USE_NETWORK",
|
|
}
|
|
end
|
|
-- need to ensure FLAC functions are statically linked
|
|
defines {
|
|
"FLAC__NO_DLL",
|
|
}
|
|
|
|
-- define USE_SYSTEM_JPEGLIB if library shipped with MAME is not used
|
|
--ifneq ($(BUILD_JPEGLIB),1)
|
|
--DEFS += -DUSE_SYSTEM_JPEGLIB
|
|
--endif
|
|
|
|
--ifdef FASTDEBUG
|
|
--DEFS += -DMAME_DEBUG_FAST
|
|
--endif
|
|
|
|
--To support casting in Lua 5.3
|
|
defines {
|
|
"LUA_COMPAT_APIINTCASTS",
|
|
}
|
|
|
|
if _ACTION == "gmake" then
|
|
|
|
--we compile C-only to C89 standard with GNU extensions
|
|
buildoptions_c {
|
|
"-std=gnu89",
|
|
|
|
}
|
|
--we compile C++ code to C++98 standard with GNU extensions
|
|
buildoptions_cpp {
|
|
"-x c++",
|
|
"-std=gnu++98",
|
|
}
|
|
|
|
buildoptions_objc {
|
|
"-x objective-c++",
|
|
}
|
|
--ifdef CPP11
|
|
--CPPONLYFLAGS += -x c++ -std=gnu++11
|
|
--else
|
|
|
|
-- 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
|
|
--ifdef SYMBOLS
|
|
--CCOMFLAGS += -g$(SYMLEVEL) -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
|
--endif
|
|
|
|
--# we need to disable some additional implicit optimizations for profiling
|
|
--ifdef PROFILE
|
|
--CCOMFLAGS += -mno-omit-leaf-frame-pointer
|
|
--endif
|
|
|
|
-- add -v if we need verbose build information
|
|
--ifdef VERBOSE
|
|
--CCOMFLAGS += -v
|
|
--endif
|
|
|
|
-- only show deprecation warnings when enabled
|
|
--ifndef DEPRECATED
|
|
buildoptions {
|
|
"-Wno-deprecated-declarations"
|
|
}
|
|
--endif
|
|
|
|
-- add profiling information for the compiler
|
|
--ifdef PROFILE
|
|
--CCOMFLAGS += -pg
|
|
--endif
|
|
|
|
--# add the optimization flag
|
|
buildoptions {
|
|
"-O3",
|
|
"-fno-strict-aliasing"
|
|
}
|
|
|
|
-- add the error warning flag
|
|
--ifndef NOWERROR
|
|
buildoptions {
|
|
"-Werror",
|
|
}
|
|
|
|
|
|
-- if we are optimizing, include optimization options
|
|
--ifneq ($(OPTIMIZE),0)
|
|
--CCOMFLAGS += -fno-strict-aliasing $(ARCHOPTS)
|
|
--ifdef LTO
|
|
--CCOMFLAGS += -flto
|
|
--endif
|
|
--endif
|
|
|
|
--ifdef SSE2
|
|
--CCOMFLAGS += -msse2
|
|
--endif
|
|
|
|
--ifdef OPENMP
|
|
--CCOMFLAGS += -fopenmp
|
|
--else
|
|
--CCOMFLAGS += -Wno-unknown-pragmas
|
|
--endif
|
|
buildoptions {
|
|
"-Wno-unknown-pragmas",
|
|
}
|
|
-- add a basic set of warnings
|
|
buildoptions {
|
|
"-Wall",
|
|
"-Wcast-align",
|
|
"-Wundef",
|
|
"-Wformat-security",
|
|
"-Wwrite-strings",
|
|
"-Wno-sign-compare",
|
|
"-Wno-conversion",
|
|
}
|
|
-- warnings only applicable to C compiles
|
|
buildoptions_c {
|
|
"-Wpointer-arith",
|
|
"-Wbad-function-cast",
|
|
"-Wstrict-prototypes",
|
|
}
|
|
|
|
-- warnings only applicable to OBJ-C compiles
|
|
buildoptions_objc {
|
|
"-Wpointer-arith",
|
|
}
|
|
|
|
-- warnings only applicable to C++ compiles
|
|
buildoptions_cpp {
|
|
"-Woverloaded-virtual",
|
|
}
|
|
|
|
--ifdef SANITIZE
|
|
--CCOMFLAGS += -fsanitize=$(SANITIZE)
|
|
|
|
--ifneq (,$(findstring thread,$(SANITIZE)))
|
|
--CCOMFLAGS += -fPIE
|
|
--endif
|
|
--endif
|
|
|
|
|
|
|
|
local version = str_to_version(_OPTIONS["gcc_version"])
|
|
if string.find(_OPTIONS["gcc"], "clang") then
|
|
buildoptions {
|
|
"-Wno-cast-align",
|
|
"-Wno-tautological-compare",
|
|
"-Wno-dynamic-class-memaccess",
|
|
"-Wno-self-assign-field",
|
|
}
|
|
|
|
if (version >= 30400) then
|
|
buildoptions {
|
|
"-Wno-inline-new-delete",
|
|
"-Wno-constant-logical-operand",
|
|
}
|
|
end
|
|
if (version >= 30500) then
|
|
buildoptions {
|
|
"-Wno-absolute-value",
|
|
"-Wno-unknown-warning-option",
|
|
"-Wno-extern-c-compat",
|
|
}
|
|
end
|
|
else
|
|
if (version >= 40700) then
|
|
buildoptions {
|
|
"-Wno-narrowing",
|
|
"-Wno-attributes"
|
|
}
|
|
end
|
|
if (version >= 40800) then
|
|
-- 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)
|
|
buildoptions {
|
|
"-Wno-unused-variable",
|
|
"-Wno-array-bounds"
|
|
}
|
|
end
|
|
end
|
|
end
|
|
--ifeq ($(findstring arm,$(UNAME)),arm)
|
|
-- CCOMFLAGS += -Wno-cast-align
|
|
--endif
|
|
|
|
if not toolchain(MAME_BUILD_DIR) then
|
|
return -- no action specified
|
|
end
|
|
|
|
configuration { "asmjs" }
|
|
buildoptions {
|
|
"-std=gnu89",
|
|
"-Wno-implicit-function-declaration",
|
|
}
|
|
buildoptions_cpp {
|
|
"-x c++",
|
|
"-std=gnu++98",
|
|
}
|
|
archivesplit_size "20"
|
|
|
|
configuration { "android*" }
|
|
buildoptions_cpp {
|
|
"-x c++",
|
|
"-std=gnu++98",
|
|
}
|
|
archivesplit_size "20"
|
|
|
|
configuration { "pnacl" }
|
|
buildoptions {
|
|
"-std=gnu89",
|
|
"-Wno-inline-new-delete",
|
|
}
|
|
buildoptions_cpp {
|
|
"-x c++",
|
|
"-std=gnu++98",
|
|
}
|
|
archivesplit_size "20"
|
|
|
|
configuration { "nacl*" }
|
|
buildoptions_cpp {
|
|
"-x c++",
|
|
"-std=gnu++98",
|
|
}
|
|
archivesplit_size "20"
|
|
|
|
configuration { "linux-*" }
|
|
linkoptions {
|
|
"-Wl,--gc-sections",
|
|
"`sdl2-config --libs`",
|
|
}
|
|
links {
|
|
"pthread",
|
|
"SDL2",
|
|
"SDL2_ttf",
|
|
"asound",
|
|
"dl",
|
|
"fontconfig",
|
|
"freetype",
|
|
"GL",
|
|
"m",
|
|
"util",
|
|
"X11",
|
|
"Xinerama",
|
|
}
|
|
|
|
configuration { "osx*" }
|
|
|
|
links {
|
|
"Cocoa.framework",
|
|
"OpenGL.framework",
|
|
"CoreAudio.framework",
|
|
"CoreMIDI.framework",
|
|
"SDL2.framework",
|
|
"pthread",
|
|
}
|
|
|
|
|
|
configuration { "mingw*" }
|
|
defines {
|
|
"main=utf8_main",
|
|
}
|
|
linkoptions {
|
|
"-Wl,--gc-sections",
|
|
"-static-libgcc",
|
|
"-static-libstdc++",
|
|
"-municode",
|
|
}
|
|
if _OPTIONS["osd"]=="sdl" then
|
|
linkoptions {
|
|
"-Wl,--allow-multiple-definition",
|
|
"-static"
|
|
}
|
|
links {
|
|
"opengl32",
|
|
"SDL2",
|
|
"Imm32",
|
|
"version",
|
|
"ole32",
|
|
"oleaut32",
|
|
}
|
|
end
|
|
links {
|
|
"user32",
|
|
"gdi32",
|
|
"dsound",
|
|
"dxguid",
|
|
"winmm",
|
|
"advapi32",
|
|
"comctl32",
|
|
"shlwapi",
|
|
"wsock32",
|
|
"dinput8",
|
|
"comdlg32",
|
|
}
|
|
|
|
configuration { "vs*" }
|
|
defines {
|
|
"main=utf8_main",
|
|
}
|
|
defines {
|
|
"XML_STATIC",
|
|
"WIN32",
|
|
"_WIN32",
|
|
"_CRT_NONSTDC_NO_DEPRECATE",
|
|
"_CRT_SECURE_NO_DEPRECATE",
|
|
}
|
|
links {
|
|
"user32",
|
|
"gdi32",
|
|
"dsound",
|
|
"dxguid",
|
|
"winmm",
|
|
"advapi32",
|
|
"comctl32",
|
|
"shlwapi",
|
|
"wsock32",
|
|
"dinput8",
|
|
"comdlg32",
|
|
}
|
|
|
|
buildoptions {
|
|
"/wd4025",
|
|
"/wd4003",
|
|
"/wd4018",
|
|
"/wd4061",
|
|
"/wd4100",
|
|
"/wd4127",
|
|
"/wd4131",
|
|
"/wd4141",
|
|
"/wd4146",
|
|
"/wd4150",
|
|
"/wd4189",
|
|
"/wd4191",
|
|
"/wd4201",
|
|
"/wd4232",
|
|
"/wd4242",
|
|
"/wd4244",
|
|
"/wd4250",
|
|
"/wd4255",
|
|
"/wd4296",
|
|
"/wd4306",
|
|
"/wd4310",
|
|
"/wd4312",
|
|
"/wd4324",
|
|
"/wd4347",
|
|
"/wd4435",
|
|
"/wd4510",
|
|
"/wd4512",
|
|
"/wd4514",
|
|
"/wd4571",
|
|
"/wd4610",
|
|
"/wd4611",
|
|
"/wd4619",
|
|
"/wd4625",
|
|
"/wd4626",
|
|
"/wd4640",
|
|
"/wd4668",
|
|
"/wd4702",
|
|
"/wd4706",
|
|
"/wd4710",
|
|
"/wd4711",
|
|
"/wd4805",
|
|
"/wd4820",
|
|
"/wd4826",
|
|
"/wd4365",
|
|
"/wd4389",
|
|
"/wd4245",
|
|
"/wd4388",
|
|
"/wd4267",
|
|
"/wd4005",
|
|
"/wd4350",
|
|
"/wd4996",
|
|
"/wd4191",
|
|
"/wd4060",
|
|
"/wd4065",
|
|
"/wd4640",
|
|
"/wd4290",
|
|
"/wd4355",
|
|
"/wd4800",
|
|
"/wd4371",
|
|
"/wd4548",
|
|
}
|
|
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 { "x32", "vs*" }
|
|
libdirs {
|
|
MAME_DIR .. "3rdparty/dxsdk/lib/x86",
|
|
}
|
|
|
|
configuration { "x64", "vs*" }
|
|
libdirs {
|
|
MAME_DIR .. "3rdparty/dxsdk/lib/x64",
|
|
}
|
|
|
|
configuration { }
|
|
|
|
group "libs"
|
|
dofile(path.join("src", "3rdparty.lua"))
|
|
dofile(path.join("src", "lib.lua"))
|
|
|
|
group "core"
|
|
|
|
dofile(path.join("src", "osd.lua"))
|
|
dofile(path.join("src", "emu.lua"))
|
|
emuProject(_OPTIONS["target"],_OPTIONS["subtarget"])
|
|
|
|
group "drivers"
|
|
createProjects(_OPTIONS["target"],_OPTIONS["subtarget"])
|
|
group "emulator"
|
|
dofile(path.join("src", "main.lua"))
|
|
if (_OPTIONS["target"] == _OPTIONS["subtarget"]) then
|
|
startproject (_OPTIONS["target"])
|
|
else
|
|
startproject (_OPTIONS["target"] .. _OPTIONS["subtarget"])
|
|
end
|
|
mainProject(_OPTIONS["target"],_OPTIONS["subtarget"])
|
|
|
|
if _OPTIONS["with-tools"] then
|
|
group "tools"
|
|
dofile(path.join("src", "tools.lua"))
|
|
end
|
|
|
|
if (_ACTION == "gmake" and _OPTIONS["gcc"]=='asmjs') then
|
|
strip()
|
|
end
|