Files
GEOS-Chem-adjoint-v35-note/code/build
2018-08-28 00:43:47 -04:00

154 lines
4.5 KiB
Perl

#!/usr/bin/perl -w
# $Id: build,v 1.1 2009/06/09 21:51:53 daven Exp $
=head1 NAME
BUILD
=head1 SYNOPSIS
BUILD is a Perl script which compiles the GEOS-CHEM code
for a given combination of platform and compiler.
=head1 REQUIRES
Perl 5.003
=head1 EXPORTS
none
=head1 DESCRIPTION
build
Methods are provided for compiling the GEOS-CHEM model
=head1 METHODS
getMakeFile : Prints a separator line to stdout
main : Driver program
=head1 MODIFICATION HISTORY
bmy, 04 Dec 2002 - INITIAL VERSION
bmy, 03 Nov 2005 - Modified for Intel "ifort" compiler
bmy, 29 Nov 2005 - Now use "and" instead of double ampersands
=head1 AUTHOR
Bob Yantosca (bmy@io.harvard.edu)
=head1 SEE ALSO
trun, bmrun
=head1 COPYRIGHT
Copyright 2002-2005, Bob Yantosca. All rights reserved.
=cut
require 5.003; # need this version of Perl or newer
use English; # English language module
use Carp; # detailed error msgs
use strict; # forces implicit variable declarations
#------------------------------------------------------------------------------
sub getMakeFile() {
#=========================================================================
# Subroutine getMakeFile examines the "define.h" file in order to
# determine the name of the makefile which will be used to compile
# GEOS-CHEM for the given platform and compiler. (bmy, 12/4/03, 11/3/05)
#
# Calling Sequence:
# ------------------------------------------------------------------------
# $makeFile = getMakeFile();
#
# NOTES:
# (1 ) Now searches for Intel "ifort" compiler makefile "Makefile.ifort
# if LINUX_IFORT switch is #defined. (bmy, 11/3/05)
#=========================================================================
# Local variables
my $line = "";
my @lines = "";
# Read "define.h" into a string array
open( INPUT, "define.h" ) or croak "getDefaults: Can't open define.h";
chomp( @lines = <INPUT> );
close( INPUT );
# Process each line individually
foreach $line ( @lines ) {
# Determine makefile name from the defined C-preprocessor switch
if ( $line =~ "#define" and !( $line =~ "!#define" ) ) {
if ( $line =~ "COMPAQ" ) { return( "Makefile.compaq" ); }
elsif ( $line =~ "IBM" ) { return( "Makefile.ibm" ); }
elsif ( $line =~ "LINUX_PGI" ) { return( "Makefile.pgi" ); }
elsif ( $line =~ "LINUX_IFC" ) { return( "Makefile.ifc" ); }
elsif ( $line =~ "LINUX_EFC" ) { return( "Makefile.efc" ); }
elsif ( $line =~ "LINUX_IFORT" ) { return( "Makefile.ifort" ); }
elsif ( $line =~ "LINUX" ) { return( "Makefile.linux" ); }
elsif ( $line =~ 'SGI' ) { return( "Makefile.sgi" ); }
elsif ( $line =~ 'SPARC' ) { return( "Makefile.sparc" ); }
}
}
# Otherwise return failure
return( '' );
}
#------------------------------------------------------------------------------
sub main() {
#=========================================================================
# Perl script "build" compiles GEOS-CHEM with the correct makefile for
# a given operating system and compiler. Examines the "define.h" file
# in order to determine the makefile name. (bmy, 12/4/03)
#
# Arguments as Input:
# ------------------------------------------------------------------------
# (1 ) $target : Name of the makefile target to build (default is "geos")
#
# NOTES:
# (1 ) Need to set system variables for Intel IFORT compiler (bmy, 11/3/05)
# (2 ) Now use "and" to avoid conflict w/ the sub mit command (bmy, 11/18/05)
#==========================================================================
# Local variables
my $makeFile = "";
my $target = "geos";
# If an argument has been passed, then redefine $target
if ( scalar( @ARGV ) > 0 ) { $target = $ARGV[0]; }
# Get the makefile name by examining "define.h"
$makeFile = getMakeFile();
# Compile GEOS-CHEM w/ the right makefile
if ( length( $makeFile ) > 0 ) {
print "Compiling $target in $makeFile\n";
# Need to set system variables for Intel IFORT compiler (bmy, 11/3/05)
#if ( $makeFile =~ "ifort" and !( $target =~ "clean" ) )
# { qx( source /usr/local/bin/ifortvars.sh; make $target -f $makeFile ); }
#else
# { qx( make $target -f $makeFile ); }
qx( make $target -f $makeFile );
} else { die "Could not find makefile name!\n" }
}
#------------------------------------------------------------------------------
# Execute MAIN program
main();
# Exit normally
exit(0);