summaryrefslogtreecommitdiffstats
path: root/configgen/bin/make-configold.pl
blob: a4a4ad843d17ed86c8ede0f76ca35aaabab76ab1 (plain) (blame)
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
126
127
128
129
130
131
132
133
134
#!/usr/bin/env perl
# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#
# This script transforms a .def file into a .h and .cpp file for config
#
# TODO: Remove this script and use the java code directly. BTW, why
#       does this script have the same limitations as the old make-config.pl
#       in that the .def-file must reside in the root directory? The java
#       code supports reading the .def-file from any directory. This script
#       should have the same input parameters as the java code, and just
#       map them directly to the java system properties

# BEGIN perl environment bootstrap section
# Do not edit between here and END as this section should stay identical in all scripts

use File::Basename;
use File::Path;

sub findpath {
    my $myfullname = ${0};
    my($myname, $mypath) = fileparse($myfullname);

    return $mypath if ( $mypath && -d $mypath );
    $mypath=`pwd`;

    my $pwdfullname = $mypath . "/" . $myname;
    return $mypath if ( -f $pwdfullname );
    return 0;
}

# Returns the argument path if it seems to point to VESPA_HOME, 0 otherwise
sub is_vespa_home {
    my($VESPA_HOME) = shift;
    my $COMMON_ENV="libexec/vespa/common-env.sh";
    if ( $VESPA_HOME && -d $VESPA_HOME ) {
        my $common_env = $VESPA_HOME . "/" . $COMMON_ENV;
        return $VESPA_HOME if -f $common_env;
    }
    return 0;
}

# Returns the home of Vespa, or dies if it cannot
sub findhome {
    # Try the VESPA_HOME env variable
    return $ENV{'VESPA_HOME'} if is_vespa_home($ENV{'VESPA_HOME'});
    if ( $ENV{'VESPA_HOME'} ) { # was set, but not correctly
        die "FATAL: bad VESPA_HOME value '" . $ENV{'VESPA_HOME'} . "'\n";
    }

    # Try the ROOT env variable
    $ROOT = $ENV{'ROOT'};
    return $ROOT if is_vespa_home($ROOT);

    # Try the script location or current dir
    my $mypath = findpath();
    if ($mypath) {
        while ( $mypath =~ s|/[^/]*$|| ) {
            return $mypath if is_vespa_home($mypath);
        }
    }
    die "FATAL: Missing VESPA_HOME environment variable\n";
}

BEGIN {
    my $tmp = findhome();
    if ( $tmp !~ m{[/]$} ) { $tmp .= "/"; }
    $ENV{'VESPA_HOME'} = $tmp;
}
my $VESPA_HOME = $ENV{'VESPA_HOME'};

# END perl environment bootstrap section

use lib $ENV{'VESPA_HOME'} . '/lib/perl5/site_perl';
use lib $ENV{'VESPA_HOME'} . '/lib64/perl5/site_perl';
use Yahoo::Vespa::Defaults;
readConfFile();

require 5.006_001;
use strict;
use warnings;

use Cwd 'abs_path';

# Now this uses the new java codegen library. But the script still exist to
# map be able to call java the right way, setting the necessary properties

my ($root, $def) = @ARGV;

if (!defined $root || !defined $def) {
    print "Usage make-config.pl <source root dir> <def file>\n";
    exit(1);
}

#print "Root: $root\n"
#    . "Def: $def\n";

my $subdir = &getRelativePath($root, &getPath($def));

my $cmd = "java"
        . " -Dconfig.spec=$def"
        . " -Dconfig.dest=$root"
        . " -Dconfig.lang=cpp"
        . " -Dconfig.subdir=$subdir"
        . " -Dconfig.dumpTree=false"
        . " -Xms64m -Xmx64m"
        . " -jar $VESPA_HOME/lib/jars/configgen.jar";

print "Generating config: $cmd\n";
exec($cmd);

exit(0); # Will never be called due to exec above, but just to indicate end

sub getRelativePath {
    my ($from, $to) = @_;

    $from = abs_path($from);
    $to = abs_path($to);

    # Escape $from so it can contain regex special characters in path
    $from =~ s/([\+\*\(\)\{\}\.\?\[\]\$\&])/\\$1/g;

    $to =~ /^$from\/(.*)$/
            or die "The def file must be contained within the root";
    return $1;
}

sub getPath {
    my $file = $_[0];
    if ($file =~ /^(.*)\/[^\/]*$/) {
        return $1;
    } else {
        return ".";
    }
}