diff --git a/.github/workflows/multi-rid-build.yml b/.github/workflows/multi-rid-build.yml index 60945820..5de18309 100644 --- a/.github/workflows/multi-rid-build.yml +++ b/.github/workflows/multi-rid-build.yml @@ -1,9 +1,9 @@ name: multi-rid-build -on: [push, pull_request, workflow_dispatch] +on: [pull_request, workflow_dispatch] env: PROJECT_NAME: psychec - BUILD_TARGETS: "psychecommon psychecfe" + BUILD_TARGETS: "cnip psychecommon psychecfe" BUILD_TESTING: OFF DEBUG_SYMBOLS: true CMAKE_BUILD_TYPE: Release @@ -23,9 +23,22 @@ jobs: - ARM64 steps: - uses: actions/checkout@v4 + - name: prepare-dirs shell: pwsh run: New-Item -ItemType Directory -Force -Path artifacts + + - name: install dlfcn-win32 + shell: pwsh + run: | + $triplet = ("${{ matrix.arch }}-windows").ToLower() + vcpkg install dlfcn-win32 --triplet $triplet + + "VCPKG_INSTALLATION_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append + "VCPKG_TRIPLET=$triplet" | Out-File -FilePath $env:GITHUB_ENV -Append + "VCPKG_INCLUDE=$env:VCPKG_INSTALLATION_ROOT\installed\$triplet\include" | Out-File -FilePath $env:GITHUB_ENV -Append + "VCPKG_LIB=$env:VCPKG_INSTALLATION_ROOT\installed\$triplet\lib" | Out-File -FilePath $env:GITHUB_ENV -Append + - id: detect-mingw shell: pwsh run: | @@ -38,6 +51,7 @@ jobs: } else { "full=false" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append } + - name: build-mingw if: steps.detect-mingw.outputs.full == 'true' run: | @@ -46,13 +60,19 @@ jobs: export PATH="$PATH:/c/Program Files/CMake/bin:/c/msys64/usr/bin:/c/msys64/mingw64/bin:/c/msys64/clang-arm64/bin:/c/msys64/ucrt64/bin" mkdir -p artifacts cmake -S . -B build/mingw/${{ matrix.arch }} -G Ninja \ + -DCMAKE_TOOLCHAIN_FILE=$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake \ + -DVCPKG_TARGET_TRIPLET=$VCPKG_TRIPLET \ -DCMAKE_BUILD_TYPE=${{ env.CMAKE_BUILD_TYPE }} \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_CXX_STANDARD=${{ env.CMAKE_CXX_STANDARD }} \ -DCMAKE_CXX_STANDARD_REQUIRED=${{ env.CMAKE_CXX_STANDARD_REQUIRED }} \ - -DCMAKE_C_FLAGS="$([ "${{ env.DEBUG_SYMBOLS }}" = "true" ] && echo "-g") ${{ env.C_FLAGS_COMMON }}" \ - -DCMAKE_CXX_FLAGS="$([ "${{ env.DEBUG_SYMBOLS }}" = "true" ] && echo "-g") ${{ env.CXX_FLAGS_COMMON }} -std=c++${{ env.CMAKE_CXX_STANDARD }}" \ + -DCMAKE_INCLUDE_PATH="$VCPKG_INCLUDE" \ + -DCMAKE_LIBRARY_PATH="$VCPKG_LIB" \ + -DCMAKE_C_FLAGS="$([ "${{ env.DEBUG_SYMBOLS }}" = "true" ] && echo "-g") ${{ env.C_FLAGS_COMMON }} -I$VCPKG_INCLUDE" \ + -DCMAKE_CXX_FLAGS="$([ "${{ env.DEBUG_SYMBOLS }}" = "true" ] && echo "-g") ${{ env.CXX_FLAGS_COMMON }} -std=c++${{ env.CMAKE_CXX_STANDARD }} -I$VCPKG_INCLUDE" \ + -DCMAKE_EXE_LINKER_FLAGS="-L$VCPKG_LIB -ldlfcn-win32" \ + -DCMAKE_SHARED_LINKER_FLAGS="-L$VCPKG_LIB -ldlfcn-win32" \ -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=$(pwd)/artifacts \ -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=$(pwd)/artifacts \ -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=$(pwd)/artifacts \ @@ -68,6 +88,14 @@ jobs: done fi ' + + - name: check-lib-files + if: steps.detect-mingw.outputs.full == 'false' + shell: pwsh + run: | + Write-Host "Library files in VCPKG_LIB directory:" + Get-ChildItem -Path $env:VCPKG_LIB -Filter "*.lib" | Select-Object -ExpandProperty Name + - name: configure-vs if: steps.detect-mingw.outputs.full == 'false' shell: pwsh @@ -75,17 +103,35 @@ jobs: $out = "$(Get-Location)\artifacts" $dbg = if ($env:DEBUG_SYMBOLS -eq 'true') { '/Zi' } else { '' } $linker = if ($env:DEBUG_SYMBOLS -eq 'true') { '/DEBUG' } else { '' } + $defs = '/D_CRT_DECLARE_NONSTDC_NAMES=1 /D_CRT_NONSTDC_NO_DEPRECATE=1 /D_CRT_SECURE_NO_WARNINGS=1 /Dpopen=_popen /Dpclose=_pclose' + + $dlfcnLib = "$env:VCPKG_LIB\dlfcn-win32.lib" + if (-not (Test-Path $dlfcnLib)) { + $dlfcnLib = (Get-ChildItem -Path $env:VCPKG_LIB -Filter "dlfcn*.lib" | Select-Object -First 1).FullName + if (-not $dlfcnLib) { + $dlfcnLib = (Get-ChildItem -Path $env:VCPKG_LIB -Filter "*.lib" | Select-Object -First 1).FullName + } + } + cmake -S . -B build/${{ matrix.arch }} -G "Visual Studio 17 2022" -A ${{ matrix.arch }} -T ClangCL ` + -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_INSTALLATION_ROOT\scripts\buildsystems\vcpkg.cmake" ` + -DVCPKG_TARGET_TRIPLET="$env:VCPKG_TRIPLET" ` + -DCMAKE_PREFIX_PATH="$env:VCPKG_INSTALLATION_ROOT\installed\$env:VCPKG_TRIPLET" ` -DCMAKE_BUILD_TYPE=${{ env.CMAKE_BUILD_TYPE }} ` -DCMAKE_CXX_STANDARD=${{ env.CMAKE_CXX_STANDARD }} -DCMAKE_CXX_STANDARD_REQUIRED=${{ env.CMAKE_CXX_STANDARD_REQUIRED }} ` - -DCMAKE_C_FLAGS="/w /EHsc $dbg" ` - -DCMAKE_CXX_FLAGS="/w /EHsc $dbg /std:c++${{ env.CMAKE_CXX_STANDARD }}" ` - -DCMAKE_SHARED_LINKER_FLAGS="$linker" ` - -DCMAKE_RUNTIME_OUTPUT_DIRECTORY="$out" ` - -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$out" ` - -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY="$out" ` + -DCMAKE_INCLUDE_PATH="$env:VCPKG_INCLUDE" ` + -DCMAKE_LIBRARY_PATH="$env:VCPKG_LIB" ` + -DCMAKE_C_FLAGS="/w /EHsc $dbg $defs /I$env:VCPKG_INCLUDE" ` + -DCMAKE_CXX_FLAGS="/w /EHsc $dbg /std:c++${{ env.CMAKE_CXX_STANDARD }} $defs /I$env:VCPKG_INCLUDE" ` + -DCMAKE_EXE_LINKER_FLAGS="/LIBPATH:$env:VCPKG_LIB $dlfcnLib $linker" ` + -DCMAKE_SHARED_LINKER_FLAGS="/LIBPATH:$env:VCPKG_LIB $dlfcnLib $linker" ` + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE="$out" ` + -DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE="$out" ` + -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE="$out" ` -DBUILD_TESTING=${{ env.BUILD_TESTING }} ` + -DVCPKG_APPLOCAL_DEPS=ON ` ${{ env.CMAKE_EXTRA_ARGS }} + - name: build-vs if: steps.detect-mingw.outputs.full == 'false' shell: pwsh @@ -93,6 +139,7 @@ jobs: foreach ($t in $env:BUILD_TARGETS.Split()) { cmake --build build/${{ matrix.arch }} --parallel --config ${{ env.CMAKE_BUILD_TYPE }} --target $t } + - uses: actions/upload-artifact@v4 with: name: ${{ env.PROJECT_NAME }}-win-${{ matrix.arch }} diff --git a/nuget/PsycheC.Native.csproj b/nuget/PsycheC.Native.csproj index 11180770..ea27c891 100644 --- a/nuget/PsycheC.Native.csproj +++ b/nuget/PsycheC.Native.csproj @@ -2,7 +2,7 @@ PsycheC.Native netstandard2.0 - 0.0.1 + 0.0.2 Cross-platform native binaries for Psyche-C. Denis Kudelin LICENSE