summaryrefslogtreecommitdiffstats
path: root/premake5.lua
diff options
context:
space:
mode:
authorskallweitNV <64953474+skallweitNV@users.noreply.github.com>2023-01-27 03:48:12 +0100
committerGitHub <noreply@github.com>2023-01-26 18:48:12 -0800
commit9f6b6fb9f1bdde8ef01640257544f0e3c9db9076 (patch)
tree23887c9812c57f8f5ea788721c039a41362164bc /premake5.lua
parent1f4c7cab13341c2e9d48df2b01ed2c048c17c152 (diff)
Format premake5.lua (#2612)
Diffstat (limited to 'premake5.lua')
-rw-r--r--premake5.lua2868
1 files changed, 1434 insertions, 1434 deletions
diff --git a/premake5.lua b/premake5.lua
index 8e1a97b7c..f3d48f07f 100644
--- a/premake5.lua
+++ b/premake5.lua
@@ -68,692 +68,694 @@ newoption {
trigger = "override-module",
description = "(Optional) Specify a lua file that can override functions",
value = "path"
- }
-
- newoption {
+}
+
+newoption {
trigger = "build-location",
description = "(Optional) Specifiy the location to place solution on root Makefile",
value = "path"
- }
-
- newoption {
+}
+
+newoption {
trigger = "execute-binary",
description = "(Optional) If true binaries used in build will be executed (disable on cross compilation)",
value = "bool",
default = "true",
allowed = { { "true", "True"}, { "false", "False" } }
- }
-
- newoption {
+}
+
+newoption {
trigger = "build-glslang",
description = "(Optional) If true glslang and spirv-opt will be built",
value = "bool",
default = "false",
allowed = { { "true", "True"}, { "false", "False" } }
- }
-
- newoption {
+}
+
+newoption {
trigger = "enable-cuda",
description = "(Optional) If true will enable cuda tests, if CUDA is found via CUDA_PATH",
value = "bool",
default = "false",
allowed = { { "true", "True"}, { "false", "False" } }
- }
-
- newoption {
+}
+
+newoption {
trigger = "enable-nvapi",
description = "(Optional) If true will enable NVAPI, if NVAPI is found via external/nvapi",
value = "bool",
default = "false",
allowed = { { "true", "True"}, { "false", "False" } }
- }
-
- newoption {
+}
+
+newoption {
trigger = "cuda-sdk-path",
description = "(Optional) Path to the root of CUDA SDK. If set will enable CUDA in build (ie in effect sets enable-cuda=true too)",
value = "path"
- }
-
- newoption {
+}
+
+newoption {
trigger = "enable-optix",
description = "(Optional) If true will enable OptiX build/ tests (also implicitly enables CUDA)",
value = "bool",
default = "false",
allowed = { { "true", "True"}, { "false", "False" } }
- }
-
- newoption {
+}
+
+newoption {
trigger = "optix-sdk-path",
description = "(Optional) Path to the root of OptiX SDK. (Implicitly enabled OptiX and CUDA)",
value = "path"
- }
-
- newoption {
+}
+
+newoption {
trigger = "enable-profile",
description = "(Optional) If true will enable slang-profile tool - suitable for gprof usage on linux",
value = "bool",
default = "false",
allowed = { { "true", "True"}, { "false", "False" } }
- }
-
- newoption {
+}
+
+newoption {
trigger = "enable-embed-stdlib",
description = "(Optional) If true build slang with an embedded version of the stdlib",
value = "bool",
default = "false",
allowed = { { "true", "True"}, { "false", "False" } }
- }
-
- newoption {
- trigger = "enable-xlib",
- description = "(Optional) If true build `gfx` and `platform` with xlib to support windowed apps on linux.",
- value = "bool",
- default = "true",
- allowed = { { "true", "True"}, { "false", "False" } }
- }
-
- newoption {
+}
+
+newoption {
+ trigger = "enable-xlib",
+ description = "(Optional) If true build `gfx` and `platform` with xlib to support windowed apps on linux.",
+ value = "bool",
+ default = "true",
+ allowed = { { "true", "True"}, { "false", "False" } }
+}
+
+newoption {
trigger = "enable-experimental-projects",
description = "(Optional) If true include experimental projects in build.",
value = "bool",
default = "false",
allowed = { { "true", "True"}, { "false", "False" } }
- }
+}
- newoption {
+newoption {
trigger = "disable-stdlib-source",
description = "(Optional) If true stdlib source will not be included in binary.",
value = "bool",
allowed = { { "true", "True"}, { "false", "False" } }
- }
+}
- newoption {
+newoption {
trigger = "skip-source-generation",
description = "(Optional) If true will skip source generation steps.",
value = "bool",
default = "false",
allowed = { { "true", "True"}, { "false", "False" } }
- }
+}
- newoption {
+newoption {
trigger = "deploy-slang-llvm",
description = "(Optional) If true will copy slang-llvm to output directory.",
value = "bool",
default = "true",
allowed = { { "true", "True"}, { "false", "False" } }
- }
- newoption {
+}
+
+newoption {
trigger = "deploy-slang-glslang",
description = "(Optional) If true will copy slang-glslang to output directory.",
value = "bool",
default = "true",
allowed = { { "true", "True"}, { "false", "False" } }
- }
- newoption {
+}
+
+newoption {
trigger = "full-debug-validation",
description = "(Optional) If true will enable full IR validation in debug build. (SLOW!)",
value = "bool",
default = "false",
allowed = { { "true", "True"}, { "false", "False" } }
- }
-
- buildLocation = _OPTIONS["build-location"]
- executeBinary = (_OPTIONS["execute-binary"] == "true")
- buildGlslang = (_OPTIONS["build-glslang"] == "true")
- enableCuda = not not (_OPTIONS["enable-cuda"] == "true" or _OPTIONS["cuda-sdk-path"])
- enableProfile = (_OPTIONS["enable-profile"] == "true")
- optixPath = _OPTIONS["optix-sdk-path"]
- enableOptix = not not (_OPTIONS["enable-optix"] == "true" or optixPath)
- enableProfile = (_OPTIONS["enable-profile"] == "true")
- enableEmbedStdLib = (_OPTIONS["enable-embed-stdlib"] == "true")
- enableXlib = (_OPTIONS["enable-xlib"] == "true")
- skipSourceGeneration = (_OPTIONS["skip-source-generation"] == "true")
- deployLLVM = (_OPTIONS["deploy-slang-llvm"] == "true")
- deployGLSLang = (_OPTIONS["deploy-slang-glslang"] == "true")
- fullDebugValidation = (_OPTIONS["full-debug-validation"] == "true")
-
- -- If stdlib embedding is enabled, disable stdlib source embedding by default
- disableStdlibSource = enableEmbedStdLib
-
- -- If embedding is enabled, and the setting `disable-stdlib-source` setting is set, use it's value
- if enableEmbedStdLib and _OPTIONS["disable-stdlib-source"] ~= nil then
+}
+
+buildLocation = _OPTIONS["build-location"]
+executeBinary = (_OPTIONS["execute-binary"] == "true")
+buildGlslang = (_OPTIONS["build-glslang"] == "true")
+enableCuda = not not (_OPTIONS["enable-cuda"] == "true" or _OPTIONS["cuda-sdk-path"])
+enableProfile = (_OPTIONS["enable-profile"] == "true")
+optixPath = _OPTIONS["optix-sdk-path"]
+enableOptix = not not (_OPTIONS["enable-optix"] == "true" or optixPath)
+enableProfile = (_OPTIONS["enable-profile"] == "true")
+enableEmbedStdLib = (_OPTIONS["enable-embed-stdlib"] == "true")
+enableXlib = (_OPTIONS["enable-xlib"] == "true")
+skipSourceGeneration = (_OPTIONS["skip-source-generation"] == "true")
+deployLLVM = (_OPTIONS["deploy-slang-llvm"] == "true")
+deployGLSLang = (_OPTIONS["deploy-slang-glslang"] == "true")
+fullDebugValidation = (_OPTIONS["full-debug-validation"] == "true")
+
+-- If stdlib embedding is enabled, disable stdlib source embedding by default
+disableStdlibSource = enableEmbedStdLib
+
+-- If embedding is enabled, and the setting `disable-stdlib-source` setting is set, use it's value
+if enableEmbedStdLib and _OPTIONS["disable-stdlib-source"] ~= nil then
disableStdlibSource = (_OPTIONS["disable-stdlib-source"] == "true")
- end
-
- -- Determine the target info
-
- targetInfo = slangUtil.getTargetInfo()
-
- --
- -- Update the dependencies for the target
- --
-
- deps:update(targetInfo.name)
-
- -- Get the target name that can be used as paths that generate for different configurations (ie contains premake Tokens)
-
- targetName = targetInfo.tokenName
-
- -- This is the path where nvapi is expected to be found
-
- nvapiPath = "external/nvapi"
-
- if enableOptix then
- optixPath = optixPath or "C:/ProgramData/NVIDIA Corporation/OptiX SDK 7.0.0/"
- enableCuda = true
- end
-
- -- cudaPath is only set if cuda is enabled, and CUDA_PATH enviromental variable is set
- cudaPath = nil
- if enableCuda then
- -- Get the CUDA path. Use the value set on cuda-sdk-path by default, if not set use the environment variable.
- cudaPath = (_OPTIONS["cuda-sdk-path"] or os.getenv("CUDA_PATH"))
- end
-
- -- TODO(JS): What's the point in the enable-xlib command line option if it's just overridden here?
-
- if targetInfo.isWindows or os.target() == "macosx" then
- enableXlib = false
- end
-
- -- Even if we have the nvapi path, we only want to currently enable on windows targets
-
- enableNvapi = not not (os.isdir(nvapiPath) and targetInfo.isWindows and _OPTIONS["enable-nvapi"] == "true")
-
- if enableNvapi then
- printf("Enabled NVAPI")
- end
-
- overrideModule = {}
- local overrideModulePath = _OPTIONS["override-module"]
- if overrideModulePath then
- overrideModule = require(overrideModulePath)
- end
-
-
- -- This is needed for gcc, for the 'fileno' functions on cygwin
- -- _GNU_SOURCE makes realpath available in gcc
- if targetInfo.os == "cygwin" then
- buildoptions { "-D_POSIX_SOURCE" }
- filter { "toolset:gcc*" }
- buildoptions { "-D_GNU_SOURCE" }
- end
-
- function getPlatforms(targetInfo)
+end
+
+-- Determine the target info
+
+targetInfo = slangUtil.getTargetInfo()
+
+--
+-- Update the dependencies for the target
+--
+
+deps:update(targetInfo.name)
+
+-- Get the target name that can be used as paths that generate for different configurations (ie contains premake Tokens)
+
+targetName = targetInfo.tokenName
+
+-- This is the path where nvapi is expected to be found
+
+nvapiPath = "external/nvapi"
+
+if enableOptix then
+ optixPath = optixPath or "C:/ProgramData/NVIDIA Corporation/OptiX SDK 7.0.0/"
+ enableCuda = true
+end
+
+-- cudaPath is only set if cuda is enabled, and CUDA_PATH enviromental variable is set
+cudaPath = nil
+if enableCuda then
+ -- Get the CUDA path. Use the value set on cuda-sdk-path by default, if not set use the environment variable.
+ cudaPath = (_OPTIONS["cuda-sdk-path"] or os.getenv("CUDA_PATH"))
+end
+
+-- TODO(JS): What's the point in the enable-xlib command line option if it's just overridden here?
+
+if targetInfo.isWindows or os.target() == "macosx" then
+ enableXlib = false
+end
+
+-- Even if we have the nvapi path, we only want to currently enable on windows targets
+
+enableNvapi = not not (os.isdir(nvapiPath) and targetInfo.isWindows and _OPTIONS["enable-nvapi"] == "true")
+
+if enableNvapi then
+ printf("Enabled NVAPI")
+end
+
+overrideModule = {}
+local overrideModulePath = _OPTIONS["override-module"]
+if overrideModulePath then
+ overrideModule = require(overrideModulePath)
+end
+
+
+-- This is needed for gcc, for the 'fileno' functions on cygwin
+-- _GNU_SOURCE makes realpath available in gcc
+if targetInfo.os == "cygwin" then
+ buildoptions { "-D_POSIX_SOURCE" }
+ filter { "toolset:gcc*" }
+ buildoptions { "-D_GNU_SOURCE" }
+end
+
+function getPlatforms(targetInfo)
return { "x86", "x64", "aarch64" }
- end
-
- workspace "slang"
- -- We will support debug/release configuration and x86/x64 builds.
- configurations { "Debug", "Release" }
- platforms(getPlatforms(targetInfo))
-
- if buildLocation then
- location(buildLocation)
- end
-
- flags "MultiProcessorCompile"
-
- --
- -- Make slang-test the startup project.
- --
- -- https://premake.github.io/docs/startproject
- startproject "slang-test"
-
- -- The output binary directory will be derived from the OS
- -- and configuration options, e.g. `bin/windows-x64/debug/`
- targetdir("bin/" .. targetName .. "/%{cfg.buildcfg:lower()}")
-
- -- C++11
- cppdialect "C++11"
- -- Statically link to the C/C++ runtime rather than create a DLL dependency.
- staticruntime "On"
- -- Turn off edit and continue for all projects. This is needed to avoid
- -- linking warnings.
- editandcontinue "Off"
-
- -- Once we've set up the common settings, we will make some tweaks
- -- that only apply in a subset of cases. Each call to `filter()`
- -- changes the "active" filter for subsequent commands. In
- -- effect, those commands iwll be ignored when the conditions of
- -- the filter aren't satisfied.
-
- -- Our `x64` platform should (obviously) target the x64
- -- architecture and similarly for x86.
- --
- -- https://premake.github.io/docs/architecture/
- --
- filter { "platforms:x64" }
- architecture "x64"
- filter { "platforms:x86" }
- architecture "x86"
- filter { "platforms:aarch64" }
- architecture "ARM64"
- filter { "platforms:aarch64", "toolset:clang" }
- buildoptions { "-arch arm64" }
- linkoptions { "-arch arm64" }
-
- filter { "toolset:clang or gcc*" }
- -- Makes all symbols hidden by default unless explicitly 'exported'
- buildoptions { "-fvisibility=hidden" }
- -- Warnings
- buildoptions { "-Wno-unused-but-set-variable", "-Wno-unused-parameter", "-Wno-type-limits", "-Wno-sign-compare", "-Wno-unused-variable", "-Wno-switch", "-Wno-return-type", "-Wno-unused-local-typedefs", "-Wno-parentheses" }
- filter { "toolset:clang or gcc*", "language:C++" }
- buildoptions { "-Wno-reorder", "-Wno-class-memaccess"}
-
- filter { "toolset:gcc*" }
- buildoptions { "-Wno-implicit-fallthrough", "-Wno-maybe-uninitialized" }
-
-
- filter { "toolset:clang" }
- buildoptions { "-Wno-deprecated-register", "-Wno-tautological-compare", "-Wno-missing-braces", "-Wno-undefined-var-template", "-Wno-unused-function", "-Wno-return-std-move", "-Wno-ignored-optimization-argument", "-Wno-unknown-warning-option" }
-
- -- When compiling the debug configuration, we want to turn
- -- optimization off, make sure debug symbols are output,
- -- and add the same preprocessor definition that VS
- -- would add by default.
- filter { "configurations:debug" }
- optimize "Off"
- symbols "On"
- defines { "_DEBUG" }
- -- staticruntime "Off"
- -- For the release configuration we will turn optimizations on
- -- (we do not yet micro-manage the optimization settings)
- -- and set the preprocessor definition that VS would add by default.
- filter { "configurations:release" }
- optimize "On"
- defines { "NDEBUG" }
-
- filter { "system:linux" }
- links { "dl" }
- --
- -- `--no-undefined` - by default if a symbol is not found in a link it will assume it will be resolved at runtime (!)
- -- this option ensures that all the referenced symbols exist
- --
- linkoptions{ "-Wl,-rpath,'$$ORIGIN',--no-as-needed,--no-undefined" }
- -- allow libraries to be listed in any order (do not require dependency order)
- linkgroups "On"
-
- function dump(o)
- if type(o) == 'table' then
- local s = '{ '
- for k,v in pairs(o) do
- if type(k) ~= 'number' then k = '"'..k..'"' end
- s = s .. '['..k..'] = ' .. dump(v) .. ','
- end
- return s .. '} '
- else
- return tostring(o)
- end
- end
-
- function dumpTable(o)
- local s = '{ '
- for k,v in pairs(o) do
- if type(k) ~= 'number' then k = '"'..k..'"' end
- s = s .. '['..k..'] = ' .. tostring(v) .. ',\n'
- end
- return s .. '} '
- end
-
- function getExecutableSuffix()
- if(os.target() == "windows") then
- return ".exe"
- end
- return ""
- end
- --
- -- We are now going to start defining the projects, where
- -- each project builds some binary artifact (an executable,
- -- library, etc.).
- --
- -- All of our projects follow a common structure, so rather
- -- than reiterate a bunch of build settings, we define
- -- some subroutines that make the configuration as concise
- -- as possible.
- --
- -- First, we will define a helper routine for adding all
- -- the relevant files from a given directory path:
- --
- -- Note that this does not work recursively
- -- so projects that spread their source over multiple
- -- directories will need to take more steps.
- function addSourceDir(path)
- files
- {
- path .. "/*.cpp", -- C++ source files
- path .. "/*.slang", -- Slang files (for our stdlib)
- path .. "/*.h", -- Header files
- path .. "/*.hpp", -- C++ style headers (for glslang)
- path .. "/*.natvis", -- Visual Studio debugger visualization files
- }
- removefiles
- {
- "**/*.meta.slang.h",
- "**/slang-*generated*.h",
- "**/gfx-unit-test/test-tmp*"
- }
- end
-
- -- Adds CUDA dependency to a project
- function addCUDAIfEnabled()
- if type(cudaPath) == "string" and targetInfo.isWindows then
- filter {}
- includedirs { cudaPath .. "/include" }
- includedirs { cudaPath .. "/include", cudaPath .. "/common/inc" }
- links { "cuda", "cudart" }
- if optixPath then
- defines { "RENDER_TEST_OPTIX" }
- includedirs { optixPath .. "include/" }
- end
-
- filter { "platforms:x86" }
- libdirs { cudaPath .. "/lib/Win32/" }
-
- filter { "platforms:x64" }
- libdirs { cudaPath .. "/lib/x64/" }
- filter {}
- return true
- elseif enableCuda then
- filter {}
- if type(cudaPath) == "string" then
- includedirs { cudaPath .. "/include" }
- includedirs { cudaPath .. "/include" }
- if optixPath then
- defines { "GFX_OPTIX" }
- includedirs { optixPath .. "include/" }
- end
- filter { "platforms:x86" }
- libdirs { cudaPath .. "/lib32/" }
- filter { "platforms:x64" }
- libdirs { cudaPath .. "/lib64/" }
- filter {}
- links { "cuda", "cudart" }
- else
- print "Error: CUDA is enabled but --cuda-sdk-path is not specified."
- end
- return true
- end
- return false
- end
-
- --
- -- Next we will define a helper routine that all of our
- -- projects will bottleneck through. Here `name` is
- -- the name for the project (and the base name for
- -- whatever output file it produces), while `sourceDir`
- -- is the directory that holds the source.
- --
- -- E.g., for the `slangc` project, the source code
- -- is nested in `source/`, so we'd (indirectly) call:
- --
- -- baseSlangProject("slangc", "source/slangc")
- --
- -- NOTE! This function will add any source from the sourceDir, *if* it's specified.
- -- Pass nil if adding files is not wanted.
- function baseSlangProject(name, sourceDir)
-
- -- Start a new project in premake. This switches
- -- the "current" project over to the newly created
- -- one, so that subsequent commands affect this project.
- --
- project(name)
-
- -- We need every project to have a stable UUID for
- -- output formats (like Visual Studio and XCode projects)
- -- that use UUIDs rather than names to uniquely identify
- -- projects. If we don't have a stable UUID, then the
- -- output files might have spurious diffs whenever we
- -- re-run premake generation.
-
- if sourceDir then
- uuid(os.uuid(name .. '|' .. sourceDir))
- else
- -- If we don't have a sourceDir, the name will have to be enough
- uuid(os.uuid(name))
- end
-
- -- Location could do with a better name than 'other' - but it seems as if %{cfg.buildcfg:lower()} and similar variables
- -- is not available for location to expand.
- location("build/" .. slangUtil.getBuildLocationName(targetInfo) .. "/" .. name)
-
-
- -- The intermediate ("object") directory will use a similar
- -- naming scheme to the output directory, but will also use
- -- the project name to avoid cases where multiple projects
- -- have source files with the same name.
- --
- objdir("intermediate/" .. targetName .. "/%{cfg.buildcfg:lower()}/%{prj.name}")
-
- -- Treat C++ as the default language, projects in other languages can
- -- override this later
- --
- language "C++"
-
- -- By default, Premake generates VS project files that
- -- reflect the directory structure of the source code.
- -- While this is nice in principle, it creates messy
- -- results in practice for our projects.
- --
- -- Instead, we will use the `vpaths` feature to imitate
- -- the default VS behavior of grouping files into
- -- virtual subdirectories (VS calls them "filters") for
- -- header and source files respectively.
- --
- -- Note: We are setting `vpaths` using a list of key/value
- -- tables instead of just a key/value table, since this
- -- appears to be an (undocumented) way to fix the order
- -- in which the filters are tested. Otherwise we have
- -- issues where premake will nondeterministically decide
- -- the check something against the `**.cpp` filter first,
- -- and decide that a `foo.cpp.h` file should go into
- -- the `"Source Files"` vpath. That behavior seems buggy,
- -- but at least we appear to have a workaround.
- --
- vpaths {
+end
+
+workspace "slang"
+ -- We will support debug/release configuration and x86/x64 builds.
+ configurations { "Debug", "Release" }
+ platforms(getPlatforms(targetInfo))
+
+ if buildLocation then
+ location(buildLocation)
+ end
+
+ flags "MultiProcessorCompile"
+
+ --
+ -- Make slang-test the startup project.
+ --
+ -- https://premake.github.io/docs/startproject
+ startproject "slang-test"
+
+ -- The output binary directory will be derived from the OS
+ -- and configuration options, e.g. `bin/windows-x64/debug/`
+ targetdir("bin/" .. targetName .. "/%{cfg.buildcfg:lower()}")
+
+ -- C++11
+ cppdialect "C++11"
+ -- Statically link to the C/C++ runtime rather than create a DLL dependency.
+ staticruntime "On"
+ -- Turn off edit and continue for all projects. This is needed to avoid
+ -- linking warnings.
+ editandcontinue "Off"
+
+ -- Once we've set up the common settings, we will make some tweaks
+ -- that only apply in a subset of cases. Each call to `filter()`
+ -- changes the "active" filter for subsequent commands. In
+ -- effect, those commands iwll be ignored when the conditions of
+ -- the filter aren't satisfied.
+
+ -- Our `x64` platform should (obviously) target the x64
+ -- architecture and similarly for x86.
+ --
+ -- https://premake.github.io/docs/architecture/
+ --
+ filter { "platforms:x64" }
+ architecture "x64"
+ filter { "platforms:x86" }
+ architecture "x86"
+ filter { "platforms:aarch64" }
+ architecture "ARM64"
+ filter { "platforms:aarch64", "toolset:clang" }
+ buildoptions { "-arch arm64" }
+ linkoptions { "-arch arm64" }
+
+ filter { "toolset:clang or gcc*" }
+ -- Makes all symbols hidden by default unless explicitly 'exported'
+ buildoptions { "-fvisibility=hidden" }
+ -- Warnings
+ buildoptions { "-Wno-unused-but-set-variable", "-Wno-unused-parameter", "-Wno-type-limits", "-Wno-sign-compare", "-Wno-unused-variable", "-Wno-switch", "-Wno-return-type", "-Wno-unused-local-typedefs", "-Wno-parentheses" }
+ filter { "toolset:clang or gcc*", "language:C++" }
+ buildoptions { "-Wno-reorder", "-Wno-class-memaccess"}
+
+ filter { "toolset:gcc*" }
+ buildoptions { "-Wno-implicit-fallthrough", "-Wno-maybe-uninitialized" }
+
+
+ filter { "toolset:clang" }
+ buildoptions { "-Wno-deprecated-register", "-Wno-tautological-compare", "-Wno-missing-braces", "-Wno-undefined-var-template", "-Wno-unused-function", "-Wno-return-std-move", "-Wno-ignored-optimization-argument", "-Wno-unknown-warning-option" }
+
+ -- When compiling the debug configuration, we want to turn
+ -- optimization off, make sure debug symbols are output,
+ -- and add the same preprocessor definition that VS
+ -- would add by default.
+ filter { "configurations:debug" }
+ optimize "Off"
+ symbols "On"
+ defines { "_DEBUG" }
+ -- staticruntime "Off"
+ -- For the release configuration we will turn optimizations on
+ -- (we do not yet micro-manage the optimization settings)
+ -- and set the preprocessor definition that VS would add by default.
+ filter { "configurations:release" }
+ optimize "On"
+ defines { "NDEBUG" }
+
+ filter { "system:linux" }
+ links { "dl" }
+ --
+ -- `--no-undefined` - by default if a symbol is not found in a link it will assume it will be resolved at runtime (!)
+ -- this option ensures that all the referenced symbols exist
+ --
+ linkoptions{ "-Wl,-rpath,'$$ORIGIN',--no-as-needed,--no-undefined" }
+ -- allow libraries to be listed in any order (do not require dependency order)
+ linkgroups "On"
+
+function dump(o)
+ if type(o) == 'table' then
+ local s = '{ '
+ for k,v in pairs(o) do
+ if type(k) ~= 'number' then k = '"'..k..'"' end
+ s = s .. '['..k..'] = ' .. dump(v) .. ','
+ end
+ return s .. '} '
+ else
+ return tostring(o)
+ end
+end
+
+function dumpTable(o)
+ local s = '{ '
+ for k,v in pairs(o) do
+ if type(k) ~= 'number' then k = '"'..k..'"' end
+ s = s .. '['..k..'] = ' .. tostring(v) .. ',\n'
+ end
+ return s .. '} '
+end
+
+function getExecutableSuffix()
+ if(os.target() == "windows") then
+ return ".exe"
+ end
+ return ""
+end
+--
+-- We are now going to start defining the projects, where
+-- each project builds some binary artifact (an executable,
+-- library, etc.).
+--
+-- All of our projects follow a common structure, so rather
+-- than reiterate a bunch of build settings, we define
+-- some subroutines that make the configuration as concise
+-- as possible.
+--
+-- First, we will define a helper routine for adding all
+-- the relevant files from a given directory path:
+--
+-- Note that this does not work recursively
+-- so projects that spread their source over multiple
+-- directories will need to take more steps.
+function addSourceDir(path)
+ files
+ {
+ path .. "/*.cpp", -- C++ source files
+ path .. "/*.slang", -- Slang files (for our stdlib)
+ path .. "/*.h", -- Header files
+ path .. "/*.hpp", -- C++ style headers (for glslang)
+ path .. "/*.natvis", -- Visual Studio debugger visualization files
+ }
+ removefiles
+ {
+ "**/*.meta.slang.h",
+ "**/slang-*generated*.h",
+ "**/gfx-unit-test/test-tmp*"
+ }
+end
+
+-- Adds CUDA dependency to a project
+function addCUDAIfEnabled()
+ if type(cudaPath) == "string" and targetInfo.isWindows then
+ filter {}
+ includedirs { cudaPath .. "/include" }
+ includedirs { cudaPath .. "/include", cudaPath .. "/common/inc" }
+ links { "cuda", "cudart" }
+ if optixPath then
+ defines { "RENDER_TEST_OPTIX" }
+ includedirs { optixPath .. "include/" }
+ end
+
+ filter { "platforms:x86" }
+ libdirs { cudaPath .. "/lib/Win32/" }
+
+ filter { "platforms:x64" }
+ libdirs { cudaPath .. "/lib/x64/" }
+ filter {}
+ return true
+ elseif enableCuda then
+ filter {}
+ if type(cudaPath) == "string" then
+ includedirs { cudaPath .. "/include" }
+ includedirs { cudaPath .. "/include" }
+ if optixPath then
+ defines { "GFX_OPTIX" }
+ includedirs { optixPath .. "include/" }
+ end
+ filter { "platforms:x86" }
+ libdirs { cudaPath .. "/lib32/" }
+ filter { "platforms:x64" }
+ libdirs { cudaPath .. "/lib64/" }
+ filter {}
+ links { "cuda", "cudart" }
+ else
+ print "Error: CUDA is enabled but --cuda-sdk-path is not specified."
+ end
+ return true
+ end
+ return false
+end
+
+--
+-- Next we will define a helper routine that all of our
+-- projects will bottleneck through. Here `name` is
+-- the name for the project (and the base name for
+-- whatever output file it produces), while `sourceDir`
+-- is the directory that holds the source.
+--
+-- E.g., for the `slangc` project, the source code
+-- is nested in `source/`, so we'd (indirectly) call:
+--
+-- baseSlangProject("slangc", "source/slangc")
+--
+-- NOTE! This function will add any source from the sourceDir, *if* it's specified.
+-- Pass nil if adding files is not wanted.
+function baseSlangProject(name, sourceDir)
+
+ -- Start a new project in premake. This switches
+ -- the "current" project over to the newly created
+ -- one, so that subsequent commands affect this project.
+ --
+ project(name)
+
+ -- We need every project to have a stable UUID for
+ -- output formats (like Visual Studio and XCode projects)
+ -- that use UUIDs rather than names to uniquely identify
+ -- projects. If we don't have a stable UUID, then the
+ -- output files might have spurious diffs whenever we
+ -- re-run premake generation.
+
+ if sourceDir then
+ uuid(os.uuid(name .. '|' .. sourceDir))
+ else
+ -- If we don't have a sourceDir, the name will have to be enough
+ uuid(os.uuid(name))
+ end
+
+ -- Location could do with a better name than 'other' - but it seems as if %{cfg.buildcfg:lower()} and similar variables
+ -- is not available for location to expand.
+ location("build/" .. slangUtil.getBuildLocationName(targetInfo) .. "/" .. name)
+
+
+ -- The intermediate ("object") directory will use a similar
+ -- naming scheme to the output directory, but will also use
+ -- the project name to avoid cases where multiple projects
+ -- have source files with the same name.
+ --
+ objdir("intermediate/" .. targetName .. "/%{cfg.buildcfg:lower()}/%{prj.name}")
+
+ -- Treat C++ as the default language, projects in other languages can
+ -- override this later
+ --
+ language "C++"
+
+ -- By default, Premake generates VS project files that
+ -- reflect the directory structure of the source code.
+ -- While this is nice in principle, it creates messy
+ -- results in practice for our projects.
+ --
+ -- Instead, we will use the `vpaths` feature to imitate
+ -- the default VS behavior of grouping files into
+ -- virtual subdirectories (VS calls them "filters") for
+ -- header and source files respectively.
+ --
+ -- Note: We are setting `vpaths` using a list of key/value
+ -- tables instead of just a key/value table, since this
+ -- appears to be an (undocumented) way to fix the order
+ -- in which the filters are tested. Otherwise we have
+ -- issues where premake will nondeterministically decide
+ -- the check something against the `**.cpp` filter first,
+ -- and decide that a `foo.cpp.h` file should go into
+ -- the `"Source Files"` vpath. That behavior seems buggy,
+ -- but at least we appear to have a workaround.
+ --
+ vpaths {
{ ["Header Files"] = { "**.h", "**.hpp"} },
{ ["Source Files"] = { "**.cpp", "**.slang", "**.natvis" } },
- }
-
- -- Override default options for a project if necessary
-
- if overrideModule.addBaseProjectOptions then
- overrideModule.addBaseProjectOptions()
- end
-
- --
- -- Add the files in the sourceDir
- -- NOTE! This doesn't recursively add files in subdirectories
- --
-
- if not not sourceDir then
- addSourceDir(sourceDir)
- end
- end
-
-
- -- We can now use the `baseSlangProject()` subroutine to
- -- define helpers for the different categories of project
- -- in our source tree.
- --
- -- For example, the Slang project has several tools that
- -- are used during building/testing, but don't need to
- -- be distributed. These always have their source code in
- -- `tools/<project-name>/`.
- --
- function tool(name)
- -- We use the `group` command here to specify that the
- -- next project we create shold be placed into a group
- -- named "tools" in a generated IDE solution/workspace.
- --
- -- This is used in the generated Visual Studio solution
- -- to group all the tools projects together in a logical
- -- sub-directory of the solution.
- --
- group "tools"
-
- -- Now we invoke our shared project configuration logic,
- -- specifying that the project lives under the `tools/` path.
- --
- baseSlangProject(name, "tools/" .. name)
-
- -- Finally, we set the project "kind" to produce a console
- -- application. This is a reasonable default for tools,
- -- and it can be overriden because Premake is stateful,
- -- and a subsequent call to `kind()` would overwrite this
- -- default.
- --
- kind "ConsoleApp"
- end
-
- -- "Standard" projects will be those that go to make the binary
- -- packages for slang: the shared libraries and executables.
- --
- function standardProject(name, sourceDir)
- -- Because Premake is stateful, any `group()` call by another
- -- project would still be in effect when we create a project
- -- here (e.g., if somebody had called `tool()` before
- -- `standardProject()`), so we are careful here to set the
- -- group to an emptry string, which Premake treats as "no group."
- --
- group ""
-
- baseSlangProject(name, sourceDir)
- end
-
-
- function toolSharedLibrary(name)
- group "test-tool"
- -- specifying that the project lives under the `tools/` path.
- --
- baseSlangProject(name .. "-tool", "tools/" .. name)
-
- defines { "SLANG_SHARED_LIBRARY_TOOL" }
-
- kind "SharedLib"
- end
-
- function exampleLibrary(name)
- group "examples"
- baseSlangProject(name, "examples/"..name)
- kind "StaticLib"
- includedirs { ".", "tools" }
- links { "gfx", "slang", "platform", "gfx-util", "core"}
- addCUDAIfEnabled();
- end
-
- exampleLibrary "example-base"
-
- -- Finally we have the example programs that show how to use Slang.
- --
- function example(name)
- -- Example programs go into an "example" group
- group "examples"
-
- -- They have their source code under `examples/<project-name>/`
- baseSlangProject(name, "examples/" .. name)
-
- -- Set up working directory to be the source directory
- debugdir("examples/" .. name)
-
- -- By default, all of our examples are GUI applications. One some
- -- platforms there is no meaningful distinction between GUI and
- -- command-line applications, but it is significant on Windows and MacOS
- --
- kind "WindowedApp"
-
- -- Every example needs to be able to include the `slang.h` header
- -- if it is going to use Slang, so we might as well set up a suitable
- -- include path here rather than make each example do it.
- --
- -- Most of the examples also need the `gfx` library,
- -- which lives under `tools/`, so we will add that to the path as well.
- --
- includedirs { ".", "tools" }
-
- -- The examples also need to link against the slang library,
- -- and the `gfx` abstraction layer (which in turn
- -- depends on the `core` library). We specify all of that here,
- -- rather than in each example.
- links { "example-base", "slang", "gfx", "gfx-util", "platform", "core" }
-
- if targetInfo.isWindows then
- else
- if enableXlib then
- defines { "SLANG_ENABLE_XLIB" }
- libdirs { "/usr/X11/lib" }
- links {"X11"}
- end
- end
-
- addCUDAIfEnabled();
- end
-
- --
- -- Create a project that is used as a build step, typically to
- -- build items needed for other dependencies
- ---
-
- function generatorProject(name, sourcePath, isSharedLib)
- -- We use the `group` command here to specify that the
- -- next project we create shold be placed into a group
- -- named "generator" in a generated IDE solution/workspace.
- --
- -- This is used in the generated Visual Studio solution
- -- to group all the tools projects together in a logical
- -- sub-directory of the solution.
- --
- group "generator"
-
- -- Set up the project, but do NOT add any source files.
- baseSlangProject(name, sourcePath)
-
- -- By default, just use static lib to force something
- -- to build.
- if isSharedLib then
- kind "SharedLib"
- else
+ }
+
+ -- Override default options for a project if necessary
+
+ if overrideModule.addBaseProjectOptions then
+ overrideModule.addBaseProjectOptions()
+ end
+
+ --
+ -- Add the files in the sourceDir
+ -- NOTE! This doesn't recursively add files in subdirectories
+ --
+
+ if not not sourceDir then
+ addSourceDir(sourceDir)
+ end
+end
+
+
+-- We can now use the `baseSlangProject()` subroutine to
+-- define helpers for the different categories of project
+-- in our source tree.
+--
+-- For example, the Slang project has several tools that
+-- are used during building/testing, but don't need to
+-- be distributed. These always have their source code in
+-- `tools/<project-name>/`.
+--
+function tool(name)
+ -- We use the `group` command here to specify that the
+ -- next project we create shold be placed into a group
+ -- named "tools" in a generated IDE solution/workspace.
+ --
+ -- This is used in the generated Visual Studio solution
+ -- to group all the tools projects together in a logical
+ -- sub-directory of the solution.
+ --
+ group "tools"
+
+ -- Now we invoke our shared project configuration logic,
+ -- specifying that the project lives under the `tools/` path.
+ --
+ baseSlangProject(name, "tools/" .. name)
+
+ -- Finally, we set the project "kind" to produce a console
+ -- application. This is a reasonable default for tools,
+ -- and it can be overriden because Premake is stateful,
+ -- and a subsequent call to `kind()` would overwrite this
+ -- default.
+ --
+ kind "ConsoleApp"
+end
+
+-- "Standard" projects will be those that go to make the binary
+-- packages for slang: the shared libraries and executables.
+--
+function standardProject(name, sourceDir)
+ -- Because Premake is stateful, any `group()` call by another
+ -- project would still be in effect when we create a project
+ -- here (e.g., if somebody had called `tool()` before
+ -- `standardProject()`), so we are careful here to set the
+ -- group to an emptry string, which Premake treats as "no group."
+ --
+ group ""
+
+ baseSlangProject(name, sourceDir)
+end
+
+
+function toolSharedLibrary(name)
+ group "test-tool"
+ -- specifying that the project lives under the `tools/` path.
+ --
+ baseSlangProject(name .. "-tool", "tools/" .. name)
+
+ defines { "SLANG_SHARED_LIBRARY_TOOL" }
+
+ kind "SharedLib"
+end
+
+function exampleLibrary(name)
+ group "examples"
+ baseSlangProject(name, "examples/"..name)
+ kind "StaticLib"
+ includedirs { ".", "tools" }
+ links { "gfx", "slang", "platform", "gfx-util", "core"}
+ addCUDAIfEnabled();
+end
+
+exampleLibrary "example-base"
+
+-- Finally we have the example programs that show how to use Slang.
+--
+function example(name)
+ -- Example programs go into an "example" group
+ group "examples"
+
+ -- They have their source code under `examples/<project-name>/`
+ baseSlangProject(name, "examples/" .. name)
+
+ -- Set up working directory to be the source directory
+ debugdir("examples/" .. name)
+
+ -- By default, all of our examples are GUI applications. One some
+ -- platforms there is no meaningful distinction between GUI and
+ -- command-line applications, but it is significant on Windows and MacOS
+ --
+ kind "WindowedApp"
+
+ -- Every example needs to be able to include the `slang.h` header
+ -- if it is going to use Slang, so we might as well set up a suitable
+ -- include path here rather than make each example do it.
+ --
+ -- Most of the examples also need the `gfx` library,
+ -- which lives under `tools/`, so we will add that to the path as well.
+ --
+ includedirs { ".", "tools" }
+
+ -- The examples also need to link against the slang library,
+ -- and the `gfx` abstraction layer (which in turn
+ -- depends on the `core` library). We specify all of that here,
+ -- rather than in each example.
+ links { "example-base", "slang", "gfx", "gfx-util", "platform", "core" }
+
+ if targetInfo.isWindows then
+ else
+ if enableXlib then
+ defines { "SLANG_ENABLE_XLIB" }
+ libdirs { "/usr/X11/lib" }
+ links {"X11"}
+ end
+ end
+
+ addCUDAIfEnabled();
+end
+
+--
+-- Create a project that is used as a build step, typically to
+-- build items needed for other dependencies
+---
+
+function generatorProject(name, sourcePath, isSharedLib)
+ -- We use the `group` command here to specify that the
+ -- next project we create shold be placed into a group
+ -- named "generator" in a generated IDE solution/workspace.
+ --
+ -- This is used in the generated Visual Studio solution
+ -- to group all the tools projects together in a logical
+ -- sub-directory of the solution.
+ --
+ group "generator"
+
+ -- Set up the project, but do NOT add any source files.
+ baseSlangProject(name, sourcePath)
+
+ -- By default, just use static lib to force something
+ -- to build.
+ if isSharedLib then
+ kind "SharedLib"
+ else
kind "StaticLib"
end
- end
-
- --
- -- With all of these helper routines defined, we can now define the
- -- actual projects quite simply. For example, here is the entire
- -- declaration of the "Hello, World" example project:
- --
- example "hello-world"
- kind "ConsoleApp"
- includedirs {"external/vulkan/include"}
- --
- -- Note how we are calling our custom `example()` subroutine with
- -- the same syntax sugar that Premake usually advocates for their
- -- `project()` function. This allows us to treat `example` as
- -- a kind of specialized "subclass" of `project`
- --
-
- -- Let's go ahead and set up the projects for our other example now.
- example "triangle"
-
- example "ray-tracing"
- example "ray-tracing-pipeline"
-
- example "gpu-printing"
- kind "ConsoleApp"
-
- example "shader-toy"
-
- example "model-viewer"
-
- example "shader-object"
- kind "ConsoleApp"
-
- example "cpu-com-example"
- kind "ConsoleApp"
-
- example "cpu-hello-world"
- kind "ConsoleApp"
- if enableExperimental then
+end
+
+--
+-- With all of these helper routines defined, we can now define the
+-- actual projects quite simply. For example, here is the entire
+-- declaration of the "Hello, World" example project:
+--
+example "hello-world"
+ kind "ConsoleApp"
+ includedirs {"external/vulkan/include"}
+--
+-- Note how we are calling our custom `example()` subroutine with
+-- the same syntax sugar that Premake usually advocates for their
+-- `project()` function. This allows us to treat `example` as
+-- a kind of specialized "subclass" of `project`
+--
+
+-- Let's go ahead and set up the projects for our other example now.
+example "triangle"
+
+example "ray-tracing"
+example "ray-tracing-pipeline"
+
+example "gpu-printing"
+ kind "ConsoleApp"
+
+example "shader-toy"
+
+example "model-viewer"
+
+example "shader-object"
+ kind "ConsoleApp"
+
+example "cpu-com-example"
+ kind "ConsoleApp"
+
+example "cpu-hello-world"
+ kind "ConsoleApp"
+if enableExperimental then
project "heterogeneous-hello-world"
kind "ConsoleApp"
links "slangc"
@@ -761,57 +763,57 @@ newoption {
prebuildcommands {
"\"%{cfg.targetdir}/slangc\" \"%{wks.location:lower()}/examples/heterogeneous-hello-world/main.slang\" -o \"%{cfg.targetdir}/heterogeneous-hello-world.exe\""
}
- files {"examples/heterogeneous-hello-world/*.slang"}
-
- end
- -- Most of the other projects have more interesting configuration going
- -- on, so let's walk through them in order of increasing complexity.
- --
- -- The `core` project is a static library that has all the basic types
- -- and routines that get shared across both the Slang compiler/runtime
- -- and the various tool projects. It's build is pretty simple:
- --
-
- standardProject("core", "source/core")
- uuid "F9BE7957-8399-899E-0C49-E714FDDD4B65"
- kind "StaticLib"
- -- We need the core library to be relocatable to be able to link with slang.so
- pic "On"
-
- -- For our core implementation, we want to use the most
- -- aggressive warning level supported by the target, and
- -- to treat every warning as an error to make sure we
- -- keep our code free of warnings.
- --
- warnings "Extra"
-
- if targetInfo.isWindows then
- addSourceDir "source/core/windows"
- else
- addSourceDir "source/core/unix"
- end
-
- standardProject("compiler-core", "source/compiler-core")
- uuid "12C1E89D-F5D0-41D3-8E8D-FB3F358F8126"
- kind "StaticLib"
- -- We need the compiler-core library to be relocatable to be able to link with slang.so
- pic "On"
-
- links { "core" }
-
- -- For our core implementation, we want to use the most
- -- aggressive warning level supported by the target, and
- -- to treat every warning as an error to make sure we
- -- keep our code free of warnings.
- --
- warnings "Extra"
-
- if targetInfo.isWindows then
- addSourceDir "source/compiler-core/windows"
- else
- addSourceDir "source/compiler-core/unix"
- end
-
+ files {"examples/heterogeneous-hello-world/*.slang"}
+
+end
+-- Most of the other projects have more interesting configuration going
+-- on, so let's walk through them in order of increasing complexity.
+--
+-- The `core` project is a static library that has all the basic types
+-- and routines that get shared across both the Slang compiler/runtime
+-- and the various tool projects. It's build is pretty simple:
+--
+
+standardProject("core", "source/core")
+ uuid "F9BE7957-8399-899E-0C49-E714FDDD4B65"
+ kind "StaticLib"
+ -- We need the core library to be relocatable to be able to link with slang.so
+ pic "On"
+
+ -- For our core implementation, we want to use the most
+ -- aggressive warning level supported by the target, and
+ -- to treat every warning as an error to make sure we
+ -- keep our code free of warnings.
+ --
+ warnings "Extra"
+
+ if targetInfo.isWindows then
+ addSourceDir "source/core/windows"
+ else
+ addSourceDir "source/core/unix"
+ end
+
+standardProject("compiler-core", "source/compiler-core")
+ uuid "12C1E89D-F5D0-41D3-8E8D-FB3F358F8126"
+ kind "StaticLib"
+ -- We need the compiler-core library to be relocatable to be able to link with slang.so
+ pic "On"
+
+ links { "core" }
+
+ -- For our core implementation, we want to use the most
+ -- aggressive warning level supported by the target, and
+ -- to treat every warning as an error to make sure we
+ -- keep our code free of warnings.
+ --
+ warnings "Extra"
+
+ if targetInfo.isWindows then
+ addSourceDir "source/compiler-core/windows"
+ else
+ addSourceDir "source/compiler-core/unix"
+ end
+
standardProject("slang-rt", "source/slang-rt")
uuid "DFC79D72-91DE-434C-871B-B3943B488BEB"
kind "SharedLib"
@@ -826,801 +828,799 @@ standardProject("slang-rt", "source/slang-rt")
addSourceDir "source/core/unix"
end
- --
- -- The cpp extractor is a tool that scans C++ header files to extract
- -- reflection like information, and generate files to handle
- -- RTTI fast/simply
- ---
-
- tool "slang-cpp-extractor"
- uuid "CA8A30D1-8FA9-4330-B7F7-84709246D8DC"
- includedirs { "." }
-
- links { "compiler-core", "core" }
-
-
- tool "test-process"
- uuid "BE412850-4BB9-429A-877C-BFBC4B34186C"
- includedirs { "." }
-
- links { "compiler-core", "core" }
-
- tool "test-server"
- uuid "23149706-C12F-4329-B6AA-8266407C32D3"
- includedirs { "." }
-
- links { "compiler-core", "core", "slang" }
-
+--
+-- The cpp extractor is a tool that scans C++ header files to extract
+-- reflection like information, and generate files to handle
+-- RTTI fast/simply
+---
+
+tool "slang-cpp-extractor"
+ uuid "CA8A30D1-8FA9-4330-B7F7-84709246D8DC"
+ includedirs { "." }
+
+ links { "compiler-core", "core" }
+
+
+tool "test-process"
+ uuid "BE412850-4BB9-429A-877C-BFBC4B34186C"
+ includedirs { "." }
+
+ links { "compiler-core", "core" }
+
+tool "test-server"
+ uuid "23149706-C12F-4329-B6AA-8266407C32D3"
+ includedirs { "." }
+
+ links { "compiler-core", "core", "slang" }
+
tool "slangd"
- uuid "B2D63B45-92B0-40F7-B242-CCA4DFD64341"
- includedirs { "." }
- links { "compiler-core", "core", "slang" }
-
- --
- -- `slang-generate` is a tool we use for source code generation on
- -- the compiler. It depends on the `core` library, so we need to
- -- declare that:
- --
-
- tool "slang-generate"
- uuid "66174227-8541-41FC-A6DF-4764FC66F78E"
- links { "core" }
-
- tool "slang-embed"
- uuid "7F773DD9-EB8F-2403-B43C-B49C2014B99C"
- links { "core" }
-
- --
- -- The `slang-test` test driver also uses the `core` library, and it
- -- currently relies on include paths being set up so that it can find
- -- the core headers:
- --
-
- tool "slang-test"
- uuid "0C768A18-1D25-4000-9F37-DA5FE99E3B64"
- includedirs { "." }
- links { "compiler-core", "slang", "core", "miniz", "lz4" }
- dependson { "slang-reflection-test-tool", "render-test-tool", "slang-unit-test-tool", "gfx-unit-test-tool" }
- -- We want to set to the root of the project, but that doesn't seem to work with '.'.
- -- So set a path that resolves to the same place.
- debugdir("source/..")
+ uuid "B2D63B45-92B0-40F7-B242-CCA4DFD64341"
+ includedirs { "." }
+ links { "compiler-core", "core", "slang" }
+
+--
+-- `slang-generate` is a tool we use for source code generation on
+-- the compiler. It depends on the `core` library, so we need to
+-- declare that:
+--
+
+tool "slang-generate"
+ uuid "66174227-8541-41FC-A6DF-4764FC66F78E"
+ links { "core" }
+
+tool "slang-embed"
+ uuid "7F773DD9-EB8F-2403-B43C-B49C2014B99C"
+ links { "core" }
+
+--
+-- The `slang-test` test driver also uses the `core` library, and it
+-- currently relies on include paths being set up so that it can find
+-- the core headers:
+--
+
+tool "slang-test"
+ uuid "0C768A18-1D25-4000-9F37-DA5FE99E3B64"
+ includedirs { "." }
+ links { "compiler-core", "slang", "core", "miniz", "lz4" }
+ dependson { "slang-reflection-test-tool", "render-test-tool", "slang-unit-test-tool", "gfx-unit-test-tool" }
+ -- We want to set to the root of the project, but that doesn't seem to work with '.'.
+ -- So set a path that resolves to the same place.
+ debugdir("source/..")
if not targetInfo.isWindows then
links { "pthread" }
end
-
- --
- -- The reflection test harness `slang-reflection-test` is pretty
- -- simple, in that it only needs to link against the slang library
- -- to do its job:
- --
-
- toolSharedLibrary "slang-reflection-test"
- uuid "C5ACCA6E-C04D-4B36-8516-3752B3C13C2F"
-
- includedirs { "." }
-
- kind "SharedLib"
- links { "core", "slang" }
-
- --
- -- The most complex testing tool we have is `render-test`, but from
- -- a build perspective the most interesting thing about it is that for
- -- our Windows build it requires a Windows 10 SDK.
- --
- -- TODO: Try to make the build not require a fixed version of the Windows SDK.
- -- Ideally we should just specify a *minimum* version.
- --
- -- This test also requires Vulkan headers which we've placed in the
- -- `external/` directory, and it also includes files from the `core`
- -- library in ways that require us to set up `source/` as an include path.
- --
- -- TODO: Fix that requirement.
- --
-
- toolSharedLibrary "render-test"
- uuid "61F7EB00-7281-4BF3-9470-7C2EA92620C3"
-
- includedirs { ".", "external", "source", "tools/gfx", "tools/platform" }
- links { "core", "compiler-core", "slang", "gfx", "gfx-util", "platform" }
- if targetInfo.isWindows then
- addSourceDir "tools/render-test/windows"
-
- systemversion "latest"
-
- -- For Windows targets, we want to copy
- -- dxcompiler.dll, and dxil.dll from the Windows SDK redistributable
- -- directory into the output directory.
- -- d3dcompiler_47.dll is copied from the external/slang-binaries submodule.
- postbuildcommands { '"$(SolutionDir)tools\\copy-hlsl-libs.bat" "$(WindowsSdkDir)Redist/D3D/%{cfg.platform:lower()}/" "%{cfg.targetdir}/" "windows-%{cfg.platform:lower()}"'}
- if (type(cudaPath) == "string") then
- addSourceDir "tools/render-test/cuda"
- end
- end
- if addCUDAIfEnabled() then
- defines { "RENDER_TEST_CUDA" }
- end
-
- --
- -- `gfx` is a abstraction layer for different GPU platforms.
- --
-
- tool "gfx"
- uuid "222F7498-B40C-4F3F-A704-DDEB91A4484A"
- -- Unlike most of the code under `tools/`, this is a library
- -- rather than a stand-alone executable.
- kind "SharedLib"
- links { "core", "slang" }
- pic "On"
-
- defines { "SLANG_GFX_DYNAMIC", "SLANG_GFX_DYNAMIC_EXPORT" }
-
- includedirs { ".", "external", "source" }
-
- files {"slang-gfx.h"}
-
- -- Will compile across targets
- addSourceDir "tools/gfx/cpu"
- addSourceDir "tools/gfx/nvapi"
- addSourceDir "tools/gfx/cuda"
- addSourceDir "tools/gfx/debug-layer"
- if targetInfo.isWindows then
+
+--
+-- The reflection test harness `slang-reflection-test` is pretty
+-- simple, in that it only needs to link against the slang library
+-- to do its job:
+--
+
+toolSharedLibrary "slang-reflection-test"
+ uuid "C5ACCA6E-C04D-4B36-8516-3752B3C13C2F"
+
+ includedirs { "." }
+
+ kind "SharedLib"
+ links { "core", "slang" }
+
+--
+-- The most complex testing tool we have is `render-test`, but from
+-- a build perspective the most interesting thing about it is that for
+-- our Windows build it requires a Windows 10 SDK.
+--
+-- TODO: Try to make the build not require a fixed version of the Windows SDK.
+-- Ideally we should just specify a *minimum* version.
+--
+-- This test also requires Vulkan headers which we've placed in the
+-- `external/` directory, and it also includes files from the `core`
+-- library in ways that require us to set up `source/` as an include path.
+--
+-- TODO: Fix that requirement.
+--
+
+toolSharedLibrary "render-test"
+ uuid "61F7EB00-7281-4BF3-9470-7C2EA92620C3"
+
+ includedirs { ".", "external", "source", "tools/gfx", "tools/platform" }
+ links { "core", "compiler-core", "slang", "gfx", "gfx-util", "platform" }
+ if targetInfo.isWindows then
+ addSourceDir "tools/render-test/windows"
+
+ systemversion "latest"
+
+ -- For Windows targets, we want to copy
+ -- dxcompiler.dll, and dxil.dll from the Windows SDK redistributable
+ -- directory into the output directory.
+ -- d3dcompiler_47.dll is copied from the external/slang-binaries submodule.
+ postbuildcommands { '"$(SolutionDir)tools\\copy-hlsl-libs.bat" "$(WindowsSdkDir)Redist/D3D/%{cfg.platform:lower()}/" "%{cfg.targetdir}/" "windows-%{cfg.platform:lower()}"'}
+ if (type(cudaPath) == "string") then
+ addSourceDir "tools/render-test/cuda"
+ end
+ end
+ if addCUDAIfEnabled() then
+ defines { "RENDER_TEST_CUDA" }
+ end
+
+--
+-- `gfx` is a abstraction layer for different GPU platforms.
+--
+
+tool "gfx"
+ uuid "222F7498-B40C-4F3F-A704-DDEB91A4484A"
+ -- Unlike most of the code under `tools/`, this is a library
+ -- rather than a stand-alone executable.
+ kind "SharedLib"
+ links { "core", "slang" }
+ pic "On"
+
+ defines { "SLANG_GFX_DYNAMIC", "SLANG_GFX_DYNAMIC_EXPORT" }
+
+ includedirs { ".", "external", "source" }
+
+ files {"slang-gfx.h"}
+
+ -- Will compile across targets
+ addSourceDir "tools/gfx/cpu"
+ addSourceDir "tools/gfx/nvapi"
+ addSourceDir "tools/gfx/cuda"
+ addSourceDir "tools/gfx/debug-layer"
+ if targetInfo.isWindows then
postbuildcommands {
'{COPY} "$(SolutionDir)tools/gfx/gfx.slang" "%{cfg.targetdir}"',
'{COPY} "$(SolutionDir)tools/gfx/slang.slang" "%{cfg.targetdir}"'
}
- else
+ else
postbuildcommands {
'{COPY} "' .. path.getabsolute("tools/gfx/gfx.slang") .. '" "%{cfg.targetdir}"',
'{COPY} "' .. path.getabsolute("tools/gfx/slang.slang") .. '" "%{cfg.targetdir}"',
}
- end
- -- To special case that we may be building using cygwin on windows. If 'true windows' we build for dx12/vk and run the script
- -- If not we assume it's a cygwin/mingw type situation and remove files that aren't appropriate
- if targetInfo.isWindows then
- systemversion "latest"
-
- -- For Windows targets, we want to copy
- -- dxcompiler.dll, and dxil.dll from the Windows SDK redistributable
- -- directory into the output directory.
- -- d3dcompiler_47.dll is copied from the external/slang-binaries submodule.
- postbuildcommands { '"$(SolutionDir)tools\\copy-hlsl-libs.bat" "$(WindowsSdkDir)Redist/D3D/%{cfg.platform:lower()}/" "%{cfg.targetdir}/"'}
-
- addSourceDir "tools/gfx/vulkan"
- addSourceDir "tools/gfx/open-gl"
- addSourceDir "tools/gfx/d3d"
- addSourceDir "tools/gfx/d3d11"
- addSourceDir "tools/gfx/d3d12"
- flags { "FatalWarnings" }
- elseif targetInfo.os == "mingw" or targetInfo.os == "cygwin" then
- -- Don't support any render techs...
- elseif os.target() == "macosx" then
- --addSourceDir "tools/gfx/open-gl"
- else
- -- Linux like
- addSourceDir "tools/gfx/vulkan"
- --addSourceDir "tools/gfx/open-gl"
- end
-
- if enableXlib then
- defines { "SLANG_ENABLE_XLIB" }
- libdirs { "/usr/X11/lib" }
- links {"X11"}
- end
-
- -- If NVAPI is enabled
- if enableNvapi then
- -- Add the include path
- includedirs { nvapiPath }
-
- -- Add a define so that render-test code can check if nvapi is available
- defines { "GFX_NVAPI" }
-
- -- Set the nvapi libs directory
- filter { "platforms:x86" }
- libdirs { nvapiPath .. "/x86" }
- links { "nvapi" }
-
- filter { "platforms:x64" }
- libdirs { nvapiPath .. "/amd64" }
- links { "nvapi64" }
-
- end
- if addCUDAIfEnabled() then
- defines { "GFX_ENABLE_CUDA" }
- end
-
- --
- -- `gfx-util` is a static library containing utilities and helpers for using
- -- the `gfx` library.
- --
- tool "gfx-util"
- uuid "F5ADB74E-02A7-44FB-AA3B-FC02F8AC7A4B"
- kind "StaticLib"
- pic "On"
-
- includedirs { ".", "source" }
-
- addSourceDir "tools/gfx-util"
- --
- -- `platform` contains all the platform abstractions for a GUI application.
- --
- tool "platform"
- uuid "3565fe5e-4fa3-11eb-ae93-0242ac130002"
- kind "SharedLib"
- pic "On"
- links {"core", "slang", "gfx" }
- defines { "SLANG_PLATFORM_DYNAMIC", "SLANG_PLATFORM_DYNAMIC_EXPORT" }
- includedirs { ".", "external", "source", "external/imgui", "tools/gfx" }
- addSourceDir "tools/platform"
- addSourceDir "tools/platform/linux"
- addSourceDir "tools/platform/windows"
- addSourceDir "tools/platform/placeholder"
- -- Include windowing support on Windows.
- if targetInfo.isWindows then
- systemversion "latest"
- else
- if enableXlib then
- defines { "SLANG_ENABLE_XLIB" }
- libdirs { "/usr/X11/lib" }
- links {"X11"}
- end
- end
-
- --
- -- The `slangc` command-line application is just a very thin wrapper
- -- around the Slang dynamic library, so its build is extermely simple.
- -- One windows `slangc` uses the the `core` library for some UTF-16
- -- to UTF-8 string conversion before calling into `slang.dll`, so
- -- it also depends on `core`:
- --
-
- standardProject("slangc", "source/slangc")
- uuid "D56CBCEB-1EB5-4CA8-AEC4-48EA35ED61C7"
- kind "ConsoleApp"
- links { "core", "slang" }
-
- function getBuildDir(isArm64)
-
- return "%{cfg.targetdir}"
- end
-
- function astReflectGenerator(isArm64)
- local builddir = getBuildDir()
-
- filter("files:**/slang-ast-reflect.h")
-
- buildmessage "C++ Extractor %{file.relpath}"
-
- local sourcePath = "%{file.directory}"
-
- -- Work out the output files
-
- local outputTypes = { "obj", "ast", "value" };
-
- local outputTable = {}
-
- for key, outputType in ipairs(outputTypes) do
- table.insert(outputTable, sourcePath .. "/slang-generated-" .. outputType .. ".h")
- table.insert(outputTable, sourcePath .. "/slang-generated-" .. outputType .. "-macro.h")
- end
-
- -- List all of the input files to be scanned
-
- local inputFiles = { "slang-ast-support-types.h", "slang-ast-base.h", "slang-ast-decl.h", "slang-ast-expr.h", "slang-ast-modifier.h", "slang-ast-stmt.h", "slang-ast-type.h", "slang-ast-val.h" }
-
- local options = { "-strip-prefix", "slang-", "-o", "slang-generated", "-output-fields", "-mark-suffix", "_CLASS"}
-
- -- Specify the actual command to run for this action.
- --
- -- Note that we use a single-quoted Lua string and wrap the path
- -- to the `slang-cpp-extractor` command in double quotes to avoid
- -- confusing the Windows shell. It seems that Premake outputs that
- -- path with forward slashes, which confused the shell if we don't
- -- quote the executable path.
-
- local buildcmd = '"' .. builddir .. '/slang-cpp-extractor" -d ' .. sourcePath .. " " .. table.concat(inputFiles, " ") .. " " .. table.concat(options, " ")
-
- buildcommands { buildcmd }
-
- -- Specify the files output by the extactor - so custom action will run when these files are needed.
- --
- buildoutputs(outputTable)
-
- -- Make it depend on the extractor tool itself
- local buildInputTable = { builddir .. "/slang-cpp-extractor" .. getExecutableSuffix() }
- for key, inputFile in ipairs(inputFiles) do
- table.insert(buildInputTable, sourcePath .. "/" .. inputFile)
- end
-
- --
- buildinputs(buildInputTable)
- end
-
- function metaSlangGenerator()
- local builddir = getBuildDir()
-
- filter("files:**.meta.slang")
-
- -- Specify the "friendly" message that should print to the build log for the action
- buildmessage "slang-generate %{file.relpath}"
-
- -- Specify the actual command to run for this action.
- --
- -- Note that we use a single-quoted Lua string and wrap the path
- -- to the `slang-generate` command in double quotes to avoid
- -- confusing the Windows shell. It seems that Premake outputs that
- -- path with forward slashes, which confused the shell if we don't
- -- quote the executable path.
- --
- buildcommands { '"' .. builddir .. '/slang-generate" %{file.relpath}' }
-
- -- Given `foo.meta.slang` we woutput `foo.meta.slang.h`.
- -- This needs to be specified because the custom action will only
- -- run when this file needs to be generated.
- --
- -- Note the use of abspath here, this ensures windows tests the correct file, otherwise
- -- triggering doesn't work. The problem still remains on linux, because abspath *isn't* an
- -- absolute path, it remains relative.
- --
- -- TODO(JS):
- -- It's not clear how to determine how to create the absolute path on linux, using
- -- path.absolutepath, requires knowing the path to be relative to, and it's neither
- -- the current path, the source path or the targetpath.
- buildoutputs { "%{file.abspath}.h" }
-
- -- We will specify an additional build input dependency on the `slang-generate`
- -- tool itself, so that changes to the code for the tool cause the generation
- -- step to be re-run.
- --
- -- In order to get the file name right, we need to know the executable suffix
- -- that the target platform will use. Premake might have a built-in way to
- -- query this, but I couldn't find it, so I am just winging it for now:
- --
- --
- buildinputs { builddir .. "/slang-generate" .. getExecutableSuffix() }
- end
-
- function preludeGenerator()
- local builddir = getBuildDir()
-
- filter("files:prelude/*-prelude.h")
-
- buildmessage "slang-embed %{file.relpath}"
- buildcommands { '"' .. builddir .. '/slang-embed" %{file.relpath}' }
- buildoutputs { "%{file.abspath}.cpp" }
- buildinputs { builddir .. "/slang-embed" .. getExecutableSuffix() }
- end
-
- if not skipSourceGeneration then
-
- generatorProject("run-generators", nil)
-
- -- We make 'source/slang' the location of the source, to make paths to source
- -- relative to that
-
- -- We include these, even though they are not really part of the dummy
- -- build, so that the filters below can pick up the appropriate locations.
-
- files
- {
- "source/slang/*.meta.slang", -- The stdlib files
- "source/slang/slang-ast-reflect.h", -- C++ reflection
- "prelude/*.h", -- The prelude files
-
- --
- -- To build we need to have some source! It has to be a source file that
- -- does not depend on anything that is generated, so we take something
- -- from core that will compile without any generation.
- --
-
- "source/core/slang-string.cpp",
- }
-
- -- First, we need to ensure that `slang-generate`/`slang-cpp-extactor`
- -- gets built before `slang`, so we declare a non-linking dependency between
- -- the projects here:
- --
- dependson { "slang-cpp-extractor", "slang-generate", "slang-embed" }
-
- local executableSuffix = getExecutableSuffix()
-
- -- We need to run the C++ extractor to generate some include files
- if executeBinary then
- astReflectGenerator()
- end
-
- -- Next, we want to add a custom build rule for each of the
- -- files that makes up the standard library. Those are
- -- always named `*.meta.slang`, so we can select for them
- -- using a `filter` and then use Premake's support for
- -- defining custom build commands:
- --
- if executeBinary then
- metaSlangGenerator()
- preludeGenerator()
- end
-
- filter { }
-
- if enableEmbedStdLib then
- standardProject("slangc-bootstrap", "source/slangc")
- uuid "6339BF31-AC99-4819-B719-679B63451EF0"
- kind "ConsoleApp"
- links { "core", "compiler-core", "miniz", "lz4" }
-
- -- We need to run all the generators to be able to build the main
- -- slang source in source/slang
-
- dependson { "run-generators" }
-
- defines {
- -- We are going statically link Slang compiler with the slangc command line
- "SLANG_STATIC",
- -- This is the bootstrap to produce the embedded stdlib, so we disable to be able to bootstrap
- "SLANG_WITHOUT_EMBEDDED_STD_LIB"
- }
-
- includedirs { "external/spirv-headers/include" }
-
- -- Add all of the slang source
- addSourceDir "source/slang"
-
- -- On some tests with MSBuild disabling these made build work.
- -- flags { "NoIncrementalLink", "NoPCH", "NoMinimalRebuild" }
-
- -- The `standardProject` operation already added all the code in
- -- `source/slang/*`, but we also want to incldue the umbrella
- -- `slang.h` header in this prject, so we do that manually here.
- files { "slang.h" }
-
- files { "source/core/core.natvis" }
-
- -- We explicitly name the prelude file(s) that we need to
- -- compile for their embedded code, since they will not
- -- exist at the time projects/makefiles are generated,
- -- and thus a glob would not match anything.
- files {
- "prelude/slang-cuda-prelude.h.cpp",
- "prelude/slang-hlsl-prelude.h.cpp",
- "prelude/slang-cpp-prelude.h.cpp",
- "prelude/slang-cpp-host-prelude.h.cpp"
- }
- end
-
- if enableEmbedStdLib then
- generatorProject("embed-stdlib-generator", nil, true)
-
- -- We include these, even though they are not really part of the dummy
- -- build, so that the filters below can pick up the appropriate locations.
-
- files
- {
- --
- -- To build we need to have some source! It has to be a source file that
- -- does not depend on anything that is generated, so we take something
- -- from core that will compile without any generation.
- --
-
- "source/slang/slang-stdlib-api.cpp",
- }
-
- -- Only produce the embedded stdlib if that option is enabled
-
- local executableSuffix = getExecutableSuffix()
-
- -- We need slangc-bootstrap to build the embedded stdlib
- dependson { "slangc-bootstrap" }
-
- local absDirectory = path.getabsolute("source/slang")
- local absOutputPath = absDirectory .. "/slang-stdlib-generated.h"
-
- -- I don't know why I need a filter, but without it nothing works (!)
- filter("files:source/slang/slang-stdlib-api.cpp")
- -- Note! Has to be an absolute path else doesn't work(!)
- buildoutputs { absOutputPath }
- filter("files:source/slang/slang-stdlib-api.cpp")
-
- filter(f)
- buildinputs { "%{cfg.targetdir}/slangc-bootstrap" .. executableSuffix }
- buildcommands { '"%{cfg.targetdir}/slangc-bootstrap" -archive-type riff-lz4 -save-stdlib-bin-source "%{file.directory}/slang-stdlib-generated.h"' }
- end
- end -- not skipSourceGeneration
-
- --
- -- TODO: Slang's current `Makefile` build does some careful incantations
- -- to make sure that the binaries it generates use a "relative `RPATH`"
- -- for loading shared libraries, so that Slang is not dependent on
- -- being installed to a fixed path on end-user machines. Before we
- -- can use Premake for the Linux build (or eventually MacOS) we would
- -- need to figure out how to replicate this incantation in premake.
- --
-
- --
- -- Now that we've gotten all the simple projects out of the way, it is time
- -- to get into the more serious build steps.
- --
- -- First up is the `slang` dynamic library project:
- --
-
- standardProject("slang", "source/slang")
- uuid "DB00DA62-0533-4AFD-B59F-A67D5B3A0808"
- kind "SharedLib"
- links { "core", "compiler-core", "miniz", "lz4"}
- warnings "Extra"
- pic "On"
-
- -- The way that we currently configure things through `slang.h`,
- -- we need to set a preprocessor definitions to ensure that
- -- we declare the Slang API functions for *export* and not *import*.
- --
- defines { "SLANG_DYNAMIC_EXPORT" }
-
- if disableStdlibSource then
+ end
+ -- To special case that we may be building using cygwin on windows. If 'true windows' we build for dx12/vk and run the script
+ -- If not we assume it's a cygwin/mingw type situation and remove files that aren't appropriate
+ if targetInfo.isWindows then
+ systemversion "latest"
+
+ -- For Windows targets, we want to copy
+ -- dxcompiler.dll, and dxil.dll from the Windows SDK redistributable
+ -- directory into the output directory.
+ -- d3dcompiler_47.dll is copied from the external/slang-binaries submodule.
+ postbuildcommands { '"$(SolutionDir)tools\\copy-hlsl-libs.bat" "$(WindowsSdkDir)Redist/D3D/%{cfg.platform:lower()}/" "%{cfg.targetdir}/"'}
+
+ addSourceDir "tools/gfx/vulkan"
+ addSourceDir "tools/gfx/open-gl"
+ addSourceDir "tools/gfx/d3d"
+ addSourceDir "tools/gfx/d3d11"
+ addSourceDir "tools/gfx/d3d12"
+ flags { "FatalWarnings" }
+ elseif targetInfo.os == "mingw" or targetInfo.os == "cygwin" then
+ -- Don't support any render techs...
+ elseif os.target() == "macosx" then
+ --addSourceDir "tools/gfx/open-gl"
+ else
+ -- Linux like
+ addSourceDir "tools/gfx/vulkan"
+ --addSourceDir "tools/gfx/open-gl"
+ end
+
+ if enableXlib then
+ defines { "SLANG_ENABLE_XLIB" }
+ libdirs { "/usr/X11/lib" }
+ links {"X11"}
+ end
+
+ -- If NVAPI is enabled
+ if enableNvapi then
+ -- Add the include path
+ includedirs { nvapiPath }
+
+ -- Add a define so that render-test code can check if nvapi is available
+ defines { "GFX_NVAPI" }
+
+ -- Set the nvapi libs directory
+ filter { "platforms:x86" }
+ libdirs { nvapiPath .. "/x86" }
+ links { "nvapi" }
+
+ filter { "platforms:x64" }
+ libdirs { nvapiPath .. "/amd64" }
+ links { "nvapi64" }
+
+ end
+ if addCUDAIfEnabled() then
+ defines { "GFX_ENABLE_CUDA" }
+ end
+
+--
+-- `gfx-util` is a static library containing utilities and helpers for using
+-- the `gfx` library.
+--
+tool "gfx-util"
+ uuid "F5ADB74E-02A7-44FB-AA3B-FC02F8AC7A4B"
+ kind "StaticLib"
+ pic "On"
+
+ includedirs { ".", "source" }
+
+ addSourceDir "tools/gfx-util"
+--
+-- `platform` contains all the platform abstractions for a GUI application.
+--
+tool "platform"
+ uuid "3565fe5e-4fa3-11eb-ae93-0242ac130002"
+ kind "SharedLib"
+ pic "On"
+ links {"core", "slang", "gfx" }
+ defines { "SLANG_PLATFORM_DYNAMIC", "SLANG_PLATFORM_DYNAMIC_EXPORT" }
+ includedirs { ".", "external", "source", "external/imgui", "tools/gfx" }
+ addSourceDir "tools/platform"
+ addSourceDir "tools/platform/linux"
+ addSourceDir "tools/platform/windows"
+ addSourceDir "tools/platform/placeholder"
+ -- Include windowing support on Windows.
+ if targetInfo.isWindows then
+ systemversion "latest"
+ else
+ if enableXlib then
+ defines { "SLANG_ENABLE_XLIB" }
+ libdirs { "/usr/X11/lib" }
+ links {"X11"}
+ end
+ end
+
+--
+-- The `slangc` command-line application is just a very thin wrapper
+-- around the Slang dynamic library, so its build is extermely simple.
+-- One windows `slangc` uses the the `core` library for some UTF-16
+-- to UTF-8 string conversion before calling into `slang.dll`, so
+-- it also depends on `core`:
+--
+
+standardProject("slangc", "source/slangc")
+ uuid "D56CBCEB-1EB5-4CA8-AEC4-48EA35ED61C7"
+ kind "ConsoleApp"
+ links { "core", "slang" }
+
+function getBuildDir(isArm64)
+ return "%{cfg.targetdir}"
+end
+
+function astReflectGenerator(isArm64)
+ local builddir = getBuildDir()
+
+ filter("files:**/slang-ast-reflect.h")
+
+ buildmessage "C++ Extractor %{file.relpath}"
+
+ local sourcePath = "%{file.directory}"
+
+ -- Work out the output files
+
+ local outputTypes = { "obj", "ast", "value" };
+
+ local outputTable = {}
+
+ for key, outputType in ipairs(outputTypes) do
+ table.insert(outputTable, sourcePath .. "/slang-generated-" .. outputType .. ".h")
+ table.insert(outputTable, sourcePath .. "/slang-generated-" .. outputType .. "-macro.h")
+ end
+
+ -- List all of the input files to be scanned
+
+ local inputFiles = { "slang-ast-support-types.h", "slang-ast-base.h", "slang-ast-decl.h", "slang-ast-expr.h", "slang-ast-modifier.h", "slang-ast-stmt.h", "slang-ast-type.h", "slang-ast-val.h" }
+
+ local options = { "-strip-prefix", "slang-", "-o", "slang-generated", "-output-fields", "-mark-suffix", "_CLASS"}
+
+ -- Specify the actual command to run for this action.
+ --
+ -- Note that we use a single-quoted Lua string and wrap the path
+ -- to the `slang-cpp-extractor` command in double quotes to avoid
+ -- confusing the Windows shell. It seems that Premake outputs that
+ -- path with forward slashes, which confused the shell if we don't
+ -- quote the executable path.
+
+ local buildcmd = '"' .. builddir .. '/slang-cpp-extractor" -d ' .. sourcePath .. " " .. table.concat(inputFiles, " ") .. " " .. table.concat(options, " ")
+
+ buildcommands { buildcmd }
+
+ -- Specify the files output by the extactor - so custom action will run when these files are needed.
+ --
+ buildoutputs(outputTable)
+
+ -- Make it depend on the extractor tool itself
+ local buildInputTable = { builddir .. "/slang-cpp-extractor" .. getExecutableSuffix() }
+ for key, inputFile in ipairs(inputFiles) do
+ table.insert(buildInputTable, sourcePath .. "/" .. inputFile)
+ end
+
+ --
+ buildinputs(buildInputTable)
+end
+
+function metaSlangGenerator()
+ local builddir = getBuildDir()
+
+ filter("files:**.meta.slang")
+
+ -- Specify the "friendly" message that should print to the build log for the action
+ buildmessage "slang-generate %{file.relpath}"
+
+ -- Specify the actual command to run for this action.
+ --
+ -- Note that we use a single-quoted Lua string and wrap the path
+ -- to the `slang-generate` command in double quotes to avoid
+ -- confusing the Windows shell. It seems that Premake outputs that
+ -- path with forward slashes, which confused the shell if we don't
+ -- quote the executable path.
+ --
+ buildcommands { '"' .. builddir .. '/slang-generate" %{file.relpath}' }
+
+ -- Given `foo.meta.slang` we woutput `foo.meta.slang.h`.
+ -- This needs to be specified because the custom action will only
+ -- run when this file needs to be generated.
+ --
+ -- Note the use of abspath here, this ensures windows tests the correct file, otherwise
+ -- triggering doesn't work. The problem still remains on linux, because abspath *isn't* an
+ -- absolute path, it remains relative.
+ --
+ -- TODO(JS):
+ -- It's not clear how to determine how to create the absolute path on linux, using
+ -- path.absolutepath, requires knowing the path to be relative to, and it's neither
+ -- the current path, the source path or the targetpath.
+ buildoutputs { "%{file.abspath}.h" }
+
+ -- We will specify an additional build input dependency on the `slang-generate`
+ -- tool itself, so that changes to the code for the tool cause the generation
+ -- step to be re-run.
+ --
+ -- In order to get the file name right, we need to know the executable suffix
+ -- that the target platform will use. Premake might have a built-in way to
+ -- query this, but I couldn't find it, so I am just winging it for now:
+ --
+ --
+ buildinputs { builddir .. "/slang-generate" .. getExecutableSuffix() }
+end
+
+function preludeGenerator()
+ local builddir = getBuildDir()
+
+ filter("files:prelude/*-prelude.h")
+
+ buildmessage "slang-embed %{file.relpath}"
+ buildcommands { '"' .. builddir .. '/slang-embed" %{file.relpath}' }
+ buildoutputs { "%{file.abspath}.cpp" }
+ buildinputs { builddir .. "/slang-embed" .. getExecutableSuffix() }
+end
+
+if not skipSourceGeneration then
+
+generatorProject("run-generators", nil)
+
+ -- We make 'source/slang' the location of the source, to make paths to source
+ -- relative to that
+
+ -- We include these, even though they are not really part of the dummy
+ -- build, so that the filters below can pick up the appropriate locations.
+
+ files
+ {
+ "source/slang/*.meta.slang", -- The stdlib files
+ "source/slang/slang-ast-reflect.h", -- C++ reflection
+ "prelude/*.h", -- The prelude files
+
+ --
+ -- To build we need to have some source! It has to be a source file that
+ -- does not depend on anything that is generated, so we take something
+ -- from core that will compile without any generation.
+ --
+
+ "source/core/slang-string.cpp",
+ }
+
+ -- First, we need to ensure that `slang-generate`/`slang-cpp-extactor`
+ -- gets built before `slang`, so we declare a non-linking dependency between
+ -- the projects here:
+ --
+ dependson { "slang-cpp-extractor", "slang-generate", "slang-embed" }
+
+ local executableSuffix = getExecutableSuffix()
+
+ -- We need to run the C++ extractor to generate some include files
+ if executeBinary then
+ astReflectGenerator()
+ end
+
+ -- Next, we want to add a custom build rule for each of the
+ -- files that makes up the standard library. Those are
+ -- always named `*.meta.slang`, so we can select for them
+ -- using a `filter` and then use Premake's support for
+ -- defining custom build commands:
+ --
+ if executeBinary then
+ metaSlangGenerator()
+ preludeGenerator()
+ end
+
+ filter { }
+
+if enableEmbedStdLib then
+ standardProject("slangc-bootstrap", "source/slangc")
+ uuid "6339BF31-AC99-4819-B719-679B63451EF0"
+ kind "ConsoleApp"
+ links { "core", "compiler-core", "miniz", "lz4" }
+
+ -- We need to run all the generators to be able to build the main
+ -- slang source in source/slang
+
+ dependson { "run-generators" }
+
+ defines {
+ -- We are going statically link Slang compiler with the slangc command line
+ "SLANG_STATIC",
+ -- This is the bootstrap to produce the embedded stdlib, so we disable to be able to bootstrap
+ "SLANG_WITHOUT_EMBEDDED_STD_LIB"
+ }
+
+ includedirs { "external/spirv-headers/include" }
+
+ -- Add all of the slang source
+ addSourceDir "source/slang"
+
+ -- On some tests with MSBuild disabling these made build work.
+ -- flags { "NoIncrementalLink", "NoPCH", "NoMinimalRebuild" }
+
+ -- The `standardProject` operation already added all the code in
+ -- `source/slang/*`, but we also want to incldue the umbrella
+ -- `slang.h` header in this prject, so we do that manually here.
+ files { "slang.h" }
+
+ files { "source/core/core.natvis" }
+
+ -- We explicitly name the prelude file(s) that we need to
+ -- compile for their embedded code, since they will not
+ -- exist at the time projects/makefiles are generated,
+ -- and thus a glob would not match anything.
+ files {
+ "prelude/slang-cuda-prelude.h.cpp",
+ "prelude/slang-hlsl-prelude.h.cpp",
+ "prelude/slang-cpp-prelude.h.cpp",
+ "prelude/slang-cpp-host-prelude.h.cpp"
+ }
+end
+
+if enableEmbedStdLib then
+ generatorProject("embed-stdlib-generator", nil, true)
+
+ -- We include these, even though they are not really part of the dummy
+ -- build, so that the filters below can pick up the appropriate locations.
+
+ files
+ {
+ --
+ -- To build we need to have some source! It has to be a source file that
+ -- does not depend on anything that is generated, so we take something
+ -- from core that will compile without any generation.
+ --
+
+ "source/slang/slang-stdlib-api.cpp",
+ }
+
+ -- Only produce the embedded stdlib if that option is enabled
+
+ local executableSuffix = getExecutableSuffix()
+
+ -- We need slangc-bootstrap to build the embedded stdlib
+ dependson { "slangc-bootstrap" }
+
+ local absDirectory = path.getabsolute("source/slang")
+ local absOutputPath = absDirectory .. "/slang-stdlib-generated.h"
+
+ -- I don't know why I need a filter, but without it nothing works (!)
+ filter("files:source/slang/slang-stdlib-api.cpp")
+ -- Note! Has to be an absolute path else doesn't work(!)
+ buildoutputs { absOutputPath }
+ filter("files:source/slang/slang-stdlib-api.cpp")
+
+ filter(f)
+ buildinputs { "%{cfg.targetdir}/slangc-bootstrap" .. executableSuffix }
+ buildcommands { '"%{cfg.targetdir}/slangc-bootstrap" -archive-type riff-lz4 -save-stdlib-bin-source "%{file.directory}/slang-stdlib-generated.h"' }
+end
+end -- not skipSourceGeneration
+
+--
+-- TODO: Slang's current `Makefile` build does some careful incantations
+-- to make sure that the binaries it generates use a "relative `RPATH`"
+-- for loading shared libraries, so that Slang is not dependent on
+-- being installed to a fixed path on end-user machines. Before we
+-- can use Premake for the Linux build (or eventually MacOS) we would
+-- need to figure out how to replicate this incantation in premake.
+--
+
+--
+-- Now that we've gotten all the simple projects out of the way, it is time
+-- to get into the more serious build steps.
+--
+-- First up is the `slang` dynamic library project:
+--
+
+standardProject("slang", "source/slang")
+ uuid "DB00DA62-0533-4AFD-B59F-A67D5B3A0808"
+ kind "SharedLib"
+ links { "core", "compiler-core", "miniz", "lz4"}
+ warnings "Extra"
+ pic "On"
+
+ -- The way that we currently configure things through `slang.h`,
+ -- we need to set a preprocessor definitions to ensure that
+ -- we declare the Slang API functions for *export* and not *import*.
+ --
+ defines { "SLANG_DYNAMIC_EXPORT" }
+
+ if disableStdlibSource then
defines { "SLANG_DISABLE_STDLIB_SOURCE" }
- end
+ end
- if fullDebugValidation then
+ if fullDebugValidation then
defines { "SLANG_ENABLE_FULL_IR_VALIDATION" }
- end
-
- if enableEmbedStdLib then
- -- We only have this dependency if we are embedding stdlib
- if not skipSourceGeneration then
+ end
+
+ if enableEmbedStdLib then
+ -- We only have this dependency if we are embedding stdlib
+ if not skipSourceGeneration then
dependson { "embed-stdlib-generator" }
- end
- else
- -- Disable StdLib embedding
- defines { "SLANG_WITHOUT_EMBEDDED_STD_LIB" }
- end
-
- includedirs { "external/spirv-headers/include" }
-
- -- On some tests with MSBuild disabling these made build work.
- -- flags { "NoIncrementalLink", "NoPCH", "NoMinimalRebuild" }
-
- -- The `standardProject` operation already added all the code in
- -- `source/slang/*`, but we also want to incldue the umbrella
- -- `slang.h` header in this prject, so we do that manually here.
- files { "slang.h" }
-
- files { "source/core/core.natvis" }
-
- -- We explicitly name the prelude file(s) that we need to
- -- compile for their embedded code, since they will not
- -- exist at the time projects/makefiles are generated,
- -- and thus a glob would not match anything.
- files {
- "prelude/slang-cuda-prelude.h.cpp",
- "prelude/slang-hlsl-prelude.h.cpp",
- "prelude/slang-cpp-prelude.h.cpp",
- "prelude/slang-cpp-host-prelude.h.cpp"
- }
-
- --
- -- The most challenging part of building `slang` is that we need
- -- to invoke generators such as slang-cpp-extractor and slang-generate
- -- to generate. We do this by executing the run-generators 'dummy' project
- -- which produces the appropriate source
-
- if not skipSourceGeneration then
+ end
+ else
+ -- Disable StdLib embedding
+ defines { "SLANG_WITHOUT_EMBEDDED_STD_LIB" }
+ end
+
+ includedirs { "external/spirv-headers/include" }
+
+ -- On some tests with MSBuild disabling these made build work.
+ -- flags { "NoIncrementalLink", "NoPCH", "NoMinimalRebuild" }
+
+ -- The `standardProject` operation already added all the code in
+ -- `source/slang/*`, but we also want to incldue the umbrella
+ -- `slang.h` header in this prject, so we do that manually here.
+ files { "slang.h" }
+
+ files { "source/core/core.natvis" }
+
+ -- We explicitly name the prelude file(s) that we need to
+ -- compile for their embedded code, since they will not
+ -- exist at the time projects/makefiles are generated,
+ -- and thus a glob would not match anything.
+ files {
+ "prelude/slang-cuda-prelude.h.cpp",
+ "prelude/slang-hlsl-prelude.h.cpp",
+ "prelude/slang-cpp-prelude.h.cpp",
+ "prelude/slang-cpp-host-prelude.h.cpp"
+ }
+
+ --
+ -- The most challenging part of building `slang` is that we need
+ -- to invoke generators such as slang-cpp-extractor and slang-generate
+ -- to generate. We do this by executing the run-generators 'dummy' project
+ -- which produces the appropriate source
+
+ if not skipSourceGeneration then
dependson { "run-generators" }
- end
-
- -- If we have slang-llvm copy it
- local slangLLVMPath = deps:getProjectRelativePath("slang-llvm", "../../..")
-
- if slangLLVMPath and deployLLVM then
- filter { "system:linux or macosx or windows" }
- local sharedLibName = slangUtil.getSharedLibraryFileName(targetInfo, "slang-llvm")
- postbuildcommands {
- "{COPY} " .. slangLLVMPath .."/bin/" .. targetName .. "/release/" .. sharedLibName .. " %{cfg.targetdir}"
- }
- end
-
+ end
+
+ -- If we have slang-llvm copy it
+ local slangLLVMPath = deps:getProjectRelativePath("slang-llvm", "../../..")
+
+ if slangLLVMPath and deployLLVM then
+ filter { "system:linux or macosx or windows" }
+ local sharedLibName = slangUtil.getSharedLibraryFileName(targetInfo, "slang-llvm")
+ postbuildcommands {
+ "{COPY} " .. slangLLVMPath .."/bin/" .. targetName .. "/release/" .. sharedLibName .. " %{cfg.targetdir}"
+ }
+ end
+
local slangGlslangPath = deps:getProjectRelativePath("slang-glslang", "../../..")
-
- -- If we are not building glslang from source, then be
- -- sure to copy a binary copy over to the output directory
- if not buildGlslang and slangGlslangPath~=nil and deployGLSLang then
- filter { "system:linux or macosx or windows" }
- local sharedLibName = slangUtil.getSharedLibraryFileName(targetInfo, "slang-glslang")
- postbuildcommands {
- "{COPY} " .. slangGlslangPath .. "/bin/" .. targetName .. "/release/" .. sharedLibName .. " %{cfg.targetdir}"
- }
- end
-
- filter {"configurations:debug"}
- defines { "SLANG_ENABLE_IR_BREAK_ALLOC=1" }
- filter {}
-
- toolSharedLibrary "gfx-unit-test"
- uuid "092DAB9F-1DA5-4538-ADD7-1A8D1DBFD519"
- includedirs { "." }
- addSourceDir "tools/unit-test"
- links { "core", "slang", "gfx", "gfx-util", "platform" }
-
- toolSharedLibrary "slang-unit-test"
- uuid "0162864E-7651-4B5E-9105-C571105276EA"
- includedirs { "." }
- addSourceDir "tools/unit-test"
- links { "lz4", "miniz", "core", "compiler-core", "slang" }
- if not targetInfo.isWindows then
- links { "pthread" }
- end
-
- if enableProfile then
- tool "slang-profile"
- uuid "375CC87D-F34A-4DF1-9607-C5C990FD6227"
-
- -- gprof needs symbols
- symbols "On"
-
- dependson { "slang" }
-
- includedirs { "external/spirv-headers/include" }
-
- defines { "SLANG_STATIC",
- -- Disable StdLib embedding
- "SLANG_WITHOUT_EMBEDDED_STD_LIB"
- }
-
- -- The `standardProject` operation already added all the code in
- -- `source/slang/*`, but we also want to incldue the umbrella
- -- `slang.h` header in this prject, so we do that manually here.
- files { "slang.h" }
-
- files { "source/core/core.natvis" }
-
- -- We explicitly name the prelude file(s) that we need to
- -- compile for their embedded code, since they will not
- -- exist at the time projects/makefiles are generated,
- -- and thus a glob would not match anything.
- files {
- "prelude/slang-cuda-prelude.h.cpp",
- "prelude/slang-hlsl-prelude.h.cpp",
- "prelude/slang-cpp-prelude.h.cpp",
- "prelude/slang-cpp-host-prelude.h.cpp"
- }
-
- -- Add the slang source
- addSourceDir "source/slang"
-
- includedirs { "." }
- links { "core", "compiler-core", "miniz", "lz4"}
-
- filter { "system:linux" }
- linkoptions{ "-pg" }
- buildoptions{ "-pg" }
-
- end
-
- standardProject("miniz", nil)
- uuid "E76ACB11-4A12-4F0A-BE1E-CE0B8836EB7F"
- kind "StaticLib"
- pic "On"
-
- -- Add the files explicitly
- language "C"
- files
- {
- "external/miniz/miniz.c",
- "external/miniz/miniz_tdef.c",
- "external/miniz/miniz_tinfl.c",
- "external/miniz/miniz_zip.c"
- }
- filter { "system:linux" }
- defines { "_LARGEFILE64_SOURCE" }
-
- filter { "system:linux or macosx" }
- links { "dl"}
-
- standardProject("lz4", nil)
- uuid "E1EC8075-823E-46E5-BC38-C124CCCDF878"
- kind "StaticLib"
- pic "On"
-
- -- Add the files explicitly
- language "C"
- files
- {
- "external/lz4/lib/lz4.c",
- "external/lz4/lib/lz4.h",
- }
-
- filter { "system:linux or macosx" }
- links { "dl"}
-
- if buildGlslang then
-
- standardProject("slang-spirv-tools", nil)
- uuid "C36F6185-49B3-467E-8388-D0E9BF5F7BB8"
- kind "StaticLib"
- pic "On"
-
- includedirs { "external/spirv-tools", "external/spirv-tools/include", "external/spirv-headers/include", "external/spirv-tools-generated"}
-
- addSourceDir("external/spirv-tools/source")
- addSourceDir("external/spirv-tools/source/opt")
- addSourceDir("external/spirv-tools/source/util")
- addSourceDir("external/spirv-tools/source/val")
-
- filter { "system:linux or macosx" }
- links { "dl"}
- --
- -- The single most complicated part of our build is our custom version of glslang.
- -- Is not really set up to produce a shared library with a usable API, so we have
- -- our own custom shim API around it to invoke GLSL->SPIRV compilation.
- --
- -- Glslang normally relies on a CMake-based build process, and its code is spread
- -- across multiple directories with implicit dependencies on certain command-line
- -- definitions.
- --
- -- The following is a tailored build of glslang that pulls in the pieces we care
- -- about whle trying to leave out the rest:
- --
- standardProject("slang-glslang", "source/slang-glslang")
- uuid "C495878A-832C-485B-B347-0998A90CC936"
- kind "SharedLib"
- pic "On"
-
- includedirs { "external/glslang", "external/spirv-tools", "external/spirv-tools/include", "external/spirv-headers/include", "external/spirv-tools-generated", "external/glslang-generated" }
-
- defines
- {
- -- `ENABLE_OPT` must be defined (to either zero or one) for glslang to compile at all
- "ENABLE_OPT=1",
-
- -- We want to build a version of glslang that supports every feature possible,
- -- so we will enable all of the supported vendor-specific extensions so
- -- that they can be used in Slang-generated GLSL code when required.
- --
- "AMD_EXTENSIONS",
- "NV_EXTENSIONS",
- }
-
- -- We will add source code from every directory that is required to get a
- -- minimal GLSL->SPIR-V compilation path working.
- addSourceDir("external/glslang/glslang/GenericCodeGen")
- addSourceDir("external/glslang/glslang/MachineIndependent")
- addSourceDir("external/glslang/glslang/MachineIndependent/preprocessor")
- addSourceDir("external/glslang/OGLCompilersDLL")
- addSourceDir("external/glslang/SPIRV")
- addSourceDir("external/glslang/StandAlone")
-
- -- Unfortunately, blindly adding files like that also pulled in a declaration
- -- of a main entry point that we do *not* want, so we will specifically
- -- exclude that file from our build.
- removefiles { "external/glslang/StandAlone/StandAlone.cpp" }
-
- -- Glslang includes some platform-specific code around DLL setup/teardown
- -- and handling of thread-local storage for its multi-threaded mode. We
- -- don't really care about *any* of that, but we can't remove it from the
- -- build so we need to include the appropriate platform-specific sources.
-
- links { "slang-spirv-tools"}
-
- filter { "system:windows" }
- -- On Windows we need to add the platform-specific sources and then
- -- remove the `main.cpp` file since it tries to define a `DllMain`
- -- and we don't want the default glslang one.
- addSourceDir( "external/glslang/glslang/OSDependent/Windows")
- removefiles { "external/glslang/glslang/OSDependent/Windows/main.cpp" }
-
- filter { "system:linux or macosx" }
- addSourceDir( "external/glslang/glslang/OSDependent/Unix")
- links { "dl", "pthread" }
-
- --
- -- With glslang's build out of the way, we've now covered everything we have
- -- to build to get Slang and its tools/examples built.
- --
- -- What is not included in this file yet is support for any custom `make`
- -- targets for:
- --
- -- * Invoking the test runner
- -- * Packaging up binaries
- -- * "Installing" Slang on a user's machine
- --
-
- end
+ -- If we are not building glslang from source, then be
+ -- sure to copy a binary copy over to the output directory
+ if not buildGlslang and slangGlslangPath~=nil and deployGLSLang then
+ filter { "system:linux or macosx or windows" }
+ local sharedLibName = slangUtil.getSharedLibraryFileName(targetInfo, "slang-glslang")
+ postbuildcommands {
+ "{COPY} " .. slangGlslangPath .. "/bin/" .. targetName .. "/release/" .. sharedLibName .. " %{cfg.targetdir}"
+ }
+ end
+
+ filter {"configurations:debug"}
+ defines { "SLANG_ENABLE_IR_BREAK_ALLOC=1" }
+ filter {}
+
+toolSharedLibrary "gfx-unit-test"
+ uuid "092DAB9F-1DA5-4538-ADD7-1A8D1DBFD519"
+ includedirs { "." }
+ addSourceDir "tools/unit-test"
+ links { "core", "slang", "gfx", "gfx-util", "platform" }
+
+toolSharedLibrary "slang-unit-test"
+ uuid "0162864E-7651-4B5E-9105-C571105276EA"
+ includedirs { "." }
+ addSourceDir "tools/unit-test"
+ links { "lz4", "miniz", "core", "compiler-core", "slang" }
+ if not targetInfo.isWindows then
+ links { "pthread" }
+ end
+
+if enableProfile then
+ tool "slang-profile"
+ uuid "375CC87D-F34A-4DF1-9607-C5C990FD6227"
+
+ -- gprof needs symbols
+ symbols "On"
+
+ dependson { "slang" }
+
+ includedirs { "external/spirv-headers/include" }
+
+ defines { "SLANG_STATIC",
+ -- Disable StdLib embedding
+ "SLANG_WITHOUT_EMBEDDED_STD_LIB"
+ }
+
+ -- The `standardProject` operation already added all the code in
+ -- `source/slang/*`, but we also want to incldue the umbrella
+ -- `slang.h` header in this prject, so we do that manually here.
+ files { "slang.h" }
+
+ files { "source/core/core.natvis" }
+
+ -- We explicitly name the prelude file(s) that we need to
+ -- compile for their embedded code, since they will not
+ -- exist at the time projects/makefiles are generated,
+ -- and thus a glob would not match anything.
+ files {
+ "prelude/slang-cuda-prelude.h.cpp",
+ "prelude/slang-hlsl-prelude.h.cpp",
+ "prelude/slang-cpp-prelude.h.cpp",
+ "prelude/slang-cpp-host-prelude.h.cpp"
+ }
+
+ -- Add the slang source
+ addSourceDir "source/slang"
+
+ includedirs { "." }
+ links { "core", "compiler-core", "miniz", "lz4"}
+
+ filter { "system:linux" }
+ linkoptions{ "-pg" }
+ buildoptions{ "-pg" }
+
+end
+
+standardProject("miniz", nil)
+ uuid "E76ACB11-4A12-4F0A-BE1E-CE0B8836EB7F"
+ kind "StaticLib"
+ pic "On"
+
+ -- Add the files explicitly
+ language "C"
+ files
+ {
+ "external/miniz/miniz.c",
+ "external/miniz/miniz_tdef.c",
+ "external/miniz/miniz_tinfl.c",
+ "external/miniz/miniz_zip.c"
+ }
+ filter { "system:linux" }
+ defines { "_LARGEFILE64_SOURCE" }
+
+ filter { "system:linux or macosx" }
+ links { "dl"}
+
+standardProject("lz4", nil)
+ uuid "E1EC8075-823E-46E5-BC38-C124CCCDF878"
+ kind "StaticLib"
+ pic "On"
+
+ -- Add the files explicitly
+ language "C"
+ files
+ {
+ "external/lz4/lib/lz4.c",
+ "external/lz4/lib/lz4.h",
+ }
+
+ filter { "system:linux or macosx" }
+ links { "dl"}
+
+if buildGlslang then
+
+standardProject("slang-spirv-tools", nil)
+ uuid "C36F6185-49B3-467E-8388-D0E9BF5F7BB8"
+ kind "StaticLib"
+ pic "On"
+
+ includedirs { "external/spirv-tools", "external/spirv-tools/include", "external/spirv-headers/include", "external/spirv-tools-generated"}
+
+ addSourceDir("external/spirv-tools/source")
+ addSourceDir("external/spirv-tools/source/opt")
+ addSourceDir("external/spirv-tools/source/util")
+ addSourceDir("external/spirv-tools/source/val")
+
+ filter { "system:linux or macosx" }
+ links { "dl"}
+--
+-- The single most complicated part of our build is our custom version of glslang.
+-- Is not really set up to produce a shared library with a usable API, so we have
+-- our own custom shim API around it to invoke GLSL->SPIRV compilation.
+--
+-- Glslang normally relies on a CMake-based build process, and its code is spread
+-- across multiple directories with implicit dependencies on certain command-line
+-- definitions.
+--
+-- The following is a tailored build of glslang that pulls in the pieces we care
+-- about whle trying to leave out the rest:
+--
+standardProject("slang-glslang", "source/slang-glslang")
+ uuid "C495878A-832C-485B-B347-0998A90CC936"
+ kind "SharedLib"
+ pic "On"
+
+ includedirs { "external/glslang", "external/spirv-tools", "external/spirv-tools/include", "external/spirv-headers/include", "external/spirv-tools-generated", "external/glslang-generated" }
+
+ defines
+ {
+ -- `ENABLE_OPT` must be defined (to either zero or one) for glslang to compile at all
+ "ENABLE_OPT=1",
+
+ -- We want to build a version of glslang that supports every feature possible,
+ -- so we will enable all of the supported vendor-specific extensions so
+ -- that they can be used in Slang-generated GLSL code when required.
+ --
+ "AMD_EXTENSIONS",
+ "NV_EXTENSIONS",
+ }
+
+ -- We will add source code from every directory that is required to get a
+ -- minimal GLSL->SPIR-V compilation path working.
+ addSourceDir("external/glslang/glslang/GenericCodeGen")
+ addSourceDir("external/glslang/glslang/MachineIndependent")
+ addSourceDir("external/glslang/glslang/MachineIndependent/preprocessor")
+ addSourceDir("external/glslang/OGLCompilersDLL")
+ addSourceDir("external/glslang/SPIRV")
+ addSourceDir("external/glslang/StandAlone")
+
+ -- Unfortunately, blindly adding files like that also pulled in a declaration
+ -- of a main entry point that we do *not* want, so we will specifically
+ -- exclude that file from our build.
+ removefiles { "external/glslang/StandAlone/StandAlone.cpp" }
+
+ -- Glslang includes some platform-specific code around DLL setup/teardown
+ -- and handling of thread-local storage for its multi-threaded mode. We
+ -- don't really care about *any* of that, but we can't remove it from the
+ -- build so we need to include the appropriate platform-specific sources.
+
+ links { "slang-spirv-tools"}
+
+ filter { "system:windows" }
+ -- On Windows we need to add the platform-specific sources and then
+ -- remove the `main.cpp` file since it tries to define a `DllMain`
+ -- and we don't want the default glslang one.
+ addSourceDir( "external/glslang/glslang/OSDependent/Windows")
+ removefiles { "external/glslang/glslang/OSDependent/Windows/main.cpp" }
+
+ filter { "system:linux or macosx" }
+ addSourceDir( "external/glslang/glslang/OSDependent/Unix")
+ links { "dl", "pthread" }
+
+--
+-- With glslang's build out of the way, we've now covered everything we have
+-- to build to get Slang and its tools/examples built.
+--
+-- What is not included in this file yet is support for any custom `make`
+-- targets for:
+--
+-- * Invoking the test runner
+-- * Packaging up binaries
+-- * "Installing" Slang on a user's machine
+--
+
+end