mirror of https://github.com/bkaradzic/bgfx
602 lines
12 KiB
Lua
602 lines
12 KiB
Lua
--
|
|
-- Copyright 2010-2023 Branimir Karadzic. All rights reserved.
|
|
-- License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
|
|
--
|
|
|
|
MODULE_DIR = path.getabsolute("../")
|
|
|
|
newoption {
|
|
trigger = "with-amalgamated",
|
|
description = "Enable amalgamated build.",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "with-sdl",
|
|
description = "Enable SDL entry.",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "with-glfw",
|
|
description = "Enable GLFW entry.",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "with-wayland",
|
|
description = "Use Wayland backend.",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "with-profiler",
|
|
description = "Enable build with intrusive profiler.",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "with-shared-lib",
|
|
description = "Enable building shared library.",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "with-tools",
|
|
description = "Enable building tools.",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "with-combined-examples",
|
|
description = "Enable building examples (combined as single executable).",
|
|
}
|
|
|
|
newoption {
|
|
trigger = "with-examples",
|
|
description = "Enable building examples.",
|
|
}
|
|
|
|
newaction {
|
|
trigger = "idl",
|
|
description = "Generate bgfx interface source code",
|
|
execute = function ()
|
|
|
|
local gen = require "bgfx-codegen"
|
|
|
|
local function generate(tempfile, outputfile, indent)
|
|
local codes = gen.apply(tempfile)
|
|
codes = gen.format(codes, {indent = indent})
|
|
gen.write(codes, outputfile)
|
|
print("Generating: " .. outputfile)
|
|
end
|
|
|
|
generate("temp.bgfx.h" , "../include/bgfx/c99/bgfx.h", " ")
|
|
generate("temp.bgfx.idl.inl", "../src/bgfx.idl.inl", "\t")
|
|
generate("temp.defines.h", "../include/bgfx/defines.h", "\t")
|
|
|
|
do
|
|
local csgen = require "bindings-cs"
|
|
csgen.write(csgen.gen(), "../bindings/cs/bgfx.cs")
|
|
csgen.write(csgen.gen_dllname(), "../bindings/cs/bgfx_dllname.cs")
|
|
|
|
local dgen = require "bindings-d"
|
|
dgen.write(dgen.gen(), "../bindings/d/package.d")
|
|
dgen.write(dgen.fakeEnumFile, "../bindings/d/fakeenum.d")
|
|
|
|
local csgen = require "bindings-bf"
|
|
csgen.write(csgen.gen(), "../bindings/bf/bgfx.bf")
|
|
|
|
local ziggen = require "bindings-zig"
|
|
ziggen.write(ziggen.gen(), "../bindings/zig/bgfx.zig")
|
|
end
|
|
|
|
os.exit()
|
|
end
|
|
}
|
|
|
|
newaction {
|
|
trigger = "version",
|
|
description = "Generate bgfx version.h",
|
|
execute = function ()
|
|
|
|
local f = io.popen("git rev-list --count HEAD")
|
|
local rev = string.match(f:read("*a"), ".*%S")
|
|
|
|
local codegen = require "codegen"
|
|
local idl = codegen.idl "bgfx.idl"
|
|
print("1." .. idl._version .. "." .. rev)
|
|
|
|
f:close()
|
|
f = io.popen("git log --format=format:%H -1")
|
|
local sha1 = f:read("*a")
|
|
f:close()
|
|
io.output(path.join(MODULE_DIR, "src/version.h"))
|
|
io.write("/*\n")
|
|
io.write(" * Copyright 2011-2023 Branimir Karadzic. All rights reserved.\n")
|
|
io.write(" * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE\n")
|
|
io.write(" */\n")
|
|
io.write("\n")
|
|
io.write("/*\n")
|
|
io.write(" *\n")
|
|
io.write(" * AUTO GENERATED! DO NOT EDIT!\n")
|
|
io.write(" *\n")
|
|
io.write(" */\n")
|
|
io.write("\n")
|
|
io.write("#define BGFX_REV_NUMBER " .. rev .. "\n")
|
|
io.write("#define BGFX_REV_SHA1 \"" .. sha1 .. "\"\n")
|
|
io.close()
|
|
|
|
os.exit()
|
|
end
|
|
}
|
|
|
|
solution "bgfx"
|
|
configurations {
|
|
"Debug",
|
|
"Release",
|
|
}
|
|
|
|
if _ACTION ~= nil and _ACTION:match "^xcode" then
|
|
platforms {
|
|
"Native", -- let xcode decide based on the target output
|
|
}
|
|
else
|
|
platforms {
|
|
"x32",
|
|
"x64",
|
|
-- "Xbox360",
|
|
"Native", -- for targets where bitness is not specified
|
|
}
|
|
end
|
|
|
|
language "C++"
|
|
startproject "example-00-helloworld"
|
|
|
|
BGFX_DIR = path.getabsolute("..")
|
|
BX_DIR = os.getenv("BX_DIR")
|
|
BIMG_DIR = os.getenv("BIMG_DIR")
|
|
|
|
local BGFX_BUILD_DIR = path.join(BGFX_DIR, ".build")
|
|
local BGFX_THIRD_PARTY_DIR = path.join(BGFX_DIR, "3rdparty")
|
|
if not BX_DIR then
|
|
BX_DIR = path.getabsolute(path.join(BGFX_DIR, "../bx"))
|
|
end
|
|
|
|
if not BIMG_DIR then
|
|
BIMG_DIR = path.getabsolute(path.join(BGFX_DIR, "../bimg"))
|
|
end
|
|
|
|
if not os.isdir(BX_DIR) or not os.isdir(BIMG_DIR) then
|
|
|
|
if not os.isdir(BX_DIR) then
|
|
print("bx not found at \"" .. BX_DIR .. "\". git clone https://github.com/bkaradzic/bx?")
|
|
end
|
|
|
|
if not os.isdir(BIMG_DIR) then
|
|
print("bimg not found at \"" .. BIMG_DIR .. "\". git clone https://github.com/bkaradzic/bimg?")
|
|
end
|
|
|
|
print("For more info see: https://bkaradzic.github.io/bgfx/build.html")
|
|
os.exit()
|
|
end
|
|
|
|
dofile (path.join(BX_DIR, "scripts/toolchain.lua"))
|
|
if not toolchain(BGFX_BUILD_DIR, BGFX_THIRD_PARTY_DIR) then
|
|
return -- no action specified
|
|
end
|
|
|
|
function copyLib()
|
|
end
|
|
|
|
if _OPTIONS["with-wayland"] then
|
|
defines { "WL_EGL_PLATFORM=1" }
|
|
end
|
|
|
|
if _OPTIONS["with-sdl"] then
|
|
if os.is("windows") then
|
|
if not os.getenv("SDL2_DIR") then
|
|
print("Set SDL2_DIR environment variable.")
|
|
end
|
|
end
|
|
end
|
|
|
|
if _OPTIONS["with-profiler"] then
|
|
defines {
|
|
"ENTRY_CONFIG_PROFILER=1",
|
|
"BGFX_CONFIG_PROFILER=1",
|
|
}
|
|
end
|
|
|
|
function exampleProjectDefaults()
|
|
|
|
debugdir (path.join(BGFX_DIR, "examples/runtime"))
|
|
|
|
includedirs {
|
|
path.join(BIMG_DIR, "include"),
|
|
path.join(BGFX_DIR, "include"),
|
|
path.join(BGFX_DIR, "3rdparty"),
|
|
path.join(BGFX_DIR, "examples/common"),
|
|
}
|
|
|
|
flags {
|
|
"FatalWarnings",
|
|
}
|
|
|
|
links {
|
|
"example-glue",
|
|
"example-common",
|
|
"bgfx",
|
|
"bimg_decode",
|
|
"bimg",
|
|
}
|
|
|
|
using_bx()
|
|
|
|
if _OPTIONS["with-sdl"] then
|
|
defines { "ENTRY_CONFIG_USE_SDL=1" }
|
|
links { "SDL2" }
|
|
|
|
configuration { "linux or freebsd" }
|
|
if _OPTIONS["with-wayland"] then
|
|
links {
|
|
"wayland-egl",
|
|
}
|
|
end
|
|
|
|
configuration { "osx*" }
|
|
libdirs { "$(SDL2_DIR)/lib" }
|
|
|
|
configuration {}
|
|
end
|
|
|
|
if _OPTIONS["with-glfw"] then
|
|
defines { "ENTRY_CONFIG_USE_GLFW=1" }
|
|
links { "glfw3" }
|
|
|
|
configuration { "linux or freebsd" }
|
|
if _OPTIONS["with-wayland"] then
|
|
links {
|
|
"wayland-egl",
|
|
}
|
|
else
|
|
links {
|
|
"Xrandr",
|
|
"Xinerama",
|
|
"Xi",
|
|
"Xxf86vm",
|
|
"Xcursor",
|
|
}
|
|
end
|
|
|
|
configuration { "osx*" }
|
|
linkoptions {
|
|
"-framework CoreVideo",
|
|
}
|
|
|
|
configuration {}
|
|
end
|
|
|
|
configuration { "vs*", "x32 or x64" }
|
|
linkoptions {
|
|
"/ignore:4199", -- LNK4199: /DELAYLOAD:*.dll ignored; no imports found from *.dll
|
|
}
|
|
links { -- this is needed only for testing with GLES2/3 on Windows with VS2008
|
|
"DelayImp",
|
|
}
|
|
|
|
configuration { "vs201*", "x32 or x64" }
|
|
linkoptions { -- this is needed only for testing with GLES2/3 on Windows with VS201x
|
|
"/DELAYLOAD:\"libEGL.dll\"",
|
|
"/DELAYLOAD:\"libGLESv2.dll\"",
|
|
}
|
|
|
|
configuration { "mingw*" }
|
|
targetextension ".exe"
|
|
links {
|
|
"comdlg32",
|
|
"gdi32",
|
|
"psapi",
|
|
}
|
|
|
|
configuration { "vs20*", "x32 or x64" }
|
|
links {
|
|
"gdi32",
|
|
"psapi",
|
|
}
|
|
|
|
configuration { "durango" }
|
|
links {
|
|
"d3d11_x",
|
|
"d3d12_x",
|
|
"combase",
|
|
"kernelx",
|
|
}
|
|
|
|
configuration { "winstore*" }
|
|
removelinks {
|
|
"DelayImp",
|
|
"gdi32",
|
|
"psapi"
|
|
}
|
|
links {
|
|
"d3d11",
|
|
"d3d12",
|
|
"dxgi"
|
|
}
|
|
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
|
|
}
|
|
|
|
-- WinRT targets need their own output directories or build files stomp over each other
|
|
configuration { "x32", "winstore*" }
|
|
targetdir (path.join(BGFX_BUILD_DIR, "win32_" .. _ACTION, "bin", _name))
|
|
objdir (path.join(BGFX_BUILD_DIR, "win32_" .. _ACTION, "obj", _name))
|
|
|
|
configuration { "x64", "winstore*" }
|
|
targetdir (path.join(BGFX_BUILD_DIR, "win64_" .. _ACTION, "bin", _name))
|
|
objdir (path.join(BGFX_BUILD_DIR, "win64_" .. _ACTION, "obj", _name))
|
|
|
|
configuration { "ARM", "winstore*" }
|
|
targetdir (path.join(BGFX_BUILD_DIR, "arm_" .. _ACTION, "bin", _name))
|
|
objdir (path.join(BGFX_BUILD_DIR, "arm_" .. _ACTION, "obj", _name))
|
|
|
|
configuration { "mingw-clang" }
|
|
kind "ConsoleApp"
|
|
|
|
configuration { "android*" }
|
|
kind "ConsoleApp"
|
|
targetextension ".so"
|
|
linkoptions {
|
|
"-shared",
|
|
}
|
|
links {
|
|
"EGL",
|
|
"GLESv2",
|
|
}
|
|
|
|
configuration { "android*", "Debug" }
|
|
linkoptions {
|
|
"-Wl,-soname,lib" .. project().name .. "Debug.so"
|
|
}
|
|
|
|
configuration { "android*", "Release" }
|
|
linkoptions {
|
|
"-Wl,-soname,lib" .. project().name .. "Release.so"
|
|
}
|
|
|
|
configuration { "wasm*" }
|
|
kind "ConsoleApp"
|
|
|
|
linkoptions {
|
|
"-s TOTAL_MEMORY=32MB",
|
|
"-s ALLOW_MEMORY_GROWTH=1",
|
|
"--preload-file ../../../examples/runtime@/"
|
|
}
|
|
|
|
removeflags {
|
|
"OptimizeSpeed",
|
|
}
|
|
|
|
flags {
|
|
"Optimize"
|
|
}
|
|
|
|
configuration { "linux-* or freebsd" }
|
|
links {
|
|
"X11",
|
|
"GL",
|
|
"pthread",
|
|
}
|
|
|
|
configuration { "rpi" }
|
|
links {
|
|
"X11",
|
|
"brcmGLESv2",
|
|
"brcmEGL",
|
|
"bcm_host",
|
|
"vcos",
|
|
"vchiq_arm",
|
|
"pthread",
|
|
}
|
|
|
|
configuration { "osx*" }
|
|
linkoptions {
|
|
"-framework Cocoa",
|
|
"-framework IOKit",
|
|
"-framework OpenGL",
|
|
"-framework QuartzCore",
|
|
"-weak_framework Metal",
|
|
}
|
|
|
|
configuration { "ios* or tvos*" }
|
|
kind "ConsoleApp"
|
|
linkoptions {
|
|
"-framework CoreFoundation",
|
|
"-framework Foundation",
|
|
"-framework IOKit",
|
|
"-framework OpenGLES",
|
|
"-framework QuartzCore",
|
|
"-framework UIKit",
|
|
"-weak_framework Metal",
|
|
}
|
|
|
|
configuration { "xcode*", "ios" }
|
|
kind "WindowedApp"
|
|
files {
|
|
path.join(BGFX_DIR, "examples/runtime/iOS-Info.plist"),
|
|
}
|
|
|
|
configuration { "xcode*", "tvos" }
|
|
kind "WindowedApp"
|
|
files {
|
|
path.join(BGFX_DIR, "examples/runtime/tvOS-Info.plist"),
|
|
}
|
|
|
|
configuration {}
|
|
|
|
strip()
|
|
end
|
|
|
|
function exampleProject(_combined, ...)
|
|
|
|
if _combined then
|
|
|
|
project ("examples")
|
|
uuid (os.uuid("examples"))
|
|
kind "WindowedApp"
|
|
|
|
for _, name in ipairs({...}) do
|
|
|
|
files {
|
|
path.join(BGFX_DIR, "examples", name, "**.c"),
|
|
path.join(BGFX_DIR, "examples", name, "**.cpp"),
|
|
path.join(BGFX_DIR, "examples", name, "**.h"),
|
|
}
|
|
|
|
removefiles {
|
|
path.join(BGFX_DIR, "examples", name, "**.bin.h"),
|
|
}
|
|
|
|
end
|
|
|
|
files {
|
|
path.join(BGFX_DIR, "examples/25-c99/helloworld.c"), -- hack for _main_
|
|
}
|
|
|
|
exampleProjectDefaults()
|
|
|
|
else
|
|
|
|
for _, name in ipairs({...}) do
|
|
project ("example-" .. name)
|
|
uuid (os.uuid("example-" .. name))
|
|
kind "WindowedApp"
|
|
|
|
files {
|
|
path.join(BGFX_DIR, "examples", name, "**.c"),
|
|
path.join(BGFX_DIR, "examples", name, "**.cpp"),
|
|
path.join(BGFX_DIR, "examples", name, "**.h"),
|
|
}
|
|
|
|
removefiles {
|
|
path.join(BGFX_DIR, "examples", name, "**.bin.h"),
|
|
}
|
|
|
|
defines {
|
|
"ENTRY_CONFIG_IMPLEMENT_MAIN=1",
|
|
}
|
|
|
|
exampleProjectDefaults()
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
group "libs"
|
|
dofile(path.join(BX_DIR, "scripts/bx.lua"))
|
|
dofile(path.join(BIMG_DIR, "scripts/bimg.lua"))
|
|
dofile(path.join(BIMG_DIR, "scripts/bimg_decode.lua"))
|
|
dofile "bgfx.lua"
|
|
|
|
local function userdefines()
|
|
local defines = {}
|
|
local BGFX_CONFIG = os.getenv("BGFX_CONFIG")
|
|
if BGFX_CONFIG then
|
|
for def in BGFX_CONFIG:gmatch "[^%s:]+" do
|
|
table.insert(defines, "BGFX_CONFIG_" .. def)
|
|
end
|
|
end
|
|
|
|
return defines
|
|
end
|
|
|
|
BGFX_CONFIG = userdefines()
|
|
|
|
bgfxProject("", "StaticLib", BGFX_CONFIG)
|
|
|
|
if _OPTIONS["with-shared-lib"] then
|
|
group "libs"
|
|
bgfxProject("-shared-lib", "SharedLib", BGFX_CONFIG)
|
|
end
|
|
|
|
if _OPTIONS["with-tools"] then
|
|
group "libs"
|
|
dofile(path.join(BIMG_DIR, "scripts/bimg_encode.lua"))
|
|
end
|
|
|
|
if _OPTIONS["with-examples"]
|
|
or _OPTIONS["with-combined-examples"]
|
|
or _OPTIONS["with-tools"] then
|
|
group "examples"
|
|
dofile "example-common.lua"
|
|
end
|
|
|
|
if _OPTIONS["with-examples"]
|
|
or _OPTIONS["with-combined-examples"] then
|
|
group "examples"
|
|
|
|
exampleProject(_OPTIONS["with-combined-examples"]
|
|
, "00-helloworld"
|
|
, "01-cubes"
|
|
, "02-metaballs"
|
|
, "03-raymarch"
|
|
, "04-mesh"
|
|
, "05-instancing"
|
|
, "06-bump"
|
|
, "07-callback"
|
|
, "08-update"
|
|
, "09-hdr"
|
|
, "10-font"
|
|
, "11-fontsdf"
|
|
, "12-lod"
|
|
, "13-stencil"
|
|
, "14-shadowvolumes"
|
|
, "15-shadowmaps-simple"
|
|
, "16-shadowmaps"
|
|
, "18-ibl"
|
|
, "19-oit"
|
|
, "20-nanovg"
|
|
, "21-deferred"
|
|
, "22-windows"
|
|
, "23-vectordisplay"
|
|
, "24-nbody"
|
|
, "26-occlusion"
|
|
, "27-terrain"
|
|
, "28-wireframe"
|
|
, "29-debugdraw"
|
|
, "30-picking"
|
|
, "31-rsm"
|
|
, "32-particles"
|
|
, "33-pom"
|
|
, "34-mvs"
|
|
, "35-dynamic"
|
|
, "36-sky"
|
|
, "37-gpudrivenrendering"
|
|
, "38-bloom"
|
|
, "39-assao"
|
|
, "40-svt"
|
|
, "41-tess"
|
|
, "42-bunnylod"
|
|
, "43-denoise"
|
|
, "44-sss"
|
|
, "45-bokeh"
|
|
, "46-fsr"
|
|
, "47-pixelformats"
|
|
, "48-drawindirect"
|
|
, "49-hextile"
|
|
)
|
|
|
|
-- 17-drawstress requires multithreading, does not compile for singlethreaded wasm
|
|
if premake.gcc.namestyle == nil or not premake.gcc.namestyle == "Emscripten" then
|
|
exampleProject(false, "17-drawstress")
|
|
end
|
|
|
|
-- C99 source doesn't compile under WinRT settings
|
|
if not premake.vstudio.iswinrt() then
|
|
exampleProject(false, "25-c99")
|
|
end
|
|
end
|
|
|
|
if _OPTIONS["with-tools"] then
|
|
group "tools"
|
|
dofile "shaderc.lua"
|
|
dofile "texturec.lua"
|
|
dofile "texturev.lua"
|
|
dofile "geometryc.lua"
|
|
dofile "geometryv.lua"
|
|
end
|