1 #! /usr/bin/env parrot-nqp
2 # Copyright 2009-2010, Austin Hastings. See accompanying LICENSE file, or
3 # http://www.opensource.org/licenses/artistic-license-2.0.php for license.
7 # setup.nqp - Configure and build the Kakapo library.
11 # $ parrot-nqp setup.nqp build
12 # $ parrot-nqp setup.nqp test
13 # $ sudo parrot-nqp setup.nqp install
16 pir::load_language('parrot');
17 pir::load_bytecode('distutils.pbc');
19 pir::load_bytecode('dumper.pir');
24 sub new_hash(*%hash) {
30 my %kakapo := new_hash(
32 :abstract( 'Run-time library for NQP programs on the Parrot VM' ),
33 :authority( 'http://gitorious.org/austin' ),
34 :copyright_holder( 'Austin Hastings' ),
35 :doc_files( <README CREDITS> ),
36 :keywords( < library nqp parrot runtime stand alone xunit
37 unit testing matcher pmc methods >),
38 :license_type( 'Artistic License 2.0' ),
39 :license_uri( 'http://www.perlfoundation.org/artistic_license_2_0' ),
40 :checkout_uri( 'git://gitorious.org/kakapo/kakapo.git' ),
41 :browser_uri( 'http://code.google.com/p/kakapo-parrot/' ),
42 :project_uri( 'git://gitorious.org/kakapo/kakapo.git' ),
44 :harness_files( 't/bootstrap' ),
46 :release_id( 'release-3' ),
47 :release_dir_format( 'released/%s'),
48 :vdd_file( 'vdd.txt' ),
51 %kakapo<copy_templates><library/krt0.pir> := <src/Internals/krt0.pir_tmpl>;
52 %kakapo<copy_templates><src/Internals/kakapo_bottom.pir> := <src/Internals/kakapo_bottom.pir_tmpl>;
53 %kakapo<copy_templates><src/Internals/kakapo_top.pir> := <src/Internals/kakapo_top.pir_tmpl>;
56 %kakapo<pir_nqp-rx><src/Internals/Base.pir> := <src/Internals/Base.nqp>;
57 %kakapo<pir_nqp-rx><src/Internals/Full.pir> := <src/Internals/Full.nqp>;
59 my @base_pir_files := <
67 src/Pmc/common_methods.pir
78 %kakapo<pir_nqp-rx>{~ $_} := change_ext(~$_, :from('.pir'), :to('.nqp'));
81 %kakapo<build_libs><library/kakapo_base.pir> := <
82 src/Internals/kakapo_top.pir
83 src/Internals/Base.pir
85 %kakapo<build_libs><library/kakapo_base.pir>.append( @base_pir_files );
86 %kakapo<build_libs><library/kakapo_base.pir>.push( <src/Internals/kakapo_bottom.pir>);
88 my @full_pir_files := <
89 src/Classes/P6object.pir
90 src/Classes/P6metaclass.pir
91 src/UnitTest/Listeners.pir
92 src/UnitTest/Loader.pir
93 src/UnitTest/Result.pir
94 src/UnitTest/Suite.pir
95 src/UnitTest/Testcase.pir
99 %kakapo<pir_nqp-rx>{~ $_} := change_ext(~$_, :from('.pir'), :to('.nqp'));
102 %kakapo<build_libs><library/kakapo_full.pir> := <
103 src/Internals/kakapo_top.pir
104 src/Internals/Full.pir
106 %kakapo<build_libs><library/kakapo_full.pir>.append( @base_pir_files );
107 %kakapo<build_libs><library/kakapo_full.pir>.append( @full_pir_files );
108 %kakapo<build_libs><library/kakapo_full.pir>.push( <src/Internals/kakapo_bottom.pir>);
110 %kakapo<strip_annotations> := %kakapo<build_libs>;
112 %kakapo<pbc_pir><library/kakapo_base.pbc> := <library/kakapo_base.pir>;
113 %kakapo<pbc_pir><library/kakapo_full.pbc> := <library/kakapo_full.pir>;
115 %kakapo<release_files><kakapo_base.pir> := <library/kakapo_base.pir>;
116 %kakapo<release_files><kakapo_base.pbc> := <library/kakapo_base.pbc>;
117 %kakapo<release_files><kakapo_full.pir> := <library/kakapo_full.pir>;
118 %kakapo<release_files><kakapo_full.pbc> := <library/kakapo_full.pbc>;
119 %kakapo<release_files><krt0.pir> := <library/krt0.pir>;
121 register_step_before('build', Setup::Step::copy_templates);
122 register_step_before('clean', Setup::Step::clean_templates);
124 #install_build_libs();
125 install_substep('build', Setup::Step::build_libs, :before('_build_pbc_pir'));
126 install_substep('build', Setup::Step::strip_annotations, :before('_build_pbc_pir'));
127 register_step_before('clean', Setup::Step::clean_libs);
129 register_step('release', Setup::Step::make_release);
132 setup_(@argv, %kakapo);
135 sub change_ext($file, :$from!, :$to!) {
136 my $len := pir::length__IS($file) - pir::length__IS($from);
138 unless pir::substr__SSI($file, $len) eq $from {
139 pir::die("No matching extension '$from' on file: $file");
142 my $base := pir::substr__SSI($file, 0, $len);
147 my $interp := pir::getinterp__P();
151 sub install_substep($step, &func, :$before, :$after) {
152 my $target := $before // $after;
157 my $index := ?$after;
160 pir::splice__vppii(%step{$step}, @insert, $index, 0);
167 pir::die("Unable to insert substep &func into $step - could not find $target");
171 # distutils functions are not in a namespace, so Step:: methods can't address them
174 sub needs_update($src, $dst, :$verbose) {
176 ! file_exists($dst) ||newer(~$src, $dst, :verbose($verbose));
179 sub setup_(@steps, %config) {
181 $P0 = find_lex '@steps'
182 $P1 = find_lex '%config'
183 'setup'($P0 :flat, $P1 :flat :named)
189 sub build_libs(*%config) {
195 for %config<build_libs> {
196 $output_file := ~ $_;
197 @inputs := %config<build_libs>{$output_file};
200 unless newer(~$output_file, @inputs) {
202 ~ pir::join(' ', @inputs)
205 system($command, :verbose(1));
210 sub clean_libs(*%config) {
211 clean_key(%config<build_libs>);
214 sub clean_templates(*%config) {
215 clean_key(%config<copy_templates>);
218 sub copy_templates(*%config) {
219 my %cfg := %config<copy_templates>;
224 unless newer(~$dst, ~$src) {
225 cp($src, $dst, :verbose(1));
230 sub make_release(*%config) {
231 my $release_id := %config<release_id>;
233 pir::die("Cannot release: <release_id> config not set");
237 @args.push( $release_id );
239 my $release_dir := pir::sprintf__SSP(%config<release_dir_format>, @args);
241 if file_exists($release_dir) {
242 pir::die("Cannot release: '$release_dir' already exists.");
245 my $vdd := %config<vdd_file>;
247 unless $vdd && file_exists($vdd) {
248 pir::die("Cannot release: no Version Description Document provided. Set <vdd_file> config.");
251 my $fh := pir::open__PSS($vdd, 'r');
252 my $leader := $fh.readline;
255 if pir::index__ISS($leader, $release_id) < 0 {
256 pir::die("Cannot release: VDD file '$vdd' does not contain '$release_id' in line 1");
259 my %cfg := %config<release_files>;
260 my $installed_vdd := 0;
263 install(%cfg{~$_}, $release_dir ~ '/' ~$_, :verbose(1));
265 if %cfg{~$_} eq $vdd {
270 unless $installed_vdd {
271 install($vdd, $release_dir ~ '/VERSION', :verbose(1));
274 unlink($vdd, :verbose(1));
277 sub strip_annotations(*%config) {
278 for %config<strip_annotations> {
279 if file_exists(~$_) {
280 my $fh := pir::open__PSS(~$_, 'r');
281 my $body := $fh.readall();
284 if pir::index__ISS($body, "\n.annotate ") >= 0 {
285 say("Removing annotations from $_");
286 $body.replace("\n.annotate ", "\n# .annotate ");
287 $fh := pir::open__PSS(~$_, 'w');