diff --git a/.github/workflows/dos-djgpp.yml b/.github/workflows/dos-djgpp.yml index ee968c3..f267223 100644 --- a/.github/workflows/dos-djgpp.yml +++ b/.github/workflows/dos-djgpp.yml @@ -188,3 +188,121 @@ jobs: with: name: UMSKT-DOS-x86 path: build/actions_upload + compress: + needs: build + if: success() + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Setup test environment + run: | + sudo apt -y update + sudo apt -y install dosbox + + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: UMSKT-DOS-x86 + path: . + + - name: Install UPX + uses: crazy-max/ghaction-upx@v3 + with: + install-only: true + + - name: Compress binary + shell: pwsh + run: | + upx umskt.exe --best --ultra-brute -v + + - name: Setup DOSBox test environment + run: | + mkdir -p dosbox_test + cp umskt.exe dosbox_test/ + # Download DPMI server directly + # wget https://github.com/UMSKT/winactiontest/raw/refs/heads/main/CWSDPMI.EXE -O dosbox_test/CWSDPMI.EXE + # Create test batch file + cat > dosbox_test/test.bat << EOL + @echo off + echo Running test 1... + umskt.exe -b 2C -c 365 -s 069420 > TEST1.TXT + if errorlevel 1 goto error + echo Running test 2... + umskt.exe -i 253286028742154311079061239762245184619981623171292574 > TEST2.TXT + if errorlevel 1 goto error + echo Tests completed > DONE.TXT + goto end + :error + echo Test failed > ERROR.TXT + :end + exit + EOL + # Create DOSBox configuration + cat > dosbox_test/dosbox.conf << EOL + [sdl] + nosound=true + [cpu] + cputype=386 + core=dynamic + cycles=max + [autoexec] + mount c . + c: + test.bat + exit + EOL + + - name: Run tests in DOSBox + + run: | + cd dosbox_test + timeout 30s dosbox -conf dosbox.conf -nogui -exit + # Check if the test completed successfully + if [ ! -f DONE.TXT ]; then + echo "Tests did not complete successfully" + if [ -f ERROR.TXT ]; then + echo "Test execution failed" + fi + if [ -f TEST1.TXT ]; then + echo "Test 1 output:" + cat TEST1.TXT + fi + if [ -f TEST2.TXT ]; then + echo "Test 2 output:" + cat TEST2.TXT + fi + exit 1 + fi + # Verify test outputs + if [ ! -f TEST1.TXT ] || [ ! -f TEST2.TXT ]; then + echo "Test output files missing" + exit 1 + fi + # Check test results - looking for key format patterns + if ! grep -qE '[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}' TEST1.TXT || \ + ! grep -qE '[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}-[0-9]{6}' TEST2.TXT; then + echo "Tests failed - unexpected output format" + echo "Test 1 output:" + cat TEST1.TXT + echo "Test 2 output:" + cat TEST2.TXT + exit 1 + else + echo "All tests passed successfully" + echo "Test 1 output:" + cat TEST1.TXT + echo "Test 2 output:" + cat TEST2.TXT + fi + + - name: Move executable to upload directory + run: | + mkdir actions_upload + mv umskt.exe actions_upload/ + + - name: Upload build artifact + uses: actions/upload-artifact@v4.6.2 + with: + name: UMSKT-DOS-x86-Compressed + path: actions_upload diff --git a/.github/workflows/windows-x86-x64.yml b/.github/workflows/windows-x86-x64.yml index f4b3062..9afa794 100644 --- a/.github/workflows/windows-x86-x64.yml +++ b/.github/workflows/windows-x86-x64.yml @@ -98,9 +98,9 @@ jobs: cd openssl-1.1.1 if [[ ${{ matrix.arch }} == "x86" ]]; then - /usr/bin/perl Configure mingw --prefix=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-${{ matrix.arch }} --openssldir=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-32 no-tests no-sse2 no-asm no-threads -DOPENSSL_DEV_NO_ATOMICS -mno-mmx -mno-sse -mno-sse2 -march=i686 -mtune=generic + /usr/bin/perl Configure mingw --prefix=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-${{ matrix.arch }} --openssldir=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-32 no-tests no-sse2 no-asm no-threads -DOPENSSL_DEV_NO_ATOMICS -mno-mmx -mno-sse -mno-sse2 -march=i686 -mtune=generic -Os -s -fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -fno-stack-protector else - /usr/bin/perl Configure mingw64 --prefix=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-${{ matrix.arch }} --openssldir=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-64 no-tests no-asm -DOPENSSL_DEV_NO_ATOMICS -mno-mmx + /usr/bin/perl Configure mingw64 --prefix=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-${{ matrix.arch }} --openssldir=$(cygpath -u "$GITHUB_WORKSPACE")/OpenSSL-TDM-64 no-tests no-asm -DOPENSSL_DEV_NO_ATOMICS -mno-mmx -Os -s -fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -fno-stack-protector fi mingw32-make -j mingw32-make install_sw @@ -158,3 +158,78 @@ jobs: with: name: UMSKT-WinNT-${{ matrix.arch }} path: umskt.exe + + compress: + needs: build + if: success() + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + include: + - arch: x86 + - arch: x64 + steps: + - name: Setup TDM-GCC + run: | + 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: Setup UPX + run: | + Invoke-WebRequest -Uri 'https://github.com/upx/upx/releases/download/v5.0.2/upx-5.0.2-win64.zip' -OutFile 'C:\Windows\temp\upx.zip' + Write-Host Creating directory... + New-Item -ItemType Directory -Path 'C:\UPX' + Write-Host Copying files... + Expand-Archive -Path 'C:\Windows\temp\upx.zip' -DestinationPath 'C:\UPX' + Write-Host Adding environment variables... + $env:PATH = 'C:\UPX\upx-5.0.2-win64;' + $env:PATH + [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine) + + - name: Download ${{matrix.arch}} artifact + uses: actions/download-artifact@v4 + with: + name: UMSKT-WinNT-${{ matrix.arch }} + path: . + - name: Compress binaries + shell: pwsh + run: | + # Strip symbols + strip .\umskt.exe + + # Remove resources + llvm-objcopy --remove-section .rsrc umskt.exe umskt_comp.exe + + # Compress with UPX + & "C:\UPX\upx-5.0.2-win64\upx.exe" --best --ultra-brute .\umskt_comp.exe + + # Replace original EXE + Remove-Item .\umskt.exe + Rename-Item -Path .\umskt_comp.exe -NewName umskt.exe + + + + - name: Run tests + shell: pwsh + run: | + Write-Host Test 1 - generating key + .\umskt.exe -b 2C -c 365 -s 069420 -v + Write-Host Test 2 - generatng confid + .\umskt.exe -i 253286028742154311079061239762245184619981623171292574 + + - name: Upload build artifact + uses: actions/upload-artifact@v4.6.2 + with: + name: UMSKT-WinNT-${{ matrix.arch }}-Compressed + path: umskt.exe diff --git a/CMakeLists.txt b/CMakeLists.txt index fb6af08..7bcc8bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,11 @@ if (WIN32 AND NOT MSVC) 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") + # Add size optimization flags for GCC + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Os -s -fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -fno-stack-protector") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os -s -fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -fno-stack-protector") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Wl,--gc-sections -Wl,--strip-all") + # Configure windres for resource compilation set(CMAKE_RC_COMPILER "C:/TDM-GCC-64/bin/windres.exe") set(CMAKE_RC_COMPILER_INIT windres) @@ -123,13 +128,13 @@ ENDIF() IF(MSVC) SET(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") IF(NOT BUILD_SHARED_LIBS) - SET(CMAKE_CXX_FLAGS_RELEASE "/MT") + SET(CMAKE_CXX_FLAGS_RELEASE "/MT /Os /GL /GS- /Gy") SET(CMAKE_CXX_FLAGS_DEBUG "/MTd") ELSE() - SET(CMAKE_CXX_FLAGS_RELEASE "/MD") + SET(CMAKE_CXX_FLAGS_RELEASE "/MD /Os /GL /GS- /Gy") SET(CMAKE_CXX_FLAGS_DEBUG "/MDd") ENDIF() - SET(CMAKE_EXE_LINKER_FLAGS "/INCREMENTAL:NO /NODEFAULTLIB:MSVCRT") + SET(CMAKE_EXE_LINKER_FLAGS "/INCREMENTAL:NO /NODEFAULTLIB:MSVCRT /OPT:REF /OPT:ICF") SET(CMAKE_ENABLE_EXPORTS ON) SET(UMSKT_EXE_WINDOWS_EXTRA src/windows/umskt.rc) SET(UMSKT_EXE_WINDOWS_DLL src/windows/dllmain.cpp)