aboutsummaryrefslogblamecommitdiffstats
path: root/src/base/UConfig.pas
blob: 9ee0a6683e2837511efd9db96e1bfe9d89539ead (plain) (tree)




























































                                                                                  
                                                            







                 









                                                            
                            
 
                                              



                            

                              
                           
                             









                                 









                                        





                                                                         
     

                                                                                   







                                                                           




                                                   
 
                     












                                                                        




                                                                      


          











                                                                    





                                                                            


                                       

              
    
                 


















                                                              
    
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   = 'Alpha';
  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);


  {$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.