Compare commits

..

11 commits

Author SHA1 Message Date
ec5483d13f refactor(ci): fix shellcheck analysis
Some checks reported errors
continuous-integration/drone/push Build was killed
2025-10-16 14:42:23 +03:30
598e1b232d ci: add shell check 2025-10-16 14:41:33 +03:30
3f5a85197a style: format tools/cmake files 2025-10-16 14:41:33 +03:30
479a15bfd0 style: format shell scripts 2025-10-16 14:41:30 +03:30
30548ea4db ci: add shell_format check 2025-10-16 14:40:11 +03:30
9de1bc7ba7 chore: remove test.sh 2025-10-16 14:40:11 +03:30
4b5d380a0e style: apply cmake-format to all cmake files 2025-10-16 14:40:11 +03:30
2612a19f3c ci: add cmake_format check 2025-10-16 14:40:11 +03:30
bd8a111607 refactor: fix some static analysis errors 2025-10-16 14:40:11 +03:30
3066153d6c refactor: fix some static analyzer errors 2025-10-16 14:40:11 +03:30
d5dc37d081 chore: remove build_ci_images.sh 2025-10-16 14:40:11 +03:30
37 changed files with 429 additions and 451 deletions

View file

@ -31,7 +31,7 @@ steps:
- ./tools/ci/amd64/gcc/unit_tests.sh
- name: valgrind
image: ci:latest
image: ci:latest
pull: if-not-exists
commands:
- ./tools/ci/amd64/gcc/valgrind.sh
@ -55,7 +55,7 @@ steps:
- ./tools/ci/amd64/clang/coverage.sh
- name: leak sanitizer
image: ci:latest
image: ci:latest
pull: if-not-exists
commands:
- ./tools/ci/amd64/clang/lsan.sh
@ -76,18 +76,36 @@ trigger:
steps:
- name: clang tidy
image: ci:latest
image: ci:latest
pull: if-not-exists
privileged: true
commands:
- ./tools/ci/static_analysis/clang_tidy.sh
- name: shell check
image: ci:latest
pull: if-not-exists
commands:
- ./tools/ci/static_analysis/shell_check.sh
- name: clang format
image: ci:latest
image: ci:latest
pull: if-not-exists
commands:
- ./tools/ci/static_analysis/clang_format.sh
- name: cmake format
image: ci:latest
pull: if-not-exists
commands:
- ./tools/ci/static_analysis/cmake_format.sh
- name: shell format
image: ci:latest
pull: if-not-exists
commands:
- ./tools/ci/static_analysis/shell_format.sh
---
kind: pipeline
type: docker

View file

@ -7,20 +7,20 @@ add_subdirectory(./time)
add_subdirectory(./logger)
add_subdirectory(./debug)
add_subdirectory(./math)
#
#
add_subdirectory(./asset_baker)
add_subdirectory(./assets)
#
#
add_subdirectory(./camera)
add_subdirectory(./input)
# add_subdirectory(./ui)
#
#
add_subdirectory(./surface)
add_subdirectory(./renderer)
add_subdirectory(./ecs)
#
#
add_subdirectory(./app)
# apps
# apps
add_subdirectory(./mirror)
add_subdirectory(test)

View file

@ -1,2 +1,5 @@
add_library_module(app application.cpp)
target_link_libraries(app PUBLIC memory PRIVATE lt_debug)
target_link_libraries(
app
PUBLIC memory
PRIVATE lt_debug)

View file

@ -1,18 +1,6 @@
add_library_module(libasset_baker
bakers.cpp
)
target_link_libraries(libasset_baker
PUBLIC
assets
logger
lt_debug
tbb
)
add_test_module(libasset_baker
bakers.test.cpp
)
add_library_module(libasset_baker bakers.cpp)
target_link_libraries(libasset_baker PUBLIC assets logger lt_debug tbb)
add_test_module(libasset_baker bakers.test.cpp)
add_executable_module(asset_baker
entrypoint/baker.cpp
)
add_executable_module(asset_baker entrypoint/baker.cpp)
target_link_libraries(asset_baker PRIVATE libasset_baker)

View file

@ -1,7 +1,2 @@
#include <asset_baker/bakers.hpp>
#include <test/test.hpp>
using ::lt::test::Case;
using ::lt::test::Suite;
// TODO(Light): add asset baking tests!

View file

@ -1,14 +1,5 @@
add_library_module(assets
shader.cpp
)
add_library_module(assets shader.cpp)
target_link_libraries(
assets
PUBLIC
logger
lt_debug
)
target_link_libraries(assets PUBLIC logger lt_debug)
add_test_module(assets
shader.test.cpp
)
add_test_module(assets shader.test.cpp)

View file

@ -1,3 +1,4 @@
add_library_module(lt_debug instrumentor.cpp)
target_link_libraries(lt_debug PUBLIC logger)
target_precompile_headers(lt_debug PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/private/pch.hpp)
target_precompile_headers(lt_debug PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/private/pch.hpp)

View file

@ -8,7 +8,6 @@ using lt::test::expect_unreachable;
using lt::test::Suite;
using lt::test::expect_eq;
using lt::test::expect_ne;
using lt::test::expect_false;
using lt::test::expect_true;

View file

@ -1,21 +1,9 @@
add_library_module(libmirror
)
target_link_libraries(
libmirror
INTERFACE
app
time
input
surface
renderer
)
add_library_module(libmirror)
target_link_libraries(libmirror INTERFACE app time input surface renderer)
add_test_module(libmirror
layers/editor_layer.test.cpp
panels/asset_browser.test.cpp
panels/properties.test.cpp
panels/scene_hierarchy.test.cpp
)
add_test_module(
libmirror layers/editor_layer.test.cpp panels/asset_browser.test.cpp
panels/properties.test.cpp panels/scene_hierarchy.test.cpp)
add_executable_module(mirror entrypoint/mirror.cpp)
target_link_libraries(mirror PRIVATE libmirror input)

View file

@ -24,6 +24,10 @@ void renderer_callback(
std::any &user_data
)
{
std::ignore = message_severity;
std::ignore = message_type;
std::ignore = user_data;
log_dbg("RENDERER CALLBACK: {}", data.message);
}
@ -204,7 +208,6 @@ public:
);
auto entity = ecs::Entity { m_editor_registry, m_window };
memory::Ref<app::SystemStats> system_stats = nullptr;
m_renderer_system = std::make_shared<renderer::System>(renderer::System::CreateInfo {
.config = { .target_api = renderer::Api::vulkan, .max_frames_in_flight = 3u },

View file

@ -1,6 +1,6 @@
add_library_module(renderer
add_library_module(
renderer
system.cpp
# Vulkan - backend
backend/vk/messenger.cpp
backend/vk/context/device.cpp
@ -18,27 +18,17 @@ add_library_module(renderer
frontend/context/surface.cpp
frontend/context/swapchain.cpp
frontend/renderer/renderer.cpp
frontend/renderer/pass.cpp
)
frontend/renderer/pass.cpp)
target_link_libraries(renderer
PUBLIC
app
ecs
memory
assets
time
bitwise
PRIVATE
surface
pthread
)
target_link_libraries(
renderer
PUBLIC app ecs memory assets time bitwise
PRIVATE surface pthread)
add_test_module(renderer
add_test_module(
renderer
test/utils.cpp
system.test.cpp
# general backend tests through the frontend
frontend/messenger.test.cpp
frontend/context/surface.test.cpp
@ -46,17 +36,9 @@ add_test_module(renderer
frontend/context/swapchain.test.cpp
frontend/renderer/pass.test.cpp
frontend/renderer/renderer.test.cpp
# backend specific tests -- vk
backend/vk/context/instance.test.cpp
# backend specific tests -- dx
# backend specific tests -- mt
)
target_link_libraries(renderer_tests
PRIVATE
surface
pthread
# backend specific tests -- dx backend specific tests -- mt
)
target_link_libraries(renderer_tests PRIVATE surface pthread)

View file

@ -10,15 +10,16 @@ Pass::Pass(
const lt::assets::ShaderAsset &vertex_shader,
const lt::assets::ShaderAsset &fragment_shader
)
: m_device(static_cast<Device *>(device)), m_layout(m_device->create_pipeline_layout(
VkPipelineLayoutCreateInfo {
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
.setLayoutCount = 0u,
.pSetLayouts = nullptr,
.pushConstantRangeCount = 0u,
.pPushConstantRanges = nullptr,
}
))
: m_device(static_cast<Device *>(device))
, m_layout(m_device->create_pipeline_layout(
VkPipelineLayoutCreateInfo {
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
.setLayoutCount = 0u,
.pSetLayouts = nullptr,
.pushConstantRangeCount = 0u,
.pPushConstantRanges = nullptr,
}
))
{
auto *vertex_module = create_module(
vertex_shader.unpack(lt::assets::ShaderAsset::BlobTag::code)
@ -111,7 +112,6 @@ Pass::Pass(
.blendConstants = { 0.0f, 0.0, 0.0, 0.0 },
};
auto attachment_description = VkAttachmentDescription {
.format = static_cast<Swapchain *>(swapchain)->get_format(),

View file

@ -46,8 +46,7 @@ System::System(CreateInfo info)
) };
}
System::~System()
= default;
System::~System() = default;
void System::on_register()
{

View file

@ -1,2 +1,3 @@
add_library(std INTERFACE)
target_precompile_headers(std INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/public/pch.hpp)
target_precompile_headers(std INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/public/pch.hpp)

View file

@ -14,7 +14,6 @@
#include <cfenv>
#include <cfloat>
#include <cinttypes>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>

View file

@ -1,4 +1,4 @@
if (NOT WIN32)
if(NOT WIN32)
add_library_module(surface linux/system.cpp)
target_link_libraries(surface PRIVATE X11)
@ -7,17 +7,10 @@ else(WIN32)
endif()
target_link_libraries(surface PUBLIC
ecs
app
math
memory
tbb
PRIVATE
logger
lt_debug
time
)
target_link_libraries(
surface
PUBLIC ecs app math memory tbb
PRIVATE logger lt_debug time)
add_test_module(surface system.test.cpp)
add_fuzz_module(surface system.fuzz.cpp)

View file

@ -4,10 +4,7 @@
namespace lt::surface {
System::System(
memory::Ref<ecs::Registry> registry,
memory::Ref<app::EventMediator> event_mediator
)
System::System(memory::Ref<ecs::Registry> registry, memory::Ref<app::EventMediator> event_mediator)
: m_registry(std::move(registry))
, m_event_mediator(std::move(event_mediator))
{

View file

@ -1,38 +0,0 @@
#!/bin/bash
find . -type f \( -name "*.cpp" -o -name "*.hpp" \) -print0 | while IFS= read -r -d '' file; do
scope=false
ref=false
if grep -Eq "Scope\s*<" "$file"; then
scope=true
sed -i -E 's/(Scope)(\s*<)/memory::\1\2/g' "$file"
fi
if grep -Eq "Ref\s*<" "$file"; then
ref=true
sed -i -E 's/(Ref)(\s*<)/memory::\1\2/g' "$file"
fi
if grep -Eq "\bcreate_scope\b" "$file"; then
scope=true
sed -i -E 's/\b(create_scope)\b/memory::\1/g' "$file"
fi
if grep -Eq "\bcreate_ref\b" "$file"; then
ref=true
sed -i -E 's/\b(create_ref)\b/memory::\1/g' "$file"
fi
if $scope || $ref; then
includes=""
$scope && includes+="#include <memory/scope.hpp>\n"
$ref && includes+="#include <memory/reference.hpp>\n"
tmp=$(mktemp)
if [[ "$file" =~ \.hpp$ ]] && pragma_line=$(grep -En -m1 '^#pragma once' "$file" | cut -d: -f1); then
insert_line=$((pragma_line + 2))
else
insert_line=1
fi
head -n $((insert_line - 1)) "$file" > "$tmp"
echo -e "$includes" >> "$tmp"
tail -n +$insert_line "$file" >> "$tmp"
mv "$tmp" "$file"
clang-format -i "$file"
fi
done

View file

@ -1,7 +1,7 @@
add_library_module(test test.cpp entrypoint.cpp)
add_library_module(fuzz_test test.cpp fuzz.cpp)
target_link_libraries(test PUBLIC tbb)
target_link_libraries(fuzz_test PUBLIC tbb)
target_link_libraries(test PUBLIC tbb logger)
target_link_libraries(fuzz_test PUBLIC tbb logger)
add_test_module(test test.test.cpp)

View file

@ -1,3 +1,4 @@
#include <logger/logger.hpp>
#include <test/test.hpp>
using namespace ::lt::test;
@ -84,14 +85,14 @@ try
}
catch (const std::exception &exp)
{
std::println("Terminated due to uncaught exception:");
std::println("\twhat: {}", exp.what());
log_crt("Terminated due to uncaught exception:");
log_crt("\twhat: {}", exp.what());
return EXIT_FAILURE;
}
catch (...)
{
std::println("Terminated due to uncaught non-std exception!");
log_crt("Terminated due to uncaught non-std exception!");
return EXIT_FAILURE;
}

View file

@ -1,4 +1,3 @@
add_library_module(time timer.cpp)
target_link_libraries(time PUBLIC tbb)
add_test_module(time timer.test.cpp)

View file

@ -4,7 +4,6 @@
#include <ui/ui.hpp>
#ifdef LIGHT_PLATFORM_WINDOWS
#include <renderer/dx/shared_context.hpp>
#include <renderer/dx/user_interface.hpp>
#endif
@ -14,7 +13,6 @@
#include <input/events/keyboard.hpp>
#include <input/events/mouse.hpp>
#include <input/key_codes.hpp>
#include <renderer/graphics_context.hpp>
#include <utility>
@ -27,8 +25,7 @@ namespace lt {
UserInterface *UserInterface::s_context = nullptr;
auto UserInterface::create(memory::Ref<SharedContext> sharedContext)
-> memory::Scope<UserInterface>
auto UserInterface::create(memory::Ref<SharedContext> sharedContext) -> memory::Scope<UserInterface>
{
auto scopeUserInterface = memory::Scope<UserInterface> { nullptr };

View file

@ -11,8 +11,7 @@ class SharedContext;
class UserInterface
{
public:
static auto create(memory::Ref<SharedContext> sharedContext)
-> memory::Scope<UserInterface>;
static auto create(memory::Ref<SharedContext> sharedContext) -> memory::Scope<UserInterface>;
static void dockspace_begin();

View file

@ -1,50 +1,59 @@
#!/bin/bash
set -e
cd $(git rev-parse --show-toplevel)/
rm -rf ./build && mkdir build/
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
CC=$(which clang)
export CC
CXX=$(which clang++)
export CXX
DISPLAY=:99
export DISPLAY
Xvfb :99 -screen 0 1024x768x16 &
export CXX=$(which clang++)
export CC=$(which clang)
export DISPLAY=:99
cmake . \
-Bbuild \
-GNinja \
-DCMAKE_LINKER_TYPE=MOLD \
-DENABLE_UNIT_TESTS=ON \
-DENABLE_LLVM_COVERAGE=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="-std=c++23 -stdlib=libc++ -g -fno-omit-frame-pointer" \
&& cmake --build ./build -j `nproc`
cmake \
-S . \
-B build \
-G Ninja \
-D CMAKE_LINKER_TYPE=MOLD \
-D ENABLE_UNIT_TESTS=ON \
-D ENABLE_LLVM_COVERAGE=ON \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_CXX_FLAGS="-std=c++23 -stdlib=libc++ -g -fno-omit-frame-pointer"
mkdir -p ./build/coverage/
for test in $(find ./build -type f -name '*_tests' -executable); do
export LLVM_PROFILE_FILE="./build/coverage/$(basename "$(dirname "$test")").profraw";
echo ${LLVM_PROFILE_FILE} >> ./build/coverage/list;
cmake --build ./build -j"$(nproc)"
mkdir -p ./build/coverage/
while IFS= read -r -d '' test; do
LLVM_PROFILE_FILE="./build/coverage/$(basename "$(dirname "$test")").profraw"
export LLVM_PROFILE_FILE
echo "${LLVM_PROFILE_FILE}" >>./build/coverage/list
gdb \
--return-child-result \
-ex='set confirm off' \
-ex='set pagination off' \
-ex='run' \
-ex='bt full' \
-ex='quit' \
-q \
"$test"
done
--return-child-result \
-ex='set confirm off' \
-ex='set pagination off' \
-ex='run' \
-ex='bt full' \
-ex='quit' \
-q \
"$test"
done < <(find ./build -type f -name '*_tests' -executable -print0)
llvm-profdata merge --input-files './build/coverage/list' -o "./build/coverage/merged.profdata"
llvm-profdata merge --input-files './build/coverage/list' -o "./build/coverage/merged.profdata"
find ./build/modules -type f -name "*.profraw" -exec rm -fv {} +
LLVM_COV_SHOW=$(llvm-cov show \
LLVM_COV_SHOW=$(
llvm-cov show \
-instr-profile='./build/coverage/merged.profdata' \
$(find ./build -type f -name '*_tests' -executable -exec printf -- '-object %s ' {} \;) \
$(find ./build -type f -name '*\.a' -exec printf -- '-object %s ' {} \;) \
"$(find ./build -type f -name '*_tests' -executable -exec printf -- '-object %s ' {} \;)" \
"$(find ./build -type f -name '*\.a' -exec printf -- '-object %s ' {} \;)" \
-ignore-filename-regex='\.test\.cpp$' \
-ignore-filename-regex='\.fuzz\.cpp$'
)
echo "${LLVM_COV_SHOW}" > './build/coverage/coverage.txt'
echo "${LLVM_COV_SHOW}" >'./build/coverage/coverage.txt'
cd ./build/coverage/ && wget -qO- "https://codecov.io/bash" | bash

View file

@ -1,21 +1,33 @@
#!/bin/bash
set -e
cd $(git rev-parse --show-toplevel)/
rm -rf ./build && mkdir build/
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
CC=$(which clang)
export CC
CXX=$(which clang++)
export CXX
DISPLAY=:99
export DISPLAY
LSAN_OPTIONS="suppressions=$(git rev-parse --show-toplevel)/tools/ci/amd64/clang/lsan.supp:fast_unwind_on_malloc=0:verbosity=1:report_objects=1"
export LSAN_OPTIONS
LSAN_SYMBOLIZER_PATH="$(which llvm-symbolizer)"
export LSAN_SYMBOLIZER_PATH
Xvfb :99 -screen 0 1024x768x16 &
export CXX=$(which clang++)
export CC=$(which clang)
export DISPLAY=:99
cmake . \
-Bbuild \
-GNinja \
-DCMAKE_LINKER_TYPE=MOLD \
-DENABLE_UNIT_TESTS=ON \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_FLAGS=" \
cmake \
-S . \
-B build \
-G Ninja \
-D CMAKE_LINKER_TYPE=MOLD \
-D ENABLE_UNIT_TESTS=ON \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_CXX_FLAGS=" \
-fsanitize=leak \
-fno-common \
-g \
@ -23,17 +35,16 @@ cmake . \
-std=c++23 \
-nostdinc++ \
-isystem /libcxx_lsan/include/c++/v1/" \
-DCMAKE_EXE_LINKER_FLAGS=" \
-D CMAKE_EXE_LINKER_FLAGS=" \
-fsanitize=leak \
-L/libcxx_lsan/lib \
-lc++ \
-lc++abi \
-Wl,-rpath,/libcxx_lsan/lib" \
&& cmake --build ./build --target='renderer_tests' -j`nproc`
-Wl,-rpath,/libcxx_lsan/lib"
export LSAN_OPTIONS="suppressions=$(git rev-parse --show-toplevel)/tools/ci/amd64/clang/lsan.supp:fast_unwind_on_malloc=0:verbosity=1:report_objects=1"
export LSAN_SYMBOLIZER_PATH="$(which llvm-symbolizer)"
for test in $(find ./build -type f -name '*_tests' -executable); do
cmake --build ./build --target='renderer_tests' -j"$(nproc)"
while IFS= read -r -d '' test; do
echo "Running $test"
"$test"
done
done < <(find ./build -type f -name '*_tests' -executable -print0)

View file

@ -1,21 +1,27 @@
#!/bin/bash
set -e
cd $(git rev-parse --show-toplevel)/
rm -rf ./build && mkdir build/
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
CC=$(which clang)
export CC
CXX=$(which clang++)
export CXX
DISPLAY=:99
export DISPLAY
Xvfb :99 -screen 0 1024x768x16 &
export CXX=$(which clang++)
export CC=$(which clang)
export DISPLAY=:99
cmake . \
-Bbuild \
-GNinja \
-DCMAKE_LINKER_TYPE=MOLD \
-DENABLE_UNIT_TESTS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS=" \
cmake \
-S . \
-B build \
-G Ninja \
-D CMAKE_LINKER_TYPE=MOLD \
-D ENABLE_UNIT_TESTS=ON \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_CXX_FLAGS=" \
-fsanitize=memory \
-fsanitize-memory-track-origins \
-g \
@ -23,16 +29,17 @@ cmake . \
-std=c++23 \
-nostdinc++ \
-isystem /libcxx_msan/include/c++/v1/" \
-DCMAKE_EXE_LINKER_FLAGS=" \
-D CMAKE_EXE_LINKER_FLAGS=" \
-fsanitize=memory \
-fsanitize-memory-track-origins \
-L/libcxx_msan/lib \
-lc++ \
-lc++abi \
-Wl,-rpath,/libcxx_msan/lib" \
&& cmake --build ./build -j`nproc`
-Wl,-rpath,/libcxx_msan/lib"
for test in $(find ./build -type f -name '*_tests' -executable); do
echo "Running $test"
"$test"
done
cmake --build ./build -j"$(nproc)"
while IFS= read -r -d '' test; do
echo "Running $test"
"$test"
done < <(find ./build -type f -name '*_tests' -executable -print0)

View file

@ -1,33 +1,41 @@
#!/bin/bash
set -e
cd $(git rev-parse --show-toplevel)/
rm -rf ./build && mkdir build/
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
CC=$(which gcc)
export CC
CXX=$(which g++)
export CXX
DISPLAY=:99
export DISPLAY
Xvfb :99 -screen 0 1024x768x16 &
export CXX=$(which g++)
export CC=$(which gcc)
export DISPLAY=:99
# gcc uses libstdc++ by default
cmake . \
-Bbuild \
-GNinja \
-DCMAKE_LINKER_TYPE=MOLD \
-DENABLE_UNIT_TESTS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="-std=c++23 -g -fno-omit-frame-pointer" \
&& cmake --build ./build -j `nproc`
cmake \
-S . \
-B build \
-G Ninja \
-D CMAKE_LINKER_TYPE=MOLD \
-D ENABLE_UNIT_TESTS=ON \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_CXX_FLAGS="-std=c++23 -g -fno-omit-frame-pointer"
for test in $(find ./build -type f -name '*_tests' -executable); do
cmake --build ./build -j"$(nproc)"
while IFS= read -r -d '' test; do
echo "Running $test"
gdb \
--return-child-result \
-ex='set confirm off' \
-ex='set pagination off' \
-ex='run' \
-ex='bt full' \
-ex='quit' \
-q \
"$test"
done
--return-child-result \
-ex='set confirm off' \
-ex='set pagination off' \
-ex='run' \
-ex='bt full' \
-ex='quit' \
-q \
"$test"
done < <(find ./build -type f -name '*_tests' -executable -print0)

View file

@ -1,35 +1,45 @@
#!/bin/bash
export DEBUGINFOD_URLS="https://debuginfod.archlinux.org/"
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
set -e
cd $(git rev-parse --show-toplevel)/
rm -rf ./build && mkdir build/
CC=$(which gcc)
export CC
CXX=$(which g++)
export CXX
DISPLAY=:99
export DISPLAY
DEBUGINFOD_URLS="https://debuginfod.archlinux.org/"
export DEBUGINFOD_URLS
Xvfb :99 -screen 0 1024x768x16 &
export CXX=$(which g++)
export CC=$(which gcc)
export DISPLAY=:99
# gcc uses libstdc++ by default
cmake . \
-Bbuild \
-GNinja \
-DCMAKE_LINKER_TYPE=MOLD \
-DENABLE_UNIT_TESTS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="-std=c++23 -fno-omit-frame-pointer -fno-common -g" \
&& cmake --build ./build -j `nproc`
cmake \
-S . \
-B build \
-G Ninja \
-D CMAKE_LINKER_TYPE=MOLD \
-D ENABLE_UNIT_TESTS=ON \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_CXX_FLAGS="-std=c++23 -fno-omit-frame-pointer -fno-common -g"
for test in $(find ./build -type f -name '*_tests' -executable); do
cmake --build ./build -j"$(nproc)"
while IFS= read -r -d '' test; do
echo "Running $test"
valgrind \
--leak-check=full \
--show-leak-kinds=all \
--track-origins=yes \
--verbose \
--num-callers=50 \
--gen-suppressions=all \
--suppressions='./tools/ci/amd64/gcc/valgrind.supp' \
--error-exitcode=255 ${test} || exit 1
done
--leak-check=full \
--show-leak-kinds=all \
--track-origins=yes \
--verbose \
--num-callers=50 \
--gen-suppressions=all \
--suppressions='./tools/ci/amd64/gcc/valgrind.supp' \
--error-exitcode=255 "${test}" || exit 1
done < <(find ./build -type f -name '*_tests' -executable -print0)

View file

@ -1,19 +1,19 @@
#!/bin/bash
set -e
cd $(git rev-parse --show-toplevel)/
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
has_fomatting_issues=0
for file in $(find ./modules -name '*.?pp'); do
echo "Checking format for $file"
if ! clang-format --dry-run --Werror "$file"; then
echo "❌ Formatting issue detected in $file"
has_fomatting_issues=1
fi
done
while IFS= read -r -d '' file; do
echo "Checking format for $file"
if ! clang-format --dry-run --Werror "$file"; then
echo "❌ Formatting issue detected in $file"
has_fomatting_issues=1
fi
done < <(find ./modules -name '*.?pp' -print0)
if [ "$has_fomatting_issues" -eq 0 ]; then
echo "✅ All files are properly formatted! Well done! ^~^"
echo "✅ All files are properly formatted! Well done! ^~^"
fi
exit ${has_fomatting_issues}

View file

@ -1,17 +1,22 @@
#!/bin/bash
set -e
cd $(git rev-parse --show-toplevel)/
rm -rf ./build && mkdir build/ && cd build
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
export CC=$(which clang)
export CXX=$(which clang++)
CC=$(which clang)
export CC
cmake .. \
-G Ninja \
-DCMAKE_LINKER_TYPE=MOLD \
-DENABLE_UNIT_TESTS=ON \
-DENABLE_STATIC_ANALYSIS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="-std=c++23 -stdlib=libc++" \
&& cmake --build . -j `nproc`
CXX=$(which clang++)
export CXX
cmake \
-S . \
-B build \
-G Ninja \
-D CMAKE_LINKER_TYPE=MOLD \
-D ENABLE_UNIT_TESTS=ON \
-D ENABLE_STATIC_ANALYSIS=ON \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_CXX_FLAGS="-std=c++23 -stdlib=libc++"
cmake --build . -j"$(nproc)"

View file

@ -0,0 +1,19 @@
#!/usr/bin/env bash
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
has_formatting_issues=0
while IFS= read -r -d '' file; do
echo "Checking format for $file"
if ! cmake-format --check "$file"; then
echo "❌ Formatting issue detected in $file"
has_formatting_issues=1
fi
done < <(find ./modules ./tools/cmake -type f \( -name 'CMakeLists.txt' -o -name '*.cmake' \) -print0)
if [ "$has_formatting_issues" -ne 0 ]; then
echo "✅ All files are properly formatted! Well done! ^~^"
fi
exit ${has_formatting_issues}

View file

@ -0,0 +1,19 @@
#!/bin/bash
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
has_shellcheck_issues=0
while IFS= read -r -d '' file; do
echo "Checking shell script $file"
if ! shellcheck "$file"; then
echo "❌ Shellcheck issue detected in $file"
has_shellcheck_issues=1
fi
done < <(find ./modules ./tools -name '*.sh' -print0)
if [ "$has_shellcheck_issues" -eq 0 ]; then
echo "✅ All files are properly shellchecked! Well done! ^~^"
fi
exit ${has_shellcheck_issues}

View file

@ -0,0 +1,19 @@
#!/bin/bash
set -euo pipefail
cd "$(git rev-parse --show-toplevel)/"
has_fomatting_issues=0
while IFS= read -r -d '' file; do
echo "Checking format for $file"
if ! shfmt -i 4 -ci -d "$file"; then
echo "❌ Formatting issue detected in $file"
has_fomatting_issues=1
fi
done < <(find ./modules ./tools -name '*.sh' -print0)
if [ "$has_fomatting_issues" -eq 0 ]; then
echo "✅ All files are properly formatted! Well done! ^~^"
fi
exit ${has_fomatting_issues}

View file

@ -1,5 +1,5 @@
if(WIN32)
add_compile_definitions(LIGHT_PLATFORM_WINDOWS)
add_compile_definitions(LIGHT_PLATFORM_WINDOWS)
elseif(UNIX)
add_compile_definitions(LIGHT_PLATFORM_LINUX)
add_compile_definitions(LIGHT_PLATFORM_LINUX)
endif()

View file

@ -1,157 +1,140 @@
function (add_library_module libname)
function(add_library_module libname)
set(PUBLIC_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/public_includes")
file(MAKE_DIRECTORY "${PUBLIC_INCLUDE_DIR}")
file(CREATE_LINK
"${CMAKE_CURRENT_SOURCE_DIR}/public/"
"${PUBLIC_INCLUDE_DIR}/${libname}"
SYMBOLIC
)
file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/public/"
"${PUBLIC_INCLUDE_DIR}/${libname}" SYMBOLIC)
if ("${ARGN}" STREQUAL "") # Header only library
if("${ARGN}" STREQUAL "") # Header only library
message("Adding INTERFACE library ${libname}")
add_library(${libname} INTERFACE)
target_include_directories(${libname} INTERFACE ${PUBLIC_INCLUDE_DIR})
target_link_libraries(${libname} INTERFACE std)
else () # Compiled library
else() # Compiled library
set(source_files)
set(source_directory "${CMAKE_CURRENT_SOURCE_DIR}/private")
foreach (source_file ${ARGN})
foreach(source_file ${ARGN})
list(APPEND source_files "${source_directory}/${source_file}")
endforeach ()
endforeach()
message("Adding library ${libname} with source files: ${source_files}")
add_library(${libname} ${source_files})
set(PRIVATE_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/private_includes")
file(MAKE_DIRECTORY "${PRIVATE_INCLUDE_DIR}")
file(CREATE_LINK
"${CMAKE_CURRENT_SOURCE_DIR}/private/"
"${PRIVATE_INCLUDE_DIR}/${libname}"
SYMBOLIC
)
file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/private/"
"${PRIVATE_INCLUDE_DIR}/${libname}" SYMBOLIC)
target_include_directories(${libname}
target_include_directories(
${libname}
PUBLIC ${PUBLIC_INCLUDE_DIR}
PRIVATE ${PRIVATE_INCLUDE_DIR}
)
PRIVATE ${PRIVATE_INCLUDE_DIR})
target_link_libraries(${libname} PUBLIC std)
endif ()
endif()
endfunction ()
endfunction()
function (add_executable_module exename)
function(add_executable_module exename)
set(source_files)
set(source_directory "${CMAKE_CURRENT_SOURCE_DIR}/private")
foreach (source_file ${ARGN})
foreach(source_file ${ARGN})
list(APPEND source_files "${source_directory}/${source_file}")
endforeach ()
endforeach()
message("Adding executable ${exename} with source files: ${source_files}")
set(PUBLIC_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/public_includes")
file(MAKE_DIRECTORY "${PUBLIC_INCLUDE_DIR}")
file(CREATE_LINK
"${CMAKE_CURRENT_SOURCE_DIR}/public/"
"${PUBLIC_INCLUDE_DIR}/${exename}"
SYMBOLIC
)
file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/public/"
"${PUBLIC_INCLUDE_DIR}/${exename}" SYMBOLIC)
set(PRIVATE_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/private_includes")
file(MAKE_DIRECTORY "${PRIVATE_INCLUDE_DIR}")
file(CREATE_LINK
"${CMAKE_CURRENT_SOURCE_DIR}/private/"
"${PRIVATE_INCLUDE_DIR}${exename}"
SYMBOLIC
)
file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/private/"
"${PRIVATE_INCLUDE_DIR}${exename}" SYMBOLIC)
add_executable(${exename} ${source_files})
target_link_libraries(${exename} PRIVATE std)
target_include_directories(${exename} PRIVATE ${PUBLIC_INCLUDE_DIR} ${PRIVATE_INCLUDE_DIR})
endfunction ()
target_include_directories(${exename} PRIVATE ${PUBLIC_INCLUDE_DIR}
${PRIVATE_INCLUDE_DIR})
endfunction()
function (add_test_module target_lib_name)
if (NOT ${ENABLE_UNIT_TESTS})
function(add_test_module target_lib_name)
if(NOT ${ENABLE_UNIT_TESTS})
return()
endif ()
endif()
set(source_files)
set(source_directory "${CMAKE_CURRENT_SOURCE_DIR}/private")
foreach (source_file ${ARGN})
foreach(source_file ${ARGN})
list(APPEND source_files "${source_directory}/${source_file}")
endforeach ()
endforeach()
message("Adding test executable ${target_lib_name}_tests with source files: ${source_files}")
message(
"Adding test executable ${target_lib_name}_tests with source files: ${source_files}"
)
set(PUBLIC_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/public_includes")
file(MAKE_DIRECTORY "${PUBLIC_INCLUDE_DIR}")
file(CREATE_LINK
"${CMAKE_CURRENT_SOURCE_DIR}/public/"
"${PUBLIC_INCLUDE_DIR}/${target_lib_name}"
SYMBOLIC
)
file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/public/"
"${PUBLIC_INCLUDE_DIR}/${target_lib_name}" SYMBOLIC)
set(PRIVATE_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/private_includes")
file(MAKE_DIRECTORY "${PRIVATE_INCLUDE_DIR}")
file(CREATE_LINK
"${CMAKE_CURRENT_SOURCE_DIR}/private/"
"${PRIVATE_INCLUDE_DIR}/${target_lib_name}"
SYMBOLIC
)
file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/private/"
"${PRIVATE_INCLUDE_DIR}/${target_lib_name}" SYMBOLIC)
add_executable(${target_lib_name}_tests ${source_files})
target_link_libraries(${target_lib_name}_tests PRIVATE ${target_lib_name} std test)
target_include_directories(${target_lib_name}_tests
target_link_libraries(${target_lib_name}_tests PRIVATE ${target_lib_name}
std test)
target_include_directories(
${target_lib_name}_tests
PRIVATE ${PUBLIC_INCLUDE_DIR}
PRIVATE ${PRIVATE_INCLUDE_DIR}
)
endfunction ()
PRIVATE ${PRIVATE_INCLUDE_DIR})
endfunction()
function (add_fuzz_module target_lib_name)
if (NOT ${ENABLE_FUZZ_TESTS})
function(add_fuzz_module target_lib_name)
if(NOT ${ENABLE_FUZZ_TESTS})
return()
endif ()
endif()
set(source_files)
set(source_directory "${CMAKE_CURRENT_SOURCE_DIR}/private")
foreach (source_file ${ARGN})
foreach(source_file ${ARGN})
list(APPEND source_files "${source_directory}/${source_file}")
endforeach ()
endforeach()
message("Adding fuzz executable ${target_lib_name}_fuzz with source files: ${source_files}")
message(
"Adding fuzz executable ${target_lib_name}_fuzz with source files: ${source_files}"
)
set(PUBLIC_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/public_includes")
file(MAKE_DIRECTORY "${PUBLIC_INCLUDE_DIR}")
file(CREATE_LINK
"${CMAKE_CURRENT_SOURCE_DIR}/public/"
"${PUBLIC_INCLUDE_DIR}/${target_lib_name}"
SYMBOLIC
)
file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/public/"
"${PUBLIC_INCLUDE_DIR}/${target_lib_name}" SYMBOLIC)
set(PRIVATE_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/private_includes")
file(MAKE_DIRECTORY "${PRIVATE_INCLUDE_DIR}")
file(CREATE_LINK
"${CMAKE_CURRENT_SOURCE_DIR}/private/"
"${PRIVATE_INCLUDE_DIR}/${target_lib_name}"
SYMBOLIC
)
file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/private/"
"${PRIVATE_INCLUDE_DIR}/${target_lib_name}" SYMBOLIC)
add_executable(${target_lib_name}_fuzz ${source_files})
target_link_libraries(${target_lib_name}_fuzz PRIVATE ${target_lib_name} std fuzz_test)
target_link_libraries(${target_lib_name}_fuzz PRIVATE ${target_lib_name}
std fuzz_test)
target_link_options(${target_lib_name}_fuzz PRIVATE -fsanitize=fuzzer)
target_compile_options(${target_lib_name}_fuzz PRIVATE -fsanitize=fuzzer)
target_include_directories(${target_lib_name}_fuzz
target_include_directories(
${target_lib_name}_fuzz
PRIVATE ${PUBLIC_INCLUDE_DIR}
PRIVATE ${PRIVATE_INCLUDE_DIR}
)
endfunction ()
PRIVATE ${PRIVATE_INCLUDE_DIR})
endfunction()
function (add_option option help)
function(add_option option help)
option(${option} ${help})
if (${option})
if(${option})
message(STATUS "${option}: ON")
add_compile_definitions(${option}=1)
else ()
else()
message(STATUS "${option}: OFF")
endif ()
endfunction ()
endif()
endfunction()

View file

@ -1,32 +1,41 @@
add_option(ENABLE_UNIT_TESTS "Enables the building of the unit test modules")
add_option(ENABLE_FUZZ_TESTS "Enables the building of the fuzz test modules")
add_option(ENABLE_STATIC_ANALYSIS "Makes the clang-tidy checks mandatory for compilation")
add_option(ENABLE_LLVM_COVERAGE "Enables the code coverage instrumentation for clang")
add_option(ENABLE_STATIC_ANALYSIS
"Makes the clang-tidy checks mandatory for compilation")
add_option(ENABLE_LLVM_COVERAGE
"Enables the code coverage instrumentation for clang")
if (ENABLE_STATIC_ANALYSIS)
set(CMAKE_CXX_CLANG_TIDY "clang-tidy;--warnings-as-errors=*;--allow-no-checks")
endif ()
if(ENABLE_STATIC_ANALYSIS)
set(CMAKE_CXX_CLANG_TIDY
"clang-tidy;--warnings-as-errors=*;--allow-no-checks")
endif()
if(ENABLE_LLVM_COVERAGE)
include(CheckCXXSourceCompiles)
if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
message(FATAL_ERROR "ENABLE_LLVM_COVERAGE only supports the clang compiler")
endif ()
if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
message(
FATAL_ERROR "ENABLE_LLVM_COVERAGE only supports the clang compiler")
endif()
# Check for libc++
check_cxx_source_compiles("
check_cxx_source_compiles(
"
#include <string>
#ifdef _LIBCPP_VERSION
int main() { return 0; }
#else
#error Not using libc++
#endif
" USING_LIBCXX)
"
USING_LIBCXX)
if(NOT USING_LIBCXX)
message(FATAL_ERROR "ENABLE_LLVM_COVERAGE requires libc++, please compile with -stdlib=libc++")
message(
FATAL_ERROR
"ENABLE_LLVM_COVERAGE requires libc++, please compile with -stdlib=libc++"
)
endif()
add_compile_options(-fprofile-instr-generate -fcoverage-mapping)
add_link_options(-fprofile-instr-generate -fcoverage-mapping)
endif ()
endif()

View file

@ -1,36 +0,0 @@
#!/bin/bash
set -e
CI_DIR="$(git rev-parse --show-toplevel)/tools/ci/"
echo "===========[ amd64_clang ]==========="]
echo "==> Building amd64_clang_coverage..."
docker build -t amd64_clang_coverage -f $CI_DIR/amd64/clang/coverage.dockerfile .
echo "...DONE <=="
echo "==> Building amd64_clang_lsan..."
docker build -t amd64_clang_lsan -f $CI_DIR/amd64/clang/lsan.dockerfile .
echo "...DONE <=="
echo "==> Building image: amd64_clang_msan"
docker build -t amd64_clang_msan -f $CI_DIR/amd64/clang/msan.dockerfile .
echo "...DONE <=="
echo "==> Building image: clang_format"
docker build -t clang_format -f $CI_DIR/static_analysis/clang_format.dockerfile .
echo "...DONE <=="
echo "==> Building image: static_analysis"
docker build -t clang_tidy -f $CI_DIR/static_analysis/clang_tidy.dockerfile .
echo "...DONE <=="
echo "===========[ amd64_gcc ]==========="]
echo "==> Building image: amd64_gcc_unit_tests"
docker build -t amd64_gcc_unit_tests -f $CI_DIR/amd64/gcc/unit_tests.dockerfile .
echo "...DONE <=="
echo "==> Building image: amd64_gcc_valgrind"
docker build -t amd64_gcc_valgrind -f $CI_DIR/amd64/gcc/valgrind.dockerfile .
echo "...DONE <=="
echo "WOOOOOOOOOOOOOOOOH!!! DONE :D"