| #!/usr/bin/perl |
| |
| # |
| #//===----------------------------------------------------------------------===// |
| #// |
| #// The LLVM Compiler Infrastructure |
| #// |
| #// This file is dual licensed under the MIT and the University of Illinois Open |
| #// Source Licenses. See LICENSE.txt for details. |
| #// |
| #//===----------------------------------------------------------------------===// |
| # |
| |
| # Pragmas. |
| use strict; |
| use warnings; |
| |
| # Standard modules. |
| use Data::Dumper; # Not actually used, but useful for debugging dumps. |
| |
| # Enable `libomp/tools/lib/' module directory. |
| use FindBin; |
| use lib "$FindBin::Bin/lib"; |
| |
| # LIBOMP modules. |
| use Build; |
| use LibOMP; |
| use Platform ":vars"; |
| use Uname; |
| use tools; |
| |
| our $VERSION = "0.017"; |
| |
| # -------------------------------------------------------------------------------------------------- |
| # Important variables. |
| # -------------------------------------------------------------------------------------------------- |
| |
| my $root_dir = $ENV{ LIBOMP_WORK }; |
| |
| my %makefiles = ( |
| rtl => cat_file( $root_dir, "src", "makefile.mk" ), |
| timelimit => cat_file( $root_dir, "tools", "src", "timelimit", "makefile.mk" ), |
| ); |
| |
| # -------------------------------------------------------------------------------------------------- |
| # Parse command line. |
| # -------------------------------------------------------------------------------------------------- |
| |
| # Possible options. |
| # * targets: comma separated list of targets the option has meaning for. For example, |
| # "version" option (4 or 5) has a meaning only for "rtl" target, while "mode" option has |
| # meaning for all targets. |
| # * base: If base is true this is a base option. All the possible values of base options are |
| # iterated if "--all" option is specified. If base is 0, this is an extra option. |
| # * params: A hash of possible option values. "*" denotes default option value. For example, |
| # if "versio" option is not specified, "--version=5" will be used implicitly. |
| # * suffux: Only for extra options. Subroutine returning suffix for build and output |
| # directories. ** When you do not want an option to be part of the suffix, set its base=2 |
| my $opts = { |
| "target" => { targets => "", base => 1, parms => { map( ( $_ => "" ), keys( %makefiles ) ), rtl => "*" }, }, |
| "version" => { targets => "rtl", base => 1, parms => { 5 => "*", 4 => "" }, }, |
| "lib-type" => { targets => "rtl", base => 1, parms => { normal => "*", stubs => "" }, }, |
| "link-type" => { targets => "rtl", base => 1, parms => { dynamic => "*", static => "" }, }, |
| "mode" => { targets => "rtl,dsl,timelimit", base => 0, parms => { release => "*", diag => "", debug => "" }, suffix => sub { substr( $_[ 0 ], 0, 3 ); } }, |
| "omp-version" => { targets => "rtl", base => 0, parms => { 40 => "", 30 => "", 41 => "*" }, suffix => sub { $_[ 0 ]; } }, |
| "coverage" => { targets => "rtl", base => 0, parms => { off => "*", on => "" }, suffix => sub { $_[ 0 ] eq "on" ? "c1" : "c0"; } }, |
| "stats" => { targets => "rtl", base => 0, parms => { off => "*", on => "" }, suffix => sub { $_[ 0 ] eq "on" ? "s1" : "s0"; } }, |
| "ompt-support" => { targets => "rtl", base => 0, parms => { off => "*", on => "" }, suffix => sub { $_[ 0 ] eq "on" ? "ompt" : "" } }, |
| "ompt-blame" => { targets => "rtl", base => 0, parms => { off => "", on => "*" }, suffix => sub { $_[ 0 ] eq "on" ? "" : "no-ompt-blame" } }, |
| "ompt-trace" => { targets => "rtl", base => 0, parms => { off => "", on => "*" }, suffix => sub { $_[ 0 ] eq "on" ? "" : "no-ompt-trace" } }, |
| }; |
| my $synonyms = { |
| "debug" => [ qw{ dbg debg } ], |
| }; |
| # This array specifies order of options to process, so it cannot be initialized with keys( %$opts ). |
| my @all_opts = qw{ target version lib-type link-type mode omp-version coverage stats ompt-support ompt-blame ompt-trace }; |
| # This is the list of base options. |
| my @base_opts = grep( $opts->{ $_ }->{ base } == 1, @all_opts ); |
| # This is the list of extra options. |
| my @extra_opts = grep( $opts->{ $_ }->{ base } == 0, @all_opts ); |
| |
| sub suffix($$$) { |
| my ( $opt, $value, $skip_if_default ) = @_; |
| my $suffix = ""; |
| if ( not $skip_if_default or $value ne $opts->{ $opt }->{ dflt } ) { |
| $suffix = $opts->{ $opt }->{ suffix }->( $value ); |
| }; # if |
| return $suffix; |
| }; # sub suffix |
| |
| my $scuts = {}; # Shortcuts. Will help to locate proper item in $opts. |
| foreach my $opt ( keys( %$opts ) ) { |
| foreach my $parm ( keys( %{ $opts->{ $opt }->{ parms } } ) ) { |
| if ( $parm !~ m{\A(?:[012]|on|off)\z} ) { |
| $scuts->{ $parm } = $opts->{ $opt }; |
| }; # if |
| if ( $opts->{ $opt }->{ parms }->{ $parm } eq "*" ) { |
| $opts->{ $opt }->{ dflt } = $parm; |
| }; # if |
| }; # foreach $parm |
| }; # foreach $opt |
| |
| sub parse_option(@) { |
| # This function is called to process every option. $name is option name, $value is option value. |
| # For boolean options $value is either 1 or 0, |
| my ( $name, $value ) = @_; |
| if ( $name eq "all" or $name eq "ALL" ) { |
| foreach my $opt ( keys( %$opts ) ) { |
| if ( $opts->{ $opt }->{ base } or $name eq "ALL" ) { |
| foreach my $parm ( keys( %{ $opts->{ $opt }->{ parms } } ) ) { |
| $opts->{ $opt }->{ parms }->{ $parm } = 1; |
| }; # foreach $parm |
| }; # if |
| }; # foreach $opt |
| return; |
| }; # if |
| if ( exists( $opts->{ $name } ) ) { |
| # Suppose it is option with explicit value, like "target=normal". |
| if ( $value eq "all" ) { |
| foreach my $parm ( keys( %{ $opts->{ $name }->{ parms } } ) ) { |
| $opts->{ $name }->{ parms }->{ $parm } = 1; |
| }; # foreach |
| return; |
| } elsif ( exists( $opts->{ $name }->{ parms }->{ $value } ) ) { |
| $opts->{ $name }->{ parms }->{ $value } = 1; |
| return; |
| } elsif ( $value eq "" and exists( $opts->{ $name }->{ parms }->{ on } ) ) { |
| $opts->{ $name }->{ parms }->{ on } = 1; |
| return; |
| } else { |
| cmdline_error( "Illegal value of \"$name\" option: \"$value\"" ); |
| }; # if |
| }; # if |
| # Ok, it is not an option with explicit value. Try to treat is as a boolean option. |
| if ( exists( $scuts->{ $name } ) ) { |
| ( $value eq "1" or $value eq "0" ) or die "Internal error; stopped"; |
| $scuts->{ $name }->{ parms }->{ $name } = $value; |
| return; |
| }; # if |
| # No, it is not a valid option at all. |
| cmdline_error( "Illegal option: \"$name\"" ); |
| }; # sub parse_option |
| |
| my $clean = 0; |
| my $clean_common = 0; |
| my $clobber = 0; |
| my $test_deps = 1; |
| my $test_touch = 1; |
| my @goals; |
| |
| sub synonyms($) { |
| my ( $opt ) = @_; |
| return exists( $synonyms->{ $opt } ) ? "|" . join( "|", @{ $synonyms->{ $opt } } ) : ""; |
| }; # sub synonyms |
| |
| my @specs = ( |
| map( ( "$_" . synonyms( $_ ) . "=s" => \&parse_option ), keys( %$opts ) ), |
| map( ( "$_" . synonyms( $_ ) . "!" => \&parse_option ), keys( %$scuts ) ), |
| ); |
| my $answer; |
| get_options( |
| @specs, |
| Platform::target_options(), |
| "all" => \&parse_option, |
| "ALL" => \&parse_option, |
| "answer=s" => \$answer, |
| "test-deps!" => \$test_deps, |
| "test-touch!" => \$test_touch, |
| "version|ver:s" => |
| sub { |
| # It is a tricky option. It specifies library version to build and it is also a standard |
| # option to request tool version. |
| if ( $_[ 1 ] eq "" ) { |
| # No arguments => version request. |
| print( "$tool version $VERSION\n" ); |
| exit( 0 ); |
| } else { |
| # Arguments => version to build. |
| parse_option( @_ ) |
| }; |
| }, |
| ); |
| @goals = @ARGV; |
| if ( grep( $_ eq "clobber", @goals ) ) { |
| $clobber = 1; |
| }; # if |
| if ( grep( $_ eq "clean", @goals ) ) { |
| $clean = 1; |
| }; # if |
| |
| # Ok, now $opts is fulfilled with 0, 1 (explicitly set by the user) and "" and "*" (original |
| # values). In each option at least one 1 should be present (otherwise there is nothing to build). |
| foreach my $opt ( keys( %$opts ) ) { |
| if ( not grep( $_ eq "1", values( %{ $opts->{ $opt }->{ parms } } ) ) ) { |
| # No explicit "1" found. Enable default choice by replacing "*" with "1". |
| foreach my $parm ( keys( %{ $opts->{ $opt }->{ parms } } ) ) { |
| if ( $opts->{ $opt }->{ parms }->{ $parm } eq "*" ) { |
| $opts->{ $opt }->{ parms }->{ $parm } = 1; |
| }; # if |
| }; # foreach $parm |
| }; # if |
| }; # foreach $opt |
| |
| # Clear $opts. Leave only "1". |
| foreach my $opt ( keys( %$opts ) ) { |
| foreach my $parm ( keys( %{ $opts->{ $opt }->{ parms } } ) ) { |
| if ( $opts->{ $opt }->{ parms }->{ $parm } ne "1" ) { |
| delete( $opts->{ $opt }->{ parms }->{ $parm } ); |
| }; # if |
| }; # foreach $parm |
| }; # foreach $opt |
| |
| # -------------------------------------------------------------------------------------------------- |
| # Fill job queue. |
| # -------------------------------------------------------------------------------------------------- |
| |
| sub enqueue_jobs($$@); |
| sub enqueue_jobs($$@) { |
| my ( $jobs, $set, @rest ) = @_; |
| if ( @rest ) { |
| my $opt = shift( @rest ); |
| if ( |
| exists( $set->{ target } ) |
| and |
| $opts->{ $opt }->{ targets } !~ m{(?:\A|,)$set->{ target }(?:,|\z)} |
| ) { |
| # This option does not have meananing for the target, |
| # do not iterate, just use default value. |
| enqueue_jobs( $jobs, { $opt => $opts->{ $opt }->{ dflt }, %$set }, @rest ); |
| } else { |
| foreach my $parm ( sort( keys( %{ $opts->{ $opt }->{ parms } } ) ) ) { |
| enqueue_jobs( $jobs, { $opt => $parm, %$set }, @rest ); |
| }; # foreach $parm |
| }; # if |
| } else { |
| my $makefile = $makefiles{ $set->{ target } }; |
| my @base = map( substr( $set->{ $_ }, 0, 3 ), @base_opts ); |
| my @extra = map( suffix( $_, $set->{ $_ }, 0 ), @extra_opts ); |
| my @ex = grep( $_ ne "", map( suffix( $_, $set->{ $_ }, 1 ), @extra_opts ) ); |
| # Shortened version of @extra -- only non-default values. |
| my $suffix = ( @extra ? "." . join( ".", @extra ) : "" ); |
| my $knights = index( $suffix, "kn" ) - 1; |
| if ( $target_arch !~ "mic" and $knights > 0 ) { |
| $suffix = substr( $suffix, 0, $knights ); |
| } |
| my $suf = ( @ex ? "." . join( ".", @ex ) : "" ); |
| # Shortened version of $siffix -- only non-default values. |
| my $build_dir = join( "-", $target_platform, join( "_", @base ) . $suffix, Uname::host_name() ); |
| my $out_arch_dir = cat_dir( $ENV{ LIBOMP_EXPORTS }, $target_platform . $suf ); |
| my $out_cmn_dir = cat_dir( $ENV{ LIBOMP_EXPORTS }, "common" ); |
| push( |
| @$jobs, |
| { |
| makefile => $makefile, |
| make_args => [ |
| "os=" . $target_os, |
| "arch=" . $target_arch, |
| "MIC_ARCH=" . $target_mic_arch, |
| "date=" . Build::tstr( $Build::start ), |
| "TEST_DEPS=" . ( $test_deps ? "on" : "off" ), |
| "TEST_TOUCH=" . ( $test_touch ? "on" : "off" ), |
| "CPLUSPLUS=on", |
| "COVERAGE=" . $set->{ coverage }, |
| # Option "mode" controls 3 make flags: |
| # debug => Full debugging : diagnostics, debug info, no optimization. |
| # diag => Only diagnostics : diagnostics, debug info, optimization. |
| # release => Production build : no diagnostics, no debug info, optimization. |
| "DEBUG_INFO=" . ( $set->{ mode } ne "release" ? "on" : "off" ), |
| "DIAG=" . ( $set->{ mode } ne "release" ? "on" : "off" ), |
| "OPTIMIZATION=" . ( $set->{ mode } ne "debug" ? "on" : "off" ), |
| "LIB_TYPE=" . substr( $set->{ "lib-type" }, 0, 4 ), |
| "LINK_TYPE=" . substr( $set->{ "link-type" }, 0, 4 ), |
| "OMP_VERSION=" . $set->{ "omp-version" }, |
| "VERSION=" . $set->{ version }, |
| "suffix=" . $suf, |
| "stats=" . $set->{ stats }, |
| "OMPT_SUPPORT=" . $set->{ "ompt-support" }, |
| "OMPT_BLAME=" . $set->{ "ompt-blame" }, |
| "OMPT_TRACE=" . $set->{ "ompt-trace" }, |
| @goals, |
| ], |
| build_dir => $build_dir |
| } |
| ); # push |
| }; # if |
| }; # sub enqueue_jobs |
| |
| my @jobs; |
| enqueue_jobs( \@jobs, {}, @all_opts ); |
| |
| # -------------------------------------------------------------------------------------------------- |
| # Do the work. |
| # -------------------------------------------------------------------------------------------------- |
| |
| my $exit = 0; |
| |
| Build::init(); |
| |
| if ( $clobber ) { |
| my @dirs = ( $ENV{ LIBOMP_TMP }, $ENV{ LIBOMP_EXPORTS }, cat_dir( $root_dir, "tools", "bin" ) ); |
| my $rc = 0; |
| question( |
| "Clobber " . join( ", ", map( "\"" . Build::shorter( $_ ) . "\"", @dirs ) ) . " dirs? ", |
| $answer, |
| qr{\A(y|yes|n|no)\z}i |
| ); |
| if ( $answer =~ m{\Ay}i ) { |
| info( "Clobbering..." ); |
| $rc = Build::clean( @dirs ); |
| info( Build::rstr( $rc ) ); |
| }; # if |
| if ( $rc != 0 ) { |
| $exit = 3; |
| }; # if |
| } else { # Build or clean. |
| if ( @jobs ) { |
| my $total = @jobs; # Total number of jobs. |
| my $n = 0; # Current job number. |
| Build::progress( "", "" ); # Output empty line to log file. |
| my $goals = join( " ", @goals ); |
| Build::progress( "Goals", $goals eq "" ? "(all)" : $goals ); |
| Build::progress( "Configurations", scalar( @jobs ) ); |
| foreach my $job ( @jobs ) { |
| ++ $n; |
| my $base = get_file( $job->{ build_dir } ); |
| Build::progress( "Making", "%3d of %3d : %s", $n, $total, $base ); |
| $job->{ rc } = Build::make( $job, $clean, sprintf( "%d/%d", $n, $total ) ); |
| }; # my $job |
| my $failures = Build::summary(); |
| if ( $failures > 0 ) { |
| $exit = 3; |
| }; # if |
| } else { |
| info( "Nothing to do." ); |
| }; # if |
| }; # if |
| |
| # And exit. |
| exit( $exit ); |
| |
| __END__ |
| |
| =pod |
| |
| =head1 NAME |
| |
| |
| B<build.pl> -- Build one or more configurations of OMP RTL libraries. |
| |
| =head1 SYNOPSIS |
| |
| B<build.pl> I<option>... [B<-->] I<make-option>... I<variable>... I<goal>... |
| |
| =head1 OPTIONS |
| |
| =over |
| |
| =item B<--all> |
| |
| Build all base configurations. |
| |
| =item B<--ALL> |
| |
| Build really all configurations, including extra ones. |
| |
| =item B<--answer=>I<str> |
| |
| Use specified string as default answer to all questions. |
| |
| =item B<--architecture=>I<arch> |
| |
| Specify target architecture to build. Default is architecture of host machine. I<arch> can be C<32>, |
| C<32e>, C<mic>, or one of known aliases like C<IA32>. |
| |
| If architecture is not specified explicitly, value of LIBOMP_ARCH environment variable is used. |
| If LIBOMP_ARCH is not defined, host architecture detected. |
| |
| =item B<--os=>I<os> |
| |
| Specify target OS. Default is OS of host machine. I<os> can be C<lin>, C<mac>, C<win>, |
| or one of known aliases like C<Linux>, C<WinNT>, etc. |
| |
| =item B<--mic-arch=>I<arch> |
| |
| Specify architecture of Intel(R) Many Integrated Core Architecture card. Default is C<knf>. I<arch> can be C<knf>, C<knc>, C<knl>. |
| |
| =item B<-->[B<no->]B<test-deps> |
| |
| Enable or disable C<test-deps>. The test runs in any case, but result of disabled test is ignored. |
| By default, test is enabled. |
| |
| =item B<-->[B<no->]B<test-touch> |
| |
| Enable or disable C<test-touch>. The test runs in any case, but result of disabled test is ignored. |
| By default, test is enabled. |
| |
| =item Base Configuration Selection Options |
| |
| =over |
| |
| =item B<--target=>I<target> |
| |
| Build specified target, either C<rtl> (OMP Runtime Library; default), |
| or C<timelimit> (program used in testing), or C<all>. |
| |
| =item B<--lib-type=>I<lib> |
| |
| Build specified library, either C<normal> (default), or C<stubs>, or C<all>. |
| |
| =item B<--link-type=>I<type> |
| |
| Build specified link type, either C<dynamic> (default) or C<all>. |
| |
| =back |
| |
| =item Extra Configuration Selection Options |
| |
| =over |
| |
| =item B<--cover=>I<switch> |
| |
| Build for code coverage data collection. I<switch> can be C<off> (default), C<on> |
| or C<all>. |
| |
| =item B<--mode=>I<mode> |
| |
| Build library of specified I<mode>, either C<debug>, C<diag>, C<release> (default), or C<all>. |
| Mode controls 3 features: |
| |
| --------------------------------------------------- |
| feature/mode debug diag release |
| --------------------------------------------------- |
| debug info o o |
| diagnostics (asserts, traces) o o |
| code optimization o o |
| --------------------------------------------------- |
| |
| =back |
| |
| =item Shortcuts |
| |
| If option with C<no> prefix is used, corresponding configuration will B<not> be built. |
| Useful for excluding some configurations if one or more other options specified with C<all> |
| value (see Examples). |
| |
| =over |
| |
| =item B<-->[B<no>]B<11> |
| |
| Build files for compiler C<11>. |
| |
| =item B<-->[B<no>]B<12> |
| |
| Build files for compiler C<12>. |
| |
| =item B<-->[B<no>]B<debug> |
| |
| =item B<-->[B<no>]B<debg> |
| |
| =item B<-->[B<no>]B<dbg> |
| |
| Build debuggable library. |
| |
| =item B<-->[B<no>]B<diag> |
| |
| Build library with diagnostics enabled. |
| |
| =item B<-->[B<no>]B<dynamic> |
| |
| Build dynamic library (default). |
| |
| =item B<-->[B<no>]B<normal> |
| |
| Build normal library (default). |
| |
| =item B<-->[B<no>]B<release> |
| |
| Build release library (default). |
| |
| =item B<-->[B<no>]B<rtl> |
| |
| Build OMP RTL (default). |
| |
| =item B<-->[B<no>]B<stubs> |
| |
| Build stubs library. |
| |
| =item B<-->[B<no>]B<timelimit> |
| |
| Build timelimit utility program. |
| |
| =back |
| |
| =item Standard Options |
| |
| =over |
| |
| =item B<--doc> |
| |
| =item B<--manual> |
| |
| Print full help message and exit. |
| |
| =item B<--help> |
| |
| Print short help message and exit. |
| |
| =item B<--usage> |
| |
| Print very short usage message and exit. |
| |
| =item B<--verbose> |
| |
| Do print informational messages. |
| |
| =item B<--version> |
| |
| Print program version and exit. |
| |
| =item B<--quiet> |
| |
| Work quiet, do not print informational messages. |
| |
| =back |
| |
| =back |
| |
| =head1 ARGUMENTS |
| |
| =over |
| |
| =item I<make-option> |
| |
| Any option for makefile, for example C<-k> or C<-n>. If you pass some options to makefile, C<--> |
| delimiter is mandatory, otherwise C<build.pl> processes all the options internally. |
| |
| =item I<variable> |
| |
| Define makefile variable in form I<name>B<=>I<value>. Most makefile capabilities are |
| accessible through C<build.pl> options, so there is no need in defining make variables in command |
| line. |
| |
| =item I<goal> |
| |
| Makefile goal to build (or clean). |
| |
| =over |
| |
| =item B<all> |
| |
| Build C<lib>, C<tests>, C<inc>. |
| |
| =item B<common> |
| |
| Build common (architecture-independent) files. Common files are not configuration-dependent, so |
| there is no point in building it for more than one configuration (thought it is harmless). |
| However, do not build common files on many machines simultaneously. |
| |
| =item B<clean> |
| |
| Delete the export files and clean build directory of configuration(s) specified by options. Note |
| that C<clean> goal cannot be mixed with other goals (except for C<clean-common>). |
| |
| =item B<clean-common> |
| |
| Delete the common files in F<exports/> directory. |
| |
| =item B<clobber> |
| |
| Clean F<export/> and F<tmp/> directories. If C<clobber> is specified, other goals and/or options |
| do not matter. |
| |
| Note: Clobbering is potentialy dangerous operation, because it deletes content of directory |
| pointed by If C<LIBOMP_TMP> environment variable, so C<build.pl> asks a confirmation before |
| clobbering. To suppress the question, use option C<--answer=yes>. |
| |
| =item B<fat> |
| |
| C<mac_32e> only: Build fat libraries for both mac_32 and mac_32e. Should be run when C<lib> |
| goal is built on both C<mac_32> and C<mac_32e>. |
| |
| =item I<file.o> |
| |
| (Windows* OS: I<file.obj>) Build specified object file only. |
| |
| =item I<file.i> |
| |
| Create preprocessed source file. |
| |
| =item B<force-tests> |
| |
| Force performing tests. |
| |
| =item B<force-test-deps> |
| |
| Force performing test-deps. |
| |
| =item B<force-test-instr> |
| |
| Force performing test-instr. |
| |
| =item B<force-test-relo> |
| |
| Force performing test-relo. |
| |
| =item B<force-test-touch> |
| |
| Force performing test-touch. |
| |
| =item B<inc> |
| |
| Build Fortran include files, omp_lib.h, omp_lib.mod and omp_lib_kinds.mod. |
| |
| =item B<lib> |
| |
| Build library (on Windows* OS in case of dynamic linking, it also builds import library). |
| |
| =item B<tests> |
| |
| Perform tests: C<test-deps>, C<test-instr>, C<test-relo>, and C<test-touch>. |
| |
| =item B<test-deps> |
| |
| Check the library dependencies. |
| |
| =item B<test-instr> |
| |
| Intel(R) Many Integrated Core Architecture only: check the library does not contain undesired instructions. |
| |
| =item B<test-relo> |
| |
| Linux* OS with dynamic linking only: check the library does not contain position-dependent |
| code. |
| |
| =item B<test-touch> |
| |
| Build a very simple application with native compiler (GNU on Linux* OS and OS X*, MS |
| on Windows* OS), check it does not depend on C<libirc> library, and run it. |
| |
| =back |
| |
| =back |
| |
| =head1 DESCRIPTION |
| |
| C<build.pl> constructs the name of a build directory, creates the directory if it |
| does not exist, changes to it, and runs make to build the goals in specified configuration. |
| If more than one configuration are specified in command line C<build.pl> builds them all. |
| |
| Being run with C<clean> goal, C<build.pl> does not build but deletes export files and |
| cleans build directories of configuration specified by other options. For example, |
| C<build.pl --all clean> means "clean build directories for all configurations", |
| it does B<not> mean "clean then build all". |
| |
| C<clear-common> goal deletes common files in F<exports/> directory. |
| Since common files are really common and not architecture and/or configuration dependent, |
| there are no much meaning in combining C<clear-common> with configuration selection options. |
| For example, C<build.pl --all clean-common> deletes the same files 13 times. |
| However, it does not hurt and can be used in conjunction with C<clear> goal. |
| |
| C<clobber> goal instructs C<build.pl> to clean exports and all build |
| directories, e. g. clean everything under F<exports/> and F<tmp/> directories. |
| |
| Logs are saved automatically, there is no need in explicit output redirection. |
| Log file for each particular configuration is named F<build.log> and located in build directory. |
| Summary log file (just result of each configuration) is saved in F<tmp/> directory. |
| |
| Log files are never overwritten. C<build.pl> always appends output to log files. |
| However (obviously), C<clear> deletes log file for cleared configurations, |
| and C<clobber> deletes all summary log files. |
| |
| =head2 Environment Variables |
| |
| =over |
| |
| =item B<LIBOMP_ARCH> |
| |
| Specifies target architecture. If not present, host architecture is used. Environment variable may |
| be overriden by C<--architecture> command line option. |
| |
| =item B<LIBOMP_EXPORTS> |
| |
| Specifies directory for output files. If not set, C<$LIBOMP_WORK/exports/> used by default. |
| |
| =item B<LIBOMP_OS> |
| |
| Specifies target OS. If not present, host OS is used. Environment variable may |
| be overriden by C<--os> command line option. |
| |
| =item B<LIBOMP_TMP> |
| |
| Directory for temporary files. C<build.pl> creates build directories there. If not set, |
| C<$LIBOMP_WORK/tmp/> used by default. |
| |
| On Windows* OS F<tmp/> directory on local drive speeds up the build process. |
| |
| =item B<LIBOMP_WORK> |
| |
| Root of libomp directory tree, contains F<src/>, F<tools/>, and F<exports/> subdirs. |
| If not set, C<build.pl> guesses the root dir (it is a parent of dir containing C<build.pl>). |
| |
| Note: Guessing it not reliable. Please set C<LIBOMP_WORK> environment variable appropriately. |
| |
| =back |
| |
| =head1 EXAMPLES |
| |
| =head2 Development |
| |
| Build normal (performance) dynamic library for debugging: |
| |
| $ build.pl --debug |
| |
| Build all libraries (normal, stub; dynamic RTL) for debugging: |
| |
| $ build.pl --all --debug |
| |
| Do a clean build for all: |
| |
| $ build.pl --all --debug clean && build.pl --all --debug |
| |
| Debugging libraries are saved in F<exports/I<platform>.deb/>. |
| |
| =head2 Promotion |
| |
| =over |
| |
| =item 1 |
| |
| Clobber everything; on one machine: |
| |
| $ build.pl clobber |
| |
| =item 2 |
| |
| Build common headers, on one machine: |
| |
| $ build.pl common |
| |
| =item 3 |
| |
| Build all platform-dependent files, on all machines: |
| |
| $ build.pl --all |
| |
| =item 4 |
| |
| Build OS X* universal (fat) libraries, on C<mac_32e>: |
| |
| $ build.pl fat |
| |
| =back |
| |
| =cut |
| |
| # end of file # |