HOSTPLATFORM TARGETPLATFORM
-PROJECTNAME PROJECTVERSION PROJECTPATCHLEVEL
+ProjectName ProjectVersion ProjectVersionInt ProjectPatchLevel
TOP_PWD
#
$InstLibExecDirGhc = "${libexecdir}";
$InstDataDirGhc = "${datadir}";
-$InstSysLibDir = ( $INSTALLING ) ? "${InstLibDirGhc}/hslibs" : "$TopPwd/hslibs";
$Status = 0; # just used for exit() status
$Verbose = '';
: "$TopPwd/${CURRENT_DIR}/${GHC_HSCPP}";
@HsCpp_flags = ();
-$genSPECS_flag = ''; # See ../utils/hscpp/hscpp.prl
$HsC = ( $INSTALLING ) ? "$InstLibExecDirGhc/hsc"
: "$TopPwd/${CURRENT_DIR}/${GHC_HSC}";
\begin{code}
sub setupOptFlags {
- $Oopt_UnfoldingUseThreshold = '-fsimpl-uf-use-threshold3';
$Oopt_MaxSimplifierIterations = '-fmax-simplifier-iterations4';
$Oopt_PedanticBottoms = '-fpedantic-bottoms'; # ON by default
$Oopt_MonadEtaExpansion = '';
$Oopt_FinalStgProfilingMassage = '';
$Oopt_StgStats = '';
$Oopt_SpecialiseUnboxed = '';
- $Oopt_DoSpecialise = ''; # ToDo:LATER: '-fspecialise';
+ $Oopt_DoSpecialise = '-fspecialise';
$Oopt_FoldrBuild = 0; # *Off* by default!
$Oopt_FB_Support = ''; # was '-fdo-arity-expand';
# $Oopt_FoldrBuildWW = 0; # Off by default
-fwarn-overlapping-patterns
-fwarn-missing-methods
+ -fwarn-duplicate-exports
these are turned off by -Wnot.
\begin{code}
@StandardWarnings = ('-fwarn-overlapping-patterns',
- '-fwarn-missing-methods');
+ '-fwarn-missing-methods',
+ '-fwarn-duplicate-exports');
@MinusWOpts = (@StandardWarnings,
'-fwarn-incomplete-patterns',
- '-fwarn-unused-names');
+ '-fwarn-unused-binds',
+ '-fwarn-unused-imports');
@MinusWallOpts = (@MinusWOpts,
+ '-fwarn-unused-matches',
'-fwarn-name-shadowing');
\end{code}
@Import_dir = ('.'); #-i things
@Include_dir = ('.'); #-I things; other default(s) stuck on AFTER option processing
-# where to look for interface files (system hi's, i.e., prelude and hslibs)
+# where to look for interface files (system hi's, i.e., prelude and syslibs)
@SysImport_dir = ( $INSTALLING )
- ? ( "$InstLibDirGhc/imports" )
- : ( "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/required"
- , "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/ghc"
- , "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/glaExts"
- , "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/concurrent" );
+ ? ( "$InstLibDirGhc/imports/std" )
+ : ( "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/std" );
# We need to look in ghc/ and glaExts/ when searching for implicitly needed .hi files, but
# we should really *not* look there for explicitly imported modules.
-$GhcVersionInfo = int($PROJECTVERSION * 100 + .5); # i.e., round (X.Y * 100)
+$GhcVersionInfo = $ProjectVersionInt;
$Haskell1Version = 4; # i.e., Haskell 1.4
@Cpp_define = ();
? $InstLibDirGhc
: ( "$TopPwd/$CURRENT_DIR/$GHC_RUNTIME_DIR"
, "$TopPwd/$CURRENT_DIR/$GHC_RUNTIME_DIR/gmp"
- , "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR"
- , "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/cbits"
+ , "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/std"
+ , "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/std/cbits"
)
);
@SysLibrary = (); # will be built up as we go along
# TEMP: disable x86 if $HaveNativeCodeGen && $TargetPlatform =~ /^(i386|alpha|sparc)-/;
$ProduceHi = '-hifile=';
$HiOnStdout = 0;
+$HiWith = '';
$HiDiff_flag = '';
$Keep_HiDiffs = 0;
# '-fsimpl-uf-use-threshold0',
# '-fessential-unfoldings-only',
- $Oopt_UnfoldingUseThreshold,
+ #
+ # The presence of -fclone-binds is *temporary* to work around
+ # the fact that the desugarer in 3.0{2.3} does generate
+ # bindings with identical ids, and the type checker doesn't perform
+ # properly cloned type substitutions. Instead, we make sure that all
+ # binders are cloned first time through the simplifier.
+ #
+ # Will be properly fixed in the `new compiler` I hear, at which point
+ # the cloning can be turned off here.
+ '-fclone-binds',
+
$Oopt_MaxSimplifierIterations,
$Oopt_ShowSimplifierProgress,
']',
# '-fessential-unfoldings-only',
# '-fsimpl-uf-use-threshold0',
+ # See remark re: cloning in defn of minusnotO
+ '-fclone-binds',
+
'-fmax-simplifier-iterations1',
$Oopt_PedanticBottoms,
']',
'-freuse-con',
$Oopt_PedanticBottoms,
$Oopt_MonadEtaExpansion,
- $Oopt_UnfoldingUseThreshold,
$Oopt_MaxSimplifierIterations,
$Oopt_ShowSimplifierProgress,
+ #
+ # The presence of -fclone-binds is *crucial* here as
+ # -ffull-laziness (which we're about to do next) floats
+ # bindings outwards, so we better make sure that this
+ # doesn't result in the floating out of bindings
+ # with identical uniques, i.e., -ffull-laziness needs
+ # to be preceeded by a simplifier pass with -fclone-binds
+ # set.
+ '-fclone-binds',
']',
#LATER: '-fcalc-inlinings1', -- pointless for 2.01
# '-freuse-con',
# $Oopt_PedanticBottoms,
# $Oopt_MonadEtaExpansion,
-# $Oopt_UnfoldingUseThreshold,
# $Oopt_MaxSimplifierIterations,
# $Oopt_ShowSimplifierProgress,
# ']',
'-freuse-con',
$Oopt_PedanticBottoms,
$Oopt_MonadEtaExpansion,
- $Oopt_UnfoldingUseThreshold,
$Oopt_MaxSimplifierIterations,
$Oopt_ShowSimplifierProgress,
']',
# but do reductions if you see them!
$Oopt_PedanticBottoms,
$Oopt_MonadEtaExpansion,
- $Oopt_UnfoldingUseThreshold,
$Oopt_MaxSimplifierIterations,
$Oopt_ShowSimplifierProgress,
']',
'-flet-to-case', # Aha! Only done after strictness analysis
$Oopt_PedanticBottoms,
$Oopt_MonadEtaExpansion,
- $Oopt_UnfoldingUseThreshold,
$Oopt_MaxSimplifierIterations,
$Oopt_ShowSimplifierProgress,
']',
# ( ($OptLevel != 2)
# ? ''
-# : "-fliberate-case -fsimplify [ $Oopt_FB_Support -ffloat-lets-exposing-whnf -ffloat-primops-ok -fcase-of-case -fdo-case-elim -fcase-merge -fdo-eta-reduction -fdo-lambda-eta-expansion -freuse-con -flet-to-case $Oopt_PedanticBottoms $Oopt_MonadEtaExpansion $Oopt_UnfoldingUseThreshold $Oopt_MaxSimplifierIterations $Oopt_ShowSimplifierProgress ]" ),
+# : "-fliberate-case -fsimplify [ $Oopt_FB_Support -ffloat-lets-exposing-whnf -ffloat-primops-ok -fcase-of-case -fdo-case-elim -fcase-merge -fdo-eta-reduction -fdo-lambda-eta-expansion -freuse-con -flet-to-case $Oopt_PedanticBottoms $Oopt_MonadEtaExpansion $Oopt_MaxSimplifierIterations $Oopt_ShowSimplifierProgress ]" ),
# Final clean-up simplification:
# but still do reductions if you see them!
$Oopt_PedanticBottoms,
$Oopt_MonadEtaExpansion,
- $Oopt_UnfoldingUseThreshold,
$Oopt_MaxSimplifierIterations,
$Oopt_ShowSimplifierProgress,
']',
#LATER: '-fcalc-inlinings2', -- pointless for 2.01
# stg2stg passes
- '-fupdate-analysis',
'-flambda-lift',
$Oopt_FinalStgProfilingMassage,
$Oopt_StgStats,
# SPECIAL FLAGS for -O2
($OptLevel == 2) ? (
+ '-fupdate-analysis', # virtually useless; relegated to -O2
'-fsemi-tagging',
) : (),
);
$Oopt_FinalStgProfilingMassage = '-fmassage-stg-for-profiling';
+ # Ignore user sccs when auto annotating, but warn when doing so.
+ $PROFignore_scc = '-W' if $PROFauto;
+
push(@HsP_flags, (($PROFignore_scc) ? $PROFignore_scc : '-S'));
if ( $SplitObjFiles ) {
Tell the world who we are, if they asked.
\begin{code}
-print STDERR "${PROJECTNAME}, version ${PROJECTVERSION}, patchlevel ${PROJECTPATCHLEVEL}\n"
+print STDERR "${ProjectName}, version ${ProjectVersion}, patchlevel ${ProjectPatchLevel}\n"
if $Verbose;
\end{code}
# for a linker, use an explicitly given one, or the going C compiler ...
local($lnkr) = ( $Lnkr ) ? $Lnkr : $CcRegd;
+ if ( ($Specific_output_file eq '') &&
+ ($TargetPlatform eq 'i386-unknown-cygwin32') ) {
+ $Specific_output_file = 'main.exe';
+ print STDERR "Output file not specified, defaulting to \"main.exe\"\n";
+ }
+
local($output) = ($Specific_output_file ne '') ? "-o $Specific_output_file" : '';
- @Files_to_tidy = ($Specific_output_file ne '') ? $Specific_output_file : 'a.out';
+ @Files_to_tidy = ($Specific_output_file ne '') ? $Specific_output_file : 'a.out';
local($to_do) = "$lnkr $Verbose @Ld_flags $output @Link_file $TopClosureFile $libdirs @UserLibrary @SysLibrary";
&run_something($to_do, 'Linker');
if \$running_under_some_shell;
# =!=!=!=!=!=!=!=!=!=!=!
# This script is automatically generated: DO NOT EDIT!!!
-# Generated by Glasgow Haskell, version ${PROJECTVERSION} ${PROJECTPATCHLEVEL}
+# Generated by Glasgow Haskell, version ${ProjectVersion} ${ProjectPatchLevel}
#
\$pvm_executable = '$pvm_executable';
\$pvm_executable_base = '$pvm_executable_base';
#ToDo: local($or_isuf) = ($Isuffix eq '') ? '' : "|$Isuffix";
- if ( $ifile !~ /\.(lhs|hs|hc|c|s)$/ && $ifile !~ /_hc$/ ) {
- print STDERR "$Pgm: don't recognise suffix on `$ifile'; passing it through to linker\n"
- if $ifile !~ /\.a$/;
+ if ( $ifile !~ /\.(lhs|hs|hc|c|s|a)$/ && $ifile !~ /_hc$/ ) {
+ # There's sometimes confusion regarding .hi files; users
+ # supplying them on the command line.
+ if ( $ifile =~ /\.hi$/ ) {
+ print STDERR "$Pgm: warning: found `$ifile' on command line; interface files should not be supplied here - ignoring it.\n";
+ } else {
+ print STDERR "$Pgm: don't recognise suffix on `$ifile'; passing it through to linker\n";
+ }
# oops; we tentatively pushed the wrong thing; fix & do the right thing
pop(@Link_file); push(@Link_file, $ifile);
}
&run_something($to_do, 'Ineffective C pre-processor');
} else {
local($includes) = '-I' . join(' -I',@Include_dir);
- $to_do .= "$HsCpp $Verbose $genSPECS_flag @HsCpp_flags -D__HASKELL1__=$Haskell1Version -D__GLASGOW_HASKELL__=$GhcVersionInfo $includes $lit2pgm_hscpp >> $hscpp_hsc";
+ $to_do .= "$HsCpp $Verbose @HsCpp_flags -D__HASKELL1__=$Haskell1Version -D__GLASGOW_HASKELL__=$GhcVersionInfo $includes $lit2pgm_hscpp >> $hscpp_hsc";
push(@Files_to_tidy, $hscpp_hsc );
&run_something($to_do, 'Haskellised C pre-processor');
}
}
local($to_do);
- $to_do = "$HsC @HsP_flags ,$hscpp_hsc $dump @HsC_flags $CoreLint $StgLint $Verbose $output +RTS @HsC_rts_flags";
+ # Win32 only: If the command processor used by system()
+ # exec()s the application as an ordinary Win32 executable,
+ # we're in trouble here, since the command line is likely
+ # to be > 255 chars long. To work around this situation,
+ # $HsC also understands `at-files', i.e., `@file' on the
+ # command line will cause $HsC to add the contents of `file'
+ # to the command line.
+ #
+ # [ Note: support for `at-files' is not compiled in by default ]
+ $cmd_line_opts_via_at_file=0;
+ if ($cmd_line_opts_via_at_file) {
+ local($to_do_opts) = "$Tmp_prefix.opts";
+ open(OPTS, "> $Tmp_prefix.opts") || &tidy_up_and_die(1,"Can't open $Tmp_prefix.opts\n");
+ print OPTS "$dump @HsC_flags $CoreLint $StgLint $Verbose";
+ close(OPTS);
+ $to_do = "$HsC @HsP_flags ,$hscpp_hsc \@$Tmp_prefix.opts $output +RTS @HsC_rts_flags";
+ } else {
+ $to_do = "$HsC @HsP_flags ,$hscpp_hsc $dump @HsC_flags $CoreLint $StgLint $Verbose $output +RTS @HsC_rts_flags";
+ }
&run_something($to_do, 'Haskell compiler');
# finish business w/ nofibbish time/bytes-alloc stats
# heave in the consistency info
print TMP "static char ghc_cc_ID[] = \"\@(#)cc $ifile\t$Cc_major_version.$Cc_minor_version,$Cc_consist_options\";\n";
- # and #include the real source
print TMP "#include \"$hsc_out\"\n";
close(TMP) || &tidy_up_and_die(1,"Failed writing to $cc_help\n");
if ($Using_dump_file) {
print STDERR "Compilation Errors dumped in $Specific_dump_file\n";
}
-
&tidy_up_and_die($return_val, '');
}
$Using_dump_file = 0;
}
\end{code}
+\begin{code}
+sub add_syslib {
+ local($syslib) = @_;
+
+ # The Win32 lib sources live in hslibs/
+ if ( $syslib eq 'win32' && ! $INSTALLING ) {
+ unshift(@SysImport_dir, "$TopPwd/hslibs/$syslib/src");
+ push(@SysLibrary_dir, "$TopPwd/hslibs/$syslib/src");
+ } else {
+ unshift(@SysImport_dir,
+ $INSTALLING ? "$InstLibDirGhc/imports/$syslib"
+ : "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/$syslib");
+
+ push(@SysLibrary_dir,
+ $INSTALLING ? ("$InstLibDirGhc")
+ : ("$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/$syslib",
+ "$TopPwd/$CURRENT_DIR/$GHC_LIB_DIR/$syslib/cbits"));
+ }
+ push(@SysLibrary, "-lHS$syslib");
+ push(@SysLibrary, "-lHS${syslib}_cbits")
+ unless $syslib =~ /^(contrib|exts|concurrent|win32)$/; #HACK! have no cbits
+}
+\end{code}
+
Source files may have {-# OPTIONS ... #-} pragmas at the top, containing
command line options we want to append to collection of commands specified
directly. @check_for_source_options@ looks at the top of a de-lit'ified Haskell
if (/^-\?$/ || /^--?help$/) { print $LongUsage; exit $Status; }
#-----------version ----------------------------------------------------
- /^--version$/ && do { print STDERR "${PROJECTNAME}, version ${PROJECTVERSION}, patchlevel ${PROJECTPATCHLEVEL}\n"; exit $Status; };
+ /^--version$/ && do { print STDERR "${ProjectName}, version ${ProjectVersion}, patchlevel ${ProjectPatchLevel}\n"; exit $Status; };
#---------- verbosity and such -----------------------------------------
/^-v$/ && do { $Verbose = '-v'; $Time = 'time'; next arg; };
next arg; };
# leave out actual C generation (debugging) [also turns off interface gen]
- /^-hi$/ && do { $HiOnStdout = 1; $ProduceHi = '-hifile='; next arg; };
+
+ /^-hi$/ && do { $HiOnStdout = 1; $ProduceHi = '-hifile='; next arg; };
# _do_ generate an interface; usually used as: -noC -hi
+ /^-hi-with-(.*)$/ && do { $HiOnStdout = 1; $HiWith .= " $1" ; $ProduceHi = '-hifile='; next arg; };
+ # limit ourselves to outputting a particular section.
/^-nohi$/ && do { $ProduceHi = '-nohifile='; next arg; };
# don't generate an interface (even if generating C)
#--------- ticky/concurrent/parallel -----------------------------------
# we sort out the details a bit later on
- /^-concurrent$/ && do { $CONCURing = 'c'; next arg; }; # concurrent Haskell
- /^-gransim$/ && do { $GRANing = 'g'; next arg; }; # GranSim
+ /^-concurrent$/ && do { $CONCURing = 'c'; &add_syslib('concurrent'); next arg; };
+ # concurrent Haskell; implies -syslib conc
+ /^-gransim$/ && do { $GRANing = 'g'; &add_syslib('concurrent'); next arg; }; # GranSim
/^-ticky$/ && do { $TICKYing = 't'; next arg; }; # ticky-ticky
- /^-parallel$/ && do { $PARing = 'p'; next arg; }; # parallel Haskell
+ /^-parallel$/ && do { $PARing = 'p'; &add_syslib('concurrent'); next arg; }; # parallel Haskell
#-------------- "user ways" --------------------------------------------
/^-syslib(.*)/ && do { local($syslib) = &grab_arg_arg(*Args,'-syslib',$1);
print STDERR "$Pgm: no such system library (-syslib): $syslib\n",
- $Status++ unless $syslib =~ /^(hbc|ghc|posix|contrib)$/;
+ $Status++ unless $syslib =~ /^(exts|misc|posix|concurrent|win32)$/;
- again:
#
# The posix library is a `special' in that it relies on
# the ghc system library (packed strings). Wielding our
# the ghc system library as well.
# (ToDo: `nub' -syslib list)
#
- unshift(@SysImport_dir,
- ${INSTALLING}
- ? "$InstSysLibDir/$syslib/imports"
- : "$TopPwd/hslibs/$syslib/src");
-
- push(@SysLibrary_dir,
- ${INSTALLING}
- ? ("$InstSysLibDir")
- : ("$TopPwd/hslibs/$syslib"
- ,"$TopPwd/hslibs/$syslib/cbits"));
-
- push(@SysLibrary, "-lHS$syslib");
- push(@SysLibrary, "-lHS${syslib}_cbits")
- unless $syslib eq 'contrib'; #HACK! it has no cbits
-
- if ( $syslib eq 'posiz') {
- $syslib='ghc';
- goto again;
+ &add_syslib($syslib);
+ if ( $syslib eq 'posix' ) {
+ &add_syslib('misc');
+ } elsif ( $syslib eq 'misc' &&
+ $TargetPlatform =~ /-solaris2$/ ) {
+ # needed for Berkeley socket/nwork stuff.
+ push(@SysLibrary, '-lnsl -lsocket');
+ } elsif ( $syslib eq 'win32' &&
+ $TargetPlatform =~ /-cygwin32$/ ) {
+ # need to get at UI/Graphics functionality.
+ push(@SysLibrary, '-luser32 -lgdi32');
}
next arg; };
/^-optP(.*)$/ && do { push(@HsCpp_flags, $1); next arg; };
/^-optCrts(.*)$/&& do { push(@HsC_rts_flags, $1); next arg; };
/^-optC(.*)$/ && do { push(@HsC_flags, $1); next arg; };
+ /^-optp(.*)$/ && do { push(@HsP_flags, $1); next arg; };
/^-optcpp(.*)$/ && do { push(@Cpp_define, $1); $Only_preprocess_hc = ($1 eq "-E"); next arg; };
/^-optc(.*)$/ && do { push(@CcBoth_flags, $1); next arg; };
/^-opta(.*)$/ && do { push(@As_flags, $1); next arg; };
/^-D(.*)/ && do { push(@HsCpp_flags, "'-D".&grab_arg_arg(*Args,'-D',$1)."'"); next arg; };
/^-U(.*)/ && do { push(@HsCpp_flags, "'-U".&grab_arg_arg(*Args,'-U',$1)."'"); next arg; };
- /^-genSPECS/ && do { $Cpp_flag_set = 1;
- $genSPECS_flag = $_;
- next arg; };
-
#---------- post-Haskell "assembler"------------------------------------
/^-ddump-raw-asm$/ && do { $Dump_raw_asm = 1; next arg; };
/^-ddump-asm-splitting-info$/ && do { $Dump_asm_splitting_info = 1; next arg; };
}
next arg; };
+ /^-fallow-overlapping-instances$/ && do { push(@HsC_flags, $_);
+ next arg; };
/^-fglasgow-exts$/
&& do { push(@HsC_flags, $_);
push(@HsP_flags, '-N');
# push(@HsC_flags, '-fshow-import-specs');
+
+ # -fglasgow-exts implies -syslib exts
+ &add_syslib('exts');
next arg; };
# ---------------
- /^(-funfolding-use-threshold)(.*)$/
- && do { $Oopt_UnfoldingUseThreshold = $1 . &grab_arg_arg(*Args,$1, $2);
- next arg; };
+ /^-funfolding-.*$/
+ && do { push(@HsC_flags, $_); next arg };
+
+ /^-funfold-casms-in-hi-file$/
+ && do { push(@HsC_flags, $_); next arg };
/^(-fmax-simplifier-iterations)(.*)$/
&& do { $Oopt_MaxSimplifierIterations = $1 . &grab_arg_arg(*Args,$1, $2);
/^-fshow-import-specs/
&& do { push(@HsC_flags, $_); next arg; };
- /^-fwarn-(.*)$/ && do { push(@HsC_flags, $_); next arg; };
+ /^-fsignatures-required/
+ && do { push(@HsC_flags, $_); next arg; };
+
+ /^-fwarn-(.*)$/ && do { push(@HsC_flags, $_); next arg; };
/^-fno-(.*)$/ && do { push(@HsC_antiflags, "-f$1");
&squashHscFlag("-f$1");
/^-W$/ && do { push(@HsC_flags, @MinusWOpts); next arg; };
/^-Wall$/ && do { push(@HsC_flags, @MinusWallOpts); next arg; };
- /^-Wnot$/ && do { foreach (@Hsc_flags) {
+ /^(-Wnot|w)$/ && do { foreach (@Hsc_flags) {
/^-fwarn-(.*)$/ && do { $_=''; };
};
push(@HsC_antiflags, @StandardWarnings);