scripts/din2d
changeset 23 0d1bd8c1cf85
parent 20 3f164cb8d543
equal deleted inserted replaced
22:06b955c7b673 23:0d1bd8c1cf85
     1 #!/usr/bin/perl
     1 #!/usr/bin/perl
     2 # Dockerfile.in -> Dockerfile
     2 # Dockerfile.in -> Dockerfile
     3 # currently just resolve .include_if_exists ..
     3 # currently just resolve .include_if_exists ..
       
     4 #                        .include
       
     5 #                        .platform
       
     6 #                        <platform>
     4 
     7 
     5 use strict;
     8 use strict;
     6 use warnings;
     9 use warnings;
       
    10 use 5.14.0;
     7 use Cwd qw(abs_path);
    11 use Cwd qw(abs_path);
     8 use File::Basename qw(dirname);
    12 use File::Basename qw(basename dirname);
     9 use Getopt::Long;
    13 use Getopt::Long;
    10 
    14 
    11 while (<>) {
    15 while (<>) {
    12     /^\.include_if_exists\s+(.+?)\s*$/ or next;
    16     state $platform;
    13     $_ = "# from $1 {{\n" . do { 
    17 
    14 	my $file = abs_path(dirname($ARGV) . "/$1");
    18     if (/^.platform\s+(\S+)\s*/) {
    15 	open(my $in, '<', $file) or die "Can't open $file: $!\n";
    19 	$platform = $1;
    16 	local $/ = undef;
    20 	$_ = "# platform is $1\n";
    17 	<$in>;
    21 	next;
    18     } 
    22     }
    19     . "# }}\n";
    23 
       
    24     if (/^(?<cmd>.include(?<try>_if_exists)?)\s+(?<file>.+?)\s*$/) {
       
    25 	$_ = "# $+{cmd} from $+{file} {{\n" . join('' => do { 
       
    26 	    my @yield;
       
    27 	    my @files = glob abs_path(dirname($ARGV)) . "/$+{file}";
       
    28 	    foreach my $file (@files) {
       
    29 		push @yield, "# from $file\n";
       
    30 		if (open(my $in, '<', $file)) {
       
    31 		    local $/ = undef;
       
    32 		    push @yield, <$in>;
       
    33 		}
       
    34 		else {
       
    35 		    die "$file: $!\n" if not $+{try};
       
    36 		}
       
    37 	    }
       
    38 	    @yield;
       
    39 	}) . "# }}\n";
       
    40     }
       
    41 
       
    42     if (/<platform>/) {
       
    43 	die "$0:$ARGV platform not known yet!\n"
       
    44 	    if not defined $platform;
       
    45 	s/<platform>/$platform/g;
       
    46     }
    20 }
    47 }
    21 continue {
    48 continue {
    22     print if defined;
    49     print if defined;
    23 }
    50 }