Migrate to library-suffix library

This commit is contained in:
Alibek Omarov
2025-11-11 06:59:17 +05:00
parent d9150734c9
commit 0dfeea5213
12 changed files with 18 additions and 883 deletions

View File

@@ -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
);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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',