1# ----------------------------------------------------------------------------- 2# 3# (c) 2009 The University of Glasgow 4# 5# This file is part of the GHC build system. 6# 7# To understand how the build system works and how to modify it, see 8# http://ghc.haskell.org/trac/ghc/wiki/Building/Architecture 9# http://ghc.haskell.org/trac/ghc/wiki/Building/Modifying 10# 11# ----------------------------------------------------------------------------- 12 13# Eliminate use of the built-in implicit rules, and clear out the default list 14# of suffixes for suffix rules. Speeds up make quite a bit. Both are needed 15# for the shortest `make -d` output. 16# Don't set --no-builtin-variables; some rules might stop working if you do 17# (e.g. 'make clean' in testsuite/ currently relies on an implicit $RM). 18MAKEFLAGS += --no-builtin-rules 19.SUFFIXES: 20 21 22# ----------------------------------------------------------------------------- 23# Sanitize environment 24 25# See Trac #11530 26export GREP_OPTIONS := 27 28ifneq "$(filter maintainer-clean distclean clean clean_% help,$(MAKECMDGOALS))" "" 29-include mk/config.mk 30else 31include mk/config.mk 32ifeq "$(ProjectVersion)" "" 33$(error Please run ./configure first) 34endif 35endif 36 37include mk/custom-settings.mk 38 39 40ifeq "$(wildcard distrib/)" "" 41 42# We're in a bindist 43 44.PHONY: default 45default: 46 @echo 'Run "make install" to install' 47 @false 48 49.PHONY: install show 50install show: 51 $(MAKE) --no-print-directory -f ghc.mk $@ BINDIST=YES NO_INCLUDE_DEPS=YES 52 53# Note [install-strip] 54# 55# install-strip is like install, but it strips the executable files while 56# installing them. 57# 58# From http://www.gnu.org/prep/standards/html_node/Standard-Targets.html: 59# 60# "install-strip should not strip the executables in the build directory 61# which are being copied for installation. It should only strip the copies 62# that are installed. " 63 64.PHONY: install-strip 65install-strip: 66 # See Note [install-strip]. 67 $(MAKE) --no-print-directory -f ghc.mk INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install BINDIST=YES NO_INCLUDE_DEPS=YES 68 69else 70 71.PHONY: default 72default : all 73 @: 74 75# For help, type 'make help' 76.PHONY: help 77help: 78 @cat MAKEHELP.md 79 80# No need to update makefiles for these targets: 81# (the ones we're filtering out) 82REALGOALS=$(filter-out \ 83 binary-dist \ 84 binary-dist-prep \ 85 install-strip \ 86 sdist sdist-ghc \ 87 sdist-ghc-prep \ 88 sdist-windows-tarballs \ 89 sdist-windows-tarballs-prep \ 90 sdist-testsuite \ 91 sdist-testsuite-prep \ 92 bootstrapping-files \ 93 framework-pkg \ 94 clean \ 95 clean_% \ 96 distclean \ 97 maintainer-clean \ 98 show \ 99 show! \ 100 echo \ 101 help \ 102 test \ 103 fulltest \ 104 slowtest \ 105 fasttest \ 106 fast \ 107 ,$(MAKECMDGOALS)) 108 109# configure touches certain files even if they haven't changed. This 110# can mean a lot of unnecessary recompilation after a re-configure, so 111# here we cache the old versions of these files so we can restore the 112# timestamps. 113%.old: % 114 @set -x && test -f $@ && cmp -s $< $@ || cp -p $< $@ 115 touch -r $@ $< 116 117 118# NB. not the same as saying '%: ...', which doesn't do the right thing: 119# it does nothing if we specify a target that already exists. 120.PHONY: $(REALGOALS) all 121$(REALGOALS) all: mk/config.mk.old mk/project.mk.old compiler/ghc.cabal.old 122ifneq "$(OMIT_PHASE_0)" "YES" 123 @echo "===--- building phase 0" 124 $(MAKE) --no-print-directory -f ghc.mk phase=0 phase_0_builds 125endif 126ifneq "$(OMIT_PHASE_1)" "YES" 127 @echo "===--- building phase 1" 128 $(MAKE) --no-print-directory -f ghc.mk phase=1 phase_1_builds 129endif 130 @echo "===--- building final phase" 131 $(MAKE) --no-print-directory -f ghc.mk phase=final $@ 132 133# if BINARY_DIST_DIR is not set, assume we want the old 134# behaviour of placing the binary dist into the current 135# directory. Provide BINARY_DIST_DIR to put the final 136# binary distribution elsewhere. 137BINARY_DIST_DIR ?= . 138 139.PHONY: binary-dist 140binary-dist: binary-dist-prep 141 mv bindistprep/*.tar.$(TAR_COMP_EXT) "$(BINARY_DIST_DIR)" 142 143.PHONY: binary-dist-prep 144binary-dist-prep: 145ifeq "$(mingw32_TARGET_OS)" "1" 146 $(MAKE) --no-print-directory -f ghc.mk windows-binary-dist-prep 147else 148 rm -f bindist-list 149 $(MAKE) --no-print-directory -f ghc.mk bindist-list BINDIST=YES 150 $(MAKE) --no-print-directory -f ghc.mk unix-binary-dist-prep 151endif 152 153.PHONY: install-strip 154install-strip: 155 # See Note [install-strip]. 156 $(MAKE) --no-print-directory -f ghc.mk INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install 157 158.PHONY: sdist sdist-ghc sdist-ghc-prep sdist-windows-tarballs sdist-windows-tarballs-prep sdist-testsuite sdist-testsuite-prep 159# Just running `./boot && ./configure && make sdist` should work, so skip 160# phase 0 and 1 and don't build any dependency files. 161sdist sdist-ghc sdist-ghc-prep sdist-windows-tarballs sdist-windows-tarballs-prep sdist-testsuite sdist-testsuite-prep : 162 $(MAKE) --no-print-directory -f ghc.mk $@ NO_INCLUDE_DEPS=YES NO_INCLUDE_PKGDATA=YES 163 164.PHONY: clean distclean maintainer-clean 165clean distclean maintainer-clean: 166 $(MAKE) --no-print-directory -f ghc.mk $@ CLEANING=YES 167 test ! -d testsuite || $(MAKE) -C testsuite $@ 168 169.PHONY: $(filter clean_%,$(MAKECMDGOALS)) 170$(filter clean_%, $(MAKECMDGOALS)) : clean_% : 171 $(MAKE) --no-print-directory -f ghc.mk $@ CLEANING=YES 172 173.PHONY: bootstrapping-files show echo 174bootstrapping-files show echo: 175 $(MAKE) --no-print-directory -f ghc.mk $@ 176 177.PHONY: show! 178show!: 179 $(MAKE) --no-print-directory -f ghc.mk show NO_INCLUDE_PKGDATA=YES 180 181ifeq "$(darwin_TARGET_OS)" "1" 182.PHONY: framework-pkg 183framework-pkg: 184 $(MAKE) -C distrib/MacOS $@ 185endif 186 187# If the user says 'make A B', then we don't want to invoke two 188# instances of the rule above in parallel: 189.NOTPARALLEL: 190 191endif 192 193# Note [validate and testsuite speed] 194# 195# There are 3 different validate and testsuite speed settings: 196# fast, normal and slow. 197# 198# how how used 199# cd tests config. many many by 200# validate && make speed= tests ways whom 201# ============================================================================= 202# --fast fast 2 some 1+exs Travis (to stay within time limit) 203# --normal test 1 all 1+exs Phabricator (slow takes too long?) 204# --slow slow 0 all all Nightly (slow is ok) 205# 206# accept 1 all 1 207# 208# `--fast` and `--normal` run one default way, as well as any other ways which 209# are explicitly requested by the test using extra_ways(). 210# 211# `make accept` should run all tests exactly once. There is no point in 212# accepting a test for multiple ways, since it should produce the same output 213# for all ways. 214# 215# To make sure all .stderr and .stdout files in the testsuite are never 216# out-of-date, it is useful if Phabricator, via a normal `./validate` and `make 217# test`, runs each test at least once. 218.PHONY: fasttest 219fasttest: 220 $(MAKE) -C testsuite/tests CLEANUP=1 SUMMARY_FILE=../../testsuite_summary.txt fast 221 222.PHONY: test 223test: 224 $(MAKE) -C testsuite/tests CLEANUP=1 SUMMARY_FILE=../../testsuite_summary.txt 225 226.PHONY: slowtest fulltest 227slowtest fulltest: 228 $(MAKE) -C testsuite/tests CLEANUP=1 SUMMARY_FILE=../../testsuite_summary.txt slow 229 230.PHONY: fast 231fast: 232 @echo "You can use 'make fast' only from inside a sub-component directory." 233 @exit 1 234