diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3b5ae35c..2cb22358 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -52,13 +52,13 @@ jobs: - name: Build on Linux if: startsWith(matrix.os, 'ubuntu') run: | - schroot --chroot steamrt_scout_i386 -- cmake -B build -S . -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DCMAKE_INSTALL_PREFIX="$PWD/dist" + schroot --chroot steamrt_scout_i386 -- cmake -DCMAKE_BUILD_TYPE=Release -DPOLLY=ON -B build -S . -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DCMAKE_INSTALL_PREFIX="$PWD/dist" schroot --chroot steamrt_scout_i386 -- cmake --build build --target all schroot --chroot steamrt_scout_i386 -- cmake --build build --target install - name: Build on Linux with vgui if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.cc, 'gcc') run: | - schroot --chroot steamrt_scout_i386 -- cmake -B build-vgui -S . -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DUSE_VGUI=ON -DCMAKE_INSTALL_PREFIX="$PWD/dist-vgui" + schroot --chroot steamrt_scout_i386 -- cmake -DCMAKE_BUILD_TYPE=Release -DPOLLY=ON -B build-vgui -S . -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DUSE_VGUI=ON -DCMAKE_INSTALL_PREFIX="$PWD/dist-vgui" cp vgui_support/vgui-dev/lib/vgui.so build-vgui/cl_dll schroot --chroot steamrt_scout_i386 -- cmake --build build-vgui --target all schroot --chroot steamrt_scout_i386 -- cmake --build build-vgui --target install diff --git a/.gitignore b/.gitignore index 42594b50..2c5017bf 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,13 @@ CMakeSettings.json CMakeFiles CMakeCache.txt Makefile + +# Android Studio/Gradle +.gradle/ +.externalNativeBuild +.cxx/ +.idea/ +local.properties +.project +.classpath +.settings \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index e2ea26c0..04cf5bce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") include(CheckIncludeFile) include(CheckCSourceCompiles) include(VSForceXPToolchain) # Force XP toolchain for Visual Studio +include(CheckIPOSupported) project (HLSDK-PORTABLE) @@ -46,16 +47,37 @@ option(USE_NOVGUI_SCOREBOARD "Prefer non-VGUI Scoreboard when USE_VGUI is enable option(USE_VOICEMGR "Enable VOICE MANAGER." OFF) option(BUILD_CLIENT "Build client dll" ON) option(BUILD_SERVER "Build server dll" ON) +option(POLLY "Enable pollyhedral optimization" OFF) -if (CMAKE_SIZEOF_VOID_P EQUAL 4 OR +if(CMAKE_SIZEOF_VOID_P EQUAL 4 OR ((WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") AND (CMAKE_SYSTEM_PROCESSOR STREQUAL "x64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" - OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64"))) + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X86_64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "EM64T"))) option(64BIT "Disable auto -m32 appending to compiler flags" OFF) - option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" ON) else() option(64BIT "Disable auto -m32 appending to compiler flags" ON) +endif() + +# It seems CMAKE_SYSTEM_PROCESSOR parameter completely useless for APPLE platform, +# so may need to set options here manually. +if((WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + AND (((CMAKE_SYSTEM_PROCESSOR STREQUAL "x64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X86_64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "EM64T") AND NOT 64BIT) + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X86" + OR CMAKE_SYSTEM_PROCESSOR STREQUAL "i386")) + option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" ON) +else() option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" OFF) endif() @@ -131,6 +153,13 @@ if(VITA) add_compile_options(-fno-use-cxa-atexit) endif() +check_ipo_supported(RESULT HAVE_LTO OUTPUT LTO_ERROR) +if(HAVE_LTO) + message(STATUS "IPO / LTO enabled") +else() + message(STATUS "IPO / LTO not supported: <${LTO_ERROR}>") +endif() + check_include_file("tgmath.h" HAVE_TGMATH_H) if(HAVE_TGMATH_H) if(NOT MSVC) @@ -157,3 +186,11 @@ endif() if(NOT BUILD_SERVER AND NOT BUILD_CLIENT) message(FATAL_ERROR "Nothing to build") endif() + +if(POLLY) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + add_compile_options(-mllvm -polly) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + add_compile_options(-fgraphite-identity -floop-interchange -floop-block) + endif() +endif() diff --git a/README.md b/README.md index 706fa58a..3bff2f52 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ sudo ./setup_chroot.sh --i386 --tarball ./com.valvesoftware.SteamRuntime.Sdk-i38 Now you can use cmake and make prepending the commands with `schroot --chroot steamrt_scout_i386 --`: ``` -schroot --chroot steamrt_scout_i386 -- cmake -B build-in-steamrt -S . +schroot --chroot steamrt_scout_i386 -- cmake -DCMAKE_BUILD_TYPE=Release -B build-in-steamrt -S . schroot --chroot steamrt_scout_i386 -- cmake --build build-in-steamrt ``` @@ -180,13 +180,20 @@ sudo apt install cmake build-essential gcc-multilib g++-multilib libsdl2-dev:i38 ### Building ``` -cmake -B build -S . +cmake -DCMAKE_BUILD_TYPE=Release -B build -S . cmake --build build ``` Note that the libraries built this way might be not compatible with Steam Half-Life. If you have such issue you can configure it to build statically with c++ and gcc libraries: ``` -cmake .. -DCMAKE_C_FLAGS="-static-libstdc++ -static-libgcc" +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc" -B build -S . +cmake --build build +``` + +Alternatively, you can avoid libstdc++/libgcc_s linking using small libsupc++ library and optimization build flags instead(Really just set Release build type and set C compiler as C++ compiler): +``` +cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=cc -B build -S . +cmake --build build ``` To ensure portability it's still better to build using Steam Runtime or another chroot of some older distro. @@ -229,13 +236,36 @@ Insert your actual user name in place of `yourusername`. Prepend any make or cmake call with `schroot -c jessie --`: ``` -schroot --chroot jessie -- cmake -B build-in-chroot -S . +schroot --chroot jessie -- cmake -DCMAKE_BUILD_TYPE=Release -B build-in-chroot -S . schroot --chroot jessie -- cmake --build build-in-chroot ``` ## Android +1. Set up [Android Studio/Android SDK](https://developer.android.com/studio). -TODO +### Android Studio +Open the project located in the `android` folder and build. + +### Command-line +``` +cd android +./gradlew assembleRelease +``` + +### Customizing the build +settings.gradle: +* **rootProject.name** - project name displayed in Android Studio (optional). + +app/build.gradle: +* **android->namespace** and **android->defaultConfig->applicationId** - set both to desired package name. +* **getBuildNum** function - set **releaseDate** variable as desired. + +app/java/su/xash/hlsdk/MainActivity.java: +* **.putExtra("gamedir", ...)** - set desired gamedir. + +src/main/AndroidManifest.xml: +* **application->android:label** - set desired application name. +* **su.xash.engine.gamedir** value - set to same as above. ## Nintendo Switch @@ -307,7 +337,13 @@ Install C and C++ compilers (like gcc or clang), cmake and make. ### Building ``` -cmake -B build -S . +cmake -DCMAKE_BUILD_TYPE=Release -B build -S . +cmake --build build +``` + +Force 64-bit build: +``` +cmake -DCMAKE_BUILD_TYPE=Release -D64BIT=1 -B build -S . cmake --build build ``` @@ -316,15 +352,22 @@ cmake --build build To use waf, you need to install python (2.7 minimum) ``` -(./waf configure -T release) -(./waf) +./waf configure -T release +./waf +``` + +Force 64-bit build: +``` +./waf configure -T release -8 +./waf ``` ## Build options Some useful build options that can be set during the cmake step. -* **GOLDSOURCE_SUPPORT** - allows to turn off/on the support for GoldSource input. Set to **ON** by default on Windows and Linux, **OFF** on other platforms. +* **GOLDSOURCE_SUPPORT** - allows to turn off/on the support for GoldSource input. Set to **ON** by default on x86 Windows and x86 Linux, **OFF** on other platforms. +* **64BIT** - allows to turn off/on 64-bit build. Set to **OFF** by default on x86_64 Windows, x86_64 Linux and 32-bit platforms, **ON** on other 64-bit platforms. * **USE_VGUI** - whether to use VGUI library. **OFF** by default. You need to init `vgui_support` submodule in order to build with VGUI. This list is incomplete. Look at `CMakeLists.txt` to see all available options. diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 00000000..9952c3d1 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,73 @@ +import java.time.LocalDateTime +import java.time.Month +import java.time.temporal.ChronoUnit + +apply plugin: 'com.android.application' + +android { + ndkVersion '26.1.10909125' + namespace 'com.example.hlsdk' + + defaultConfig { + applicationId 'com.example.hlsdk' + versionName '1.0' + versionCode getBuildNum() + minSdkVersion 3 + targetSdk 34 + compileSdk 34 + + externalNativeBuild { + cmake { + arguments '-DPOLLY=ON' + } + } + } + + externalNativeBuild { + cmake { + version '3.22.1' + path file('../../CMakeLists.txt') + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + buildTypes { + debug { + minifyEnabled false + shrinkResources false + debuggable true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + release { + minifyEnabled false + shrinkResources false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + } + + lint { + abortOnError false + } + + androidResources { + noCompress += '' + } + + packagingOptions { + jniLibs { + useLegacyPackaging = true + } + } +} + +static def getBuildNum() { + LocalDateTime now = LocalDateTime.now() + LocalDateTime releaseDate = LocalDateTime.of(2023, Month.DECEMBER, 28, 0, 0, 0) + int qBuildNum = releaseDate.until(now, ChronoUnit.DAYS) + int minuteOfDay = now.getHour() * 60 + now.getMinute() + return qBuildNum * 10000 + minuteOfDay +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..d928f396 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/java/su/xash/hlsdk/MainActivity.java b/android/app/src/main/java/su/xash/hlsdk/MainActivity.java new file mode 100644 index 00000000..5d1dd353 --- /dev/null +++ b/android/app/src/main/java/su/xash/hlsdk/MainActivity.java @@ -0,0 +1,37 @@ +package su.xash.hlsdk; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Bundle; + +public class MainActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + String pkg = "su.xash.engine.test"; + + try { + getPackageManager().getPackageInfo(pkg, 0); + } catch (PackageManager.NameNotFoundException e) { + try { + pkg = "su.xash.engine"; + getPackageManager().getPackageInfo(pkg, 0); + } catch (PackageManager.NameNotFoundException ex) { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=su.xash.engine")).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)); + finish(); + return; + } + } + + startActivity(new Intent().setComponent(new ComponentName(pkg, "su.xash.engine.XashActivity")) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK) + .putExtra("gamedir", "valve") + .putExtra("gamelibdir", getApplicationInfo().nativeLibraryDir) + .putExtra("package", getPackageName())); + finish(); + } +} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 00000000..61060cd6 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,17 @@ +buildscript { + repositories { + mavenCentral() + google() + } + + dependencies { + classpath 'com.android.tools.build:gradle:8.2.0' + } +} + +allprojects { + repositories { + mavenCentral() + google() + } +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 00000000..87cc72da --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=384m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# android.useDeprecatedNdk=true +android.enableJetifier=true +android.useAndroidX=true \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..2b338a93 Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..61656665 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Dec 28 14:36:02 EET 2023 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew new file mode 100755 index 00000000..9d82f789 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 00000000..8a0b282a --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 00000000..8b31d676 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,3 @@ +include ':app' + +rootProject.name = 'hlsdk-portable' \ No newline at end of file diff --git a/cl_dll/CMakeLists.txt b/cl_dll/CMakeLists.txt index e12b2a13..e5fdfaa0 100644 --- a/cl_dll/CMakeLists.txt +++ b/cl_dll/CMakeLists.txt @@ -20,7 +20,7 @@ # SOFTWARE. # -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.9) project (CLDLL) set (CLDLL_LIBRARY client) @@ -29,13 +29,25 @@ add_definitions(-DCLIENT_DLL) if(NOT MSVC) add_compile_options(-fno-exceptions) # GCC/Clang flag - add_compile_options(-Wno-write-strings) # GCC/Clang flag + add_compile_options(-fno-rtti) # GCC/Clang flag add_compile_options(-fvisibility=hidden) # GCC/Clang flag add_definitions(-D_LINUX -DLINUX) # It seems enough for all non-Win32 systems add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp) if(NOT MINGW) add_definitions(-D_snprintf=snprintf -D_vsnprintf=vsnprintf) endif() + if(CMAKE_BUILD_TYPE MATCHES "Release" + OR (CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo" + AND CMAKE_SYSTEM_NAME STREQUAL "Android")) + add_compile_options(-fno-unwind-tables -fno-asynchronous-unwind-tables) # GCC/Clang flag + add_compile_options(-fomit-frame-pointer) # GCC/Clang flag + add_compile_options(-ftree-vectorize) # GCC/Clang flag + add_compile_options(-funsafe-math-optimizations) # GCC/Clang flag + if(CMAKE_SYSTEM_NAME STREQUAL "Android") + add_compile_options(-O3 -DNDEBUG) # gradle compiles release builds with RelWithDebInfo(-O2 -g) and strips debug symbols. + target_link_options(${CLDLL_LIBRARY} PUBLIC "LINKER:-O3") + endif() + endif() else() add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE) endif() @@ -219,8 +231,16 @@ if(MSVC) set_property(TARGET ${CLDLL_LIBRARY} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() +if(HAVE_LTO) + set_property(TARGET ${CLDLL_LIBRARY} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + install( TARGETS ${CLDLL_LIBRARY} DESTINATION "${GAMEDIR}/${CLIENT_INSTALL_DIR}/" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) + +add_custom_command(TARGET ${CLDLL_LIBRARY} + POST_BUILD DEPENDS ${CLDLL_LIBRARY} + COMMAND $<$:${CMAKE_STRIP}> -s $) diff --git a/cl_dll/cl_util.h b/cl_dll/cl_util.h index 91615660..65275c69 100644 --- a/cl_dll/cl_util.h +++ b/cl_dll/cl_util.h @@ -166,7 +166,8 @@ void VectorScale( const float *in, float scale, float *out ); float VectorNormalize( float *v ); void VectorInverse( float *v ); -extern vec3_t vec3_origin; +// extern vec3_t vec3_origin; +extern float vec3_origin[3]; // disable 'possible loss of data converting float to int' warning message #pragma warning( disable: 4244 ) diff --git a/cl_dll/util.cpp b/cl_dll/util.cpp index 7d6b6669..ec5c796f 100644 --- a/cl_dll/util.cpp +++ b/cl_dll/util.cpp @@ -33,11 +33,11 @@ #if !defined(M_PI_F) #define M_PI_F (float)M_PI #endif -extern vec3_t vec3_origin; +// extern vec3_t vec3_origin; // if C++ mangling differs from C symbol name #if _MSC_VER || __WATCOMC__ -vec3_t vec3_origin; +float vec3_origin[3]; #endif float Length( const float *v ) diff --git a/dlls/CMakeLists.txt b/dlls/CMakeLists.txt index c2390a8f..afe449a7 100644 --- a/dlls/CMakeLists.txt +++ b/dlls/CMakeLists.txt @@ -20,17 +20,30 @@ # SOFTWARE. # -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.9) project (SVDLL) set (SVDLL_LIBRARY server) if(NOT MSVC) add_compile_options(-fno-exceptions) # GCC/Clang flag + add_compile_options(-fno-rtti) # GCC/Clang flag add_compile_options(-Wno-invalid-offsetof) # GCC/Clang flag add_compile_options(-fvisibility=hidden) # GCC/Clang flag add_definitions(-D_LINUX) # It seems enough for all non-Win32 systems add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf ) + if(CMAKE_BUILD_TYPE MATCHES "Release" + OR (CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo" + AND CMAKE_SYSTEM_NAME STREQUAL "Android")) + add_compile_options(-fno-unwind-tables -fno-asynchronous-unwind-tables) # GCC/Clang flag + add_compile_options(-fomit-frame-pointer) # GCC/Clang flag + add_compile_options(-ftree-vectorize) # GCC/Clang flag + add_compile_options(-funsafe-math-optimizations) # GCC/Clang flag + if(CMAKE_SYSTEM_NAME STREQUAL "Android") + add_compile_options(-O3 -DNDEBUG) # gradle compiles release builds with RelWithDebInfo(-O2 -g) and strips debug symbols. + target_link_options(${SVDLL_LIBRARY} PUBLIC "LINKER:-O3") + endif() + endif() else() add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE) endif() @@ -223,8 +236,16 @@ if(MSVC) set_property(TARGET ${SVDLL_LIBRARY} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() +if(HAVE_LTO) + set_property(TARGET ${SVDLL_LIBRARY} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + install( TARGETS ${SVDLL_LIBRARY} DESTINATION "${GAMEDIR}/${SERVER_INSTALL_DIR}/" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + +add_custom_command(TARGET ${SVDLL_LIBRARY} + POST_BUILD DEPENDS ${SVDLL_LIBRARY} + COMMAND $<$:${CMAKE_STRIP}> -s $) diff --git a/dlls/game.cpp b/dlls/game.cpp index d7854ade..3fab4bf6 100644 --- a/dlls/game.cpp +++ b/dlls/game.cpp @@ -726,7 +726,7 @@ cvar_t sk_plr_spore3 = { "sk_plr_spore3", "0" }; void GameDLLInit( void ) { // Register cvars here: - if( CVAR_GET_POINTER( "build" ) ) + if( !CVAR_GET_POINTER( "sv_language" ) ) g_fIsXash3D = TRUE; g_psv_gravity = CVAR_GET_POINTER( "sv_gravity" ); diff --git a/mod_options.txt b/mod_options.txt index a492e011..a2e1bc9a 100644 --- a/mod_options.txt +++ b/mod_options.txt @@ -2,7 +2,7 @@ BARNACLE_FIX_VISIBILITY=OFF # Barnacle tongue length fix CLIENT_WEAPONS=ON # Client local weapons prediction CROWBAR_IDLE_ANIM=OFF # Crowbar idle animation CROWBAR_DELAY_FIX=OFF # Crowbar attack delay fix -CROWBAR_FIX_RAPID_CROWBAR=OFF # Rapid crowbar fix +CROWBAR_FIX_RAPID_CROWBAR=ON # Rapid crowbar fix GAUSS_OVERCHARGE_FIX=OFF # Gauss overcharge fix TRIPMINE_BEAM_DUPLICATION_FIX=OFF # Fix of tripmine beam duplication on level transition HANDGRENADE_DEPLOY_FIX=OFF # Handgrenade deploy animation fix after finishing a throw diff --git a/wscript b/wscript index 02efd884..4e5503ed 100644 --- a/wscript +++ b/wscript @@ -211,7 +211,7 @@ def configure(conf): conf.msg(msg='-> processing mod options', result='...', color='BLUE') regex = re.compile('^([A-Za-z0-9_]+)=([A-Za-z0-9_]+)\ \#\ (.*)$') - with open('mod_options.txt') as fd: + with open(str(conf.path.make_node('mod_options.txt'))) as fd: lines = fd.readlines() for line in lines: m = regex.match(line.strip()) @@ -230,6 +230,10 @@ def configure(conf): if conf.env.HLDEMO_BUILD and conf.env.OEM_BUILD: conf.fatal('Don\'t mix Demo and OEM builds!') + # force to use server library name + if conf.env.DEST_OS == 'android': + conf.env.SERVER_LIBRARY_NAME = 'server' # can't be any other name, until specified + # strip lib from pattern if conf.env.DEST_OS not in ['android']: if conf.env.cxxshlib_PATTERN.startswith('lib'):