{* UltraStar Deluxe - Karaoke Game * * UltraStar Deluxe is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * 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 2 * 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. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * $URL$ * $Id$ *} unit UConfig; // ------------------------------------------------------------------- // Note on version comparison (for developers only): // ------------------------------------------------------------------- // Delphi (in contrast to FPC) DOESN'T support MACROS. So we // can't define a macro like VERSION_MAJOR(version) to extract // parts of the version-number or to create version numbers for // comparison purposes as with a MAKE_VERSION(maj, min, rev) macro. // So we have to define constants for every part of the version here. // // In addition FPC (in contrast to delphi) DOES NOT support floating- // point numbers in $IF compiler-directives (e.g. {$IF VERSION > 1.23}) // It also DOESN'T support arithmetic operations so we aren't able to // compare versions this way (brackets aren't supported too): // {$IF VERSION > ((VER_MAJ*2)+(VER_MIN*23)+(VER_REL*1))} // // Hence we have to use fixed numbers in the directives. At least // Pascal allows leading 0s so 0005 equals 5 (octals are // preceded by & and not by 0 in FPC). // We also fix the count of digits for each part of the version number // to 3 (aaaiiirrr with aaa=major, iii=minor, rrr=release version) // // A check for a library with at least a version of 2.5.11 would look // like this: // {$IF LIB_VERSION >= 002005011} // // If you just need to check the major version do this: // {$IF LIB_VERSION_MAJOR >= 23} // // IMPORTANT: // Because this unit must be included in a uses-section it is // not possible to use the version-numbers in this uses-clause. // Example: // interface // uses // versions, // include this file // {$IF USE_UNIT_XYZ}xyz;{$IFEND} // Error: USE_UNIT_XYZ not defined // const // {$IF USE_UNIT_XYZ}test = 2;{$IFEND} // OK // uses // {$IF USE_UNIT_XYZ}xyz;{$IFEND} // OK // // Even if this file was an include-file no constants could be declared // before the interface's uses clause. // In FPC macros {$DEFINE VER:= 3} could be used to declare the version-numbers // but this is incompatible to Delphi. In addition macros do not allow expand // arithmetic expressions. Although you can define // {$DEFINE FPC_VER:= FPC_VERSION*1000000+FPC_RELEASE*1000+FPC_PATCH} // the following check would fail: // {$IF FPC_VERSION_INT >= 002002000} // would fail because FPC_VERSION_INT is interpreted as a string. // // PLEASE consider this if you use version numbers in $IF compiler- // directives. Otherwise you might break portability. // ------------------------------------------------------------------- interface {$IFDEF FPC} {$MODE Delphi} {$MACRO ON} // for evaluation of FPC_VERSION/RELEASE/PATCH {$ENDIF} {$I switches.inc} uses SysUtils; const // IMPORTANT: // If IncludeConstants is defined, the const-sections // of the config-file will be included too. // This switch is necessary because it is not possible to // include the const-sections in the switches.inc. // switches.inc is always included before the first uses- // section but at that place no const-section is allowed. // So we have to include the config-file in switches.inc // with IncludeConstants undefined and in UConfig.pas with // IncludeConstants defined (see the note above). {$DEFINE IncludeConstants} // include config-file (defines + constants) {$IF Defined(MSWindows)} {$I ..\config-win.inc} {$ELSEIF Defined(Linux)} {$I ../config-linux.inc} {$ELSEIF Defined(FreeBSD)} {$I ../config-freebsd.inc} {$ELSEIF Defined(Darwin)} {$I ../config-darwin.inc} {$ELSE} {$MESSAGE Fatal 'Unknown OS'} {$IFEND} {* Libraries *} VERSION_MAJOR = 1000000; VERSION_MINOR = 1000; VERSION_RELEASE = 1; (* * Current version of UltraStar Deluxe *) USDX_VERSION_MAJOR = 1; USDX_VERSION_MINOR = 1; USDX_VERSION_RELEASE = 0; USDX_VERSION_STATE = ''; USDX_STRING = 'UltraStar Deluxe'; (* * FPC version numbers are already defined as built-in macros: * FPC_VERSION (MAJOR) * FPC_RELEASE (MINOR) * FPC_PATCH (RELEASE) * Since FPC_VERSION is already defined, we will use FPC_VERSION_INT as * composed version number. *) {$IFNDEF FPC} // Delphi 7 evaluates every $IF-directive even if it is disabled by a surrounding // $IF or $IFDEF so the follwing will give you an error in delphi: // {$IFDEF FPC}{$IF (FPC_VERSION > 2)}...{$IFEND}{$ENDIF} // The reason for this error is that FPC_VERSION is not a valid constant. // To avoid this error, we define dummys here. FPC_VERSION = 0; FPC_RELEASE = 0; FPC_PATCH = 0; {$ENDIF} FPC_VERSION_INT = (FPC_VERSION * VERSION_MAJOR) + (FPC_RELEASE * VERSION_MINOR) + (FPC_PATCH * VERSION_RELEASE); // FPC 2.2.0 unicode support is very buggy. The cwstring unit for example // always crashes whenever UTF8ToAnsi() is called on a non UTF8 encoded string // what is fixed in 2.2.2. {$IF Defined(FPC) and (FPC_VERSION_INT < 2002002)} // < 2.2.2 {$MESSAGE FATAL 'FPC >= 2.2.2 required!'} {$IFEND} {$IFDEF HaveFFmpeg} LIBAVCODEC_VERSION = (LIBAVCODEC_VERSION_MAJOR * VERSION_MAJOR) + (LIBAVCODEC_VERSION_MINOR * VERSION_MINOR) + (LIBAVCODEC_VERSION_RELEASE * VERSION_RELEASE); LIBAVFORMAT_VERSION = (LIBAVFORMAT_VERSION_MAJOR * VERSION_MAJOR) + (LIBAVFORMAT_VERSION_MINOR * VERSION_MINOR) + (LIBAVFORMAT_VERSION_RELEASE * VERSION_RELEASE); LIBAVUTIL_VERSION = (LIBAVUTIL_VERSION_MAJOR * VERSION_MAJOR) + (LIBAVUTIL_VERSION_MINOR * VERSION_MINOR) + (LIBAVUTIL_VERSION_RELEASE * VERSION_RELEASE); {$IFDEF HaveSWScale} LIBSWSCALE_VERSION = (LIBSWSCALE_VERSION_MAJOR * VERSION_MAJOR) + (LIBSWSCALE_VERSION_MINOR * VERSION_MINOR) + (LIBSWSCALE_VERSION_RELEASE * VERSION_RELEASE); {$ENDIF} {$ENDIF} {$IFDEF HaveProjectM} PROJECTM_VERSION = (PROJECTM_VERSION_MAJOR * VERSION_MAJOR) + (PROJECTM_VERSION_MINOR * VERSION_MINOR) + (PROJECTM_VERSION_RELEASE * VERSION_RELEASE); {$ENDIF} {$IFDEF HavePortaudio} PORTAUDIO_VERSION = (PORTAUDIO_VERSION_MAJOR * VERSION_MAJOR) + (PORTAUDIO_VERSION_MINOR * VERSION_MINOR) + (PORTAUDIO_VERSION_RELEASE * VERSION_RELEASE); {$ENDIF} {$IFDEF HaveLibsamplerate} LIBSAMPLERATE_VERSION = (LIBSAMPLERATE_VERSION_MAJOR * VERSION_MAJOR) + (LIBSAMPLERATE_VERSION_MINOR * VERSION_MINOR) + (LIBSAMPLERATE_VERSION_RELEASE * VERSION_RELEASE); {$ENDIF} function USDXVersionStr(): string; function USDXShortVersionStr(): string; implementation uses StrUtils, Math; function USDXShortVersionStr(): string; begin Result := USDX_STRING + IfThen(USDX_VERSION_STATE <> '', ' '+USDX_VERSION_STATE); end; function USDXVersionStr(): string; begin Result := USDX_STRING + ' V ' + IntToStr(USDX_VERSION_MAJOR) + '.' + IntToStr(USDX_VERSION_MINOR) + '.' + IntToStr(USDX_VERSION_RELEASE) + IfThen(USDX_VERSION_STATE <> '', ' '+USDX_VERSION_STATE) + ' Build'; end; end.