diff --git a/.github/workflows/vcpkg-linux-drivers.yml b/.github/workflows/vcpkg-linux-drivers.yml new file mode 100644 index 000000000..c4c0f2f61 --- /dev/null +++ b/.github/workflows/vcpkg-linux-drivers.yml @@ -0,0 +1,459 @@ +# OS settings notes: +# --- +# Set time zone to 'Etc/UTC' (this was the default) + +name: Vcpkg Linux TinyDrivers + +# Invoke manually from the command-line using the gh command, eg.: +# gh workflow run --ref silverqx-develop +# The reason for this is that I have 2 self-hosted runners on one PC (one for Linux and other for +# Windows) and I'm not able to serialize all these workflows and because of that I would have to +# decrease parallel and it would take hours to finish, so all Linux workflows must be invoked +# manually. +# on: workflow_dispatch +on: + push: + branches: + - silverqx-develop +# - main +# - gh-actions + +concurrency: + group: tinyorm-linux + +# I will not remove the build folders before a job execution it's not necessary and +# it will be faster this way. I can still remove them manually if needed or +# if something goes wrong. + +jobs: + + vcpkg-linux-tinydrivers: + name: Vcpkg Linux TinyDrivers + + # Self-hosted runner is Ubuntu 22.04 + runs-on: [ self-hosted, linux ] +# runs-on: ubuntu-22.04 + + strategy: + matrix: + build-type: + - key: debug + name: Debug + + - key: release + name: Release + + qt: + - key: qt6 + name: Qt6 + version: 6.7.0 + # For vcpkg classic mode (install tests) + vcpkg-qt: qtbase + vcpkg-qt-features: qtbase[core] + vcpkg-tinyorm: tinyorm + # Build also tom example to test it + vcpkg-tinyorm-features: tinyorm[core,build-mysql-driver,tom-example] + + steps: + - uses: actions/checkout@v4 + with: + path: main + + # I don't install everything to the TinyRunnerWorkPath as in all other workflows, I leave it + # this way because I tried to refactor it to the env.TinyRunnerWorkPath and it looks terrible + - name: TinyORM prepare environment + run: | + runnerWorkPath=$(realpath '${{ runner.workspace }}/..') + echo "TinyRunnerWorkPath=$runnerWorkPath" >> $GITHUB_ENV + + echo "TinyParallel=10" >> $GITHUB_ENV + + tinyormPath=$(realpath ./main) + echo "TinyORMPath=$tinyormPath" >> $GITHUB_ENV + + - name: MySQL service check status + run: | + mysqladmin --password="$DB_MYSQL_PASSWORD" ping + env: + DB_MYSQL_PASSWORD: ${{ secrets.DB_MYSQL_PASSWORD_SELF }} + + - name: Ninja install latest version + uses: seanmiddleditch/gha-setup-ninja@master + with: + destination: ${{ env.TinyRunnerWorkPath }}/ninja-build + + - name: vcpkg prepare environment + run: | + echo "VCPKG_ROOT=$VCPKG_INSTALLATION_ROOT" >> $GITHUB_ENV + # The x64-linux is correct + echo 'VCPKG_DEFAULT_TRIPLET=x64-linux' >> $GITHUB_ENV + echo 'VCPKG_MAX_CONCURRENCY=${{ env.TinyParallel }}' >> $GITHUB_ENV + + vcpkgPath=$(realpath '${{ env.TinyORMPath }}/cmake/vcpkg') + + portsPath="$vcpkgPath/ports" + echo "VCPKG_OVERLAY_PORTS=$portsPath" >> $GITHUB_ENV + + tripletsPath="$vcpkgPath/triplets" + echo "VCPKG_OVERLAY_TRIPLETS=$tripletsPath" >> $GITHUB_ENV + + # Binary caching + echo 'VCPKG_BINARY_SOURCES=clear;x-gha,readwrite' >> $GITHUB_ENV + + - name: vcpkg prepare binary caching + uses: actions/github-script@v6 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: vcpkg add on the $PATH + run: | + echo "$VCPKG_INSTALLATION_ROOT" >> $GITHUB_PATH + + - name: CMake print version + run: | + cmake --version + + - name: vcpkg print version + run: | + vcpkg --version + + # Will be used in the classic method (vcpkg install tinyorm) and VcpkgManifest method + # I will not write bash scripts for this, would be a pain 🫤 + - name: vcpkg prepare TinyORM ports (update REF and SHA512) + shell: pwsh -NoProfile -Command "& '{0}'" + working-directory: ${{ env.TinyORMPath }} + run: | + . ./tools/private/Common-Deploy.ps1 + + $portfileQt6Path = Resolve-Path -Path './cmake/vcpkg/ports/tinyorm/portfile.cmake' + $vcpkgRef = '${{ github.sha }}' + + Edit-VcpkgRefAndHash -Project '${{ github.repository }}' -Ref $vcpkgRef ` + -PortFile $portfileQt6Path -EnableRetries + + # The following two steps (vcpkg install) are not needed below they only test if the vcpkg + # classic mode works correctly. The Release and Debug build types are build at once so invoke + # these two steps for the debug matrix only. + + - name: vcpkg upgrade repository (latest version) + if: matrix.build-type.key == 'debug' + run: | + cd "$VCPKG_INSTALLATION_ROOT" + + git switch master + git fetch --tags origin + git reset --hard origin/master + + # This should reliably remove the qtbase and tinyorm with all dependencies. + # It's much faster to do it this way like removing the whole vcpkg folder and then the binary + # caching should kick in. + - name: vcpkg remove ${{ matrix.qt.vcpkg-qt }} and ${{ matrix.qt.vcpkg-tinyorm }} (classic mode) + if: matrix.build-type.key == 'debug' + run: >- + vcpkg remove --recurse vcpkg-cmake vcpkg-cmake-config zlib boost-uninstall libmysql + ncurses libb2 ${{ matrix.qt.vcpkg-qt }} ${{ matrix.qt.vcpkg-tinyorm }} + + # Install libmysql separately so I will see what's up if it fails + - name: vcpkg install libmysql (classic mode) + if: matrix.build-type.key == 'debug' + run: | + vcpkg install libmysql + + - name: vcpkg install ${{ matrix.qt.vcpkg-qt }} (classic mode) + if: matrix.build-type.key == 'debug' + run: | + vcpkg install ${{ matrix.qt.vcpkg-qt-features }} + + - name: vcpkg install ${{ matrix.qt.vcpkg-tinyorm }} (classic mode) + if: matrix.build-type.key == 'debug' + run: | + vcpkg install ${{ matrix.qt.vcpkg-tinyorm-features }} + + # Prepare TinyORM-HelloWorld-TinyDrivers project + + - name: HelloWorld-TinyDrivers checkout + uses: actions/checkout@v4 + with: + repository: silverqx/TinyORM-HelloWorld-TinyDrivers + path: HelloWorld-TinyDrivers + + - name: TinyORM create folder for build trees + run: | + mkdir --parents '../TinyORM-builds-cmake' + + - name: HelloWorld-TinyDrivers create folder for build trees + run: | + mkdir --parents '../HelloWorld-builds-cmake' + + # VcpkgManifest method (no install or deployment) + # --- + + # I don't need to use set(VCPKG_USE_HEAD_VERSION ON) and set HEAD_REF because I'm using + # Edit-VcpkgRefAndHash a few steps above to correctly set RED and SHA512. + + - name: 🪡 VcpkgManifest method (no install or deployment) 🪡 + run: | + echo 'no-op' + + - name: HelloWorld-TinyDrivers prepare VcpkgManifest method (vcpkg.json) + working-directory: HelloWorld-TinyDrivers + run: | + cp ./vcpkg.json.VcpkgManifest.${{ matrix.qt.name }}.example ./vcpkg.json + + # CMAKE_DISABLE_PRECOMPILE_HEADERS=ON is correct (no need to use PCH for one TU) + # VCPKG_APPLOCAL_DEPS=OFF is correct as everything is linked statically on Linux + # Don't use ccache for the VcpkgManifest method as the vcpkg has its own binary caching + - name: HelloWorld-TinyDrivers cmake configure (vcpkgmanifest-gcc-${{ matrix.build-type.key }}) + working-directory: HelloWorld-TinyDrivers + run: >- + cmake + -S . + -B '${{ runner.workspace }}/HelloWorld-builds-cmake/build-TinyDrivers-vcpkgmanifest-gcc-${{ matrix.build-type.key }}' + -G Ninja + -D CMAKE_TOOLCHAIN_FILE:FILEPATH="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" + -D CMAKE_DISABLE_PRECOMPILE_HEADERS:BOOL=ON + -D CMAKE_BUILD_TYPE:STRING=${{ matrix.build-type.name }} + -D VCPKG_APPLOCAL_DEPS:BOOL=OFF + -D RESOLVE_TINYORM:STRING=VcpkgManifest + + - name: HelloWorld-TinyDrivers cmake build ✨ (vcpkgmanifest-gcc-${{ matrix.build-type.key }}) + working-directory: >- + ../HelloWorld-builds-cmake/build-TinyDrivers-vcpkgmanifest-gcc-${{ matrix.build-type.key }} + run: | + cmake --build . --target all --parallel ${{ env.TinyParallel }} + + - name: HelloWorld-TinyDrivers execute (MySQL) 🏁 + working-directory: >- + ../HelloWorld-builds-cmake/build-TinyDrivers-vcpkgmanifest-gcc-${{ matrix.build-type.key }} + run: | + ./HelloWorld-TinyDrivers + env: + DB_MYSQL_CHARSET: ${{ secrets.DB_MYSQL_CHARSET }} + DB_MYSQL_COLLATION: ${{ secrets.DB_MYSQL_COLLATION }} + DB_MYSQL_DATABASE: ${{ secrets.DB_MYSQL_DATABASE }} + DB_MYSQL_HOST: ${{ secrets.DB_MYSQL_HOST_SELF }} + DB_MYSQL_PASSWORD: ${{ secrets.DB_MYSQL_PASSWORD_SELF }} + DB_MYSQL_SSL_CA: ${{ secrets.DB_MYSQL_DATA_SELF_LINUX }}/ca.pem + DB_MYSQL_SSL_CERT: ${{ secrets.DB_MYSQL_DATA_SELF_LINUX }}/client-cert.pem + DB_MYSQL_SSL_KEY: ${{ secrets.DB_MYSQL_DATA_SELF_LINUX }}/client-key.pem + DB_MYSQL_SSL_MODE: ${{ secrets.DB_MYSQL_SSL_MODE }} + DB_MYSQL_USERNAME: ${{ secrets.DB_MYSQL_USERNAME_SELF }} + + # The FetchContent and Manual methods below need Qt installed and to be accessible on the system + + - name: ${{ matrix.qt.name }} prepare environment + run: | + echo '/opt/Qt/${{ matrix.qt.version }}/bin' >> $GITHUB_PATH + echo "LD_LIBRARY_PATH=/opt/Qt/${{ matrix.qt.version }}/gcc_64/lib${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" >> $GITHUB_ENV + + # The CMAKE_PREFIX_PATH must be defined on the GitHub Actions, this is some kind of a bug + # because the CMake can't find the Qt, but if I export the PATH directly in the step + # it works but doesn't work using the GITHUB_PATH like define two line above. 🫤 + echo "CMAKE_PREFIX_PATH=/opt/Qt/${{ matrix.qt.version }}/gcc_64${CMAKE_PREFIX_PATH:+:}$CMAKE_PREFIX_PATH" >> $GITHUB_ENV + + # Prepare ccache + # + # The TinyORM build in the Manual method and the FetchContent method are using the ccache, + # packages build through the FetchContent CMake module are also using the ccache, they respect + # the CMAKE_CXX_COMPILER_LAUNCHER option. + + # Don't use the default CCACHE_DIR path on self-hosted runners + - name: Ccache prepare environment + run: | + ccacheDirPath=$(realpath '${{ runner.workspace }}/ccache_drivers') + echo "CCACHE_DIR=$ccacheDirPath" >> $GITHUB_ENV + + - name: Ccache print version and configuration + run: | + echo '::group::Print version' + ccache --version + echo '::endgroup::' + + echo '::group::Print ccache config' + ccache --show-config + echo '::endgroup::' + + # Manual method linking against the TinyORM build tree (no install or deployment) + # --- + + - name: 🪡 Manual method linking against the TinyORM build tree (no install or deployment) 🪡 + run: | + echo 'no-op' + + - name: Ccache clear statistics + run: | + ccache --zero-stats + + # CMAKE_DISABLE_PRECOMPILE_HEADERS=OFF is correct (I want to use PCH here) + # BUILD_TREE_DEPLOY=ON is needed here + - name: TinyORM cmake configure (manual-gcc-${{ matrix.build-type.key }}) + working-directory: ${{ env.TinyORMPath }} + run: >- + cmake + -S . + -B '${{ runner.workspace }}/TinyORM-builds-cmake/build-TinyDrivers-manual-gcc-${{ matrix.build-type.key }}' + -G Ninja + -D CMAKE_CXX_COMPILER_LAUNCHER:FILEPATH=/usr/local/bin/ccache + -D CMAKE_TOOLCHAIN_FILE:FILEPATH="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" + -D CMAKE_DISABLE_PRECOMPILE_HEADERS:BOOL=OFF + -D CMAKE_BUILD_TYPE:STRING=${{ matrix.build-type.name }} + -D CMAKE_EXPORT_PACKAGE_REGISTRY:BOOL=OFF + -D CMAKE_CXX_SCAN_FOR_MODULES:BOOL=OFF + -D VCPKG_APPLOCAL_DEPS:BOOL=OFF + -D VERBOSE_CONFIGURE:BOOL=ON + -D BUILD_TREE_DEPLOY:BOOL=OFF + -D MATCH_EQUAL_EXPORTED_BUILDTREE:BOOL=ON + -D STRICT_MODE:BOOL=OFF + -D MYSQL_PING:BOOL=OFF + -D BUILD_TESTS:BOOL=OFF + -D ORM:BOOL=ON + -D TOM:BOOL=OFF + -D TOM_EXAMPLE:BOOL=OFF + -D BUILD_DRIVERS:BOOL=OFF + -D BUILD_DRIVERS:BOOL=ON + -D DRIVERS_TYPE:STRING=Shared + + - name: TinyORM cmake build ✨ (manual-gcc-${{ matrix.build-type.key }}) + working-directory: >- + ../TinyORM-builds-cmake/build-TinyDrivers-manual-gcc-${{ matrix.build-type.key }} + run: | + cmake --build . --target all --parallel ${{ env.TinyParallel }} + + - name: Ccache print statistics + run: | + ccache --show-stats -vv + + # Build and execute the HelloWorld-TinyDrivers console application + + - name: HelloWorld-TinyDrivers prepare Manual method (vcpkg.json) + working-directory: HelloWorld-TinyDrivers + run: | + cp ./vcpkg.json.Manual.example ./vcpkg.json + + # CMAKE_DISABLE_PRECOMPILE_HEADERS=ON is correct (no need to use PCH for one TU) + - name: HelloWorld-TinyDrivers cmake configure (manual-gcc-${{ matrix.build-type.key }}) + working-directory: HelloWorld-TinyDrivers + run: >- + cmake + -S . + -B '${{ runner.workspace }}/HelloWorld-builds-cmake/build-TinyDrivers-manual-gcc-${{ matrix.build-type.key }}' + -G Ninja + -D CMAKE_PREFIX_PATH:PATH='${{ runner.workspace }}/TinyORM-builds-cmake/build-TinyDrivers-manual-gcc-${{ matrix.build-type.key }}' + -D CMAKE_TOOLCHAIN_FILE:FILEPATH="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" + -D CMAKE_DISABLE_PRECOMPILE_HEADERS:BOOL=ON + -D CMAKE_BUILD_TYPE:STRING=${{ matrix.build-type.name }} + -D VCPKG_APPLOCAL_DEPS:BOOL=OFF + -D RESOLVE_TINYORM:STRING=Manual + + - name: HelloWorld-TinyDrivers cmake build ✨ (manual-gcc-${{ matrix.build-type.key }}) + working-directory: >- + ../HelloWorld-builds-cmake/build-TinyDrivers-manual-gcc-${{ matrix.build-type.key }} + run: | + cmake --build . --target all --parallel ${{ env.TinyParallel }} + + - name: HelloWorld-TinyDrivers execute (MySQL) 🏁 + working-directory: >- + ../HelloWorld-builds-cmake/build-TinyDrivers-manual-gcc-${{ matrix.build-type.key }} + run: | + buildFolder='${{ runner.workspace }}/TinyORM-builds-cmake/build-TinyDrivers-manual-gcc-${{ matrix.build-type.key }}' + + export LD_LIBRARY_PATH="$buildFolder"${LD_LIBRARY_PATH:+:}"$LD_LIBRARY_PATH" + + ./HelloWorld-TinyDrivers + env: + DB_MYSQL_CHARSET: ${{ secrets.DB_MYSQL_CHARSET }} + DB_MYSQL_COLLATION: ${{ secrets.DB_MYSQL_COLLATION }} + DB_MYSQL_DATABASE: ${{ secrets.DB_MYSQL_DATABASE }} + DB_MYSQL_HOST: ${{ secrets.DB_MYSQL_HOST_SELF }} + DB_MYSQL_PASSWORD: ${{ secrets.DB_MYSQL_PASSWORD_SELF }} + DB_MYSQL_SSL_CA: ${{ secrets.DB_MYSQL_DATA_SELF_LINUX }}/ca.pem + DB_MYSQL_SSL_CERT: ${{ secrets.DB_MYSQL_DATA_SELF_LINUX }}/client-cert.pem + DB_MYSQL_SSL_KEY: ${{ secrets.DB_MYSQL_DATA_SELF_LINUX }}/client-key.pem + DB_MYSQL_SSL_MODE: ${{ secrets.DB_MYSQL_SSL_MODE }} + DB_MYSQL_USERNAME: ${{ secrets.DB_MYSQL_USERNAME_SELF }} + + # FetchContent method (with install or deployment) + # --- + + - name: 🪡 FetchContent method (with install or deployment) 🪡 + run: | + echo 'no-op' + + - name: HelloWorld-TinyDrivers prepare FetchContent method (vcpkg.json) + working-directory: HelloWorld-TinyDrivers + run: | + cp ./vcpkg.json.FetchContent.example ./vcpkg.json + + # I will not write bash scripts for this, would be a pain 🫤 + - name: HelloWorld-TinyDrivers prepare FetchContent method (update GIT_TAG) + shell: pwsh -NoProfile -Command "& '{0}'" + working-directory: HelloWorld-TinyDrivers + run: | + $toolsPath = Resolve-Path -Path '${{ env.TinyORMPath }}/tools/private' + $gitTag = '${{ github.sha }}' + + & "$toolsPath/Edit-FetchContentGitTag.ps1" -CMakeLists ./CMakeLists.txt -GitTag $gitTag + + - name: Ccache clear statistics + run: | + ccache --zero-stats + + # CMAKE_DISABLE_PRECOMPILE_HEADERS=OFF is correct (I want to use PCH here) + - name: HelloWorld-TinyDrivers cmake configure (fetchcontent-gcc-${{ matrix.build-type.key }}) + working-directory: HelloWorld-TinyDrivers + run: >- + cmake + -S . + -B '${{ runner.workspace }}/HelloWorld-builds-cmake/build-TinyDrivers-fetchcontent-gcc-${{ matrix.build-type.key }}' + -G Ninja + -D CMAKE_CXX_COMPILER_LAUNCHER:FILEPATH=/usr/local/bin/ccache + -D CMAKE_TOOLCHAIN_FILE:FILEPATH="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" + -D CMAKE_DISABLE_PRECOMPILE_HEADERS:BOOL=OFF + -D CMAKE_BUILD_TYPE:STRING=${{ matrix.build-type.name }} + -D CMAKE_INSTALL_PREFIX:PATH='${{ runner.workspace }}/HelloWorld-TinyDrivers-FetchContent-Install/${{ matrix.build-type.name }}' + -D CMAKE_EXPORT_PACKAGE_REGISTRY:BOOL=OFF + -D VCPKG_APPLOCAL_DEPS:BOOL=OFF + -D VERBOSE_CONFIGURE:BOOL=ON + -D BUILD_TREE_DEPLOY:BOOL=OFF + -D MATCH_EQUAL_EXPORTED_BUILDTREE:BOOL=OFF + -D STRICT_MODE:BOOL=OFF + -D MYSQL_PING:BOOL=OFF + -D BUILD_TESTS:BOOL=OFF + -D ORM:BOOL=ON + -D TOM:BOOL=OFF + -D TOM_EXAMPLE:BOOL=OFF + -D BUILD_DRIVERS:BOOL=ON + -D DRIVERS_TYPE:STRING=Shared + -D RESOLVE_TINYORM:STRING=FetchContent + + # Also install it, to test the deployment process + - name: HelloWorld-TinyDrivers cmake build and install ✨ (fetchcontent-gcc-${{ matrix.build-type.key }}) + working-directory: >- + ../HelloWorld-builds-cmake/build-TinyDrivers-fetchcontent-gcc-${{ matrix.build-type.key }} + run: | + cmake --build . --target install --parallel ${{ env.TinyParallel }} + + - name: Ccache print statistics + run: | + ccache --show-stats -vv + + - name: HelloWorld-TinyDrivers execute (MySQL) 🏁 + working-directory: >- + ../HelloWorld-TinyDrivers-FetchContent-Install/${{ matrix.build-type.name }}/bin + run: | + export LD_LIBRARY_PATH='../lib'${LD_LIBRARY_PATH:+:}"$LD_LIBRARY_PATH" + + ./HelloWorld-TinyDrivers + env: + DB_MYSQL_CHARSET: ${{ secrets.DB_MYSQL_CHARSET }} + DB_MYSQL_COLLATION: ${{ secrets.DB_MYSQL_COLLATION }} + DB_MYSQL_DATABASE: ${{ secrets.DB_MYSQL_DATABASE }} + DB_MYSQL_HOST: ${{ secrets.DB_MYSQL_HOST_SELF }} + DB_MYSQL_PASSWORD: ${{ secrets.DB_MYSQL_PASSWORD_SELF }} + DB_MYSQL_SSL_CA: ${{ secrets.DB_MYSQL_DATA_SELF_LINUX }}/ca.pem + DB_MYSQL_SSL_CERT: ${{ secrets.DB_MYSQL_DATA_SELF_LINUX }}/client-cert.pem + DB_MYSQL_SSL_KEY: ${{ secrets.DB_MYSQL_DATA_SELF_LINUX }}/client-key.pem + DB_MYSQL_SSL_MODE: ${{ secrets.DB_MYSQL_SSL_MODE }} + DB_MYSQL_USERNAME: ${{ secrets.DB_MYSQL_USERNAME_SELF }}