output_dir = "%{cfg.buildcfg}-%{cfg.system}" 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 "configurations:debug" runtime "Debug" symbols "On" filter { "configurations:release", "configurations:dist" } runtime "Release" optimize "Speed" filter "configurations:dist" symbols "Off" filter {} end function setup_cpp_target() setup_target() filter "configurations:debug" runtime "Debug" symbols "On" filter { "configurations:release", "configurations:dist" } runtime "Release" optimize "Speed" 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 } 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" 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_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" 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" } buildoptions { "-Wall", "-Wextra", "-Werror", "-pedantic", } filter {} filter { "system:macosx or system:linux", "files:src/platform/vulkan/**" } buildoptions "-Wno-missing-field-initializers" filter {} filter "system:windows" systemversion "latest" links "opengl32.lib" 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 {}