output_dir = "%{cfg.buildcfg}-%{cfg.system}" -- the LunarG installer sets this on windows. without it the vulkan backend is -- left out of the build (DONUT_NO_VULKAN) and the app runs opengl only. vulkan_sdk = os.getenv("VULKAN_SDK") if os.target() == "windows" and not vulkan_sdk then print("VULKAN_SDK is not set: building without the Vulkan backend (OpenGL only)") end include_dir = { glm = "ext/glm", glfw = "ext/glfw/include", glad = "ext/glad/include", imgui = "ext/imgui", imguizmo = "ext/ImGuizmo", imgui_backends = "ext/imgui/backends", toml11 = "ext/toml11/include", nlohmann = "ext/json/single_include", stb = "ext/stb", } function setup_target() targetdir ("bin/" .. output_dir) objdir ("bin-int/" .. output_dir .. "/%{prj.name}") staticruntime "On" end function setup_c_target() setup_target() filter { "system:macosx or system:linux" } buildoptions { "-Wall", "-Wextra", "-Wpedantic", "-Wconversion", "-Wsign-conversion", "-Wshadow", "-Wstrict-prototypes", "-Wmissing-prototypes", } filter {} filter "configurations:debug" runtime "Debug" symbols "On" -- premake filters don't nest: this one has to name debug again, or the -- sanitizers end up in every config filter { "configurations:debug", "system:macosx or system:linux" } buildoptions { "-g", "-fno-omit-frame-pointer", "-fsanitize=address,undefined", } linkoptions { "-fsanitize=address,undefined", } filter {} filter "configurations:release or dist" runtime "Release" optimize "Speed" filter {} filter "configurations:dist" symbols "Off" filter {} end function setup_cpp_target() setup_target() filter { "system:macosx or system:linux" } buildoptions { "-Wall", "-Wextra", "-Wpedantic", "-Wconversion", "-Wsign-conversion", "-Wshadow", } filter {} filter "configurations:debug" runtime "Debug" symbols "On" -- premake filters don't nest: this one has to name debug again, or the -- sanitizers end up in every config filter { "configurations:debug", "system:macosx or system:linux" } buildoptions { "-g", "-fno-omit-frame-pointer", "-fsanitize=address,undefined", } linkoptions { "-fsanitize=address,undefined", } filter {} filter "configurations:release or dist" runtime "Release" optimize "Speed" filter {} filter "configurations:dist" symbols "Off" filter {} end newaction { trigger = "clean", description = "Remove build output and generated project files", execute = function() os.rmdir("bin") os.rmdir("bin-int") os.remove("Makefile") for _, file in ipairs(os.matchfiles("*.make")) do os.remove(file) end os.rmdir("logs") os.remove("config/settings.toml") os.remove("imgui.ini") print("Cleaned build output and generated project files") end } newaction { trigger = "check", description = "Run static analysis with cppcheck", execute = function() local result = os.execute("make clean") if result ~= true and result ~= 0 then error("Failed to clean project") end result = os.execute( "bear -- make config=debug" ) if result ~= true and result ~= 0 then error("Failed to generate compile_commands.json") end result = os.execute( "cppcheck " .. "--project=compile_commands.json " .. "--file-filter=src/** " .. "--enable=warning,style,performance,portability " .. "--error-exitcode=1" ) if result ~= true and result ~= 0 then error("cppcheck found issues") end end } workspace "donut" architecture "x64" startproject "donut" multiprocessorcompile "On" configurations { "debug", "release", "dist", } filter "system:windows" defines "DONUT_WINDOWS" filter "system:linux" defines "DONUT_LINUX" filter "system:macosx" architecture "ARM64" defines "DONUT_MACOS" filter {} group "dependencies" project "glad" kind "StaticLib" language "C" warnings "Off" setup_c_target() files { "ext/glad/include/glad/glad.h", "ext/glad/include/KHR/khrplatform.h", "ext/glad/src/glad.c", } includedirs "%{include_dir.glad}" filter "system:windows" systemversion "latest" filter {} project "glfw" kind "StaticLib" language "C" warnings "Off" setup_c_target() files { "ext/glfw/src/context.c", "ext/glfw/src/init.c", "ext/glfw/src/input.c", "ext/glfw/src/monitor.c", "ext/glfw/src/platform.c", "ext/glfw/src/vulkan.c", "ext/glfw/src/window.c", "ext/glfw/src/internal.h", "ext/glfw/src/platform.h", "ext/glfw/src/mappings.h", "ext/glfw/src/null_init.c", "ext/glfw/src/null_joystick.c", "ext/glfw/src/null_joystick.h", "ext/glfw/src/null_monitor.c", "ext/glfw/src/null_platform.h", "ext/glfw/src/null_window.c", } filter "system:linux" pic "On" files { "ext/glfw/src/x11_init.c", "ext/glfw/src/x11_monitor.c", "ext/glfw/src/x11_platform.h", "ext/glfw/src/x11_window.c", "ext/glfw/src/xkb_unicode.c", "ext/glfw/src/xkb_unicode.h", "ext/glfw/src/wl_init.c", "ext/glfw/src/wl_monitor.c", "ext/glfw/src/wl_platform.h", "ext/glfw/src/wl_window.c", "ext/glfw/src/posix_module.c", "ext/glfw/src/posix_time.c", "ext/glfw/src/posix_time.h", "ext/glfw/src/posix_thread.c", "ext/glfw/src/posix_thread.h", "ext/glfw/src/glx_context.c", "ext/glfw/src/egl_context.c", "ext/glfw/src/osmesa_context.c", "ext/glfw/src/linux_joystick.c", "ext/glfw/src/linux_joystick.h", } defines "_GLFW_X11" filter "system:macosx" pic "On" files { "ext/glfw/src/cocoa_init.m", "ext/glfw/src/cocoa_joystick.h", "ext/glfw/src/cocoa_joystick.m", "ext/glfw/src/cocoa_monitor.m", "ext/glfw/src/cocoa_platform.h", "ext/glfw/src/cocoa_time.c", "ext/glfw/src/cocoa_time.h", "ext/glfw/src/cocoa_window.m", "ext/glfw/src/nsgl_context.m", "ext/glfw/src/egl_context.c", "ext/glfw/src/osmesa_context.c", "ext/glfw/src/posix_module.c", "ext/glfw/src/posix_thread.c", "ext/glfw/src/posix_thread.h", } defines "_GLFW_COCOA" filter "system:windows" systemversion "latest" files { "ext/glfw/src/win32_init.c", "ext/glfw/src/win32_joystick.c", "ext/glfw/src/win32_joystick.h", "ext/glfw/src/win32_module.c", "ext/glfw/src/win32_monitor.c", "ext/glfw/src/win32_platform.h", "ext/glfw/src/win32_thread.c", "ext/glfw/src/win32_thread.h", "ext/glfw/src/win32_time.c", "ext/glfw/src/win32_time.h", "ext/glfw/src/win32_window.c", "ext/glfw/src/wgl_context.c", "ext/glfw/src/egl_context.c", "ext/glfw/src/osmesa_context.c", } defines { "_GLFW_WIN32", "_CRT_SECURE_NO_WARNINGS", } filter {} project "imgui" kind "StaticLib" language "C++" cppdialect "C++17" setup_cpp_target() files { "ext/imgui/imgui.cpp", "ext/imgui/imgui_draw.cpp", "ext/imgui/imgui_tables.cpp", "ext/imgui/imgui_widgets.cpp", "ext/imgui/imgui_demo.cpp", "ext/imgui/backends/imgui_impl_glfw.cpp", "ext/imgui/backends/imgui_impl_opengl3.cpp", } includedirs { "%{include_dir.imgui}", "%{include_dir.glfw}", } filter "system:linux" pic "On" filter "system:macosx" files "ext/imgui/backends/imgui_impl_vulkan.cpp" externalincludedirs "/opt/homebrew/include" filter "system:windows" systemversion "latest" if vulkan_sdk then files "ext/imgui/backends/imgui_impl_vulkan.cpp" externalincludedirs (vulkan_sdk .. "/Include") end filter {} project "imguizmo" kind "StaticLib" language "C++" cppdialect "C++17" setup_cpp_target() files { "ext/ImGuizmo/ImGuizmo.cpp", "ext/ImGuizmo/ImGuizmo.h", } includedirs { "%{include_dir.imgui}", "%{include_dir.imguizmo}", } filter "system:linux" pic "On" filter "system:windows" systemversion "latest" filter {} group "" project "donut" kind "ConsoleApp" language "C++" cppdialect "C++20" setup_cpp_target() defines { "_CRT_SECURE_NO_WARNINGS", "GLFW_INCLUDE_NONE", } files { "ext/glm/glm/**.hpp", "ext/glm/glm/**.inl", "src/**.h", "src/**.cpp", "assets/fonts/inter/static/Inter_18pt-Regular.ttf", "assets/fonts/inter/static/Inter_18pt-Bold.ttf", "assets/fonts/inter/static/Inter_18pt-Light.ttf", } includedirs "src" debugdir "%{wks.location}" -- every asset path is relative to the repo root externalincludedirs { "%{include_dir.glm}", "%{include_dir.glfw}", "%{include_dir.glad}", "%{include_dir.imgui}", "%{include_dir.imgui_backends}", "%{include_dir.imguizmo}", "%{include_dir.toml11}", "%{include_dir.nlohmann}", "%{include_dir.stb}", } links { "glfw", "glad", "imgui", "imguizmo", } filter { "system:macosx or system:linux", "files:src/platform/vulkan/**" } buildoptions "-Wno-missing-field-initializers" filter {} filter "system:windows" systemversion "latest" defines "NOMINMAX" -- glad drags in windows.h, whose min/max macros eat std::min/std::max usestandardpreprocessor "On" -- msvc only knows __VA_OPT__ (log.h) with its conforming preprocessor conformancemode "On" buildoptions "/utf-8" links "opengl32" if vulkan_sdk then externalincludedirs (vulkan_sdk .. "/Include") libdirs (vulkan_sdk .. "/Lib") -- delay-loaded, so a box without a Vulkan driver still starts (on OpenGL) -- instead of the loader refusing to run the exe at all links { "vulkan-1", "delayimp" } linkoptions "/DELAYLOAD:vulkan-1.dll" else defines "DONUT_NO_VULKAN" removefiles "src/platform/vulkan/**" end filter "system:macosx" files "src/**.mm" prebuildcommands 'bash "%{wks.location}/tools/compile-shaders.sh"' externalincludedirs "/opt/homebrew/include" libdirs "/opt/homebrew/lib" links { "Cocoa.framework", "IOKit.framework", "CoreFoundation.framework", "QuartzCore.framework", "Metal.framework", "Foundation.framework", "vulkan", } filter "configurations:debug" defines "DONUT_DEBUG" filter "configurations:release" defines "DONUT_RELEASE" filter "configurations:dist" defines "DONUT_DIST" filter {}