diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 482dee5..29e33ca 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -23,176 +23,83 @@ name: C/C++ CI (Windows) on: push: branches: [ "*" ] - paths-ignore: [ '**.md', 'doc/**', '.idea/**'] # If only these files are edited, skip + paths-ignore: [ '**.md', 'doc/**', '.idea/**'] workflow_dispatch: jobs: - build-32bit: + build-tdm: runs-on: windows-latest + strategy: + matrix: + arch: [x64, x86] steps: - # https://github.com/actions/runner-images/issues/6067#issuecomment-1213069040 - - name: Install Windows XP Support for Visual Studio + - name: Setup TDM-GCC run: | - Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\" - $InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" - $componentsToAdd = @( - "Microsoft.VisualStudio.Component.WinXP" - ) - [string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_} - $Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache') - $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden - if ($process.ExitCode -eq 0) - { - Write-Host "components have been successfully added" - Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.* - } - else - { - Write-Host "components were not installed" - exit 1 - } - - - name: Download And Install 32-bit OpenSSL - run: | - $installDir = "$Env:ProgramFiles\OpenSSL" - # Define the URL for the JSON file containing the hashes - $jsonUrl = "https://raw.githubusercontent.com/slproweb/opensslhashes/master/win32_openssl_hashes.json" - - # Download the JSON data - $jsonData = Invoke-RestMethod -Uri $jsonUrl - - # Initialize variables for the latest version and URL - $latestVersion = "0.0.0" - $latestUrl = "" - - # Iterate through the files to find the latest 3.1.x version - foreach ($file in $jsonData.files.PSObject.Properties) { - $details = $file.Value - if ($details.basever -like "3.1*" -and $file.Name -like "Win32OpenSSL*") { - if ([version]$details.basever -gt [version]$latestVersion) { - $latestVersion = $details.basever - $latestUrl = $details.url - } - } - } - - # Output the latest version and URL - Write-Output "Latest OpenSSL Win32 3.1.x version: $latestVersion" - Write-Output "Download link: $latestUrl" - - $installerURL = $latestURL - $installerName = "Win32OpenSSL.exe" - $installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName" - - (New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath) - - Remove-Item "$installDir" -Force -Recurse - $installerArgs = '/silent', '/sp-', '/suppressmsgboxes', "/DIR=`"$installDir`"" - Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru + Write-Host Downloading TDM-GCC v10.3.0... + Invoke-WebRequest -Uri 'https://github.com/jmeubank/tdm-gcc/releases/download/v10.3.0-tdm64-2/tdm64-gcc-10.3.0-2.exe' -OutFile 'C:\Windows\temp\TDM-GCC-64.exe' + Write-Host Creating directory... + New-Item -ItemType Directory -Path 'C:\TDM-GCC-64' + Write-Host Copying files [Set 1/3]... + Start-Process '7z' -ArgumentList 'e C:\Windows\temp\TDM-GCC-64.exe -oC:\TDM-GCC-64 -y' -Wait + Write-Host Copying files [Set 2/3]... + Start-Process '7z' -ArgumentList 'e C:\TDM-GCC-64\*.tar.xz -oC:\TDM-GCC-64 -y' -Wait + Write-Host Copying files [Set 3/3]... + Start-Process '7z' -ArgumentList 'x C:\TDM-GCC-64\*.tar -oC:\TDM-GCC-64 -y' -Wait + Write-Host Adding environment variables... + $env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH + [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine) - name: Checkout Source Tree uses: actions/checkout@v4 - - name: Setup MSBuild - uses: microsoft/setup-msbuild@v1 + - name: Download OpenSSL-TDM release asset + shell: pwsh + run: | + if ('${{ matrix.arch }}' -eq 'x64') { + $url = "https://github.com/UMSKT/winactiontest/releases/download/openssl/OpenSSL-TDM-64.zip" + $dest = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-64" + $libdir = "lib64" + $cmake_flags = "-m64" + $openssl_root = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-64" + } else { + $url = "https://github.com/UMSKT/winactiontest/releases/download/openssl/OpenSSL-TDM-32.zip" + $dest = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-32" + $libdir = "lib32" + $cmake_flags = "-m32" + $openssl_root = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-32" + } + Invoke-WebRequest -Uri $url -OutFile "OpenSSL-TDM.zip" + Expand-Archive -Path "OpenSSL-TDM.zip" -DestinationPath $env:GITHUB_WORKSPACE + echo "OPENSSL_ROOT=$openssl_root" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "OPENSSL_LIBDIR=$libdir" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "CMAKE_FLAGS=$cmake_flags" | Out-File -FilePath $env:GITHUB_ENV -Append - - name: Configure UMSKT - uses: threeal/cmake-action@v1.2.0 - with: - generator: "Visual Studio 17 2022" - options: CMAKE_SYSTEM_VERSION="5.1.2600" - args: -A "Win32" -T v141_xp + - name: Configure UMSKT (TDM-GCC ${{ matrix.arch }}) + shell: pwsh + run: | + $env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH + $OPENSSL_ROOT = "$env:OPENSSL_ROOT" + $OPENSSL_LIB = "$OPENSSL_ROOT/$env:OPENSSL_LIBDIR" + $OPENSSL_INC = "$OPENSSL_ROOT/include" + cmake -G "MinGW Makefiles" ` + -DCMAKE_C_COMPILER="gcc" ` + -DCMAKE_CXX_COMPILER="g++" ` + -DOPENSSL_ROOT_DIR="$OPENSSL_ROOT" ` + -DOPENSSL_INCLUDE_DIR="$OPENSSL_INC" ` + -DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_LIB/libcrypto.a" ` + -DOPENSSL_SSL_LIBRARY="$OPENSSL_LIB/libssl.a" ` + -DCMAKE_C_FLAGS="$env:CMAKE_FLAGS" ` + -DCMAKE_CXX_FLAGS="$env:CMAKE_FLAGS" ` + . - - name: Build UMSKT - working-directory: build - run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release + - name: Build UMSKT (TDM-GCC ${{ matrix.arch }}) + shell: pwsh + run: | + $env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH + mingw32-make - name: Upload build artifact uses: actions/upload-artifact@v4.6.2 with: - name: UMSKT-Win32 - path: build/Release - - build-64bit: - runs-on: windows-latest - steps: - - name: Install Windows XP Support for Visual Studio - run: | - Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\" - $InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" - $componentsToAdd = @( - "Microsoft.VisualStudio.Component.WinXP" - ) - [string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_} - $Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache') - $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden - if ($process.ExitCode -eq 0) - { - Write-Host "components have been successfully added" - Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.* - } - else - { - Write-Host "components were not installed" - exit 1 - } - - - name: Download And Install 64-bit OpenSSL - run: | - $installDir = "$Env:ProgramFiles\OpenSSL" - # Define the URL for the JSON file containing the hashes - $jsonUrl = "https://raw.githubusercontent.com/slproweb/opensslhashes/master/win32_openssl_hashes.json" - - # Download the JSON data - $jsonData = Invoke-RestMethod -Uri $jsonUrl - - # Initialize variables for the latest version and URL - $latestVersion = "0.0.0" - $latestUrl = "" - - # Iterate through the files to find the latest 3.1.x version - foreach ($file in $jsonData.files.PSObject.Properties) { - $details = $file.Value - if ($details.basever -like "3.1*" -and $file.Name -like "Win64OpenSSL*") { - if ([version]$details.basever -gt [version]$latestVersion) { - $latestVersion = $details.basever - $latestUrl = $details.url - } - } - } - - # Output the latest version and URL - Write-Output "Latest OpenSSL Win64 3.1.x version: $latestVersion" - Write-Output "Download link: $latestUrl" - - $installerURL = $latestURL - $installerName = "Win64OpenSSL.exe" - $installerPath = Join-Path -Path "${env:Temp}" -ChildPath "$installerName" - - (New-Object System.Net.WebClient).DownloadFile($installerURL, $installerPath) - - Remove-Item "$installDir" -Force -Recurse - $installerArgs = '/silent', '/sp-', '/suppressmsgboxes', "/DIR=`"$installDir`"" - Start-Process -FilePath $installerPath -ArgumentList $installerArgs -Wait -PassThru - - - name: Checkout Source Tree - uses: actions/checkout@v4 - - - name: Setup MSBuild - uses: microsoft/setup-msbuild@v1 - - - name: Configure UMSKT - uses: threeal/cmake-action@v1.2.0 - with: - generator: "Visual Studio 17 2022" - args: -A "x64" -T "v141_xp" - - - name: Build UMSKT - working-directory: build - run: msbuild ALL_BUILD.vcxproj /P:Configuration=Release - - - name: Upload build artifact - uses: actions/upload-artifact@v4.6.2 - with: - name: UMSKT-Win64 - path: build/Release + name: UMSKT-TDM${{ matrix.arch }} + path: umskt.exe diff --git a/.gitignore b/.gitignore index 3d8ca8b..8591949 100644 --- a/.gitignore +++ b/.gitignore @@ -252,4 +252,10 @@ _deps CMakeSettings.json # Visual Studio -.vs/ \ No newline at end of file +.vs/ + +CPM_modules +CPM_*.cmake +cpm-package-lock.cmake +*.a +*_cmrc* \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index f7763ea..ed7b19a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,13 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.12) PROJECT(UMSKT) +# Force TDM-GCC on Windows if not using MSVC +if (WIN32 AND NOT MSVC) + set(CMAKE_C_COMPILER "C:/TDM-GCC-64/bin/gcc.exe" CACHE FILEPATH "C Compiler" FORCE) + set(CMAKE_CXX_COMPILER "C:/TDM-GCC-64/bin/g++.exe" CACHE FILEPATH "C++ Compiler" FORCE) + message(STATUS "[UMSKT] Forcing use of TDM-GCC in C:/TDM-GCC-64") +endif() + SET(CMAKE_CXX_STANDARD 17) SET(CMAKE_OSX_SYSROOT "macosx" CACHE PATH "macOS SDK path") @@ -207,6 +214,12 @@ ELSE() TARGET_INCLUDE_DIRECTORIES(umskt PUBLIC ${OPENSSL_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(umskt _umskt ${OPENSSL_CRYPTO_LIBRARIES} ${ZLIB_LIBRARIES} fmt nlohmann_json::nlohmann_json umskt::rc ${UMSKT_LINK_LIBS}) TARGET_LINK_DIRECTORIES(umskt PUBLIC ${UMSKT_LINK_DIRS}) + + # Link required Windows system libraries for OpenSSL + if (WIN32) + target_link_libraries(umskt crypt32 ws2_32) + endif() + IF(MSVC AND MSVC_MSDOS_STUB) SET_PROPERTY(TARGET umskt APPEND PROPERTY LINK_FLAGS /STUB:${MSVC_MSDOS_STUB}) ENDIF()