summaryrefslogtreecommitdiff
path: root/rules/hi-rule.mk
diff options
context:
space:
mode:
authorIan Lynagh <ian@well-typed.com>2013-02-22 22:18:50 +0000
committerIan Lynagh <ian@well-typed.com>2013-02-22 23:56:38 +0000
commita49e9cf3ff5af48c011c7ade9338b49b667b2201 (patch)
tree3e10649e9e827540debe07c0e0aeecb66b0d1aed /rules/hi-rule.mk
parent1abfa87072981eb9a2cdf1343bb19cdc2cfe426e (diff)
downloadhaskell-a49e9cf3ff5af48c011c7ade9338b49b667b2201.tar.gz
Add separate rules for all .hi files, rather than using %.hi style
If a file is created by a %.hi rule, and the actual filename isn't mentioned in the makefiles, then make will treat it as an 'intermediate file' and delete it when it is finished. We'd been lucky so far that .hi files weren't actually being built due to our rules (but rather, as side-effects of the .o rules). However, when using -dynamic-too to build, we had a rule $1/$2/build/%.$$(dyn_osuf): $1/$2/build/%.$$(v_hisuf) which meant that building a .dyn_o could cause the rule for the corresponding .hi to be used, and the .hi may then be deleted later on. This was exacerbated by a bug in GNU make 3.81 which caused make to enter an infinite loop if running in parallel mode: http://lists.gnu.org/archive/html/bug-make/2013-02/msg00020.html Adding .SECONDARY: would stop make from deleting the intermediate files. However, this caused make to take a pathologically long time (it appeared to be live-locked for 2 hours before I killed it) with our build system. This patch instead creates lines like $(eval $(call hi-rule,libraries/base/dist-install/build/Unsafe/Coerce.dyn_hi libraries/base/dist-install/build/Unsafe/Coerce.hi : %hi: %o libraries/base/Unsafe/Coerce.hs)) in the .depend files, which results in a rule like libraries/base/dist-install/build/Unsafe/Coerce.dyn_hi libraries/base/dist-install/build/Unsafe/Coerce.hi : %hi: %o libraries/base/Unsafe/Coerce.hs ; which, as the files are now all named in the makefiles, means they are no longer intermediate files so do not get deleted.
Diffstat (limited to 'rules/hi-rule.mk')
-rw-r--r--rules/hi-rule.mk14
1 files changed, 2 insertions, 12 deletions
diff --git a/rules/hi-rule.mk b/rules/hi-rule.mk
index e478c17aea..a343389967 100644
--- a/rules/hi-rule.mk
+++ b/rules/hi-rule.mk
@@ -71,25 +71,15 @@
#
# a/%.hi : a/%.o b/%.hs ;
-define hi-rule # $1 = source directory, $2 = object directory, $3 = way
-
-$(call hi-rule-helper,$2/%.$$($3_hisuf) : $2/%.$$($3_osuf) $1/%.hs)
-$(call hi-rule-helper,$2/%.$$($3_hisuf) : $2/%.$$($3_osuf) $1/%.lhs)
-
-$(call hi-rule-helper,$2/%.$$($3_way_)hi-boot : $2/%.$$($3_way_)o-boot $1/%.hs)
-$(call hi-rule-helper,$2/%.$$($3_way_)hi-boot : $2/%.$$($3_way_)o-boot $1/%.lhs)
-
-endef
-
ifeq "$(ExtraMakefileSanityChecks)" "NO"
-define hi-rule-helper # $1 = rule header
+define hi-rule # $1 = rule header
$1 ;
endef
else
-define hi-rule-helper # $1 = rule header
+define hi-rule # $1 = rule header
$1
@if [ ! -f $$@ ] ; then \
echo "Panic! $$< exists, but $$@ does not."; \