diff --git a/AMBuildScript b/AMBuildScript index 7b88dbdf..51cfe01d 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -14,6 +14,7 @@ class AMXXConfig(object): self.hlsdk_path = None self.mysql_path = None self.generated_headers = [] + self.versionlib = None self.csx_app = None self.stdcxx_path = None @@ -24,7 +25,6 @@ class AMXXConfig(object): def detectProductVersion(self): builder.AddConfigureFile('product.version') - builder.AddConfigureFile('.git/HEAD') # For OS X dylib versioning import re @@ -243,11 +243,15 @@ class AMXXConfig(object): cfg.defines += [ 'AMX_NOPROPLIST', 'PAWN_CELL_SIZE=32', + 'AMXMODX_BUILD', + 'AMXX_USE_VERSIONLIB', ] if self.use_auto_versioning(): - cfg.defines += ['AMBUILD'] + cfg.defines += ['AMXX_GENERATED_BUILD'] cfg.includes += [os.path.join(builder.buildPath, 'includes')] + cfg.includes += [os.path.join(builder.sourcePath, 'support', 'versionlib')] + cfg.includes += [os.path.join(builder.sourcePath, 'public')] cfg.includes += [os.path.join(builder.sourcePath, 'public', 'sdk')] cfg.includes += [os.path.join(builder.sourcePath, 'public', 'amtl')] @@ -258,9 +262,10 @@ class AMXXConfig(object): # Low-level compiler and binary construction. # - def MMCompiler(self, context): - compiler = context.compiler.clone() + def ConfigureForModule(self, context, compiler): compiler.cxxincludes += [ + os.path.join(context.currentSourcePath), + os.path.join(context.currentSourcePath, 'sdk'), os.path.join(self.metamod_path, 'metamod'), os.path.join(self.hlsdk_path, 'common'), os.path.join(self.hlsdk_path, 'dlls'), @@ -271,49 +276,22 @@ class AMXXConfig(object): ] return compiler - def LibraryBuilder(self, context, compiler, name): - binary = compiler.Library(name) - binary.compiler.cxxincludes += [os.path.join(context.currentSourcePath)] + def AddVersioning(self, binary): if builder.target_platform == 'windows': binary.compiler.rcdefines += [ 'BINARY_NAME="{0}"'.format(binary.outputFile), 'RC_COMPILE', ] if self.use_auto_versioning(): - binary.compiler.rcdefines += ['AMBUILD'] + binary.compiler.rcdefines += ['AMXX_GENERATED_BUILD'] elif builder.target_platform == 'mac': binary.compiler.postlink += [ '-compatibility_version', '1.0.0', '-current_version', self.productVersion ] - if self.use_auto_versioning(): - binary.compiler.rcdefines += ['AMBUILD'] - - binary.compiler.sourcedeps += AMXX.generated_headers - return binary - - def ModuleBuilder(self, context, compiler, name): - compiler.cxxincludes += [ - os.path.join(context.currentSourcePath, 'sdk'), - ] - - if builder.target_platform == 'mac' or builder.target_platform == 'windows': - name = name + '_amxx' - elif builder.target_platform == 'linux': - name = name + '_amxx_i386' - - return self.LibraryBuilder(context, compiler, name) - - def ProgramBuilder(self, context, compiler, name): - binary = compiler.Program(name) - binary.compiler.cxxincludes += [os.path.join(context.currentSourcePath)] - if builder.target_platform == 'windows': - binary.compiler.rcdefines += [ - 'BINARY_NAME="{0}"'.format(binary.outputFile), - 'AMBUILD', - 'RC_COMPILE', - ] - binary.compiler.sourcedeps += AMXX.generated_headers + if self.use_auto_versioning(): + binary.compiler.linkflags += [self.versionlib] + binary.compiler.sourcedeps += AMXX.generated_headers return binary # @@ -322,30 +300,39 @@ class AMXXConfig(object): # def Library(self, context, name): - compiler = context.compiler.clone() - return self.LibraryBuilder(context, compiler, name) + binary = context.compiler.Library(name) + return self.AddVersioning(binary) def MetaPlugin(self, context, name): - compiler = self.MMCompiler(context) - + binary = context.compiler.Library(name) + self.ConfigureForModule(context, binary.compiler) + if builder.target_platform == 'mac' or builder.target_platform == 'windows': name = name + '_mm' elif builder.target_platform == 'linux': name = name + '_mm_i386' - return self.LibraryBuilder(context, compiler, name) + return self.AddVersioning(binary) def Module(self, context, name): - compiler = context.compiler.clone() - return self.ModuleBuilder(context, compiler, name) + binary = context.compiler.Library(name) + self.ConfigureForModule(context, binary.compiler) + return self.AddVersioning(binary) def MetaModule(self, context, name): - compiler = self.MMCompiler(context) - return self.ModuleBuilder(context, compiler, name) + binary = context.compiler.Library(name) + self.ConfigureForModule(context, binary.compiler) + + if builder.target_platform == 'mac' or builder.target_platform == 'windows': + name = name + '_amxx' + elif builder.target_platform == 'linux': + name = name + '_amxx_i386' + + return self.AddVersioning(binary) def Program(self, context, name): - compiler = context.compiler.clone() - return self.ProgramBuilder(context, compiler, name) + binary = context.compiler.Program(name) + return self.AddVersioning(binary) AMXX = AMXXConfig() AMXX.detectProductVersion() @@ -359,6 +346,10 @@ if AMXX.use_auto_versioning(): 'support/Versioning', { 'AMXX': AMXX } ) + AMXX.versionlib = builder.RunScript( + 'support/versionlib/AMBuilder', + { 'AMXX': AMXX } + ) builder.RunBuildScripts( [ diff --git a/public/amxmodx_version.h b/public/amxmodx_version.h new file mode 100644 index 00000000..d8fde6a4 --- /dev/null +++ b/public/amxmodx_version.h @@ -0,0 +1,42 @@ +#ifndef _INCLUDE_AMXX_VERSION_INFORMATION_H_ +#define _INCLUDE_AMXX_VERSION_INFORMATION_H_ + +/** + * @file Contains AMX Mod X version information. + * @brief This file will redirect to an autogenerated version if being compiled via + * the build scripts. + */ + +#if defined AMXX_GENERATED_BUILD + #if defined RC_COMPILE + #undef AMXX_USE_VERSIONLIB + #endif + #if defined AMXX_USE_VERSIONLIB + #include + #else + #include + #endif +#else + #define AMXX_BUILD_TAG "manual" + #define AMXX_BUILD_LOCAL_REV "0" + #define AMXX_BUILD_CSET "0" + #define AMXX_BUILD_MAJOR "1" + #define AMXX_BUILD_MINOR "8" + #define AMXX_BUILD_RELEASE "3" + + #define AMXX_BUILD_UNIQUEID AMXX_BUILD_LOCAL_REV ":" AMXX_BUILD_CSET + + #define AMXX_VERSION_STRING AMXX_BUILD_MAJOR "." AMXX_BUILD_MINOR "." AMXX_BUILD_RELEASE "-" AMXX_BUILD_TAG + #define AMXX_VERSION_FILE 1,8,3,0 +#endif + +#define AMXX_BUILD_TIMESTAMP __DATE__ " " __TIME__ + +#if !defined(AMXX_GENERATED_BUILD) || !defined(AMXX_USE_VERSIONLIB) + #define AMXX_VERSION AMXX_VERSION_STRING + #define AMXX_BUILD_ID AMXX_BUILD_UNIQUEID + #define AMXX_BUILD_TIME AMXX_BUILD_TIMESTAMP +#endif + +#endif /* _INCLUDE_AMXX_VERSION_INFORMATION_H_ */ + diff --git a/support/Versioning b/support/Versioning index 26a7249b..c78d9d6a 100644 --- a/support/Versioning +++ b/support/Versioning @@ -13,7 +13,7 @@ argv = [ os.path.join(builder.buildPath, 'includes'), ] outputs = [ - os.path.join(builder.buildFolder, 'includes', 'amxmodx_version.h'), + os.path.join(builder.buildFolder, 'includes', 'amxmodx_version_auto.h'), os.path.join(builder.buildFolder, 'includes', 'amxmodx_version.inc'), ] diff --git a/support/generate_headers.py b/support/generate_headers.py index c0c5b448..b4ff5cf5 100644 --- a/support/generate_headers.py +++ b/support/generate_headers.py @@ -60,29 +60,27 @@ def output_version_headers(): if tag != "": fullstring += "-{0}".format(tag) if tag == "dev": - fullstring += "+{0}".format(shorthash) + fullstring += "+{0}".format(count) - with open(os.path.join(OutputFolder, 'amxmodx_version.h'), 'w') as fp: + with open(os.path.join(OutputFolder, 'amxmodx_version_auto.h'), 'w') as fp: fp.write(""" #ifndef _AMXMODX_AUTO_VERSION_INFORMATION_H_ #define _AMXMODX_AUTO_VERSION_INFORMATION_H_ -#define SVN_VERSION_STRING "{fullstring}" -#define SVN_VERSION_DWORD {major}, {minor}, {release}, 0 -#define SVN_VERSION_PRODUCT "{product}" -#define SVN_VERSION SVN_VERSION_STRING -#define SVN_BUILD_ID "{count}:{longhash}" +#define AMXX_BUILD_TAG \"{0}\" +#define AMXX_BUILD_CSET \"{1}\" +#define AMXX_BUILD_MAJOR \"{2}\" +#define AMXX_BUILD_MINOR \"{3}\" +#define AMXX_BUILD_RELEASE \"{4}\" +#define AMXX_BUILD_LOCAL_REV \"{6}\" + +#define AMXX_BUILD_UNIQUEID "{6}:" AMXX_BUILD_CSET + +#define AMXX_VERSION_STRING \"{5}\" +#define AMXX_VERSION_FILE {2},{3},{4},0 #endif // _AMXMODX_AUTO_VERSION_INFORMATION_H_ - """.format( - fullstring = fullstring, - major = major, - minor = minor, - release = release, - product = product, - count = count, - longhash = longhash - )) + """.format(tag, shorthash, major, minor, release, fullstring, count)) version_num = int(major) * 100 + int(minor) * 10 + int(release) with open(os.path.join(OutputFolder, 'amxmodx_version.inc'), 'w') as fp: @@ -92,13 +90,23 @@ def output_version_headers(): #endif #define _amxmodx_version_included -#define AMXX_VERSION {major}.{minor}{release} -#define AMXX_VERSION_NUM {version_num} +#define AMXX_VERSION_TAG \"{tag}\" +#define AMXX_VERSION_CSET \"{shorthash}\" +#define AMXX_VERSION_MAJOR \"{major}\" +#define AMXX_VERSION_MINOR \"{minor}\" +#define AMXX_VERSION_RELEASE \"{release}\" +#define AMXX_VERSION_LOCAL_REV \"{count}\" +#define AMXX_VERSION {major}.{minor}{release} +#define AMXX_VERSION_NUM {version_num} + stock const AMXX_VERSION_STR[] = "{fullstring}"; """.format( + tag = tag, + shorthash = shorthash, major = major, minor = minor, release = release, + count = count, version_num = version_num, fullstring = fullstring )) diff --git a/support/versionlib/AMBuilder b/support/versionlib/AMBuilder new file mode 100644 index 00000000..97449fe1 --- /dev/null +++ b/support/versionlib/AMBuilder @@ -0,0 +1,15 @@ +# vim: sts=2 ts=8 sw=2 tw=99 et ft=python: +import os + +lib = builder.compiler.StaticLibrary('version') +lib.compiler.includes += [ + os.path.join(builder.sourcePath, 'public'), +] +lib.compiler.defines.remove('AMXX_USE_VERSIONLIB') +lib.compiler.sourcedeps += AMXX.generated_headers +lib.sources += [ + 'versionlib.cpp' +] +task = builder.Add(lib) + +rvalue = task.binary diff --git a/support/versionlib/versionlib.cpp b/support/versionlib/versionlib.cpp new file mode 100644 index 00000000..2f190f34 --- /dev/null +++ b/support/versionlib/versionlib.cpp @@ -0,0 +1,8 @@ + +#include +#include + +const char *AMXX_LOCAL_REV = AMXX_BUILD_LOCAL_REV; +const char *AMXX_SHA = AMXX_BUILD_CSET; +const char *AMXX_VERSION = AMXX_VERSION_STRING; +const char *AMXX_BUILD_TIME = __DATE__ " " __TIME__; diff --git a/support/versionlib/versionlib.h b/support/versionlib/versionlib.h new file mode 100644 index 00000000..eb66a9aa --- /dev/null +++ b/support/versionlib/versionlib.h @@ -0,0 +1,24 @@ +#ifndef _INCLUDE_AMXX_VERSIONLIB_H_ +#define _INCLUDE_AMXX_VERSIONLIB_H_ + +#if !defined(AMXX_USE_VERSIONLIB) +// These get defined in amxmodx_version.h since +// versionlib does not use versionlib. + #undef AMXX_LOCAL_REV + #undef AMXX_CSET + #undef AMXX_VERSION + #undef AMXX_BUILD_TIME +#endif + +#ifdef __cplusplus + #define EXTERN_C extern "C" +#else + #define EXTERN_C extern +#endif + +EXTERN_C const char *AMXX_LOCAL_REV; +EXTERN_C const char *AMXX_SHA; +EXTERN_C const char *AMXX_VERSION; +EXTERN_C const char *AMXX_BUILD_TIME; + +#endif // _INCLUDE_AMXX_VERSIONLIB_H_