build system update
This commit is contained in:
Vendored
+2
-2
@@ -41,8 +41,8 @@
|
|||||||
"LD_LIBRARY_PATH": "/home/caleb/.local/share/vulkan-sdk/1.4.357.1/x86_64/lib/VulkanLoader/lib:/home/caleb/.local/share/vulkan-sdk/1.4.357.1/x86_64/lib",
|
"LD_LIBRARY_PATH": "/home/caleb/.local/share/vulkan-sdk/1.4.357.1/x86_64/lib/VulkanLoader/lib:/home/caleb/.local/share/vulkan-sdk/1.4.357.1/x86_64/lib",
|
||||||
"VK_ADD_LAYER_PATH": "/home/caleb/.local/share/vulkan-sdk/1.4.357.1/x86_64/share/vulkan/explicit_layer.d"
|
"VK_ADD_LAYER_PATH": "/home/caleb/.local/share/vulkan-sdk/1.4.357.1/x86_64/share/vulkan/explicit_layer.d"
|
||||||
},
|
},
|
||||||
"cmake.buildDirectory": "${workspaceFolder}/build",
|
"cmake.useCMakePresets": "always",
|
||||||
"cmake.generator": "Ninja",
|
"cmake.copyCompileCommands": "${workspaceFolder}/build/compile_commands.json",
|
||||||
"cmake.configureOnOpen": true,
|
"cmake.configureOnOpen": true,
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
".clang-format": "yaml",
|
".clang-format": "yaml",
|
||||||
|
|||||||
+1
-3
@@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.22.2)
|
cmake_minimum_required(VERSION 3.25.2)
|
||||||
|
|
||||||
set(NAME sophia)
|
set(NAME sophia)
|
||||||
|
|
||||||
@@ -15,8 +15,6 @@ endif()
|
|||||||
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
message(STATUS "Debug build: enabling debug logging")
|
message(STATUS "Debug build: enabling debug logging")
|
||||||
else()
|
|
||||||
add_compile_definitions(NDEBUG)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"version": 6,
|
||||||
|
"configurePresets": [
|
||||||
|
{
|
||||||
|
"name": "base",
|
||||||
|
"hidden": true,
|
||||||
|
"generator": "Ninja",
|
||||||
|
"binaryDir": "${sourceDir}/build/${presetName}",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "debug",
|
||||||
|
"displayName": "Debug",
|
||||||
|
"inherits": "base",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_BUILD_TYPE": "Debug"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "release",
|
||||||
|
"displayName": "Release (with debug info)",
|
||||||
|
"inherits": "base",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "asan",
|
||||||
|
"displayName": "Debug + AddressSanitizer/UBSan",
|
||||||
|
"inherits": "debug",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_CXX_FLAGS": "-fsanitize=address,undefined -fno-omit-frame-pointer",
|
||||||
|
"CMAKE_C_FLAGS": "-fsanitize=address,undefined -fno-omit-frame-pointer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tsan",
|
||||||
|
"displayName": "Debug + ThreadSanitizer",
|
||||||
|
"inherits": "debug",
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_CXX_FLAGS": "-fsanitize=thread",
|
||||||
|
"CMAKE_C_FLAGS": "-fsanitize=thread"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"buildPresets": [
|
||||||
|
{
|
||||||
|
"name": "debug",
|
||||||
|
"configurePreset": "debug"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "release",
|
||||||
|
"configurePreset": "release"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "asan",
|
||||||
|
"configurePreset": "asan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tsan",
|
||||||
|
"configurePreset": "tsan"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -8,17 +8,21 @@ COMING SOON
|
|||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
|
|
||||||
- [cmake](https://cmake.org/)
|
- [cmake](https://cmake.org/) 3.25+
|
||||||
|
- [Ninja](https://ninja-build.org/)
|
||||||
- [Vulkan SDK](https://vulkan.lunarg.com/) - With validation layers
|
- [Vulkan SDK](https://vulkan.lunarg.com/) - With validation layers
|
||||||
|
|
||||||
### Build instructions
|
### Build instructions
|
||||||
|
|
||||||
|
Builds use the presets in `CMakePresets.json` (`debug`, `release`), each in its own `build/<preset>` directory:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
|
cmake --preset debug
|
||||||
cd build
|
cmake --build --preset debug
|
||||||
make -j
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Or with the dev helper: `dev build [preset] [--fresh]`.
|
||||||
|
|
||||||
## Third Party libraries used
|
## Third Party libraries used
|
||||||
|
|
||||||
- [GLFW](https://github.com/glfw/glfw) - Window and input handling
|
- [GLFW](https://github.com/glfw/glfw) - Window and input handling
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ WAIT_FOR_PROCESS = "wait_for_process"
|
|||||||
class DevHelper:
|
class DevHelper:
|
||||||
SHADER_EXTENSIONS = (".vert", ".frag", ".comp", ".geom", ".tesc", ".tese")
|
SHADER_EXTENSIONS = (".vert", ".frag", ".comp", ".geom", ".tesc", ".tese")
|
||||||
PROJECT_NAME = "sophia"
|
PROJECT_NAME = "sophia"
|
||||||
|
DEFAULT_PRESET = "debug"
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.last_exit_status = 0
|
self.last_exit_status = 0
|
||||||
@@ -39,9 +40,29 @@ class DevHelper:
|
|||||||
return method(*rest, **kwargs)
|
return method(*rest, **kwargs)
|
||||||
|
|
||||||
# Primary command wrappers
|
# Primary command wrappers
|
||||||
|
|
||||||
|
##
|
||||||
|
# Configures and builds a CMake preset (see CMakePresets.json).
|
||||||
|
# dev build [preset] [--fresh]
|
||||||
|
# The preset defaults to debug and builds into build/<preset>. --fresh
|
||||||
|
# discards the preset's CMake cache before configuring.
|
||||||
def build(self, *args, **kwargs):
|
def build(self, *args, **kwargs):
|
||||||
command = f"rm -rf build && cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug"
|
preset, fresh = self._parse_preset_args(args, "build")
|
||||||
self._exec_in_root(command, replace=True)
|
self._build_preset(preset, fresh)
|
||||||
|
|
||||||
|
##
|
||||||
|
# Builds the debug preset (incrementally), then runs the testbed from
|
||||||
|
# build/debug. Any arguments are passed through to the testbed.
|
||||||
|
# dev testbed [args...]
|
||||||
|
def testbed(self, *args, **kwargs):
|
||||||
|
preset = self.DEFAULT_PRESET
|
||||||
|
self._build_preset(preset, fresh=False)
|
||||||
|
|
||||||
|
preset_dir = os.path.join(self._project_root(), "build", preset)
|
||||||
|
binary = os.path.join(preset_dir, "bin", "testbed")
|
||||||
|
print(f"Running: {shlex.join([binary, *args])}")
|
||||||
|
os.chdir(preset_dir)
|
||||||
|
os.execv(binary, [binary, *args])
|
||||||
|
|
||||||
##
|
##
|
||||||
# Checks out a branch named after a Gitea issue URL.
|
# Checks out a branch named after a Gitea issue URL.
|
||||||
@@ -149,6 +170,52 @@ class DevHelper:
|
|||||||
if not name.startswith("_") and name != "call" and callable(getattr(DevHelper, name))
|
if not name.startswith("_") and name != "call" and callable(getattr(DevHelper, name))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _parse_preset_args(self, args, command):
|
||||||
|
preset = None
|
||||||
|
fresh = False
|
||||||
|
for arg in args:
|
||||||
|
if arg == "--fresh":
|
||||||
|
fresh = True
|
||||||
|
elif arg.startswith("-"):
|
||||||
|
raise ValueError(f"Unknown option: {arg}")
|
||||||
|
elif preset is None:
|
||||||
|
preset = arg
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Usage: dev {command} [preset] [--fresh]")
|
||||||
|
|
||||||
|
preset = preset or self.DEFAULT_PRESET
|
||||||
|
presets = self._configure_presets()
|
||||||
|
if preset not in presets:
|
||||||
|
raise ValueError(f"Unknown preset: {preset} (available: {', '.join(presets)})")
|
||||||
|
return preset, fresh
|
||||||
|
|
||||||
|
def _configure_presets(self):
|
||||||
|
with open(os.path.join(self._project_root(), "CMakePresets.json")) as f:
|
||||||
|
presets = json.load(f)["configurePresets"]
|
||||||
|
return [preset["name"] for preset in presets if not preset.get("hidden")]
|
||||||
|
|
||||||
|
def _build_preset(self, preset, fresh):
|
||||||
|
configure = ["cmake", "--preset", preset]
|
||||||
|
if fresh:
|
||||||
|
configure.append("--fresh")
|
||||||
|
self._run_in_root(configure)
|
||||||
|
self._copy_compile_commands(preset)
|
||||||
|
self._run_in_root(["cmake", "--build", "--preset", preset])
|
||||||
|
|
||||||
|
# Editor tooling reads build/compile_commands.json, so point it at the
|
||||||
|
# most recently configured preset.
|
||||||
|
def _copy_compile_commands(self, preset):
|
||||||
|
build_dir = os.path.join(self._project_root(), "build")
|
||||||
|
source = os.path.join(build_dir, preset, "compile_commands.json")
|
||||||
|
if os.path.isfile(source):
|
||||||
|
shutil.copyfile(source, os.path.join(build_dir, "compile_commands.json"))
|
||||||
|
|
||||||
|
def _run_in_root(self, command):
|
||||||
|
print(f"Running: {shlex.join(command)}")
|
||||||
|
result = subprocess.run(command, cwd=self._project_root())
|
||||||
|
if result.returncode != 0:
|
||||||
|
sys.exit(result.returncode)
|
||||||
|
|
||||||
def _parse_issue_url(self, url):
|
def _parse_issue_url(self, url):
|
||||||
match = re.match(r"^(https?://[^/]+)/([^/]+)/([^/]+)/issues/(\d+)", url)
|
match = re.match(r"^(https?://[^/]+)/([^/]+)/([^/]+)/issues/(\d+)", url)
|
||||||
if match is None:
|
if match is None:
|
||||||
|
|||||||
Reference in New Issue
Block a user