Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
GHC
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Gesh
GHC
Commits
b26d48dd
Commit
b26d48dd
authored
28 years ago
by
sof
Browse files
Options
Downloads
Patches
Plain Diff
[project @ 1997-03-13 09:15:06 by sof]
removed use of MODULES file plus new Makefile setup
parent
1e56d346
Loading
Loading
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
ghc/utils/mkdependHS/Makefile
+54
-6
54 additions, 6 deletions
ghc/utils/mkdependHS/Makefile
ghc/utils/mkdependHS/mkdependHS.prl
+83
-95
83 additions, 95 deletions
ghc/utils/mkdependHS/mkdependHS.prl
with
137 additions
and
101 deletions
ghc/utils/mkdependHS/Makefile
+
54
−
6
View file @
b26d48dd
TOP
=
../../..
include
$(TOP)/ghc/mk/ghc.mk
TOP
=
../..
include
$(TOP)/mk/boilerplate.mk
INSTALLING
=
0
WAYS
=
boot
::
all
SCRIPT_PROG
=
mkdependHS
SCRIPT_OBJS
=
mkdependHS.prl
SCRIPT_SUBST_VARS
=
\
RAWCPP TMPDIR UNLIT_PROG
\
TOP_PWD
\
INSTALL_LIB_DIR INSTALL_DATA_DIR
\
INSTALL_HSLIBS_DIR INSTALLING
\
PRELUDE_DIRS
\
PROJECTVERSION SED
PROG
=
mkdependHS
SRC
=
mkdependHS.prl
INTERP
=
$(
PERL
)
DESTDIR
=
$(
INSTBINDIR_GHC
)
#
# install setup
#
INSTALL_PROGS
+=
$(
SCRIPT_PROG
)
INSTALL_HSLIBS_DIR
:=
$(
libdir
)
/../hslibs-
$(
ProjectVersion
)
INSTALL_LIB_DIR
:=
$(
libdir
)
INSTALL_DATA_DIR
:=
$(
datadir
)
ifeq
"$(INSTALLING)" "1"
TOP_PWD
:=
$(
prefix
)
UNLIT_PROG
:=
$(
libexecdir
)
/unlit
PRELUDE_DIRS
:=
$(
libdir
)
/imports
else
TOP_PWD
:=
$(
FPTOOLS_TOP_ABS
)
UNLIT_PROG
:=
$(
FPTOOLS_TOP_ABS
)
/ghc/utils/unlit/unlit
PRELUDE_DIRS
:=
"
$(
FPTOOLS_TOP_ABS
)
/ghc/lib/ghc:
$(
FPTOOLS_TOP_ABS
)
/ghc/lib/required:
$(
FPTOOLS_TOP_ABS
)
/ghc/lib/glaExts:
$(
FPTOOLS_TOP_ABS
)
/ghc/lib/concurrent"
endif
#
# Before really installing the script, we have to
# reconfigure it such that the paths it refers to,
# point to the installed utils.
#
install
::
$(
RM
)
$(
SCRIPT_PROG
)
$(
MAKE
)
$(
MFLAGS
)
INSTALLING
=
1
$(
SCRIPT_PROG
)
CLEAN_FILES
+=
$(
SCRIPT_PROG
)
include
$(TOP)/mk/target.mk
include
$(TOP)/mk/script.mk
# Hack to re-create the in-situ build tree script after
# having just installed it.
#
install
::
@$(
RM
)
$(
SCRIPT_PROG
)
@$(
MAKE
)
$(
MFLAGS
)
$(
SCRIPT_PROG
)
This diff is collapsed.
Click to expand it.
ghc/utils/mkdependHS/mkdependHS.prl
+
83
−
95
View file @
b26d48dd
# *** MSUB does some substitutions here ***
# *** grep for $( ***
#
#
tries to work like mkd
epend
C
#
perl script expect the following variables to be pr
epend
ed:
#
# RAWCPP TMPDIR TOP_PWD
# INSTALL_LIB_DIR INSTALL_DATA_DIR INSTALL_HSLIBS_DIR INSTALLING
# PROJECTVERSION SED
#
# tries to work like mkdependC - capable of dealing with:
#
# -literate Haskell code (Bird tracks or Glasgow literate style) (.lhs)
# -straight Haskell source (.hs)
# -literate or straight Happy specs (.ly)
#
# ToDo: strip out all the .h junk
#
($Pgm = $0) =~ s/.*\/([^\/]+)$/\1/;
...
...
@@ -54,7 +62,7 @@ $Dashdashes_seen = 0;
# Try to guess how to run gcc's CPP directly -------------
$OrigCpp =
'$(
RAWCPP
)'
;
$OrigCpp =
${
RAWCPP
}
;
if ( $OrigCpp !~ /(\S+)\s+(.*)/ ) {
$Cpp = $OrigCpp;
} else {
...
...
@@ -75,8 +83,8 @@ if ( $OrigCpp !~ /(\S+)\s+(.*)/ ) {
if ( $ENV{'TMPDIR'} ) { # where to make tmp file names
$Tmp_prefix = $ENV{'TMPDIR'} . "/mkdependHS$$";
} else {
$Tmp_prefix ="$
(
TMPDIR
)
/mkdependHS$$";
$ENV{'TMPDIR'} =
'$(
TMPDIR
)'
; # set the env var as well
$Tmp_prefix ="$
{
TMPDIR
}
/mkdependHS$$";
$ENV{'TMPDIR'} =
"${
TMPDIR
}"
; # set the env var as well
}
#------------------------------------------------------------------------
...
...
@@ -87,40 +95,47 @@ if ( $ENV{'TMPDIR'} ) { # where to make tmp file names
# $ENV{'GLASGOW_HASKELL_ROOT'} = '/some/absolute/path/name';
if (! $ENV{'GLASGOW_HASKELL_ROOT'}) { # good -- death to environment variables
$TopPwd =
'$(
TOP_PWD
)'
;
$InstLibDirGhc =
'$(
INSTLIBDIR
_GHC)'
;
$InstDataDirGhc =
'$(
INSTDATADIR
_GHC)'
;
$TopPwd =
${
TOP_PWD
}
;
$InstLibDirGhc =
${
INST
ALL_
LIB
_
DIR
}
;
$InstDataDirGhc =
${
INST
ALL_
DATA
_
DIR
}
;
} else {
$TopPwd = $ENV{'GLASGOW_HASKELL_ROOT'};
if (
'$(
INSTLIBDIR
_GHC)'
=~ /.*(\/lib\/ghc\/\d\.\d\d\/[^-]-[^-]-[^-]\/.*)/) {
if (
${
INST
ALL_
LIB
_
DIR
}
=~ /.*(\/lib\/ghc\/\d\.\d\d\/[^-]
+
-[^-]
+
-[^-]
+
\/.*)/) {
$InstLibDirGhc = $ENV{'GLASGOW_HASKELL_ROOT'} . $1;
} else {
print STDERR "GLASGOW_HASKELL_ROOT environment variable is set;\nBut can't untangle $
(
INSTLIBDIR
_GHC)
.\n(Installation error)\n";
print STDERR "GLASGOW_HASKELL_ROOT environment variable is set;\nBut can't untangle $
{
INST
ALL_
LIB
_
DIR
}
.\n(Installation error)\n";
exit(1);
}
if (
'$(
INSTDATADIR
_GHC)'
=~ /.*(\/lib\/ghc\/\d\.\d\d\/.*)/) {
if (
${
INST
AL_
DATA
_
DIR
}
=~ /.*(\/lib\/ghc\/\d\.\d\d\/.*)/) {
$InstDataDirGhc = $ENV{'GLASGOW_HASKELL_ROOT'} . $2;
} else {
print STDERR "GLASGOW_HASKELL_ROOT environment variable is set;\nBut can't untangle $
(
INSTDATADIR
_GHC)
.\n(Installation error)\n";
print STDERR "GLASGOW_HASKELL_ROOT environment variable is set;\nBut can't untangle $
{
INST
ALL_
DATA
_
DIR
}
.\n(Installation error)\n";
exit(1);
}
}
$Unlit = ( $(INSTALLING) ) ? "$InstLibDirGhc/unlit"
: "$TopPwd/ghc/utils/unlit/unlit";
$Unlit = ${UNLIT_PROG};
$Begin_magic_str = "# DO NOT DELETE: Beginning of Haskell dependencies\n";
$End_magic_str = "# DO NOT DELETE: End of Haskell dependencies\n";
$Obj_suffix = 'o';
$ghc_version_info = int ( $
(
PROJECTVERSION
)
* 100 );
$ghc_version_info = int ( $
{
PROJECTVERSION
}
* 100 );
$Import_dirs = '.';
%Syslibs = ();
%LibIfaces = (); # known prelude/syslib ifaces; read from a file
%Ignore_dirs = (); # directories to considered stable.
%IgnoreMe = ();
# directories to considered stable.
@Ignore_dirs = split(/:/,${PRELUDE_DIRS});
# ($INSTALLING) ? ("$InstLibDirGhc/imports")
# : ("$TopPwd/ghc/lib/ghc",
# "$TopPwd/ghc/lib/required",
# "$TopPwd/ghc/lib/glaExts",
# "$TopPwd/ghc/lib/concurrent");
$Haskell_1 = 3; # assume Haskell 1.3. Changed by -fhaskell-1.?
$Include_dirs = '-I.';
...
...
@@ -129,12 +144,13 @@ $Makefile = '';
&mangle_command_line_args();
# load up LibIfaces tables:
&read_MODULES('prelude', 'prelude');
# set up array of ignored modules
foreach $lib ( @Syslibs ) {
&read_MODULES('syslib', $lib);
local($dir) =
($INSTALLING) ? "${INSTALL_HSLIBS_DIR}/${lib}/imports"
: "$TopPwd/hslibs/${lib}/src";
push(@Ignore_dirs,$dir);
}
#print STDERR "libs provide:",(keys %LibIfaces),"\n";
if ( $Status ) {
print stderr $Usage;
...
...
@@ -171,15 +187,15 @@ foreach $sf (@Src_files) {
# a de-commenter (not implemented);
# builds up @Depend_lines
print STDERR "Here we go for source file: $sf\n" if $Verbose;
($bf = $sf) =~ s/\.l?hs$//;
($bf = $sf) =~ s/\.l?
(
hs
|y)
$//;
#push(@Depend_lines, "$bf.$Obj_suffix $bf.hi : $sf\n");
push(@Depend_lines, "$bf.$Obj_suffix : $sf\n");
foreach $suff (@File_suffix) {
push(@Depend_lines, "$bf.${suff}_$Obj_suffix : $sf\n");
}
# if it's a literate file, .lhs, then we de-literatize it:
if ( $sf !~ /\.lhs$/ ) {
# if it's a literate file, .lhs
or .ly? (happy specs)
, then we de-literatize it:
if ( $sf !~ /\.l
(
hs
|y)
$/ ) {
$file_to_read = $sf;
} else {
$file_to_read = "$Tmp_prefix.hs";
...
...
@@ -188,14 +204,22 @@ foreach $sf (@Src_files) {
}
&slurp_file_for_imports($file_to_read, $sf);
if ( $sf =~ /\.lhs$/ ) {
if ( $sf =~ /\.l
(
hs
|y)
$/ ) {
unlink "$Tmp_prefix.hs";
}
}
# OK, mangle the Makefile
unlink("$Makefile.bak");
rename($Makefile,"$Makefile.bak");
#
# If no output file exist as yet, create one.
#
if ( ! -f $Makefile.bak ) {
system("touch $Makefile.bak");
} else {
rename($Makefile,"$Makefile.bak");
}
# now copy Makefile.bak into Makefile, rm'ing old dependencies
# and adding the new
open(OMKF,"< $Makefile.bak") || die "$Pgm: can't open $Makefile.bak: $!\n";
...
...
@@ -252,7 +276,7 @@ sub mangle_command_line_args {
$IgnoreMe{$thing} = 'y';
} elsif ( /^-(X|-exclude-directory=)(.*)/ ) {
foreach $d ( split(/:/,&grab_arg_arg($1, $2)) ) {
$
Ignore_dirs
{$d} =
"$d";
push(@
Ignore_dirs
,
"$d"
)
;
}
} elsif ( /^--include-module=(.*)/ ) {
local($thing) = &grab_arg_arg($1,$2);
...
...
@@ -274,31 +298,6 @@ sub mangle_command_line_args {
@File_suffix = sort (@File_suffix);
}
sub read_MODULES {
local($flavor,$lib) = @_;
local($m_dir) = '';
if ($flavor eq 'prelude') {
$m_dir = ( $(INSTALLING) ) ? "$InstDataDirGhc/imports" : "$TopPwd/ghc/lib";
} else {
$m_dir = ( $(INSTALLING) ) ? "$InstSysLibDir/$lib" : "$TopPwd/hslibs/$lib";
}
local($m_file) = "$m_dir/MODULES";
open(MFILE, "< $m_file") || die "$Pgm: can't open $m_file to read\n";
while (<MFILE>) {
chop;
# strip comments and leading/trailing whitespace
s/#.*//;
s/^\s+//;
s/\s+$//;
next if /^$/; # nothing left!
$LibIfaces{"$lib:$_"} = 1; # record that this library provides this iface
}
close(MFILE);
}
sub grab_arg_arg {
local($option, $rest_of_arg) = @_;
...
...
@@ -322,8 +321,8 @@ sub preprocess_import_dirs {
foreach $d ( @Import_dirs ) {
# Check to see if it can be ignored
print STDERR "Ignore imports from $d\n" if $Verbose && $Ignore_dirs{$d};
next if $Ignore_dirs{$d};
#
print STDERR "Ignore imports from $d\n" if $Verbose && $Ignore_dirs{$d};
#
next if $Ignore_dirs{$d};
opendir(DIR, $d) || die "$Pgm: can't open directory $d\n";
...
...
@@ -339,14 +338,14 @@ sub preprocess_import_dirs {
closedir(DIR); # No, don't check the error code
}
# Add all the modules
found in the ignorable directories
# Add all the modules
# to the IgnoreMe array before we start scanning for imports.
foreach $d (
keys %
Ignore_dirs) {
foreach $d (
@
Ignore_dirs) {
opendir(DIR, $d) || die "$Pgm: can't open directory $d\n";
for ($_ = readdir(DIR); $_; $_ = readdir(DIR)) {
next unless /(.*)\.(hi|l?hs)$/;
next unless /(.*)\.(hi|l?hs
|l?y
)$/;
#don't tag it twice or overwrite it with a diff. value
next if $IgnoreMe{$1};
print STDERR "Module $d/$1.$2 will be ignored\n" if $Verbose;
...
...
@@ -368,44 +367,33 @@ sub slurp_file_for_imports {
# we mangle #include's so they will also leave something
# behind to indicate the dependency on _them_
# Worth our while to relativise the path or
# assume it is there in the first place? -- SOF
#
print STDERR "/usr/bin/sed -e '/^# *include/{p;s/^# *include/!include/;};s/'\\''//g;s/\"//g' $file_to_read | $Cpp $Include_dirs -I$last_seen_dir @Defines |\n" if $Verbose;
print STDERR "${SED} -e '/^# *include/{p;s/^# *include/!include/;};s/'\\''//g;s/\"//g' $file_to_read | $Cpp $Include_dirs -I$last_seen_dir @Defines |\n" if $Verbose;
open(SRCFILE, "
/usr/bin/sed
-e '/^# *include/{p;s/^# *include/!include/;};s/'\\''//g;s/\"//g' $file_to_read | $Cpp $Include_dirs -I$last_seen_dir @Defines |")
open(SRCFILE, "
${SED}
-e '/^# *include/{p;s/^# *include/!include/;};s/'\\''//g;s/\"//g' $file_to_read | $Cpp $Include_dirs -I$last_seen_dir @Defines |")
|| die "$Pgm: Can't open $file_to_read: $!\n";
while (<SRCFILE>) {
#
# i
n
port {-# SOURCE #-} Foo (bar) generates dependencies on the source file only,
# i
m
port {-# SOURCE #-} Foo (bar) generates dependencies on the source file only,
# the compiler will deal with the absence of Foo.hi by consulting the
# source for Foo directly.
#
# >? import qualified ModuleName | !include "foo"
#
# source for Foo directly. (for dealing with recursive modules).
#
next unless (/^>?\s*(import)(\s+{-#\s*SOURCE\s*#-})?(\s+qualified)?\s+([A-Z][A-Za-z0-9_']*)/ || /^!(include)(\s+)"(\S+)"/);
$todo = $1;
$source = ( $2 ne '') ? 1 : 0;
$modname = $4;
next if $modname eq '';
if ($todo eq 'import') {
if ( $IgnoreMe{$modname} eq 'y' ) {
$follow_file = '__ignore__';
} elsif ( $ModuleIn{$modname} ) {
if ( $ModuleIn{$modname} ) {
$follow_file = "$ModuleIn{$modname}/$modname.hi";
} else { # hard way
$follow_file
= &find_in_Import_dirs($orig_src_file, $modname, $last_seen_dir );
}
} else {
if ( $IgnoreMe{$modname} eq 'y' ) {
$follow_file = '__ignore__';
} else {
$follow_file
= &find_in_Include_dirs($orig_src_file, $modname, $last_seen_dir);
}
}
if (! $follow_file) { # it didnae find anything
...
...
@@ -416,7 +404,7 @@ sub slurp_file_for_imports {
local($int_file);
$int_file = $follow_file;
if ( $int_file !~ /\.(l?hs|hi)$/ ) {
if ( $int_file !~ /\.(l?hs|hi
|l?y
)$/ ) {
push(@Depend_lines, "$bf.$Obj_suffix : $int_file\n");
foreach $suff (@File_suffix) {
push(@Depend_lines, "$bf.${suff}_$Obj_suffix : $int_file\n");
...
...
@@ -424,6 +412,7 @@ sub slurp_file_for_imports {
} else {
$int_file =~ s/\.l?hs$//;
$int_file =~ s/\.l?y$//;
$int_file =~ s/\.hi$//;
local($source_dep);
...
...
@@ -433,9 +422,12 @@ sub slurp_file_for_imports {
} elsif ( $source && -f "$int_file.lhs" ) {
$source_dep = "$int_file.lhs";
push(@Depend_lines, "$bf.$Obj_suffix : $source_dep\n");
} elsif ( $source && ( -f "$int_file.ly" || -f "$int_file.y" ) ) {
$source_dep = "$int_file.hs";
push(@Depend_lines, "$bf.$Obj_suffix : $source_dep\n");
} else {
if ( $source ) {
print STDERR "Warning: could not find source file dependency $int_file.(hs|lhs)\n";
print STDERR "Warning: could not find source file dependency $int_file.(hs|lhs
|y|ly
)\n";
}
push(@Depend_lines, "$bf.$Obj_suffix : $int_file.hi\n");
}
...
...
@@ -486,13 +478,11 @@ sub find_in_Import_dirs {
}
}
$name_to_check = "$import_dir/$modname.hs";
print STDERR "trying... $name_to_check\n" if $Verbose >= 2; # very verbose
return($name_to_check) if -f $name_to_check;
$name_to_check = "$import_dir/$modname.lhs";
print STDERR "trying... $name_to_check\n" if $Verbose >= 2; # very verbose
return($name_to_check) if -f $name_to_check;
for $suff ('hs', 'lhs', 'ly', 'y') {
$name_to_check = "$import_dir/$modname.$suff";
print STDERR "trying... $name_to_check\n" if $Verbose >= 2; # very verbose
return($name_to_check) if -f $name_to_check;
}
}
if ($do_magical_check == 1) {
$name_to_check = "$last_seen_dir/$modname.hi";
...
...
@@ -508,24 +498,22 @@ sub find_in_Import_dirs {
}
}
$name_to_check = "$last_seen_dir/$modname.lhs";
print STDERR "trying... $name_to_check\n" if $Verbose >= 2; # very verbose
return($name_to_check) if -f $name_to_check;
$name_to_check = "$last_seen_dir/$modname.hs";
print STDERR "trying... $name_to_check\n" if $Verbose >= 2; # very verbose
return($name_to_check) if -f $name_to_check;
for $suff ('lhs', 'hs', 'ly', 'y') {
$name_to_check = "$last_seen_dir/$modname.$suff";
print STDERR "trying... $name_to_check\n" if $Verbose >= 2; # very verbose
return($name_to_check) if -f $name_to_check;
}
}
# OK, maybe it's referring to something in a system library
foreach $lib ( @Syslibs ) {
return('__ignore__') if $LibIfaces{"$lib:$modname"};
}
#
foreach $lib ( @Syslibs ) {
#
return('__ignore__') if $LibIfaces{"$lib:$modname"};
#
}
# Last hope: referring to a Prelude interface
return('__ignore__') if
$LibIfaces{"prelude:$modname"}
;
return('__ignore__') if
( $IgnoreMe{$modname} eq 'y' )
;
die "No file `$modname.hi', `$modname.lhs'
or
`$modname.hs' (reqd from file `$orig_src_file')\namong import directories:\n\t$Import_dirs\n";
die "No file `$modname.hi', `$modname.lhs'
,
`$modname.hs' (reqd from file `$orig_src_file')\namong import directories:\n\t$Import_dirs\n";
}
sub find_in_Include_dirs {
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment