From 5cfe6b289455ffb2d0a17f1cab70f96083df0447 Mon Sep 17 00:00:00 2001 From: pmichaud Date: Tue, 27 Jul 2010 15:18:55 -0500 Subject: Update build process slightly. --- build/Configure.pl | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++++ build/Makefile.in | 108 +++++++++++++++++++++++++ 2 files changed, 339 insertions(+) create mode 100644 build/Configure.pl create mode 100644 build/Makefile.in (limited to 'build') diff --git a/build/Configure.pl b/build/Configure.pl new file mode 100644 index 0000000..a0e687e --- /dev/null +++ b/build/Configure.pl @@ -0,0 +1,231 @@ +#! perl +# Copyright (C) 2009 The Perl Foundation + +use 5.008; +use strict; +use warnings; +use Getopt::Long; +use Cwd; + +MAIN: { + my %options; + GetOptions(\%options, 'help!', 'parrot-config=s', 'makefile-timing!', + 'gen-parrot!', 'prefix=s', 'gen-parrot-option=s@'); + + # Print help if it's requested + if ($options{'help'}) { + print_help(); + exit(0); + } + + # Determine the revision of Parrot we require + open my $REQ, '<', "build/PARROT_REVISION" + or die "cannot open build/PARROT_REVISION: $!\n"; + my ($reqsvn, $reqpar) = split(' ', <$REQ>); + $reqsvn += 0; + close $REQ; + + # Update/generate parrot build if needed + if ($options{'gen-parrot'}) { + my @opts = @{ $options{'gen-parrot-option'} || [] }; + my $prefix = $options{'prefix'} || cwd()."/install"; + # parrot's Configure.pl mishandles win32 backslashes in --prefix + $prefix =~ s{\\}{/}g; + my @command = ($^X, "build/gen_parrot.pl", "--prefix=$prefix", ($^O !~ /win32/i ? "--optimize" : ()), @opts); + + print "Generating Parrot ...\n"; + print "@command\n\n"; + system @command; + } + + # Get a list of parrot-configs to invoke. + my @parrot_config_exe = qw( + install/bin/parrot_config + parrot_config + ); + if (exists $options{'prefix'}) { + unshift @parrot_config_exe, + $options{'prefix'} . '/bin/parrot_config'; + } + + if ($options{'parrot-config'} && $options{'parrot-config'} ne '1') { + @parrot_config_exe = ($options{'parrot-config'}); + } + + # Get configuration information from parrot_config + my %config = read_parrot_config(@parrot_config_exe); + + my $parrot_errors = ''; + if (!%config) { + $parrot_errors .= "Unable to locate parrot_config\n"; + } + elsif ($reqsvn > $config{'revision'} && + ($reqpar eq '' || version_int($reqpar) > version_int($config{'VERSION'}))) { + $parrot_errors .= "Parrot revision r$reqsvn required (currently r$config{'revision'})\n"; + } + + if ($parrot_errors) { + die <<"END"; +===SORRY!=== +$parrot_errors +To automatically build the version of Parrot that came with this +distribution ($reqpar), try re-running Configure.pl with the +'--gen-parrot' option. Or, use the '--parrot-config' option to +explicitly specify the location of parrot_config to be used to +build Rakudo Star. + +END + } + + # Verify the Parrot installation is sufficient for building Rakudo + verify_parrot(%config); + + # Create the Makefile using the information we just got + create_makefile($options{'makefile-timing'}, %config); + my $make = $config{'make'}; + + { + no warnings; + print "Cleaning up ...\n"; + if (open my $CLEAN, '-|', "$make clean") { + my @slurp = <$CLEAN>; + close $CLEAN; + } + } + + print <<"END"; + +You can now use '$make' to build Rakudo Perl. +After that, you can use '$make test' to run some local tests, +or '$make spectest' to check out (via svn) a copy of the Perl 6 +official test suite and run its tests. + +END + exit 0; + +} + + +sub read_parrot_config { + my @parrot_config_exe = @_; + my %config = (); + for my $exe (@parrot_config_exe) { + no warnings; + if (open my $PARROT_CONFIG, '-|', "$exe --dump") { + print "\nReading configuration information from $exe ...\n"; + while (<$PARROT_CONFIG>) { + if (/(\w+) => '(.*)'/) { $config{$1} = $2 } + } + close $PARROT_CONFIG or die $!; + last if %config; + } + } + return %config; +} + + +sub verify_parrot { + print "Verifying Parrot installation...\n"; + my %config = @_; + my $EXE = $config{'exe'}; + my $PARROT_BIN_DIR = $config{'bindir'}; + my $PARROT_VERSION = $config{'versiondir'}; + my $PARROT_LIB_DIR = $config{'libdir'}.$PARROT_VERSION; + my $PARROT_SRC_DIR = $config{'srcdir'}.$PARROT_VERSION; + my $PARROT_INCLUDE_DIR = $config{'includedir'}.$PARROT_VERSION; + my $PARROT_TOOLS_DIR = "$PARROT_LIB_DIR/tools"; + my @required_files = ( + "$PARROT_LIB_DIR/library/PGE/Perl6Grammar.pbc", + "$PARROT_LIB_DIR/library/PCT/HLLCompiler.pbc", + "$PARROT_BIN_DIR/ops2c".$EXE, + "$PARROT_TOOLS_DIR/build/pmc2c.pl", + "$PARROT_SRC_DIR", + "$PARROT_SRC_DIR/pmc", + "$PARROT_INCLUDE_DIR", + "$PARROT_INCLUDE_DIR/pmc", + ); + my @missing = map { " $_" } grep { ! -e } @required_files; + if (@missing) { + my $missing = join("\n", @missing); + die <<"END"; + +===SORRY!=== +I'm missing some needed files from the Parrot installation: +$missing +(Perhaps you need to use Parrot's "make install-dev" or +install the "parrot-devel" package for your system?) + +END + } +} + +# Generate a Makefile from a configuration +sub create_makefile { + my ($makefile_timing, %config) = @_; + + my $maketext = slurp( 'build/Makefile.in' ); + + $config{'stagestats'} = $makefile_timing ? '--stagestats' : ''; + $config{'win32_libparrot_copy'} = $^O eq 'MSWin32' ? 'copy $(PARROT_BIN_DIR)\libparrot.dll .' : ''; + $maketext =~ s/@(\w+)@/$config{$1}/g; + if ($^O eq 'MSWin32') { + $maketext =~ s{/}{\\}g; + $maketext =~ s{\\\*}{\\\\*}g; + $maketext =~ s{http:\S+}{ do {my $t = $&; $t =~ s'\\'/'g; $t} }eg; + } + + if ($makefile_timing) { + $maketext =~ s{(?', $outfile) || + die "Unable to write $outfile\n"; + print {$MAKEOUT} $maketext; + close $MAKEOUT or die $!; + + return; +} + +sub slurp { + my $filename = shift; + + open my $fh, '<', $filename or die "Unable to read $filename\n"; + local $/ = undef; + my $maketext = <$fh>; + close $fh or die $!; + + return $maketext; +} + +sub version_int { + sprintf('%d%03d%03d', split(/\./, $_[0])) +} + + +# Print some help text. +sub print_help { + print <<'END'; +Configure.pl - Rakudo Configure + +General Options: + --help Show this text + --gen-parrot Download and build a copy of Parrot to use + --gen-parrot-option='--option=value' + Set parrot config option when using --gen-parrot + --parrot-config=/path/to/parrot_config + Use config information from parrot_config executable +Experimental developer's options: + --makefile-timing Insert 'time' command all over in the Makefile +END + + return; +} + +# Local Variables: +# mode: cperl +# cperl-indent-level: 4 +# fill-column: 100 +# End: +# vim: expandtab shiftwidth=4: diff --git a/build/Makefile.in b/build/Makefile.in new file mode 100644 index 0000000..055e20b --- /dev/null +++ b/build/Makefile.in @@ -0,0 +1,108 @@ +# Copyright (C) 2006-2010, The Perl Foundation. +# $Id$ + +PARROT_ARGS = + +# values from parrot_config +PARROT_BIN_DIR = @bindir@ +PARROT_VERSION = @versiondir@ +PARROT_INCLUDE_DIR = @includedir@$(PARROT_VERSION) +PARROT_LIB_DIR = @libdir@$(PARROT_VERSION) +PARROT_SRC_DIR = @srcdir@$(PARROT_VERSION) +HAS_ICU = @has_icu@ + +CC = @cc@ +CFLAGS = @ccflags@ @cc_shared@ @cc_debug@ @ccwarn@ @cc_hasjit@ @gc_flag@ +EXE = @exe@ +LD = @ld@ +LDFLAGS = @ldflags@ @ld_debug@ +LD_LOAD_FLAGS = @ld_load_flags@ +LIBPARROT = @inst_libparrot_ldflags@ +O = @o@ +LOAD_EXT = @load_ext@ +PERL = @perl@ +CP = @cp@ +MV = @mv@ +RM_F = @rm_f@ +MKPATH = $(PERL) -MExtUtils::Command -e mkpath +CHMOD = $(PERL) -MExtUtils::Command -e chmod +POD2MAN = @pod2man@ + +# locations of parrot resources +PARROT = $(PARROT_BIN_DIR)/parrot$(EXE) +NQP_EXE = $(PARROT_BIN_DIR)/parrot-nqp$(EXE) +PBC_TO_EXE = $(PARROT_BIN_DIR)/pbc_to_exe$(EXE) +PARROT_TOOLS_DIR = $(PARROT_LIB_DIR)/tools +PARROT_PERL_LIB = $(PARROT_TOOLS_DIR)/lib +OPS2C = $(PARROT_BIN_DIR)/ops2c$(EXE) +PMC2C = $(PERL) $(PARROT_TOOLS_DIR)/build/pmc2c.pl +PMC2C_INCLUDES = --include src/pmc --include $(PARROT_SRC_DIR) --include $(PARROT_SRC_DIR)/pmc +CINCLUDES = -I$(PARROT_INCLUDE_DIR) -I$(PARROT_INCLUDE_DIR)/pmc +LINKARGS = $(LDFLAGS) $(LD_LOAD_FLAGS) $(LIBPARROT) @libs@ @icu_shared@ + +# rakudo directories +DYNEXT_DIR = dynext +PMC_DIR = src/pmc +OPS_DIR = src/ops +PERL6_LANG_DIR = $(PARROT_LIB_DIR)/languages/perl6 +MANDIR = @mandir@ +DOCDIR = @prefix@/share/doc + +## cleaning +clean: + $(RM_F) $(CLEANUPS) + +distclean: realclean + +realclean: clean + $(RM_F) Makefile + +testclean: + + +## miscellaneous targets +# a listing of all targets meant to be called by users +help: + @echo "" + @echo "Following targets are available for the user:" + @echo "" + @echo " all: perl6.pbc" + @echo " install: Install stuff." + @echo "" + @echo "Maintenance:" + @echo " perlcritic: Run Perl::Critic on all the Perl 5 code." + @echo "" + @echo "Cleaning:" + @echo " clean: Basic cleaning up." + @echo " distclean: Removes also anything built, in theory." + @echo " realclean: Removes also files generated by 'Configure.pl'." + @echo " testclean: Clean up test results." + @echo "" + @echo "Misc:" + @echo " help: Print this help message." + @echo "" + +config: + $(PERL) Configure.pl + +$(PARROT): + +CRITIC_FILES=Configure.pl t/harness build/ tools/ + +perlcritic: + perlcritic -1 --profile tools/util/perlcritic.conf $(CRITIC_FILES) + +manifest: + echo MANIFEST >MANIFEST + git ls-files | $(PERL) -ne '/^\./ || print' >>MANIFEST + rm -rf t/spec + svn export "http://svn.pugscode.org/pugs/t/spec" t/spec + find t/spec -type f >>MANIFEST + sort -u -o MANIFEST MANIFEST + +release: manifest + [ -n "$(VERSION)" ] || ( echo "\nTry 'make release VERSION=yyyy.mm'\n\n"; exit 1 ) + [ -d rakudo-star-$(VERSION) ] || ln -s . rakudo-star-$(VERSION) + $(PERL) -ne 'print "rakudo-star-$(VERSION)/$$_"' MANIFEST | \ + tar -zcv -T - -f rakudo-star-$(VERSION).tar.gz + rm rakudo-star-$(VERSION) -- cgit v1.1