-- premake5.lua -- This file describes the build configuration for Slang so -- that premake can generate platform-specific build files -- using Premake 5 (https://premake.github.io/). -- -- To update the build files that are checked in to the Slang repository, -- run a `premake5` binary and specify the appropriate action, e.g.: -- -- premake5.exe --os=windows vs2015 -- -- If you are trying to build Slang on another platform, then you -- can try invoking `premake5` for your desired OS and build format -- and see what happens. -- -- If you are going to modify this file to change/customize the Slang -- build, then you may need to read up on Premake's approach and -- how it uses/abuses Lua syntax. A few important things to note: -- -- * Everything that *looks* like a declarative (e.g., `kind "SharedLib"`) -- is actually a Lua function call (e.g., `kind("SharedLib")`) that -- modifies the behind-the-scenes state that describes the build. -- -- * Many of these function calls are "sticky" and affect subsequent -- calls, so ordering matters a *lot*. This file uses indentation to -- represent some of the flow of state, but it is important to recognize -- that the indentation is not semantically significant. -- -- * Because the configuration logic is just executable Lua code, we -- can capture and re-use bits of configuration logic in ordinary -- Lua subroutines. -- -- Now let's move on to the actual build: -- The "workspace" represents the overall build (the "solution" in -- Visual Studio terms). It sets up basic build settings that will -- apply across all projects. -- -- To output linux will output to linux -- % premake5 --os=linux gmake2 --build-location="build.linux" -- -- % cd build.linux -- % make config=release_x64 -- or -- % make config=debug_x64 -- -- From in the build directory you can use -- % premake5 --file=../premake5.lua --os=linux gmake2 -- Fail if we try to use the deprecated 'gmake' generator if _ACTION == "gmake" then premake.error "Please use the 'gmake2' generator instead of 'gmake'" end -- -- Add the package path for slang-pack/slang-util -- The question mark is there the name of the module is inserted. --- local modulePath = "external/slang-binaries/lua-modules/?.lua" package.path = package.path .. ";" .. modulePath -- Load the slack package manager module slangPack = require("slang-pack") slangUtil = require("slang-util") -- Load the dependencies from the json file deps = slangPack.loadDependencies("deps/target-deps.json") newoption { trigger = "override-module", description = "(Optional) Specify a lua file that can override functions", value = "path" } newoption { trigger = "build-location", description = "(Optional) Specifiy the location to place solution on root Makefile", value = "path" } 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 { trigger = "build-glslang", description = "(Optional) If true glslang and spirv-opt will be built", value = "bool", default = "false", allowed = { { "true", "True"}, { "false", "False" } } } 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 { 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 { 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 { 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 { trigger = "optix-sdk-path", description = "(Optional) Path to the root of OptiX SDK. (Implicitly enabled OptiX and CUDA)", value = "path" } 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 { 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 { trigger = "enable-experimental-projects", description = "(Optional) If true include experimental projects in build.", value = "bool", default = "false", allowed = { { "true", "True"}, { "false", "False" } } } 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 { trigger = "skip-source-generation", description = "(Optional) If true will skip source generation steps.", value = "bool", default = "false", allowed = { { "true", "True"}, { "false", "False" } } } 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 { 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 { 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" } } } newoption { trigger = "enable-asan", description = "(Optional) If true will enable ASAN (address santizier).", 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") enableAsan = (_OPTIONS["enable-asan"] == "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) 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()}") cppdialect "C++17" -- 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", "-Wno-invalid-offsetof" } 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 -- -- Enable ASAN (address sanitizer) if requested. -- if enableAsan then if (targetInfo.isWindows) then buildoptions { "/fsanitize=address" } flags { "NoIncrementalLink" } end 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//`. -- 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//` 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, projectKind) -- 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 the generator projects run a custom tool and don't -- require any premake machinery to compile a binary for them. if projectKind == nil then kind "Utility" else kind (projectKind) 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 "autodiff-texture" 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" -- 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" pic "On" warnings "Extra" links {"miniz", "lz4"} defines { "SLANG_RT_DYNAMIC", "SLANG_RT_DYNAMIC_EXPORT" } addSourceDir "source/core" if targetInfo.isWindows then addSourceDir "source/core/windows" else 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 "slang-lookup-generator" uuid "3242baa7-fc4c-4f76-83bc-e4403099dc1d" 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/..") 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 postbuildcommands { '{COPY} "$(SolutionDir)tools/gfx/gfx.slang" "%{cfg.targetdir}"', '{COPY} "$(SolutionDir)tools/gfx/slang.slang" "%{cfg.targetdir}"' } 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" 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 various source-generation tools -- get 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 { } generatorProject("generate-lookup-tables") tables = { { json = "external/spirv-headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json", header = "spirv/unified1/GLSL.std.450.h", prefix = "GLSLstd450", type = "GLSLstd450" }, { json = "external/spirv-headers/include/spirv/unified1/spirv.core.grammar.json", header = "spirv/unified1/spirv.h", prefix = "Spv", type = "SpvOp" } } for _, t in pairs(tables) do files {t.json} end dependson { "slang-lookup-generator" } local builddir = getBuildDir() if executeBinary then for _, t in pairs(tables) do filter("files:" .. t.json) local inJson = "%{file.abspath}" local cppFilename = "slang-lookup-" .. t.type:lower() .. ".cpp" local cppPath = "%{wks.location}/source/slang/" .. cppFilename local buildcmd = '"' .. builddir .. '/slang-lookup-generator" ' .. inJson .. " " .. cppPath .. " " .. t.type .. " " .. t.prefix .. " " .. t.header buildmessage ("slang-lookup-generator for " .. cppFilename) buildcommands { buildcmd } buildinputs { inJson, builddir .. "/slang-lookup-generator" .. getExecutableSuffix() } buildoutputs (cppPath) end 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", "prelude/slang-torch-prelude.h.cpp" } end if enableEmbedStdLib then generatorProject("embed-stdlib-generator", nil, "SharedLib") -- 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 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 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", "prelude/slang-torch-prelude.h.cpp" } -- Similarly for any generated lookup tables files { "source/slang/slang-lookup-spvop.cpp", "source/slang/slang-lookup-glslstd450.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" } dependson { "generate-lookup-tables" } 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", "prelude/slang-torch-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