Show Application Title, Version, and Company

From Free Pascal wiki
Revision as of 11:58, 26 December 2013 by MarkMLl (talk | contribs) (Attempt at initial version.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

This article is a placeholder containing links to code, some of which might be obsolete as of late 2013 (Lazarus 1.0, FPC 2.6.2).

From its earliest versions, Microsoft Windows had the capability of storing version information etc. in an executable file. Support for that was added to Delphi around v3, and was part-functional in Lazarus 0.9.24.

There is no implicit provision in the ELF file format for version numbers, copyright and so on, but Lazarus stores this in resource sections. Reading the information back at runtime relies on FPC units, below are some pointers that might be useful.

Using fcl-res, contribution via the mailing list: [1]

Use this like

FUNCTION resourceVersionInfo: STRING;

(* Unlike most of AboutText (below), this takes significant activity at run-    *)
(* time to extract version/release/build numbers from resource information      *)
(* appended to the binary.                                                      *)

VAR     Stream: TResourceStream;
        vr: TVersionResource;
        fi: TVersionFixedInfo;

BEGIN
  RESULT:= ;
  TRY

(* This raises an exception if version info has not been incorporated into the  *)
(* binary (Lazarus Project -> Project Options -> Version Info -> Version        *)
(* numbering).                                                                  *)

    Stream:= TResourceStream.CreateFromID(HINSTANCE, 1, PChar(RT_VERSION));
    TRY
      vr:= TVersionResource.Create;
      TRY
        vr.SetCustomRawDataStream(Stream);
        fi:= vr.FixedInfo;
        RESULT := 'Version ' + IntToStr(fi.FileVersion[0]) + '.' + IntToStr(fi.FileVersion[1]) +
               ' release ' + IntToStr(fi.FileVersion[2]) + ' build ' + IntToStr(fi.FileVersion[3]) + eol;
        vr.SetCustomRawDataStream(nil)
      FINALLY
        vr.Free
      END
    FINALLY
      Stream.Free
    END
  EXCEPT
  END
END { resourceVersionInfo } ;

Somebody's work-in-progress: [2]

Using vinfo: [3] and [4]

On an Apple Mac: Mac Show Application Title, Version, and Company

Unix-only hacks

These work with Linux on various platforms, and probably with Solaris provided that the GNU-derived utilities are installed.

Getting Subversion revision information as a program-accessible string

Put this into Project options -> Compilation -> Execute before -> Command:

/bin/sh -c "echo -n C`svnversion -n`C |tr A-G %-+ >project_svnrevision.inc"

Note quote and backtick positions. The tr is converting C into another layer of quotes which is necessary for things to work as required.

Put this into the program:

  (*$IFDEF UNIX   *)
          rev= (*$I project_svnrevision.inc *) ;
  (*$ELSE         *)
          rev= 'unimplemented';
  (*$ENDIF        *)

Note that that has to be a string, since the revision number will have a non-numeric suffix if the project has been updated since it was last committed.

Renaming the final executable to include platform and timestamp

Put this into Project options -> Paths -> Unit output directory:

lib/$(TargetCPU)-$(TargetOS)

Put this into Project options -> Paths -> Target file name:

UnyokedBackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)

Make sure that "Apply conventions" is ticked (checked). This might vary slightly according to IDE and compiler/linker versions.

Put this into Project options -> Compilation -> Execute after -> Command:

/bin/sh -c "mv libunyokedbackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType).so UnyokedBackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType).`date +%F.%R`.so"

That should be a single line. Note quote and backtick positions.