# FILENAME...	release.pl
#
# USAGE... This PERL script is used in conjunction with a start_epics_xxx
#          script to setup environment variables for medm.  It defaults to
#          csh output, but a switch enables bash output (second form below).
#
# ORIGINAL AUTHOR: Ron Sluiter
# 
# SYNOPSIS...	perl release.pl (<ioctop> directory)
#               perl -s release.pl -form=bash (<ioctop> directory)  
#
#
#
# MODIFICATION LOG...
# 03/25/04 rls Support for GATEWAY environment variable.
# 04/08/04 rls Bug fix for spaces between macro and '=' sign; e.g. MPF = /home/mpf.
# 01/25/08 rls Support "include" entries without a macro; e.g. "include /home/ioc/configure/MASTER_RELEASE"
# 01/29/08 rls Bug fix; "($macro) =" line is wrong.
# 04/06/11 daa Add bash output format support.
# 03/20/15 kcl Rewrite to use recursive function, allows in-place resolution of included files
# 03/02/17 kmp Also look for macros in optional include files

#
#Version:       $Revision$
#Modified By:   $Author$
#Last Modified: $Date$

use Env;

$top = $ARGV[0];

sub Parse
{	
	my ($file, $applications) = @_;	
	
	if (-r "$file")
	{
		open(my $fh, "$file") or die "Cannot open $file\n";
		
		while ($line = <$fh>)
		{			
			next if ( $line =~ /\s*#/ );
			
			chomp($line);
			$line =~ s/\r//g;
			$_ = $line;
			
			#test for "include" command
			($prefix,$post) = /(.*)\s* (.*)/;
			
			if ($prefix eq "include" || $prefix eq "-include")
			{
				($prefix,$macro,$post) = /(.*)\s* \s*\$\((.*)\)(.*)/;
				
				if ($macro eq "")
				{
					#true if no macro is present
					#the following looks for
					#prefix = post
					($prefix,$post) = /(.*)\s* \s*(.*)/;
				}
				else
				{
					$base = $applications{$macro};
				
					if ($base eq "")
					{
						#print "error: $macro was not previously defined\n";
					}
					else
					{
						$post = $base . $post;
					}
				}
				
				Parse($post, $applications);
			}
			else
			{
				#the following looks for
				#prefix = $(macro)post
				($prefix,$macro,$post) = /(.*)\s*=\s*\$\((.*)\)(.*)/;
				
				if ($macro eq "")
				{
					#true ifno macro is present
					#the following looks for
					#prefix = post
					($prefix,$post) = /(.*)\s*=\s*(.*)/;
				}
				else
				{
					$base = $applications{$macro};
					
					if ($base eq "")
					{
						#print "error: $macro was not previously defined\n";
					}
					else
					{
						$post = $base . $post;
					}
				}
				
				$prefix =~ s/^\s+|\s+$//g; # strip leading and trailing whitespace.
				
				if ("$prefix" ne "")
				{
					$applications{"$prefix"} = "$post";
				}
			}
		}
		
		close $fh;
    }
}

my $applications;

$applications{"TOP"} = $top;

if ($ENV{GATEWAY} ne "")
{
    # Add GATEWAY to macro list.
    $applications{GATEWAY} = $ENV{GATEWAY};
}

$format = 0;
if ($form eq "bash")
{
    $format = 1;
}

Parse("$top/configure/RELEASE", $applications);

foreach $key (keys %applications)
{
	if ($format == 1)
	{
		print "$key=$applications{$key}\n";
	}
	else
	{
		print "set $key = $applications{$key}\n";
	}
}