summaryrefslogtreecommitdiffstats
path: root/dirver.pl
blob: f360c18ababa543d9b4e64b050529ab398ea26f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/usr/bin/perl
#-----------------------------------------------------------------
# dirver.pl: Generates ascii format #define for FILEVERSION
#   resource identifier used by Windows executable binaries.
#
#   Usage: dirver.pl -v <major.minor.patch> [-d mm/dd/yy] [-o outfile]
#   Example: dirver.pl -v 6.5.2 -d 1/19/2005 -o fileversion.h
#
#   -v <major.minor.patch>    Version number.
#   -d <mm/dd/yy>             Date. (optional)
#   -o <outfile>              Output header file. (optional)
#   -H                        Print this help message
#-----------------------------------------------------------------

use Getopt::Std;
use FileHandle;
                                                                                             
autoflush STDERR 1;
                                                                                             
getopts('v:d:o:H');
                                                                                             
if ($opt_H) {exitHelp();}

# Load arguments
$version = $opt_v || exitHelp();
$date = $opt_d;
$outfile = $opt_o;

# Separate version into components
my @verComponents = split(/\./, $version);

# Set version components to 0 if not defined
if ($verComponents[1] == undef) { $verComponents[1] = "0"; }
if ($verComponents[2] == undef) { $verComponents[2] = "0"; }

# Calculate build version and build date
my $buildVersion = calcVersion(@verComponents);
my $buildDate = calcBuildDate($date);

# Write #defines out to stdout or a file is requested
if ($outfile) {
    open(OUTFILE,">$outfile") || die "Error: Can't create $outfile: $!";
    $outhdl = OUTFILE;
} else {
    $outhdl = STDOUT;
}

print $outhdl "#define VI_PRODUCTVERSION $verComponents[0].$verComponents[1]\n";
print $outhdl "#define PRODUCTTEXT \"$version\"\n";
print $outhdl "#define VI_FILEVERSION $buildVersion, 0, 0, $buildDate\n";
print $outhdl "#define VI_FileVersion \"$version Build $buildDate\\0\"\n";

# Close file if not using STDOUT
if ($outfile) {
    close(OUTFILE);
}

#---------- calcVersion subroutine ----------
sub calcVersion {
    my @ver = shift;
    my $nVersion = 0;

    $nVersion = $ver[0];
    $nVersion <<= 5;
    $nVersion += $ver[1];
    $nVersion <<= 7;
    $nVersion += $ver[2];
    $nVersion &= 0xFFFF;

    return $nVersion;
}

#---------- calcBuildDate subroutine ----------
sub calcBuildDate {
    my $date = shift;
    my @dateComponents = ();
    my $month, $date, $year;
    my $buildDate = "";

    # Use date if passed in, otherwise use system date
    if ($date) {
        # Separate date into month, day, and year
        @dateComponents = split(/\//, $date);

        # Use struct tm range for month
        $dateComponents[0]--;

        # Handle 2 digit years like (20)00
        if ($dateComponents[2] < 70) {
            $dateComponents[2] += 20;
        }

        $month = $dateComponents[0];
        $day = $dateComponents[1];
        $year = $dateComponents[2];
    } else {
        $month = (localtime)[4];
        $day = (localtime)[3];
        $year = (localtime)[5] - 80;
    }

    $buildDate = $year;
    $buildDate <<= 4;
    $buildDate += $month;
    $buildDate <<= 5;
    $buildDate += $day;
    $buildDate &= 0xFFFF;

    return $buildDate;
}

#---------- exitHelp subroutine ----------
sub exitHelp {
    print(STDERR "$0: Generates ascii format #define for FILEVERSION
    \tresource identifier used by Windows executable binaries.

    \tUsage: $0 -v <major.minor.patch> [-d mm/dd/yy] [-o outfile]
    \tExample: $0 -v 6.5.2 -d 1/19/2005 -o fileversion.h

    \t-v <major.minor.patch>    Version number.
    \t-d <mm/dd/yy>             Date. \(optional\)
    \t-o <outfile>              Output header file. \(optional\)
    \t-H                        Print this help message\n");
    exit(0);
}