From dbc66788a680daf3f8a1c0c6e7fbd1b77cc06864 Mon Sep 17 00:00:00 2001 From: Spartan322 Date: Sat, 2 Sep 2023 09:03:14 -0400 Subject: Add github actions and workflow --- .github/actions/dataloader-build/action.yml | 32 +++++ .github/actions/dataloader-cache/action.yml | 22 ++++ .github/actions/mingw-cache/action.yml | 18 +++ .github/workflows/builds.yml | 140 +++++++++++++++++++++ SConstruct | 4 +- deps/SCsub | 8 +- include/openvic-dataloader/csv/LineObject.hpp | 24 ++-- .../detail/OptionalConstexpr.hpp | 9 ++ .../openvic-dataloader/detail/VectorConstexpr.hpp | 9 ++ .../detail/BasicBufferHandler.hpp | 7 +- 10 files changed, 254 insertions(+), 19 deletions(-) create mode 100644 .github/actions/dataloader-build/action.yml create mode 100644 .github/actions/dataloader-cache/action.yml create mode 100644 .github/actions/mingw-cache/action.yml create mode 100644 .github/workflows/builds.yml create mode 100644 include/openvic-dataloader/detail/OptionalConstexpr.hpp create mode 100644 include/openvic-dataloader/detail/VectorConstexpr.hpp diff --git a/.github/actions/dataloader-build/action.yml b/.github/actions/dataloader-build/action.yml new file mode 100644 index 0000000..36caebd --- /dev/null +++ b/.github/actions/dataloader-build/action.yml @@ -0,0 +1,32 @@ +name: Build OpenVic-Dataloader +description: Build OpenVic-Dataloader with provided options. +inputs: + target: + description: Build target (editor, template_release, template_debug). + default: "template_release" + platform: + description: Target platform. + required: false + sconsflags: + default: "" + scons-cache: + description: The scons cache path. + default: "${{ github.workspace }}/.scons-cache/" + scons-cache-limit: + description: The scons cache size limit. + # actions/cache has 10 GiB limit, and GitHub runners have a 14 GiB disk. + # Limit to 7 GiB to avoid having the extracted cache fill the disk. + default: 7168 +runs: + using: "composite" + steps: + - name: Scons Build + shell: sh + env: + SCONSFLAGS: ${{ inputs.sconsflags }} + SCONS_CACHE: ${{ inputs.scons-cache }} + SCONS_CACHE_LIMIT: ${{ inputs.scons-cache-limit }} + run: | + echo "Building with flags:" platform=${{ inputs.platform }} target=${{ inputs.target }} ${{ env.SCONSFLAGS }} + scons platform=${{ inputs.platform }} target=${{ inputs.target }} ${{ env.SCONSFLAGS }} + ls -l bin/ diff --git a/.github/actions/dataloader-cache/action.yml b/.github/actions/dataloader-cache/action.yml new file mode 100644 index 0000000..c913216 --- /dev/null +++ b/.github/actions/dataloader-cache/action.yml @@ -0,0 +1,22 @@ +name: Setup OpenVic-Dataloader Build Cache +description: Setup OpenVic-Dataloader Build Cache +inputs: + cache-name: + description: The cache base name (job name by default). + default: "${{github.job}}" + scons-cache: + description: The scons cache path. + default: "${{github.workspace}}/.scons-cache/" +runs: + using: "composite" + steps: + # Upload cache on completion and check it out now + - name: Load .scons_cache directory + uses: actions/cache@v3 + with: + path: ${{inputs.scons-cache}} + key: ${{inputs.cache-name}}-${{env.OVDL_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + restore-keys: | + ${{inputs.cache-name}}-${{env.OVDL_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + ${{inputs.cache-name}}-${{env.OVDL_BASE_BRANCH}}-${{github.ref}} + ${{inputs.cache-name}}-${{env.OVDL_BASE_BRANCH}} diff --git a/.github/actions/mingw-cache/action.yml b/.github/actions/mingw-cache/action.yml new file mode 100644 index 0000000..e92962d --- /dev/null +++ b/.github/actions/mingw-cache/action.yml @@ -0,0 +1,18 @@ +name: Setup MinGW Cache +description: Setup MinGW Cache +inputs: + cache-key: + description: Name for MinGW cache key. + default: "mingw-cache" +runs: + using: "composite" + steps: + # Upload cache on completion and check it out now + - name: Load MinGW Cache + id: cache-mingw + uses: actions/cache@v3 + with: + path: C:\ProgramData\chocolatey\lib\mingw + key: ${{inputs.cache-key}} + - name: Setup MinGW for build + uses: egor-tensin/setup-mingw@v2 \ No newline at end of file diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml new file mode 100644 index 0000000..0e0bcfe --- /dev/null +++ b/.github/workflows/builds.yml @@ -0,0 +1,140 @@ +name: Builds + +on: [push, pull_request] + +env: + OVDL_BASE_BRANCH: master + +concurrency: + group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-macos + cancel-in-progress: true + +jobs: + build: + runs-on: ${{matrix.os}} + name: ${{matrix.name}} + permissions: write-all + strategy: + fail-fast: false + matrix: + include: + - identifier: windows-debug + os: windows-latest + name: 🏁 Windows Debug + target: template_debug + platform: windows + arch: x86_64 + - identifier: windows-release + os: windows-latest + name: 🏁 Windows Release + target: template_release + platform: windows + arch: x86_64 + - identifier: macos-debug + os: macos-latest + name: 🍎 macOS (universal) Debug + target: template_debug + platform: macos + arch: universal + - identifier: macos-release + os: macos-latest + name: 🍎 macOS (universal) Release + target: template_release + platform: macos + arch: universal + - identifier: linux-debug + os: ubuntu-latest + name: 🐧 Linux Debug + runner: ubuntu-20.04 + target: template_debug + platform: linux + arch: x86_64 + - identifier: linux-release + os: ubuntu-latest + name: 🐧 Linux Release + runner: ubuntu-20.04 + target: template_release + platform: linux + arch: x86_64 + + steps: + - name: Checkout project + uses: actions/checkout@v3.3.0 + with: + submodules: recursive + + - name: Setup OpenVic-Dataloader build cache + uses: ./.github/actions/dataloader-cache + with: + cache-name: ${{ matrix.identifier }} + continue-on-error: true + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + + - name: Set up SCons + shell: bash + run: | + python -c "import sys; print(sys.version)" + python -m pip install scons + scons --version + + - name: Linux dependencies + if: ${{ matrix.platform == 'linux' }} + run: | + sudo apt-get update -qq + sudo apt-get install -qqq build-essential pkg-config + g++ --version + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 + sudo update-alternatives --set g++ /usr/bin/g++-12 + g++ --version + + - name: Setup MinGW for Windows/MinGW build + if: ${{ matrix.platform == 'windows' }} + uses: ./.github/actions/mingw-cache + + - name: Compile Dataloader + uses: ./.github/actions/dataloader-build + with: + platform: ${{ matrix.platform }} + target: ${{ matrix.target }} + sconsflags: arch=${{ matrix.arch }} build_ovdl_library=yes + + - name: Delete compilation files + if: ${{ matrix.platform == 'windows' }} + run: | + Remove-Item bin/* -Include *.exp,*.pdb -Force + + - name: Upload library artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ github.event.repository.name }}-library + path: | + ${{ github.workspace }}/bin/libopenvic-dataloader.* + + - name: Upload executable artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ github.event.repository.name }}-executable + path: | + ${{ github.workspace }}/bin/openvic-dataloader.headless.* + + - name: Archive Release + uses: thedoctor0/zip-release@0.7.1 + with: + type: "zip" + filename: "../../../libopenvic-dataloader.${{ matrix.platform }}.${{ matrix.arch }}.zip" + directory: "${{ github.workspace }}/bin/" + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') + + - name: Create and upload asset + uses: ncipollo/release-action@v1 + with: + allowUpdates: true + artifacts: "libopenvic-dataloader.${{ matrix.platform }}.${{ matrix.arch }}.zip" + omitNameDuringUpdate: true + omitBodyDuringUpdate: true + token: ${{ secrets.GITHUB_TOKEN }} + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') diff --git a/SConstruct b/SConstruct index 6770de7..3128ebc 100644 --- a/SConstruct +++ b/SConstruct @@ -245,7 +245,7 @@ env["OBJSUFFIX"] = suffix + env["OBJSUFFIX"] library_name = "libopenvic-dataloader{}{}".format(suffix, env["LIBSUFFIX"]) if env["build_ovdl_library"]: - library = env.StaticLibrary(target=env.File(os.path.join(BINDIR, library_name)), source=sources) + library = env.StaticLibrary(target=os.path.join(BINDIR, library_name), source=sources) Default(library) env.Append(LIBPATH=[env.Dir(BINDIR)]) @@ -267,6 +267,8 @@ if env["build_ovdl_headless"]: headless_env.headless_sources = GlobRecursive("*.cpp", headless_path) if not env["build_ovdl_library"]: headless_env.headless_sources += sources + else: + headless_env.headless_sources += env.lexy_sources headless_program = headless_env.Program( target=os.path.join(BINDIR, headless_name), source=headless_env.headless_sources, diff --git a/deps/SCsub b/deps/SCsub index d58d83e..1afe1a6 100644 --- a/deps/SCsub +++ b/deps/SCsub @@ -32,13 +32,13 @@ def build_lexy(env): library = lexy_env.StaticLibrary(target="lexy/src/" + library_name, source=sources) Default(library) - env.Append(CPPPATH=[env.Dir("lexy/include")]) + env.Append(CPPPATH=[lexy_env.Dir("lexy/include")]) if env.get("is_msvc", False): - env.Append(CXXFLAGS=["/external:I", env.Dir("lexy/include"), "/external:W0"]) + env.Append(CXXFLAGS=["/external:I", lexy_env.Dir("lexy/include"), "/external:W0"]) else: - env.Append(CXXFLAGS=["-isystem", env.Dir("lexy/include")]) + env.Append(CXXFLAGS=["-isystem", lexy_env.Dir("lexy/include")]) env.Append(CXXFLAGS=[""]) - env.Append(LIBPATH=[env.Dir("lexy/src")]) + env.Append(LIBPATH=[lexy_env.Dir("lexy/src")]) env.Append(LIBS=[library_name]) diff --git a/include/openvic-dataloader/csv/LineObject.hpp b/include/openvic-dataloader/csv/LineObject.hpp index 0494ffb..8a9c2ec 100644 --- a/include/openvic-dataloader/csv/LineObject.hpp +++ b/include/openvic-dataloader/csv/LineObject.hpp @@ -10,6 +10,8 @@ #include #include +#include + namespace ovdl::csv { /// LineObject should be able to recognize the differences between: /// Input -> Indexes == "" @@ -30,20 +32,20 @@ namespace ovdl::csv { using inner_value_type = std::string; using container_type = std::vector>; - constexpr LineObject() = default; - constexpr LineObject(LineObject&) = default; - constexpr LineObject(LineObject&&) = default; - constexpr LineObject(const LineObject&) = default; + OVDL_VECTOR_CONSTEXPR LineObject() = default; + OVDL_VECTOR_CONSTEXPR LineObject(LineObject&) = default; + OVDL_VECTOR_CONSTEXPR LineObject(LineObject&&) = default; + OVDL_VECTOR_CONSTEXPR LineObject(const LineObject&) = default; - constexpr LineObject& operator=(const LineObject& other) = default; - constexpr LineObject& operator=(LineObject&& other) = default; + OVDL_VECTOR_CONSTEXPR LineObject& operator=(const LineObject& other) = default; + OVDL_VECTOR_CONSTEXPR LineObject& operator=(LineObject&& other) = default; - constexpr ~LineObject() = default; + OVDL_VECTOR_CONSTEXPR ~LineObject() = default; - constexpr LineObject(std::initializer_list pos_and_val) : container_type(pos_and_val) { + OVDL_VECTOR_CONSTEXPR LineObject(std::initializer_list pos_and_val) : container_type(pos_and_val) { } - constexpr LineObject(position_type prefix_end, std::initializer_list pos_and_val, position_type suffix_end = 0) + OVDL_VECTOR_CONSTEXPR LineObject(position_type prefix_end, std::initializer_list pos_and_val, position_type suffix_end = 0) : container_type(pos_and_val), _prefix_end(prefix_end), _suffix_end(suffix_end) { @@ -77,8 +79,8 @@ namespace ovdl::csv { private: // Should be position of first valid value on line - position_type _prefix_end; + position_type _prefix_end = 0; // Should be position after last value or position after last seperator - position_type _suffix_end; + position_type _suffix_end = 0; }; } \ No newline at end of file diff --git a/include/openvic-dataloader/detail/OptionalConstexpr.hpp b/include/openvic-dataloader/detail/OptionalConstexpr.hpp new file mode 100644 index 0000000..bcb12a7 --- /dev/null +++ b/include/openvic-dataloader/detail/OptionalConstexpr.hpp @@ -0,0 +1,9 @@ +#pragma once + +// THANK YOU APPLE FOR YOUR UTTER DISREGARD FOR C++20 + +#if __cpp_lib_optional >= 202106L +#define OVDL_OPTIONAL_CONSTEXPR constexpr +#else +#define OVDL_OPTIONAL_CONSTEXPR inline +#endif \ No newline at end of file diff --git a/include/openvic-dataloader/detail/VectorConstexpr.hpp b/include/openvic-dataloader/detail/VectorConstexpr.hpp new file mode 100644 index 0000000..7e7fa34 --- /dev/null +++ b/include/openvic-dataloader/detail/VectorConstexpr.hpp @@ -0,0 +1,9 @@ +#pragma once + +// THANK YOU APPLE FOR YOUR UTTER DISREGARD FOR C++20 + +#if __cpp_lib_constexpr_vector >= 201907L +#define OVDL_VECTOR_CONSTEXPR constexpr +#else +#define OVDL_VECTOR_CONSTEXPR inline +#endif \ No newline at end of file diff --git a/src/openvic-dataloader/detail/BasicBufferHandler.hpp b/src/openvic-dataloader/detail/BasicBufferHandler.hpp index ba2cef9..75ea8ee 100644 --- a/src/openvic-dataloader/detail/BasicBufferHandler.hpp +++ b/src/openvic-dataloader/detail/BasicBufferHandler.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -14,16 +15,16 @@ namespace ovdl::detail { template class BasicBufferHandler { public: - constexpr bool is_valid() const { + OVDL_OPTIONAL_CONSTEXPR bool is_valid() const { return _buffer.size() != 0; } - constexpr std::optional load_buffer_size(const char* data, std::size_t size) { + OVDL_OPTIONAL_CONSTEXPR std::optional load_buffer_size(const char* data, std::size_t size) { _buffer = lexy::buffer(data, size); return std::nullopt; } - constexpr std::optional load_buffer(const char* start, const char* end) { + OVDL_OPTIONAL_CONSTEXPR std::optional load_buffer(const char* start, const char* end) { _buffer = lexy::buffer(start, end); return std::nullopt; } -- cgit v1.2.3-56-ga3b1