aboutsummaryrefslogtreecommitdiff
path: root/skel
diff options
context:
space:
mode:
authorpmichaud <pmichaud@pobox.com>2010-07-28 01:23:44 -0500
committerpmichaud <pmichaud@pobox.com>2010-07-28 01:23:44 -0500
commit2eff06a529aae02f2b6b38835ad38fbf7833597c (patch)
tree79ea7a0fda91bbd73fb658bf320a933a668723b1 /skel
parent5d1a7bccc213b2444581345c06f756f1fa538c50 (diff)
Refactor pieces into skel/ .
Diffstat (limited to 'skel')
-rw-r--r--skel/Configure.pl231
-rw-r--r--skel/build/Makefile.in140
-rw-r--r--skel/build/gen_parrot.pl84
-rw-r--r--skel/build/module-install.pl37
-rw-r--r--skel/docs/announce/2010.078
-rw-r--r--skel/docs/external-documentation25
6 files changed, 525 insertions, 0 deletions
diff --git a/skel/Configure.pl b/skel/Configure.pl
new file mode 100644
index 0000000..a0e687e
--- /dev/null
+++ b/skel/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{(?<!\\\n)^\t(?!\s*-?cd)(?=[^\n]*\S)}{\ttime }mg;
+ }
+
+ my $outfile = 'Makefile';
+ print "\nCreating $outfile ...\n";
+ open(my $MAKEOUT, '>', $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/skel/build/Makefile.in b/skel/build/Makefile.in
new file mode 100644
index 0000000..f3666ae
--- /dev/null
+++ b/skel/build/Makefile.in
@@ -0,0 +1,140 @@
+# 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_CONFIG = $(PARROT_BIN_DIR)/parrot_config$(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
+
+PERL6_EXE = perl6$(EXE)
+PERL6_LANG_DIR = $(PARROT_LIB_DIR)/languages/perl6
+
+MODULES = \
+ modules/zavolaj \
+ modules/MiniDBI \
+ modules/xml-writer \
+ modules/svg \
+ modules/svg-plot \
+ modules/Math-RungeKutta \
+ modules/Math-Model \
+ modules/mainline \
+ modules/perl6-Config-INI \
+ modules/perl6-File-Find \
+ modules/perl6-Term-ANSIColor \
+ modules/Algorithm-Viterbi \
+
+all: rakudo
+
+rakudo: rakudo/$(PERL6_EXE)
+rakudo/$(PERL6_EXE):
+ cd rakudo && $(PERL) Configure.pl --parrot-config=$(PARROT_CONFIG) && $(MAKE)
+rakudo-test: rakudo/perl6
+ cd rakudo && $(MAKE) test
+rakudo-install: rakudo
+ cd rakudo && $(MAKE) install
+ $(CP) $(PARROT_BIN_DIR)/$(PERL6_EXE) .
+ $(CHMOD) 755 $(PERL6_EXE)
+
+modules-install:
+ @echo "Installing 'ufo'"
+ $(CP) modules/ufo/ufo $(PARROT_BIN_DIR)/ufo
+ $(CHMOD) 755 $(PARROT_BIN_DIR)/ufo
+ $(PERL) build/module-install.pl $(PARROT_BIN_DIR)/$(PERL6_EXE) $(DESTDIR)$(PERL6_LANG_DIR)/lib $(MODULES)
+
+blizkost:
+ cd modules/blizkost && $(PERL) Configure.pl --parrot-config=$(PARROT_CONFIG) && $(MAKE)
+blizkost-install: blizkost
+ cd modules/blizkost && $(MAKE) install
+
+install: rakudo-install modules-install
+
+## 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 "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 build/
+
+perlcritic:
+ perlcritic -1 --profile tools/util/perlcritic.conf $(CRITIC_FILES)
+
+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)
diff --git a/skel/build/gen_parrot.pl b/skel/build/gen_parrot.pl
new file mode 100644
index 0000000..b5faaa2
--- /dev/null
+++ b/skel/build/gen_parrot.pl
@@ -0,0 +1,84 @@
+#! perl
+# Copyright (C) 2009 The Perl Foundation
+
+=head1 TITLE
+
+gen_parrot.pl - script to obtain and build Parrot for Rakudo
+
+=head2 SYNOPSIS
+
+ perl gen_parrot.pl [--parrot --configure=options]
+
+=head2 DESCRIPTION
+
+Maintains an appropriate copy of Parrot in the parrot/ subdirectory.
+The revision of Parrot to be used in the build is given by the
+build/PARROT_REVISION file.
+
+=cut
+
+use strict;
+use warnings;
+use 5.008;
+
+# Work out slash character to use.
+my $slash = $^O eq 'MSWin32' ? '\\' : '/';
+
+## determine what revision of Parrot we require
+open my $REQ, "build/PARROT_REVISION"
+ || die "cannot open build/PARROT_REVISION\n";
+my ($reqsvn, $reqpar) = split(' ', <$REQ>);
+$reqsvn += 0;
+close $REQ;
+
+{
+ no warnings;
+ if (open my $REV, '-|', "parrot_install${slash}bin${slash}parrot_config revision") {
+ my $revision = 0+<$REV>;
+ close $REV;
+ if ($revision >= $reqsvn) { print "Parrot r$revision already available (r$reqsvn required)\n";
+ exit(0);
+ }
+ }
+}
+
+chdir('parrot-2.6.0') || die "Can't chdir to 'parrot-2.6.0': $!";
+
+
+## If we have a Makefile from a previous build, do a 'make realclean'
+if (-f 'Makefile') {
+ my %config = read_parrot_config();
+ my $make = $config{'make'};
+ if ($make) {
+ print "\nPerforming '$make realclean' ...\n";
+ system_or_die($make, "realclean");
+ }
+}
+
+print "\nConfiguring Parrot ...\n";
+my @config_command = ($^X, 'Configure.pl', @ARGV);
+print "@config_command\n";
+system_or_die( @config_command );
+
+print "\nBuilding Parrot ...\n";
+my %config = read_parrot_config();
+my $make = $config{'make'} or exit(1);
+system_or_die($make, 'install-dev');
+
+sub read_parrot_config {
+ my %config = ();
+ if (open my $CFG, "config_lib.pir") {
+ while (<$CFG>) {
+ if (/P0\["(.*?)"], "(.*?)"/) { $config{$1} = $2 }
+ }
+ close $CFG;
+ }
+ %config;
+}
+
+sub system_or_die {
+ my @cmd = @_;
+
+ system( @cmd ) == 0
+ or die "Command failed (status $?): @cmd\n";
+}
diff --git a/skel/build/module-install.pl b/skel/build/module-install.pl
new file mode 100644
index 0000000..cba32df
--- /dev/null
+++ b/skel/build/module-install.pl
@@ -0,0 +1,37 @@
+#! perl
+
+use warnings;
+use strict;
+use File::Find;
+use File::Copy;
+use File::Path;
+use File::Basename;
+
+my $perl6 = shift @ARGV;
+my $perl6lib = shift @ARGV;
+
+my @pmfiles;
+while (@ARGV) {
+ my $module = shift @ARGV;
+ our $mlib = "$module/lib";
+
+ find({ no_chdir=>1, wanted => \&libcopy }, $mlib);
+
+ sub libcopy {
+ return unless /\.pm6?/;
+ my $source = $File::Find::name;
+ my $target = $source;
+ $target =~ s/$mlib/$perl6lib/;
+ print "$source => $target\n";
+ mkpath dirname($target);
+ copy($source, $target) or die "copy failed: $!\n";
+ push @pmfiles, $target;
+ }
+}
+
+foreach my $pm (@pmfiles) {
+ my $out = $pm; $out =~ s/\.pm6?$/.pir/;
+ my @cmd = ('./perl6', '--target=pir', "--output=$out", $pm);
+ print join(' ', @cmd), "\n";
+ system(@cmd);
+}
diff --git a/skel/docs/announce/2010.07 b/skel/docs/announce/2010.07
new file mode 100644
index 0000000..321cb10
--- /dev/null
+++ b/skel/docs/announce/2010.07
@@ -0,0 +1,8 @@
+ Announce: Rakudo Star Distribution Release 1
+
+On behalf of the Rakudo development team, I'm pleased to announce the first
+"Rakudo Star" release. It is a distribution release containing the Rakudo
+Perl 6 compiler, modules and documentation, aiming to be a useable development
+environment.
+
+This is not a Perl 6 production release, or a finalized 6.0 release.
diff --git a/skel/docs/external-documentation b/skel/docs/external-documentation
new file mode 100644
index 0000000..d591479
--- /dev/null
+++ b/skel/docs/external-documentation
@@ -0,0 +1,25 @@
+Here are some useful links to a knowledge source not included in
+Rakudo Star, yet helpful and especially useful for beginners.
+
+* Perl 5 to 6
+ http://perlgeek.de/en/article/5-to-6
+
+Series of articles by Moritz Lenz giving an excellent introduction
+to Perl 6 for Perl 5 programmers, focusing on the changed things
+and underlining the caveats.
+
+* Perl 6 Advent Calendar
+ http://perl6advent.wordpress.com/
+
+Series of articles showing "Something cool about Perl 6 every day".
+Advent Calendar shows some nice new features of Perl 6, explains
+the new operators and shows many interesting, challenging examples
+of their usage.
+
+* Gabor Szabo's screencasts
+ http://szabgab.com/perl6.html#screencast
+
+In his screencasts, Gabor Szabo shows a baby-steps introduction
+to Perl 6, showing code examples and executing them to show their
+effect on the screen. A great introduction if you'd like to start
+from the very beginning and explore Perl 6 piece by piece.