diff --git a/engine/common/common.h b/engine/common/common.h index 0c8f1ddb..ad168866 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -51,6 +51,8 @@ XASH SPECIFIC - sort of hack that works only in Xash3D not in GoldSrc #include // off_t #endif +#include "library_suffix.h" + // configuration // diff --git a/engine/common/lib_common.c b/engine/common/lib_common.c index d3c1a5fc..6acc3029 100644 --- a/engine/common/lib_common.c +++ b/engine/common/lib_common.c @@ -125,18 +125,6 @@ dll_user_t *FS_FindLibrary( const char *dllname, qboolean directpath ) ============================================================================= */ - -static void COM_GenerateCommonLibraryName( const char *name, const char *ext, char *out, size_t size ) -{ -#if ( XASH_WIN32 || ( XASH_LINUX && !XASH_ANDROID ) || XASH_APPLE ) && XASH_X86 - Q_snprintf( out, size, "%s.%s", name, ext ); -#elif XASH_WIN32 || ( XASH_LINUX && !XASH_ANDROID ) || XASH_APPLE - Q_snprintf( out, size, "%s_%s.%s", name, Q_buildarch(), ext ); -#else - Q_snprintf( out, size, "%s_%s_%s.%s", name, Q_buildos(), Q_buildarch(), ext ); -#endif -} - /* ============== COM_GenerateClientLibraryPath @@ -149,32 +137,12 @@ static void COM_GenerateClientLibraryPath( const char *name, char *out, size_t s #ifdef XASH_INTERNAL_GAMELIBS // assuming library loader knows where to get libraries Q_strncpy( out, name, size ); #else - string dllpath; + string libname; -#if XASH_ANDROID - Q_snprintf( dllpath, sizeof( dllpath ), "%s/lib%s", GI->dll_path, name ); -#else - Q_snprintf( dllpath, sizeof( dllpath ), "%s/%s", GI->dll_path, name ); + COM_GenerateCommonLibraryName( name, libname, sizeof( libname )); + + Q_snprintf( out, size, "%s/%s", GI->dll_path, libname ); #endif - - COM_GenerateCommonLibraryName( dllpath, OS_LIB_EXT, out, size ); -#endif -} - -/* -============== -COM_StripIntelSuffix - -Some modders use _i?86 suffix in game library name -So strip it to follow library naming for non-Intel CPUs -============== -*/ -static inline void COM_StripIntelSuffix( char *out ) -{ - char *suffix = Q_strrchr( out, '_' ); - - if( suffix && Q_stricmpext( "_i?86", suffix )) - *suffix = 0; } /* @@ -202,8 +170,8 @@ static void COM_GenerateServerLibraryPath( const char *alt_dllname, char *out, s COM_StripIntelSuffix( out ); COM_DefaultExtension( out, "." OS_LIB_EXT, size ); #else - string temp, dir, dllpath, ext; - const char *dllname; + string temp, dir, libname; + const char *base_dllname; #if XASH_WIN32 Q_strncpy( temp, GI->game_dll, sizeof( temp )); @@ -218,27 +186,19 @@ static void COM_GenerateServerLibraryPath( const char *alt_dllname, char *out, s if( alt_dllname ) { - dllname = alt_dllname; - Q_strncpy( ext, OS_LIB_EXT, sizeof( ext )); + base_dllname = alt_dllname; } else { // cleaned up dll name - Q_strncpy( ext, COM_FileExtension( temp ), sizeof( ext )); COM_StripExtension( temp ); COM_StripIntelSuffix( temp ); - dllname = COM_FileWithoutPath( temp ); + base_dllname = COM_FileWithoutPath( temp ); } - // add `lib` prefix if required by platform -#if XASH_ANDROID - Q_snprintf( dllpath, sizeof( dllpath ), "%s/lib%s", dir, dllname ); -#else - Q_snprintf( dllpath, sizeof( dllpath ), "%s/%s", dir, dllname ); -#endif + COM_GenerateCommonLibraryName( base_dllname, libname, sizeof( libname )); - // and finally add platform suffix - COM_GenerateCommonLibraryName( dllpath, ext, out, size ); + Q_snprintf( out, size, "%s/%s", dir, libname ); #endif } diff --git a/engine/wscript b/engine/wscript index 372f071c..a96a5758 100644 --- a/engine/wscript +++ b/engine/wscript @@ -199,7 +199,7 @@ def build(bld): # public includes for renderers and utils use bld(name = 'engine_includes', export_includes = '. common common/imagelib', use = 'filesystem_includes') - libs = ['engine_includes', 'public', 'werror', 'backtrace'] + libs = ['engine_includes', 'public', 'werror', 'backtrace', 'library_suffix'] includes = ['server', 'client', 'client/vgui', 'common/soundlib', 'platform'] # basic build: dedicated only diff --git a/filesystem/filesystem.c b/filesystem/filesystem.c index e3cdc729..aff8b544 100644 --- a/filesystem/filesystem.c +++ b/filesystem/filesystem.c @@ -48,6 +48,7 @@ GNU General Public License for more details. #include "xash3d_mathlib.h" #include "common/com_strings.h" #include "common/protocol.h" +#include "library_suffix.h" #define FILE_COPY_SIZE (1024 * 1024) #define SAVE_AGED_COUNT 2 // the default count of quick and auto saves diff --git a/filesystem/wscript b/filesystem/wscript index b80ec79e..fa60d9a5 100644 --- a/filesystem/wscript +++ b/filesystem/wscript @@ -33,7 +33,7 @@ def configure(conf): def build(bld): bld(name = 'filesystem_includes', export_includes = '.') - libs = [ 'filesystem_includes', 'sdk_includes', 'werror' ] + libs = [ 'filesystem_includes', 'sdk_includes', 'werror', 'library_suffix' ] # on PSVita do not link any libraries that are already in the main executable, but add the includes target if bld.env.DEST_OS != 'psvita': diff --git a/public/build.c b/public/build.c index 361a7b90..7bd062b3 100644 --- a/public/build.c +++ b/public/build.c @@ -76,168 +76,3 @@ int Q_buildnum_compat( void ) return 4529; } -/* -============ -Q_GetPlatformStringByID - -Returns name of operating system by ID. Without any spaces. - -TODO: add platform-dependent ABI variants, for example, different libc on Linux -============ -*/ -const char *Q_PlatformStringByID( const int platform ) -{ - switch( platform ) - { - case PLATFORM_WIN32: - return "win32"; - case PLATFORM_ANDROID: - return "android"; - case PLATFORM_LINUX: - return "linux"; - case PLATFORM_APPLE: - return "apple"; - case PLATFORM_FREEBSD: - return "freebsd"; - case PLATFORM_NETBSD: - return "netbsd"; - case PLATFORM_OPENBSD: - return "openbsd"; - case PLATFORM_EMSCRIPTEN: - return "emscripten"; - case PLATFORM_DOS4GW: - return "DOS4GW"; - case PLATFORM_HAIKU: - return "haiku"; - case PLATFORM_SERENITY: - return "serenity"; - case PLATFORM_IRIX: - return "irix"; - case PLATFORM_NSWITCH: - return "nswitch"; - case PLATFORM_PSVITA: - return "psvita"; - case PLATFORM_WASI: - return "wasi"; - case PLATFORM_SUNOS: - return "sunos"; - case PLATFORM_HURD: - return "hurd"; - case PLATFORM_PSP: - return "psp"; - } - - assert( 0 ); - return "unknown"; -} - -/* -============ -Q_buildos - -Shortcut for Q_buildos_ -============ -*/ -const char *Q_buildos( void ) -{ - return Q_PlatformStringByID( XASH_PLATFORM ); -} - - -/* -============ -Q_ArchitectureStringByID - -Returns name of the architecture by it's ID. Without any spaces. -============ -*/ -const char *Q_ArchitectureStringByID( const int arch, const uint abi, const int endianness, const qboolean is64 ) -{ - // I don't want to change this function prototype - // and don't want to use static buffer either - // so encode all possible variants... :) - switch( arch ) - { - case ARCHITECTURE_AMD64: - return "amd64"; - case ARCHITECTURE_X86: - return "i386"; - case ARCHITECTURE_E2K: - return "e2k"; - case ARCHITECTURE_JS: - return "javascript"; - case ARCHITECTURE_PPC: - return endianness == ENDIANNESS_LITTLE ? - ( is64 ? "ppc64el" : "ppcel" ): - ( is64 ? "ppc64" : "ppc" ); - case ARCHITECTURE_MIPS: - return endianness == ENDIANNESS_LITTLE ? - ( is64 ? "mips64el" : "mipsel" ): - ( is64 ? "mips64" : "mips" ); - case ARCHITECTURE_ARM: - // no support for big endian ARM here - if( endianness == ENDIANNESS_LITTLE ) - { - const uint ver = ( abi >> ARCH_ARM_VER_SHIFT ) & ARCH_ARM_VER_MASK; - const qboolean hardfp = FBitSet( abi, ARCH_ARM_HARDFP ); - - if( is64 ) - return "arm64"; // keep as arm64, it's not aarch64! - - switch( ver ) - { - case 8: - return hardfp ? "armv8_32hf" : "armv8_32l"; - case 7: - return hardfp ? "armv7hf" : "armv7l"; - case 6: - return "armv6l"; - case 5: - return "armv5l"; - case 4: - return "armv4l"; - } - } - break; - case ARCHITECTURE_RISCV: - switch( abi ) - { - case ARCH_RISCV_FP_SOFT: - return is64 ? "riscv64" : "riscv32"; - case ARCH_RISCV_FP_SINGLE: - return is64 ? "riscv64f" : "riscv32f"; - case ARCH_RISCV_FP_DOUBLE: - return is64 ? "riscv64d" : "riscv32d"; - } - break; - case ARCHITECTURE_WASM: - return is64 ? "wasm64" : "wasm32"; - } - - assert( 0 ); - return is64 ? - ( endianness == ENDIANNESS_LITTLE ? "unknown64el" : "unknownel" ) : - ( endianness == ENDIANNESS_LITTLE ? "unknown64be" : "unknownbe" ); -} - -/* -============ -Q_buildarch - -Returns current name of the architecture. Without any spaces. -============ -*/ -const char *Q_buildarch( void ) -{ - return Q_ArchitectureStringByID( - XASH_ARCHITECTURE, - XASH_ARCHITECTURE_ABI, - XASH_ENDIANNESS, -#if XASH_64BIT - true -#else - false -#endif - ); -} - diff --git a/public/build.h b/public/build.h deleted file mode 100644 index 49253b30..00000000 --- a/public/build.h +++ /dev/null @@ -1,280 +0,0 @@ -/* -build.h - compile-time build information - -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to -*/ -#pragma once -#ifndef BUILD_H -#define BUILD_H - -/* -All XASH_* macros set by this header are guaranteed to have positive value -otherwise not defined. - -Every macro is intended to be the unified interface for buildsystems that lack -platform & CPU detection, and a neat quick way for checks in platform code -For Q_build* macros, refer to buildenums.h - -Any new define must be undefined at first -You can generate #undef list below with this oneliner: - $ sed 's/\t//g' build.h | grep '^#define XASH' | awk '{ print $2 }' | \ - sort | uniq | awk '{ print "#undef " $1 }' - -Then you can use another oneliner to query all variables: - $ grep '^#undef XASH' build.h | awk '{ print $2 }' -*/ - -#undef XASH_64BIT -#undef XASH_AMD64 -#undef XASH_ANDROID -#undef XASH_APPLE -#undef XASH_ARM -#undef XASH_ARM_HARDFP -#undef XASH_ARM_SOFTFP -#undef XASH_ARMv4 -#undef XASH_ARMv5 -#undef XASH_ARMv6 -#undef XASH_ARMv7 -#undef XASH_ARMv8 -#undef XASH_BIG_ENDIAN -#undef XASH_DOS4GW -#undef XASH_E2K -#undef XASH_EMSCRIPTEN -#undef XASH_FREEBSD -#undef XASH_HAIKU -#undef XASH_HURD -#undef XASH_IOS -#undef XASH_IRIX -#undef XASH_JS -#undef XASH_LINUX -#undef XASH_LITTLE_ENDIAN -#undef XASH_MIPS -#undef XASH_MOBILE_PLATFORM -#undef XASH_NETBSD -#undef XASH_OPENBSD -#undef XASH_POSIX -#undef XASH_PPC -#undef XASH_RISCV -#undef XASH_RISCV_DOUBLEFP -#undef XASH_RISCV_SINGLEFP -#undef XASH_RISCV_SOFTFP -#undef XASH_SERENITY -#undef XASH_SUNOS -#undef XASH_TERMUX -#undef XASH_WIN32 -#undef XASH_X86 -#undef XASH_NSWITCH -#undef XASH_PSP -#undef XASH_PSVITA -#undef XASH_WASI -#undef XASH_WASM - -//================================================================ -// -// PLATFORM DETECTION CODE -// -//================================================================ -#if defined _WIN32 - #define XASH_WIN32 1 -#elif defined __WATCOMC__ && defined __DOS__ - #define XASH_DOS4GW 1 -#elif defined __psp__ - #define XASH_PSP 1 -#else // POSIX compatible - #define XASH_POSIX 1 - #if defined __linux__ - #if defined __ANDROID__ - #define XASH_ANDROID 1 - #if defined __TERMUX__ - #define XASH_TERMUX 1 - #endif - #endif - #define XASH_LINUX 1 - #elif defined __FreeBSD__ - #define XASH_FREEBSD 1 - #elif defined __NetBSD__ - #define XASH_NETBSD 1 - #elif defined __OpenBSD__ - #define XASH_OPENBSD 1 - #elif defined __HAIKU__ - #define XASH_HAIKU 1 - #elif defined __serenity__ - #define XASH_SERENITY 1 - #elif defined __sgi - #define XASH_IRIX 1 - #elif defined __APPLE__ - #include - #define XASH_APPLE 1 - #if TARGET_OS_IOS - #define XASH_IOS 1 - #endif // TARGET_OS_IOS - #elif defined __SWITCH__ - #define XASH_NSWITCH 1 - #elif defined __vita__ - #define XASH_PSVITA 1 - #elif defined __wasi__ - #define XASH_WASI 1 - #elif defined __sun__ - #define XASH_SUNOS 1 - #elif defined __EMSCRIPTEN__ - #define XASH_EMSCRIPTEN 1 - #elif defined __gnu_hurd__ - #define XASH_HURD 1 - #else - #error - #endif -#endif - -// XASH_SAILFISH is special: SailfishOS by itself is a normal GNU/Linux platform -// It doesn't make sense to split it to separate platform -// but we still need XASH_MOBILE_PLATFORM for the engine. -// So this macro is defined entirely in build-system: see main wscript -// HLSDK/PrimeXT/other SDKs users note: you may ignore this macro -#if ( XASH_ANDROID && !XASH_TERMUX ) || XASH_IOS || XASH_NSWITCH || XASH_PSVITA || XASH_SAILFISH - #define XASH_MOBILE_PLATFORM 1 -#endif - -//================================================================ -// -// ENDIANNESS DEFINES -// -//================================================================ - -#if !defined XASH_ENDIANNESS - #if defined XASH_WIN32 || __LITTLE_ENDIAN__ - //!!! Probably all WinNT installations runs in little endian - #define XASH_LITTLE_ENDIAN 1 - #elif __BIG_ENDIAN__ - #define XASH_BIG_ENDIAN 1 - #elif defined __BYTE_ORDER__ && defined __ORDER_BIG_ENDIAN__ && defined __ORDER_LITTLE_ENDIAN__ // some compilers define this - #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ - #define XASH_BIG_ENDIAN 1 - #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - #define XASH_LITTLE_ENDIAN 1 - #endif - #else - #include - #if __BYTE_ORDER == __BIG_ENDIAN - #define XASH_BIG_ENDIAN 1 - #elif __BYTE_ORDER == __LITTLE_ENDIAN - #define XASH_LITTLE_ENDIAN 1 - #endif - #endif // !XASH_WIN32 -#endif - -//================================================================ -// -// CPU ARCHITECTURE DEFINES -// -//================================================================ -#if defined __x86_64__ || defined _M_X64 - #define XASH_64BIT 1 - #define XASH_AMD64 1 -#elif defined __i386__ || defined _X86_ || defined _M_IX86 - #define XASH_X86 1 -#elif defined __aarch64__ || defined _M_ARM64 - #define XASH_64BIT 1 - #define XASH_ARM 8 -#elif defined __mips__ - #define XASH_MIPS 1 -// commented out to avoid misdetection, modern Emscripten versions target WASM only -//#elif defined __EMSCRIPTEN__ -// #define XASH_JS 1 -#elif defined __e2k__ - #define XASH_64BIT 1 - #define XASH_E2K 1 -#elif defined __PPC__ || defined __powerpc__ || defined __ppc__ - #define XASH_PPC 1 - #if defined __PPC64__ || defined __powerpc64__ - #define XASH_64BIT 1 - #endif -#elif defined _M_ARM // msvc - #define XASH_ARM 7 - #define XASH_ARM_HARDFP 1 -#elif defined __arm__ - #if __ARM_ARCH == 8 || __ARM_ARCH_8__ - #define XASH_ARM 8 - #elif __ARM_ARCH == 7 || __ARM_ARCH_7__ - #define XASH_ARM 7 - #elif __ARM_ARCH == 6 || __ARM_ARCH_6__ || __ARM_ARCH_6J__ - #define XASH_ARM 6 - #elif __ARM_ARCH == 5 || __ARM_ARCH_5__ - #define XASH_ARM 5 - #elif __ARM_ARCH == 4 || __ARM_ARCH_4__ - #define XASH_ARM 4 - #else - #error "Unknown ARM" - #endif - - #if defined __SOFTFP__ || __ARM_PCS_VFP == 0 - #define XASH_ARM_SOFTFP 1 - #else // __SOFTFP__ - #define XASH_ARM_HARDFP 1 - #endif // __SOFTFP__ -#elif defined __riscv - #define XASH_RISCV 1 - - #if __riscv_xlen == 64 - #define XASH_64BIT 1 - #elif __riscv_xlen != 32 - #error "Unknown RISC-V ABI" - #endif - - #if defined __riscv_float_abi_soft - #define XASH_RISCV_SOFTFP 1 - #elif defined __riscv_float_abi_single - #define XASH_RISCV_SINGLEFP 1 - #elif defined __riscv_float_abi_double - #define XASH_RISCV_DOUBLEFP 1 - #else - #error "Unknown RISC-V float ABI" - #endif -#elif defined __wasm__ - #if defined __wasm64__ - #define XASH_64BIT 1 - #endif - #define XASH_WASM 1 -#else - #error "Place your architecture name here! If this is a mistake, try to fix conditions above and report a bug" -#endif - -#if !XASH_64BIT && ( defined( __LP64__ ) || defined( _LP64 )) -#define XASH_64BIT 1 -#endif - -#if XASH_ARM == 8 - #define XASH_ARMv8 1 -#elif XASH_ARM == 7 - #define XASH_ARMv7 1 -#elif XASH_ARM == 6 - #define XASH_ARMv6 1 -#elif XASH_ARM == 5 - #define XASH_ARMv5 1 -#elif XASH_ARM == 4 - #define XASH_ARMv4 1 -#endif - -#endif // BUILD_H diff --git a/public/buildenums.h b/public/buildenums.h deleted file mode 100644 index 7ffb3864..00000000 --- a/public/buildenums.h +++ /dev/null @@ -1,178 +0,0 @@ -/* -build.h - compile-time build information -Copyright (C) 2023 Alibek Omarov - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -*/ -#pragma once -#ifndef BUILDENUMS_H -#define BUILDENUMS_H - -#include "build.h" - -// This header defines the enumeration values that can be passed to Q_build* -// functions and get current value through XASH_PLATFORM, XASH_ARCHITECTURE and -// XASH_ARCHITECTURE_ABI defines - -//================================================================ -// -// OPERATING SYSTEM DEFINES -// -//================================================================ -#define PLATFORM_WIN32 1 -#define PLATFORM_LINUX 2 -#define PLATFORM_FREEBSD 3 -#define PLATFORM_ANDROID 4 -#define PLATFORM_APPLE 5 -#define PLATFORM_NETBSD 6 -#define PLATFORM_OPENBSD 7 -#define PLATFORM_EMSCRIPTEN 8 -#define PLATFORM_DOS4GW 9 -#define PLATFORM_HAIKU 10 -#define PLATFORM_SERENITY 11 -#define PLATFORM_IRIX 12 -#define PLATFORM_NSWITCH 13 -#define PLATFORM_PSVITA 14 -#define PLATFORM_WASI 15 -#define PLATFORM_SUNOS 16 -#define PLATFORM_HURD 17 -#define PLATFORM_PSP 18 - -#if XASH_WIN32 - #define XASH_PLATFORM PLATFORM_WIN32 -#elif XASH_ANDROID - #define XASH_PLATFORM PLATFORM_ANDROID -#elif XASH_LINUX - #define XASH_PLATFORM PLATFORM_LINUX -#elif XASH_APPLE - #define XASH_PLATFORM PLATFORM_APPLE -#elif XASH_FREEBSD - #define XASH_PLATFORM PLATFORM_FREEBSD -#elif XASH_NETBSD - #define XASH_PLATFORM PLATFORM_NETBSD -#elif XASH_OPENBSD - #define XASH_PLATFORM PLATFORM_OPENBSD -#elif XASH_EMSCRIPTEN - #define XASH_PLATFORM PLATFORM_EMSCRIPTEN -#elif XASH_DOS4GW - #define XASH_PLATFORM PLATFORM_DOS4GW -#elif XASH_HAIKU - #define XASH_PLATFORM PLATFORM_HAIKU -#elif XASH_SERENITY - #define XASH_PLATFORM PLATFORM_SERENITY -#elif XASH_IRIX - #define XASH_PLATFORM PLATFORM_IRIX -#elif XASH_NSWITCH - #define XASH_PLATFORM PLATFORM_NSWITCH -#elif XASH_PSVITA - #define XASH_PLATFORM PLATFORM_PSVITA -#elif XASH_WASI - #define XASH_PLATFORM PLATFORM_WASI -#elif XASH_SUNOS - #define XASH_PLATFORM PLATFORM_SUNOS -#elif XASH_HURD - #define XASH_PLATFORM PLATFORM_HURD -#elif XASH_PSP - #define XASH_PLATFORM PLATFORM_PSP -#else - #error -#endif - -//================================================================ -// -// CPU ARCHITECTURE DEFINES -// -//================================================================ -#define ARCHITECTURE_X86 1 -#define ARCHITECTURE_AMD64 2 -#define ARCHITECTURE_ARM 3 -#define ARCHITECTURE_MIPS 4 -#define ARCHITECTURE_JS 6 -#define ARCHITECTURE_E2K 7 -#define ARCHITECTURE_RISCV 8 -#define ARCHITECTURE_PPC 9 -#define ARCHITECTURE_WASM 10 - -#if XASH_AMD64 - #define XASH_ARCHITECTURE ARCHITECTURE_AMD64 -#elif XASH_X86 - #define XASH_ARCHITECTURE ARCHITECTURE_X86 -#elif XASH_ARM - #define XASH_ARCHITECTURE ARCHITECTURE_ARM -#elif XASH_MIPS - #define XASH_ARCHITECTURE ARCHITECTURE_MIPS -#elif XASH_JS - #define XASH_ARCHITECTURE ARCHITECTURE_JS -#elif XASH_E2K - #define XASH_ARCHITECTURE ARCHITECTURE_E2K -#elif XASH_RISCV - #define XASH_ARCHITECTURE ARCHITECTURE_RISCV -#elif XASH_PPC - #define XASH_ARCHITECTURE ARCHITECTURE_PPC -#elif XASH_WASM - #define XASH_ARCHITECTURE ARCHITECTURE_WASM -#else - #error -#endif - -//================================================================ -// -// ENDIANNESS DEFINES -// -//================================================================ -#define ENDIANNESS_LITTLE 1 -#define ENDIANNESS_BIG 2 - -#if XASH_LITTLE_ENDIAN - #define XASH_ENDIANNESS ENDIANNESS_LITTLE -#elif XASH_BIG_ENDIAN - #define XASH_ENDIANNESS ENDIANNESS_BIG -#else - #error -#endif - -//================================================================ -// -// APPLICATION BINARY INTERFACE -// -//================================================================ -#define BIT( n ) ( 1U << ( n )) - -#define ARCH_ARM_VER_MASK ( BIT( 5 ) - 1 ) -#define ARCH_ARM_VER_SHIFT 0 -#define ARCH_ARM_HARDFP BIT( 5 ) - -#define ARCH_RISCV_FP_SOFT 0 -#define ARCH_RISCV_FP_SINGLE 1 -#define ARCH_RISCV_FP_DOUBLE 2 - -#if XASH_ARCHITECTURE == ARCHITECTURE_ARM - #if XASH_ARM_HARDFP - #define XASH_ARCHITECTURE_ABI ( ARCH_ARM_HARDFP | XASH_ARM ) - #else - #define XASH_ARCHITECTURE_ABI ( XASH_ARM ) - #endif -#elif XASH_ARCHITECTURE == ARCHITECTURE_RISCV - #if XASH_RISCV_SOFTFP - #define XASH_ARCHITECTURE_ABI ARCH_RISCV_FP_SOFT - #elif XASH_RISCV_SINGLEFP - #define XASH_ARCHITECTURE_ABI ARCH_RISCV_FP_SINGLE - #elif XASH_RISCV_DOUBLEFP - #define XASH_ARCHITECTURE_ABI ARCH_RISCV_FP_DOUBLE - #else - #error - #endif -#else - #define XASH_ARCHITECTURE_ABI 0 // unused -#endif - - -#endif // BUILDENUMS_H diff --git a/public/crtlib.h b/public/crtlib.h index 18633662..22bf73b9 100644 --- a/public/crtlib.h +++ b/public/crtlib.h @@ -58,10 +58,6 @@ enum int Q_buildnum( void ); int Q_buildnum_iso( const char *date ); int Q_buildnum_compat( void ); -const char *Q_PlatformStringByID( const int platform ); -const char *Q_buildos( void ); -const char *Q_ArchitectureStringByID( const int arch, const uint abi, const int endianness, const qboolean is64 ); -const char *Q_buildarch( void ); extern const char *g_buildcommit; extern const char *g_buildbranch; extern const char *g_build_date; diff --git a/public/tests/test_build.c b/public/tests/test_build.c index edcabee9..2b24a29a 100644 --- a/public/tests/test_build.c +++ b/public/tests/test_build.c @@ -1,180 +1,10 @@ #include -#include "build.h" -#include "buildenums.h" #include "crtlib.h" -// THESE DEFINITIONS MUST NEVER CHANGE -static struct -{ - int id; - const char *string; -} expected_platforms[] = -{ -{ PLATFORM_WIN32, "win32" }, -{ PLATFORM_ANDROID, "android" }, -{ PLATFORM_LINUX, "linux" }, -{ PLATFORM_APPLE, "apple" }, -{ PLATFORM_FREEBSD, "freebsd" }, -{ PLATFORM_NETBSD, "netbsd" }, -{ PLATFORM_OPENBSD, "openbsd" }, -{ PLATFORM_EMSCRIPTEN, "emscripten" }, -{ PLATFORM_DOS4GW, "DOS4GW" }, -{ PLATFORM_HAIKU, "haiku" }, -{ PLATFORM_SERENITY, "serenity" }, -{ PLATFORM_IRIX, "irix" }, -{ PLATFORM_NSWITCH, "nswitch" }, -{ PLATFORM_PSVITA, "psvita" }, -{ PLATFORM_WASI, "wasi" }, -{ PLATFORM_HURD, "hurd" }, -}; - -static struct -{ - int id; - int abi; - int endianness; - int is64; - const char *string; -} expected_architectures[] = -{ -{ ARCHITECTURE_AMD64, 0, -1, -1, "amd64" }, -{ ARCHITECTURE_X86, 0, -1, -1, "i386" }, -{ ARCHITECTURE_E2K, 0, -1, -1, "e2k" }, -{ ARCHITECTURE_JS, 0, -1, -1, "javascript" }, - -// all possible WebAssembly names -{ ARCHITECTURE_WASM, 0, -1, true, "wasm64" }, -{ ARCHITECTURE_WASM, 0, -1, false, "wasm32" }, - -// all possible MIPS names -{ ARCHITECTURE_MIPS, 0, ENDIANNESS_BIG, true, "mips64" }, -{ ARCHITECTURE_MIPS, 0, ENDIANNESS_BIG, false, "mips" }, -{ ARCHITECTURE_MIPS, 0, ENDIANNESS_LITTLE, true, "mips64el" }, -{ ARCHITECTURE_MIPS, 0, ENDIANNESS_LITTLE, false, "mipsel" }, - -// all possible PowerPC names -{ ARCHITECTURE_PPC, 0, ENDIANNESS_BIG, true, "ppc64" }, -{ ARCHITECTURE_PPC, 0, ENDIANNESS_BIG, false, "ppc" }, -{ ARCHITECTURE_PPC, 0, ENDIANNESS_LITTLE, true, "ppc64el" }, -{ ARCHITECTURE_PPC, 0, ENDIANNESS_LITTLE, false, "ppcel" }, - -// All ARM is little endian only (for now?) -// Arm64 is always arm64, no matter the version (for now) -// Arm64 don't care about hardfp bit -{ ARCHITECTURE_ARM, 8 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, true, "arm64" }, -{ ARCHITECTURE_ARM, 8, ENDIANNESS_LITTLE, true, "arm64" }, -{ ARCHITECTURE_ARM, 0 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, true, "arm64" }, -{ ARCHITECTURE_ARM, 0, ENDIANNESS_LITTLE, true, "arm64" }, - -// ARMv6 and below don't care about hardfp bit -{ ARCHITECTURE_ARM, 4 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv4l" }, -{ ARCHITECTURE_ARM, 4, ENDIANNESS_LITTLE, false, "armv4l" }, -{ ARCHITECTURE_ARM, 5 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv5l" }, -{ ARCHITECTURE_ARM, 5, ENDIANNESS_LITTLE, false, "armv5l" }, -{ ARCHITECTURE_ARM, 6 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv6l" }, -{ ARCHITECTURE_ARM, 6, ENDIANNESS_LITTLE, false, "armv6l" }, -{ ARCHITECTURE_ARM, 6 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv6l" }, -{ ARCHITECTURE_ARM, 6, ENDIANNESS_LITTLE, false, "armv6l" }, - -// ARMv7 and ARMv8 in 32-bit mode, hardfp bit is important -{ ARCHITECTURE_ARM, 7 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv7hf" }, -{ ARCHITECTURE_ARM, 7, ENDIANNESS_LITTLE, false, "armv7l" }, -{ ARCHITECTURE_ARM, 8 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv8_32hf" }, -{ ARCHITECTURE_ARM, 8, ENDIANNESS_LITTLE, false, "armv8_32l" }, - -{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SOFT, -1, true, "riscv64" }, -{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SOFT, -1, false, "riscv32" }, -{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SINGLE, -1, true, "riscv64f" }, -{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SINGLE, -1, false, "riscv32f" }, -{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_DOUBLE, -1, true, "riscv64d" }, -{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_DOUBLE, -1, false, "riscv32d" }, -}; - -static int TestPlatformString( void ) -{ - int i; - - for( i = 0; i < sizeof( expected_platforms ) / sizeof( expected_platforms[0] ); i++ ) - { - if( Q_strcmp( Q_PlatformStringByID( expected_platforms[i].id ), expected_platforms[i].string )) - return i + 1; - } - - return 0; -} - -static qboolean TestArchitectureString_NoEndianness( int id, int abi, int is64, const char *string ) -{ - return !Q_strcmp( Q_ArchitectureStringByID( id, abi, ENDIANNESS_LITTLE, is64 ), string ) && - !Q_strcmp( Q_ArchitectureStringByID( id, abi, ENDIANNESS_BIG, is64 ), string ); -} - -static qboolean TestArchitectureString_No64( int id, int abi, int endianness, const char *string ) -{ - if( endianness == -1 ) - { - return TestArchitectureString_NoEndianness( id, abi, false, string ) && - TestArchitectureString_NoEndianness( id, abi, true, string ); - } - - return !Q_strcmp( Q_ArchitectureStringByID( id, abi, endianness, true ), string ) && - !Q_strcmp( Q_ArchitectureStringByID( id, abi, endianness, false ), string ); -} - -static int TestArchitectureString( void ) -{ - int i; - - for( i = 0; i < sizeof( expected_architectures ) / sizeof( expected_architectures[0] ); i++ ) - { - if( expected_architectures[i].is64 == -1 ) - { - if( !TestArchitectureString_No64( - expected_architectures[i].id, - expected_architectures[i].abi, - expected_architectures[i].endianness, - expected_architectures[i].string )) - return i + 1; - } - else if( expected_architectures[i].endianness == -1 ) - { - if( !TestArchitectureString_NoEndianness( - expected_architectures[i].id, - expected_architectures[i].abi, - expected_architectures[i].is64, - expected_architectures[i].string )) - { - abort(); - return i + 1; - } - } - else - { - if( Q_strcmp( Q_ArchitectureStringByID( - expected_architectures[i].id, - expected_architectures[i].abi, - expected_architectures[i].endianness, - expected_architectures[i].is64 - ), expected_architectures[i].string )) - return i + 1; - } - } - - return 0; -} - int main( void ) { int res; - res = TestPlatformString(); - if( res != 0 ) - return res; - - res = TestArchitectureString(); - if( res != 0 ) - return res + 100; - if( Q_buildnum_compat() != 4529 ) return 200; diff --git a/public/tests/test_validate_target.c b/public/tests/test_validate_target.c deleted file mode 100644 index e3a645be..00000000 --- a/public/tests/test_validate_target.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include "build.h" -#include "buildenums.h" -#include "crtlib.h" - -#ifndef VALIDATE_TARGET -#error -#endif - -int main( void ) -{ - string buf; - - if( Q_snprintf( buf, sizeof( buf ), "%s-%s", Q_buildos( ), Q_buildarch( )) < 0 ) - return 1; - - if( Q_strcmp( buf, VALIDATE_TARGET ) != 0 ) - return 2; - - return EXIT_SUCCESS; -} diff --git a/public/wscript b/public/wscript index f04859ba..17eceec4 100644 --- a/public/wscript +++ b/public/wscript @@ -72,8 +72,7 @@ def get_git_commit_date(conf): return gitversion.run_git(conf, ['log', '-1', '--format=%ci']) def options(opt): - opt.add_option('--validate-target', action='store', dest='VALIDATE_TARGET', default=None, - help='development option, needs --enable-tests flag') + pass def configure(conf): # private to libpublic @@ -83,8 +82,6 @@ def configure(conf): conf.env.GIT_COMMIT_DATE = conf.get_git_commit_date() conf.end_msg(conf.env.GIT_COMMIT_DATE) - conf.env.VALIDATE_TARGET = conf.options.VALIDATE_TARGET - # need to expose it for everyone using libpublic headers conf.env.EXPORT_DEFINES_LIST = [] conf.export_define('_CRT_SILENCE_NONCONFORMING_TGMATH_H', conf.env.COMPILER_CC == 'msvc') @@ -139,7 +136,8 @@ def configure(conf): def build(bld): bld(name = 'sdk_includes', export_includes = '. ../common ../pm_shared ../engine', - export_defines = bld.env.EXPORT_DEFINES_LIST) + export_defines = bld.env.EXPORT_DEFINES_LIST, + use = 'library_suffix_includes') # build it separately to slightly improve rebuild times bld.stlib(source = 'build_vcs.c', @@ -151,14 +149,6 @@ def build(bld): use = 'sdk_includes werror build_vcs') if bld.env.TESTS: - if bld.env.VALIDATE_TARGET: - bld.program(features = 'test', - source = 'tests/test_validate_target.c', - target = 'validate_target', - use = 'public', - defines = 'VALIDATE_TARGET="%s"' % bld.env.VALIDATE_TARGET, - install_path = None) - tests = { 'strings': 'tests/test_strings.c', 'build': 'tests/test_build.c',