X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=docs%2Fusers_guide%2Fseparate_compilation.xml;h=727a13365504b69faa7be866c8a15ad834116ecb;hb=dd82b49ad6f719bd324de7f2d63f3341c0e87694;hp=fc22fbdef3c4c88fa578140e897d5fccfd658221;hpb=4920157a2e5b7679b6971632c1b1f7be38c09f53;p=ghc-hetmet.git
diff --git a/docs/users_guide/separate_compilation.xml b/docs/users_guide/separate_compilation.xml
index fc22fbd..727a133 100644
--- a/docs/users_guide/separate_compilation.xml
+++ b/docs/users_guide/separate_compilation.xml
@@ -299,7 +299,7 @@
dir. For example:
-$ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`
+$ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `uname -m`
The object files, Foo.o,
@@ -374,6 +374,20 @@ $ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`
+
+
+ dir
+
+
+
+ The option is shorthand for
+ the combination
+ of , ,
+ and .
+
+
+
+
suffix
@@ -565,9 +579,9 @@ $ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`
the same as the old one; this is friendly to
make. When an interface does change,
it is often enlightening to be informed. The
- option will make GHC run
- diff on the old and new
- .hi files.
+ option will make GHC
+ report the differences between the old and
+ new .hi files.
@@ -647,24 +661,24 @@ $ ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`
B, say) may conceivably not change
B.hi one jot. So now…
- GHC keeps a version number on each interface file, and on
- each type signature within the interface file. It also keeps in
- every interface file a list of the version numbers of everything
- it used when it last compiled the file. If the source file's
- modification date is earlier than the .o
- file's date (i.e. the source hasn't changed since the file was
- last compiled), and the recompilation checking is on, GHC will be
- clever. It compares the version numbers on the things it needs
- this time with the version numbers on the things it needed last
- time (gleaned from the interface file of the module being
- compiled); if they are all the same it stops compiling rather
- early in the process saying “Compilation IS NOT
- required”. What a beautiful sight!
-
- Patrick Sansom had a workshop paper about how all this is
- done (though the details have changed quite a bit). Ask him if you want a
- copy.
+ GHC calculates a fingerprint (in fact an MD5 hash) of each
+ interface file, and of each declaration within the interface
+ file. It also keeps in every interface file a list of the
+ fingerprints of everything it used when it last compiled the
+ file. If the source file's modification date is earlier than
+ the .o file's date (i.e. the source hasn't
+ changed since the file was last compiled), and the recompilation
+ checking is on, GHC will be clever. It compares the fingerprints
+ on the things it needs this time with the fingerprints
+ on the things it needed last time (gleaned from the
+ interface file of the module being compiled); if they are all
+ the same it stops compiling early in the process saying
+ “Compilation IS NOT required”. What a beautiful
+ sight!
+
+ You can read
+ about how
+ all this works in the GHC commentary.
@@ -702,7 +716,10 @@ module B where
hi-boot files
Here A imports B, but B imports
A with a {-# SOURCE #-} pragma, which breaks the
-circular dependency. For every module A.hs that is {-# SOURCE #-}-imported
+circular dependency. Every loop in the module import graph must be broken by a {-# SOURCE #-} import;
+or, equivalently, the module import graph must be acyclic if {-# SOURCE #-} imports are ignored.
+
+For every module A.hs that is {-# SOURCE #-}-imported
in this way there must exist a source file A.hs-boot. This file contains an abbreviated
version of A.hs, thus:
@@ -1166,7 +1183,8 @@ just in case they contain an instance declaration that matters to M. This would
be a disaster in practice, so GHC tries to be clever. In particular, if an instance declaration is in the same module as the definition
-of any type or class mentioned in the head of the instance declaration, then
+of any type or class mentioned in the head of the instance declaration
+(the part after the “=>”; see ), then
GHC has to visit that interface file anyway. Example:
module A where
@@ -1205,7 +1223,7 @@ functional dependency:
class E x y | y -> x where ...
Then in some importing module M, the constraint (E a Int) should be "improved" by setting
-a = Int, even though there is no explicit mention
+a = T, even though there is no explicit mention
of T in M.
These considerations lead to the following definition of an orphan module:
@@ -1229,7 +1247,7 @@ These considerations lead to the following definition of an orphan module:
- Only the instance head (the part after the “=>”)
+ Only the instance head
counts. In the example above, it is not good enough for C's declaration
to be in module A; it must be the declaration of D or T.
@@ -1243,7 +1261,13 @@ These considerations lead to the following definition of an orphan module:
-GHC will warn you if you are creating an orphan module, if you add `-fwarn-orphan-modules`.
+If you use the flag , GHC will warn you
+if you are creating an orphan module.
+Like any warning, you can switch the warning off with ,
+and
+will make the compilation fail if the warning is issued.
+
+
You can identify an orphan module by looking in its interface
file, M.hi, using the
mode. If there is a [orphan module] on the