mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-05 03:24:56 +08:00
Migrate to library-suffix library
This commit is contained in:
165
public/build.c
165
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
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
280
public/build.h
280
public/build.h
@@ -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 <http://unlicense.org/>
|
||||
*/
|
||||
#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 <TargetConditionals.h>
|
||||
#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 <sys/param.h>
|
||||
#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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -1,180 +1,10 @@
|
||||
#include <stdlib.h>
|
||||
#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;
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
#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;
|
||||
}
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user