mame/scripts/genie.lua
2015-03-26 09:35:10 +01:00

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