#!/usr/bin/env perl

#*************************************************************************
# Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
#     National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
#     Operator of Los Alamos National Laboratory.
# SPDX-License-Identifier: EPICS
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************

use strict;

use Getopt::Std;
use File::Basename;

my $tool = basename($0);

our ($opt_h, $opt_q, $opt_v);
our $opt_o = 'epicsVersion.h';

$Getopt::Std::OUTPUT_HELP_VERSION = 1;

HELP_MESSAGE() unless getopts('ho:qv:') && @ARGV == 1;
HELP_MESSAGE() if $opt_h;

my ($infile) = @ARGV;

print "Building $opt_o from $infile\n" unless $opt_q;

open my $VARS, '<', $infile
    or die "$tool: Can't open $infile: $!\n";

my ($ver, $rev, $mod, $patch, $snapshot);
while (<$VARS>) {
    chomp;
    next if m/^\s*#/;   # Skip comments
    if (m/^EPICS_VERSION\s*=\s*(\d+)/)              { $ver = $1; }
    if (m/^EPICS_REVISION\s*=\s*(\d+)/)             { $rev = $1; }
    if (m/^EPICS_MODIFICATION\s*=\s*(\d+)/)         { $mod = $1; }
    if (m/^EPICS_PATCH_LEVEL\s*=\s*(\d+)/)          { $patch = $1; }
    if (m/^EPICS_DEV_SNAPSHOT\s*=\s*([-\w]*)/)      { $snapshot = $1; }
}
close $VARS;

map {
    die "$tool: Variable missing from $infile" unless defined $_;
} $ver, $rev, $mod, $patch, $snapshot;

my $ver_str = "$ver.$rev.$mod";
$ver_str .= ".$patch" if $patch > 0;
my $ver_short = $ver_str;
$ver_str .= $snapshot if $snapshot ne '';
$ver_str .= "-$opt_v" if $opt_v;

print "Found EPICS Version $ver_str\n" unless $opt_q;

open my $OUT, '>', $opt_o
    or die "$tool: Can't create $opt_o: $!\n";

my $obase = basename($opt_o, '.h');

print $OUT <<"END";
/* Generated file $opt_o */

#ifndef INC_${obase}_H
#define INC_${obase}_H

#define EPICS_VERSION        $ver
#define EPICS_REVISION       $rev
#define EPICS_MODIFICATION   $mod
#define EPICS_PATCH_LEVEL    $patch
#define EPICS_DEV_SNAPSHOT   "$snapshot"
#define EPICS_SITE_VERSION   "$opt_v"

#define EPICS_VERSION_SHORT  "$ver_short"
#define EPICS_VERSION_FULL   "$ver_str"
#define EPICS_VERSION_STRING "EPICS $ver_str"
#define epicsReleaseVersion  "EPICS R$ver_str"

#ifndef VERSION_INT
#  define VERSION_INT(V,R,M,P) ( ((V)<<24) | ((R)<<16) | ((M)<<8) | (P))
#endif
#define EPICS_VERSION_INT VERSION_INT($ver, $rev, $mod, $patch)

#endif /* INC_${obase}_H */
END

close $OUT;

sub HELP_MESSAGE {
    print STDERR "Usage: $tool [options] CONFIG_BASE_VERSION\n",
        "  -h       Help: Print this message\n",
        "  -q       Quiet: Only print errors\n",
        "  -o file  Output filename, default is $opt_o\n",
        "  -v vers  Site-specific version string\n",
        "\n";
    exit 1;
}
