Tidy up, fixed problem in Bug #76.
This commit is contained in:
135
src/libCom/env/bldEnvData.pl
vendored
135
src/libCom/env/bldEnvData.pl
vendored
@@ -17,26 +17,17 @@
|
||||
#
|
||||
# tool to build envData.c from envDefs.h and config/CONFIG*ENV
|
||||
|
||||
use Cwd;
|
||||
use Cwd 'abs_path';
|
||||
|
||||
# We need exactly one argument:
|
||||
$usage="Usage:\tbldEnvData <config-Directory>";
|
||||
die $usage unless $#ARGV==0;
|
||||
|
||||
$start_dir=cwd();
|
||||
$config_dir=$ARGV[0];
|
||||
|
||||
# Don't see a reason for this directory hopping,
|
||||
# it's copied from the original:
|
||||
chdir $config_dir or die "cannot change dir to $config_dir";
|
||||
$config_dir=cwd();
|
||||
chdir $start_dir;
|
||||
|
||||
$SRC = "../env/envDefs.h";
|
||||
$env_data = "${config_dir}/CONFIG_ENV";
|
||||
$site_data= "${config_dir}/CONFIG_SITE_ENV";
|
||||
$out_name = "envData.c";
|
||||
$OUT = "> $out_name";
|
||||
$config_dir = abs_path($ARGV[0]);
|
||||
$env_defs = abs_path("../env/envDefs.h");
|
||||
$config_env = "${config_dir}/CONFIG_ENV";
|
||||
$site_env = "${config_dir}/CONFIG_SITE_ENV";
|
||||
$out_name = "envData.c";
|
||||
|
||||
# $tool = basename of this script
|
||||
$tool=$0;
|
||||
@@ -46,115 +37,85 @@ $tool=~ s'.*/'';
|
||||
# Start by extracting the ENV_PARAM declarations from $SRC
|
||||
# i.e. gather the names of params we are interested in:
|
||||
#
|
||||
open SRC or die "Cannot open $SRC";
|
||||
while (<SRC>)
|
||||
{
|
||||
if (m'epicsShareExtern[ \t]+READONLY[ \t]+ENV_PARAM[ \t]+([A-Za-z_]+)[ \t;]*')
|
||||
{
|
||||
open SRC, "<$env_defs" or die "Cannot open $SRC";
|
||||
while (<SRC>) {
|
||||
if (m/epicsShareExtern\s+READONLY\s+ENV_PARAM\s+([A-Za-z_]+)\s*;/) {
|
||||
$need_var{$1} = 1;
|
||||
}
|
||||
}
|
||||
close SRC;
|
||||
|
||||
|
||||
|
||||
# Read the default values from the config file into shell variables
|
||||
sub GetVars
|
||||
{
|
||||
sub GetVars {
|
||||
my ($filename) = @_;
|
||||
|
||||
open IN, $filename or die "Cannot read $filename";
|
||||
while (<IN>)
|
||||
{
|
||||
# word space = space rest
|
||||
if (m'([A-Za-z_]+)[ \t]*=[ \t]*(.*)')
|
||||
{
|
||||
$var = $1;
|
||||
# Check if we need that variable:
|
||||
open IN, "<$filename" or die "Cannot read $filename";
|
||||
while (<IN>) {
|
||||
# Discard comments, carriage returns and trailing whitespace
|
||||
next if m/^ \s* \#/x;
|
||||
chomp;
|
||||
if (m/^ \s* ([A-Za-z_] \w*) \s* = \s* (.*) \s* $/x) {
|
||||
my ($var, $val) = ($1, $2);
|
||||
next unless $need_var{$var};
|
||||
|
||||
# cosmetics:
|
||||
# Some vars are given as "",
|
||||
# so that $value{$var} is empty (=undefined).
|
||||
# To avoid "no value for .." warning I use %have_value
|
||||
$have_value{$var} = 1;
|
||||
$value{$var} = $2;
|
||||
# remove '"'
|
||||
if ($value{$var} =~ m'"(.*)"')
|
||||
{
|
||||
$value{$var} = $1;
|
||||
}
|
||||
# remove trailing whitespace and carriage return
|
||||
$value{$var} =~ s/\s+$//;
|
||||
$val =~ s/^"(.*)"$/$1/x;
|
||||
$value{$var} = $val;
|
||||
}
|
||||
}
|
||||
close IN;
|
||||
}
|
||||
|
||||
GetVars ($env_data);
|
||||
GetVars ($site_data);
|
||||
GetVars ($config_env);
|
||||
GetVars ($site_env);
|
||||
|
||||
# Generate header file
|
||||
#
|
||||
|
||||
print "Generating $out_name\n";
|
||||
|
||||
open OUT or die "cannot create $out_name";
|
||||
open OUT, ">$out_name" or die "cannot create $out_name";
|
||||
|
||||
# Write header
|
||||
print OUT "/*\t$out_name\n";
|
||||
print OUT " *\n";
|
||||
print OUT " *\tcreated by $tool\n";
|
||||
print OUT " *\n";
|
||||
print OUT " *\tfrom:\n";
|
||||
print OUT " *\t$SRC\n";
|
||||
print OUT " *\t$env_data\n";
|
||||
print OUT " *\t$site_data\n";
|
||||
print OUT " *\n";
|
||||
print OUT " *\t" . localtime() . "\n";
|
||||
print OUT " *\n";
|
||||
print OUT " */\n";
|
||||
print OUT "\n";
|
||||
print OUT "#define epicsExportSharedSymbols\n";
|
||||
print OUT "#include \"envDefs.h\"\n";
|
||||
print OUT "\n";
|
||||
print OUT "/* $out_name\n",
|
||||
" *\n",
|
||||
" * Created " . localtime() . "\n",
|
||||
" * by $tool from files:\n",
|
||||
" *\t$env_defs\n",
|
||||
" *\t$config_env\n",
|
||||
" *\t$site_env\n",
|
||||
" */\n",
|
||||
"\n",
|
||||
"#define epicsExportSharedSymbols\n",
|
||||
"#include \"envDefs.h\"\n",
|
||||
"\n";
|
||||
|
||||
|
||||
# Print variables
|
||||
#
|
||||
foreach $var ( sort keys %need_var )
|
||||
{
|
||||
if ($have_value{$var})
|
||||
{
|
||||
$default = $value{$var};
|
||||
}
|
||||
else
|
||||
{
|
||||
$default = "";
|
||||
print "Cannot find value for $var\n";
|
||||
}
|
||||
@vars = sort keys %need_var;
|
||||
foreach $var (@vars) {
|
||||
$default = exists $value{$var} ? $value{$var} : "";
|
||||
print "Warning: No default value found for $var\n"
|
||||
unless exists $value{$var};
|
||||
|
||||
printf OUT "epicsShareDef READONLY ENV_PARAM %s = { \"%s\", \"%s\" };\n",
|
||||
$var, $var, $default;
|
||||
print OUT "epicsShareDef READONLY ENV_PARAM $var =\n",
|
||||
"\t{\"$var\", \"$default\"};\n";
|
||||
}
|
||||
|
||||
# Now create an array pointing to all parameters
|
||||
|
||||
print OUT "\n";
|
||||
print OUT "epicsShareDef READONLY ENV_PARAM* env_param_list[EPICS_ENV_VARIABLE_COUNT+1] =\n";
|
||||
print OUT "{\n";
|
||||
print OUT "\n",
|
||||
"epicsShareDef READONLY ENV_PARAM* env_param_list[] = {\n";
|
||||
|
||||
# Contents are the addresses of each parameter
|
||||
foreach $var ( sort keys %need_var )
|
||||
{
|
||||
foreach $var (@vars) {
|
||||
print OUT "\t&$var,\n";
|
||||
}
|
||||
|
||||
# Finally finish list with 0
|
||||
print OUT "\t0\n";
|
||||
print OUT "};\n";
|
||||
print OUT "\n";
|
||||
print OUT "/*\tEOF $out_name */\n";
|
||||
print OUT "\t0\n",
|
||||
"};\n",
|
||||
"\n",
|
||||
"/*\tEOF $out_name */\n";
|
||||
|
||||
close OUT;
|
||||
|
||||
|
||||
4
src/libCom/env/envDefs.h
vendored
4
src/libCom/env/envDefs.h
vendored
@@ -73,14 +73,12 @@ epicsShareExtern READONLY ENV_PARAM EPICS_IOC_LOG_FILE_NAME;
|
||||
epicsShareExtern READONLY ENV_PARAM EPICS_IOC_LOG_FILE_COMMAND;
|
||||
epicsShareExtern READONLY ENV_PARAM EPICS_CMD_PROTO_PORT;
|
||||
epicsShareExtern READONLY ENV_PARAM EPICS_AR_PORT;
|
||||
#define EPICS_ENV_VARIABLE_COUNT 23
|
||||
|
||||
/*
|
||||
* bldEnvData looks for "epicsShareExtern ENV_PARAM" so
|
||||
* this always needs to be divided into two lines
|
||||
*/
|
||||
epicsShareExtern READONLY ENV_PARAM
|
||||
*env_param_list[EPICS_ENV_VARIABLE_COUNT+1];
|
||||
epicsShareExtern READONLY ENV_PARAM *env_param_list[];
|
||||
|
||||
struct in_addr;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user