diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..23bcef9 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,105 @@ +name: C/C++ CI + +on: + push: + branches: [master] + paths-ignore: + - '**.md' + + pull_request: + types: [opened, reopened, synchronize] + release: + types: [published] + +jobs: + windows: + name: 'Windows' + runs-on: windows-latest + + env: + solution: 'SafeNameAndChat.sln' + buildPlatform: 'x86' + buildRelease: 'Release' + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v1.0.2 + + - name: Build + run: | + msbuild ${{ env.solution }} -p:Configuration="${{ env.buildRelease }}" /t:Clean,Build /p:Platform=${{ env.buildPlatform }} /p:PlatformToolset=v140_xp /p:XPDeprecationWarning=false + + - name: Move files + run: | + mkdir publish\bin\win32 + move ${{ env.buildRelease }}\SafeNameAndChat.dll publish\bin\win32\SafeNameAndChat.dll + + - name: Deploy artifacts + uses: actions/upload-artifact@v2 + with: + name: win32 + path: publish/* + + linux: + name: 'Linux' + runs-on: ubuntu-latest + container: s1lentq/linux86buildtools:latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + apt-get install -y g++-8 g++-8-multilib + + - name: Build + run: | + rm -rf build && CC=gcc-8 CXX=g++-8 cmake -B build -DUSE_STATIC_LIBSTDC=ON && cmake --build build -j8 + + - name: Move files + run: | + mkdir -p publish/bin/linux32 + mv build/SafeNameAndChat.so publish/bin/linux32/SafeNameAndChat.so + + - name: Deploy artifacts + uses: actions/upload-artifact@v2 + id: upload-job + with: + name: linux32 + path: publish/* + + publish: + name: 'Publish' + runs-on: ubuntu-latest + needs: [windows, linux] + + steps: + - name: Deploying linux artifacts + uses: actions/download-artifact@v2 + with: + name: linux32 + + - name: Deploying windows artifacts + uses: actions/download-artifact@v2 + with: + name: win32 + + - name: Publish artifacts + uses: softprops/action-gh-release@v1 + id: publish-job + if: | + github.event_name == 'release' && + github.event.action == 'published' && + startsWith(github.ref, 'refs/tags/') + with: + files: | + bin/linux32/SafeNameAndChat.so + bin/win32/SafeNameAndChat.dll diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 816a9d2..0000000 --- a/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -dist: trusty -sudo: required -language: cpp -os: linux -compiler: gcc -addons: - apt: - sources: ubuntu-toolchain-r-test - packages: - - linux-libc-dev:i386 - - g++-8 - - g++-8-multilib - - cmake - - freebsd-buildutils -before_install: eval "CC=gcc-8 && CXX=g++-8" -script: - # Why do we need -fno-gnu-unique? - # These params disable "global unique objects" generated for currently compiled code - # - # -fuse-ld=gold -Wl,--no-gnu-unique - # These params disable "global unique objects" for already compiled object files, so there will be no UNIQUE in result binary - # You need to use these params if you're exporting symbols from object files not compiled with -fno-gnu-unique - # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60348#c5 - # BTW -fuse-ld=gold always (sure?) produce binary with SVR4 brand, but we can change it by brandelf anyway - # Also idk what also the gold linker affects in result binary, there is about 5KB diff - # - # TODO: -flto & its issues with hiding symbols - # If static library is compiled with -flto, its exported symbols may be exported even if you have version script file - # There is a command for linker fixes that issue, but I forgot it - # - # Also looks like I'm having some issues with -ldl importing, hmm... (IDA doesn't display required glibc version for imported functions) - - ${CXX} Main.cpp -m32 -O3 -shared -std=c++14 -s -static-libgcc -static-libstdc++ -fvisibility=hidden -fpermissive -Ihlsdk/common -Ihlsdk/dlls -Ihlsdk/engine -Ihlsdk/pm_shared -Imetamod -ldl -o SafeNameAndChat.so -fdata-sections -ffunction-sections -Wl,--version-script=version_script.lds -Wl,--gc-sections -fno-gnu-unique - - brandelf SafeNameAndChat.so -t SVR4 -deploy: - provider: releases - file: SafeNameAndChat.so - skip_cleanup: true - overwrite: true - api_key: '$GITHUB_API_KEY' - on: - tags: true \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..15f5c3a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,114 @@ +cmake_minimum_required(VERSION 3.1) +project(snac CXX) + +option(DEBUG "Build with debug information." OFF) +option(USE_STATIC_LIBSTDC "Enables static linking libstdc++." OFF) + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Avoid -rdynamic -fPIC options +set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "") +set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + +set(COMPILE_FLAGS "-m32 -U_FORTIFY_SOURCE") +set(LINK_FLAGS "-m32") + +set(COMPILE_FLAGS "${COMPILE_FLAGS} -Wall -fno-exceptions -fno-builtin -Wno-unknown-pragmas") + +# Remove noxref code and data +set(COMPILE_FLAGS "${COMPILE_FLAGS} -ffunction-sections -fdata-sections") + +if (DEBUG) + set(COMPILE_FLAGS "${COMPILE_FLAGS} -g3 -O3 -ggdb") +else() + set(COMPILE_FLAGS "${COMPILE_FLAGS} -g0 -O3 -fno-stack-protector") +endif() + +set(COMPILE_FLAGS "${COMPILE_FLAGS} -msse2 -fno-rtti -fvisibility=hidden -fvisibility-inlines-hidden -ffunction-sections -fdata-sections") + +# Check Intel C++ compiler +if ("$ENV{CXX}" MATCHES "icpc") + set(COMPILE_FLAGS "${COMPILE_FLAGS} \ + -fp-model=strict\ + -fasm-blocks\ + -fomit-frame-pointer\ + -Qoption,cpp,--treat_func_as_string_literal_cpp") + + set(LINK_FLAGS "${LINK_FLAGS} \ + -static-intel\ + -no-intel-extensions") + + if (NOT DEBUG) + set(COMPILE_FLAGS "${COMPILE_FLAGS} -ipo") + set(LINK_FLAGS "${LINK_FLAGS} -ipo") + endif() +else() + # Produce code optimized for the most common IA32/AMD64/EM64T processors. + # As new processors are deployed in the marketplace, the behavior of this option will change. + set(COMPILE_FLAGS "${COMPILE_FLAGS} -fpermissive -fno-sized-deallocation") + + # Check if not Clang compiler + if (NOT "$ENV{CXX}" MATCHES "clang") + set(COMPILE_FLAGS "${COMPILE_FLAGS} -fno-gnu-unique") + endif() +endif() + +# GCC >= 8.3 +if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0) + set(COMPILE_FLAGS "${COMPILE_FLAGS} -fcf-protection=none") +endif() + +if (NOT DEBUG) + set(LINK_FLAGS "${LINK_FLAGS} \ + -s -Wl,-gc-sections -Wl,--version-script=\"${PROJECT_SOURCE_DIR}/version_script.lds\"") +endif() + +set(PROJECT_PUBLIC_DIR + "${PROJECT_SOURCE_DIR}/hlsdk/common" + "${PROJECT_SOURCE_DIR}/hlsdk/dlls" + "${PROJECT_SOURCE_DIR}/hlsdk/engine" + "${PROJECT_SOURCE_DIR}/hlsdk/pm_shared" + "${PROJECT_SOURCE_DIR}/metamod" +) + +set(MAIN_SRCS + "Main.cpp" +) + +add_library(snac SHARED) + +target_include_directories(snac PRIVATE + ${PROJECT_SOURCE_DIR} + ${PROJECT_PUBLIC_DIR} +) + +target_compile_definitions(snac PRIVATE + _LINUX + LINUX + NDEBUG + _GLIBCXX_USE_CXX11_ABI=0 +) + +target_sources(snac PRIVATE + ${MAIN_SRCS} +) + +target_link_libraries(snac PRIVATE + rt + m + dl +) + +if (USE_STATIC_LIBSTDC) + target_compile_definitions(snac PRIVATE BUILD_STATIC_LIBSTDC) + set(LINK_FLAGS "${LINK_FLAGS} -static-libgcc -static-libstdc++") +endif() + +set_target_properties(snac PROPERTIES + OUTPUT_NAME SafeNameAndChat + PREFIX "" + COMPILE_FLAGS ${COMPILE_FLAGS} + LINK_FLAGS ${LINK_FLAGS} + POSITION_INDEPENDENT_CODE OFF +) diff --git a/Compile.sh b/Compile.sh deleted file mode 100644 index 5d1cccf..0000000 --- a/Compile.sh +++ /dev/null @@ -1,10 +0,0 @@ -/opt/intel/bin/icpc \ - -O3 -m32 -shared \ - -fno-builtin -fno-rtti -Qoption,cpp,--treat_func_as_string_literal_cpp -no-intel-extensions -fno-stack-protector -std=c++14 \ - -ipo -s -static-libgcc -static-intel -static-libstdc++ \ - -msse2 -fp-model strict -fomit-frame-pointer -g0 \ - -fvisibility=hidden \ --Ihlsdk/common -Ihlsdk/dlls -Ihlsdk/engine -Ihlsdk/pm_shared -Imetamod \ - Main.cpp \ --lrt -ldl -lm \ --o SafeNameAndChat.so \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..bbaa673 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# SafeNameAndChat [![Download](https://camo.githubusercontent.com/1c836b9a3bc97bddd0d35f531833ce0eab6f1a82c69bc47987a3068b4d1197ed/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f57504d4750526f53546f54654d612f536166654e616d65416e64436861742e737667)](https://github.com/WPMGPRoSToTeMa/SafeNameAndChat/releases/latest) [![Downloads](https://camo.githubusercontent.com/d12eaaf6643e932e38e267852f633a581423216858bc1bb7ab7bfa9d1654f419/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f57504d4750526f53546f54654d612f536166654e616d65416e64436861742f746f74616c3f636f6c6f723d696d706f7274616e74)]() [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) + +## Build instructions +### Checking requirements +There are several software requirements for building SafeNameAndChat: + +#### Windows +
+Visual Studio 2015 (C++14 standard) and later ++ +#### Linux +
+git >= 1.8.5 +cmake >= 3.10 +GCC >= 4.9.2 (Optional) +ICC >= 15.0.1 20141023 (Optional) +LLVM (Clang) >= 6.0 (Optional) ++ +### Building + +#### Windows +Use `Visual Studio` to build, open `SafeNameAndChat.sln` and just select from the solution configurations list `Release` or `Debug` and platform x86 + +#### Linux + +* Optional options using `build.sh --compiler=[gcc] --jobs=[N] -D[option]=[ON or OFF]` (without square brackets) + +
+-c=|--compiler=[icc|gcc|clang] - Select preferred C/C++ compiler to build +-j=|--jobs=[N] - Specifies the number of jobs (commands) to run simultaneously (For faster building) + +Definitions (-D) +DEBUG - Enables debugging mode +USE_STATIC_LIBSTDC - Enables static linking library libstdc++ ++ +* ICC
./build.sh --compiler=intel+* LLVM (Clang)
./build.sh --compiler=clang+* GCC
./build.sh --compiler=gcc+ +##### Checking build environment (Debian / Ubuntu) + +
+sudo dpkg --add-architecture i386 +sudo apt-get update +sudo apt-get install -y gcc-multilib g++-multilib +sudo apt-get install -y build-essential +sudo apt-get install -y libc6-dev libc6-dev-i386 ++
+1) sudo apt-get install -y gcc g++ +2) sudo apt-get install -y clang ++