X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=nesc.git;a=blobdiff_plain;f=tools%2Fnescc.in;h=20e61ecaee68117ad495f2f14d1dc032c1315d44;hp=02756bb875910c57e0a8b8cfbf86101ff2f3d4f7;hb=627b462e8421954b5102d839ff203adb3400a8cc;hpb=7b54393e237ed8f23c0c74f0a6cbc8de26c5bf98 diff --git a/tools/nescc.in b/tools/nescc.in index 02756bb..20e61ec 100644 --- a/tools/nescc.in +++ b/tools/nescc.in @@ -32,55 +32,71 @@ $ENV{"PATH"} = "$NCDIR:$ENV{PATH}"; $ENV{"NCDIR"} = $NCDIR; # Have fun with the arguments + $gcc = "gcc"; +undef $ENV{NESCC_ARGS}; +undef $ENV{NESCC_CFILE}; +undef $ENV{NESCC_CONLY}; +undef $ENV{NESCC_DEPUTY}; +undef $ENV{NESCC_DEPUTY_ARGS}; +undef $ENV{NESCC_GCC}; + for ($i = 0; $i <= $#ARGV; $i++) { - $strip = 0; $_ = $ARGV[$i]; if (/^-/) { + if (/^-v$/) { + $verbose = 1; + } + if (/^-docdir=(.*)/) { $docdir = $1; - $strip = 1; - } - elsif (/^-topdir=(.*)/) { + } elsif (/^-topdir=(.*)/) { push @topdirs, $1; - $strip = 1; - } - elsif (/^-graphviz=(.*)/) { + } elsif (/^-graphviz=(.*)/) { if($1 =~ /^y/i) { $use_graphviz = 1; } else { $use_graphviz = 0; } - $strip = 1; - } - elsif (/^--version$/) { + } elsif (/^--version$/) { $print_version = 1; - $strip = 1; - } - elsif (/^-gcc=(.*)/) { - $gcc = $1; - $strip = 1; - } - elsif (/^-mingw-gcc$/) { + } elsif (/^-(fnesc-)?gcc=(.*)/) { + $gcc = $2; + } elsif (/^-mingw-gcc$/) { $mingw_gcc = 1; - $strip = 1; - push @new_args, "-fnesc-mingw-gcc"; - } - elsif (/^-v$/) { - $verbose = 1; - } - elsif (/^-conly$/) { - $strip = 1; - push @new_args, "-fnesc-conly"; - push @new_args, "-fsyntax-only"; + push @nescc_args, "-fnesc-mingw-gcc"; + } elsif (/^-conly$/) { + $ENV{NESCC_CONLY} = "yes"; + push @nescc_args, "-fsyntax-only"; + } elsif (/^-fnesc-cfile=(.*)$/) { + $ENV{NESCC_CFILE} = $1; + } elsif (/^-_?fnesc-deputy$/) { + $ENV{NESCC_DEPUTY} = "yes"; + } elsif (/^-_?fnesc-deputy-args=(.*)$/) { + $ENV{NESCC_DEPUTY_ARGS} = $1; + } elsif (/^(-(f|W|Wno-)nesc.*)$/) { + # Don't confuse the non-nesC frontends with our -f and -W + # flags (these were ignored in earlier C/etc frontends, + # but current ones give error messages, preventing nescc + # from compiling C files) + push @nescc_args, $1; + } elsif (/^-([IDUAo])/) { + $opt = $1; + ($i, $val) = &extractarg($i); + push @new_args, "-$opt", $val; + } elsif (/^(-include|-idirafter|-imacro|-iprefix|-iwithprefix|-iwithprefixbefore|-isystem|-isysroot|-X[a-zA-Z]*|--param)$/) { + $opt = $1; + ($i, $arg) = &nextarg($i); + push @new_args, $opt, $arg; + } else { + push @new_args, $_; } - } - - push @new_args, $_ if !$strip; + } else { + push @new_args, $_; + } } - if ($verbose || $print_version) { print "nescc: @PACKAGE_VERSION@\n"; } @@ -115,62 +131,59 @@ push @new_args, "-DNESC=$numversion"; # Base network type definitions unshift @new_args, "-I$NCDIR"; -unshift @new_args, "-fnesc-include=nesc_nx"; +unshift @nescc_args, "-fnesc-include=nesc_nx"; # # documentation generation options # -if( defined($docdir) ) { +if (defined($docdir)) { # add the doc output dir - push @new_args, "-fnesc-docdir=$docdir"; + push @nescc_args, "-fnesc-docdir=$docdir"; # add top level dirs, to strip out of package names foreach my $dir (@topdirs) { - push @new_args, "-fnesc-topdir=$dir"; + push @nescc_args, "-fnesc-topdir=$dir"; } # add graphviz option - if( defined($use_graphviz) ) { - push @new_args, "-fnesc-docs-use-graphviz" if($use_graphviz); + if (defined($use_graphviz)) { + push @nescc_args, "-fnesc-docs-use-graphviz" if $use_graphviz; } else { - my $dot = `which dot 2>&1`; - push @new_args, "-fnesc-docs-use-graphviz" if($dot !~ /^\s*$/); + local $dot = `which dot 2>&1`; + push @nescc_args, "-fnesc-docs-use-graphviz" if $dot !~ /^\s*$/; } } - unshift @new_args, "-specs=$NCDIR/tdspecs"; -unshift @new_args, "-fnesc-gcc=$gcc"; unshift @new_args, $gcc; if ($mingw_gcc) { # Yuck. Convert unix paths to windows paths - $ENV{"NCDIR"} = &winpath($ENV{"NCDIR"}); + $ENV{NCDIR} = &winpath($ENV{NCDIR}); + $ENV{NESCC_CFILE} = &winpath($ENV{NESCC_CFILE}); @ARGV = @new_args; @new_args = (); for ($i = 0; $i <= $#ARGV; $i++) { $_ = $ARGV[$i]; if (/^-/) { - if (/^-[oIL]/) { + if (/^-([oIL])/) { # convert argument filename which may be in same arg - $opt = substr $_, 1, 1; + $opt = $1; ($i, $file) = &extractarg($i); $file = &winpath($file); push @new_args, "-$opt$file"; } - elsif (/^-[xubV]/) { + elsif (/^-([xubV])/) { # pass option and arg through unchanged - $opt = substr $_, 1, 1; + $opt = $1; ($i, $arg) = &extractarg($i); push @new_args, "-$opt$arg"; } - elsif ($i < $#ARGV && - (/^-idirafter$/ || /^-include$/ || /^-imacros$/ || - /^-iprefix$/ || /^-iwithprefix$/ || /^-iwithprefixbefore$/ || - /^-isystem$/ || /^-Xlinker$/)) { + elsif (/^(-include|-idirafter|-imacro|-iprefix|-iwithprefix|-iwithprefixbefore|-isystem|-isysroot|-Xlinker)/) { # convert argument filename which is in next arg - push @new_args, $_; - push @new_args, &winpath($ARGV[++$i]); + $opt = $1; + ($i, $arg) = &nextarg($i); + push @new_args, $opt, &winpath($arg); } elsif (/^-specs=(.*)$/) { # convert argument filename @@ -187,30 +200,60 @@ if ($mingw_gcc) { } } -# Don't confuse the non-nesC frontends with our -f and -W flags -# (these were ignored in earlier C/etc frontends, but current ones give -# error messages, preventing nescc from compiling C files) -map { s/-((f|W|Wno-)nesc)/-_\1/; $_; } @new_args; +foreach (@nescc_args) { + $_ = quotemeta $_; + s/\\([-=,\.\/])/\1/g; +} + +$ENV{NESCC_ARGS} = join(' ', @nescc_args); +$ENV{NESCC_GCC} = $gcc; + +printenv("NCDIR"); +printenv("NESCC_ARGS"); +printenv("NESCC_CFILE"); +printenv("NESCC_CONLY"); +printenv("NESCC_DEPUTY"); +printenv("NESCC_DEPUTY_ARGS"); +printenv("NESCC_GCC"); print STDERR join(' ', @new_args), "\n" if $verbose; exec @new_args; print STDERR "Couldn't execute $gcc\n"; exit 2; +sub printenv { + local ($s) = @_; + + print STDERR "$s=\"$ENV{$s}\"\n" if $verbose && defined($ENV{$s}); +} + sub extractarg { local ($i) = @_; if (length($ARGV[$i]) == 2) { - $arg = $ARGV[++$i]; + return &nextarg($i); } else { $arg = substr($ARGV[$i], 2); + return ($i, $arg); + } +} + +sub nextarg { + local ($i) = @_; + + if ($i < $#ARGV) { + $arg = $ARGV[++$i]; + } + else { + printf STDERR "missing argument to $ARGV[$i]\n"; + exit 2; } return ($i, $arg); } sub winpath { - my ($path) = @_; + local ($path) = @_; $path = `cygpath -w $path`; chop $path;