Merge pull request #9898 from haskell/mergify/bp/3.12/pr-9865
[cabal.git] / Makefile
blob7adb96d3bc54835df0df4918b8c0729f5400d897
1 .PHONY : all lexer sdpx lib exe doctest
2 .PHONY : phony
4 CABALBUILD := cabal build
5 CABALRUN := cabal run
6 DOCTEST := cabal repl --with-ghc=doctest --repl-options="-w" --project-file=cabal.project.doctest
8 # default rules
10 all : exe lib
12 lib : $(LEXER_HS)
13 $(CABALBUILD) Cabal:libs
15 exe : $(LEXER_HS)
16 $(CABALBUILD) cabal-install:exes
18 init: ## Set up git hooks and ignored revisions
19 @git config core.hooksPath .githooks
20 ## TODO
22 style: ## Run the code styler
23 @fourmolu -q -i Cabal Cabal-syntax cabal-install
25 style-modified: ## Run the code styler on modified files
26 @git ls-files --modified Cabal Cabal-syntax cabal-install \
27 | grep '.hs$$' | xargs -P $(PROCS) -I {} fourmolu -q -i {}
29 style-commit: ## Run the code styler on the previous commit
30 @git diff --name-only HEAD $(COMMIT) Cabal Cabal-syntax cabal-install \
31 | grep '.hs$$' | xargs -P $(PROCS) -I {} fourmolu -q -i {}
33 # source generation: SPDX
35 SPDX_LICENSE_HS:=Cabal-syntax/src/Distribution/SPDX/LicenseId.hs
36 SPDX_EXCEPTION_HS:=Cabal-syntax/src/Distribution/SPDX/LicenseExceptionId.hs
38 spdx : $(SPDX_LICENSE_HS) $(SPDX_EXCEPTION_HS)
40 SPDX_LICENSE_VERSIONS:=3.0 3.2 3.6 3.9 3.10 3.16 3.23
42 $(SPDX_LICENSE_HS) : templates/SPDX.LicenseId.template.hs cabal-dev-scripts/src/GenUtils.hs cabal-dev-scripts/src/GenSPDX.hs license-list-data/licenses-3.0.json license-list-data/licenses-3.2.json
43 cabal run --builddir=dist-newstyle-meta --project-file=cabal.project.meta gen-spdx -- templates/SPDX.LicenseId.template.hs $(SPDX_LICENSE_VERSIONS:%=license-list-data/licenses-%.json) $(SPDX_LICENSE_HS)
45 $(SPDX_EXCEPTION_HS) : templates/SPDX.LicenseExceptionId.template.hs cabal-dev-scripts/src/GenUtils.hs cabal-dev-scripts/src/GenSPDXExc.hs license-list-data/exceptions-3.0.json license-list-data/exceptions-3.2.json
46 cabal run --builddir=dist-newstyle-meta --project-file=cabal.project.meta gen-spdx-exc -- templates/SPDX.LicenseExceptionId.template.hs $(SPDX_LICENSE_VERSIONS:%=license-list-data/exceptions-%.json) $(SPDX_EXCEPTION_HS)
48 # source generation: templates
50 TEMPLATE_MACROS:=Cabal/src/Distribution/Simple/Build/Macros/Z.hs
51 TEMPLATE_PATHS:=Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
53 templates : phony $(TEMPLATE_MACROS) $(TEMPLATE_PATHS)
55 $(TEMPLATE_MACROS) : templates/cabal_macros.template.h cabal-dev-scripts/src/GenCabalMacros.hs
56 cabal run --builddir=dist-newstyle-meta --project-file=cabal.project.meta gen-cabal-macros -- $< $@
58 $(TEMPLATE_PATHS) : templates/Paths_pkg.template.hs cabal-dev-scripts/src/GenPathsModule.hs
59 cabal run --builddir=dist-newstyle-meta --project-file=cabal.project.meta gen-paths-module -- $< $@
61 # generated docs
62 # Use cabal build before cabal run to avoid output of the build on stdout when running
63 doc/buildinfo-fields-reference.rst : \
64 $(wildcard Cabal-syntax/src/*/*.hs Cabal-syntax/src/*/*/*.hs Cabal-syntax/src/*/*/*/*.hs) \
65 $(wildcard Cabal-described/src/Distribution/Described.hs Cabal-described/src/Distribution/Utils/*.hs) \
66 buildinfo-reference-generator/src/Main.hs \
67 buildinfo-reference-generator/template.zinza
68 cabal build --project-file=cabal.project.buildinfo buildinfo-reference-generator
69 cabal run --project-file=cabal.project.buildinfo buildinfo-reference-generator buildinfo-reference-generator/template.zinza | tee $@
70 git diff --exit-code $@
72 # analyse-imports
73 analyse-imports : phony
74 find Cabal-syntax/src Cabal/src cabal-install/src -type f -name '*.hs' | xargs cabal run --builddir=dist-newstyle-meta --project-file=cabal.project.meta analyse-imports --
76 # ghcid
78 ghcid-lib :
79 ghcid -c 'cabal repl Cabal'
81 ghcid-cli :
82 ghcid -c 'cabal repl cabal-install'
84 # Artem, 2023-02-03, https://github.com/haskell/cabal/issues/8504
85 # The new and prefered way to call the doctest tool (as of now) is based on cabal repl --with-ghc=doctest.
86 # The call below reflects the current documentation of the doctest tool except one caveat,
87 # which is https://github.com/haskell/cabal/issues/6859, i.e. we have to hide allow-newer in our project
88 # file from cabal/doctest. This is easy: we just select a project file with no allow-newer (e.g. cabal.project.libonly).
90 # TODO: Cabal-described should be added here but its doctests currently broken, see:
91 # https://github.com/haskell/cabal/issues/8734
92 # Just as well, cabal-install(-solver) doctests (the target below) bitrotted and need some care.
93 doctest :
94 $(DOCTEST) Cabal-syntax
95 $(DOCTEST) Cabal-described
96 $(DOCTEST) --build-depends=QuickCheck Cabal
97 $(DOCTEST) cabal-install-solver
98 $(DOCTEST) cabal-install
100 # This is not run as part of validate.sh (we need hackage-security, which is tricky to get).
101 doctest-cli :
102 doctest -D__DOCTEST__ --fast cabal-install/src cabal-install-solver/src cabal-install-solver/src-assertion
104 doctest-install:
105 cabal install doctest --overwrite-policy=always --ignore-project
107 # tests
109 check-tests :
110 $(CABALRUN) check-tests -- --cwd Cabal-tests ${TEST}
112 parser-tests :
113 $(CABALRUN) parser-tests -- --cwd Cabal-tests ${TEST}
115 parser-tests-accept :
116 $(CABALRUN) parser-tests -- --cwd Cabal-tests --accept ${TEST}
118 custom-setup-tests :
119 $(CABALRUN) custom-setup-tests --
121 hackage-parsec-tests :
122 $(CABALRUN) hackage-tests -- parsec +RTS -s -qg -I0 -A64M -N${THREADS} -RTS ${TEST}
124 hackage-roundtrip-tests :
125 $(CABALRUN) hackage-tests -- roundtrip +RTS -s -qg -I0 -A64M -N${THREADS} -RTS ${TEST}
127 cabal-install-test:
128 $(CABALBUILD) -j3 cabal-tests cabal
129 rm -rf .ghc.environment.*
130 cd cabal-testsuite && `cabal list-bin cabal-tests` --with-cabal=`cabal list-bin cabal` --hide-successes -j3 ${TEST}
132 # hackage-benchmarks (solver)
134 hackage-benchmarks-run:
135 $(CABALBUILD) -j3 hackage-benchmark cabal
136 rm -rf .ghc.environment.*
137 $$(cabal list-bin hackage-benchmark) --cabal1=cabal --cabal2=$$(cabal list-bin cabal) --packages="hakyll servant-auth-server" --print-trials --concurrently
140 # This doesn't run build, as you first need to test with cabal-install-test :)
141 cabal-install-test-accept:
142 rm -rf .ghc.environment.*
143 cd cabal-testsuite && `cabal list-bin cabal-tests` --with-cabal=`cabal list-bin cabal` --hide-successes -j3 --accept ${TEST}
145 # Docker validation
147 # Use this carefully, on big machine you can say
149 # make validate-via-docker-all -j4 -O
151 validate-via-docker-all : validate-via-docker-8.2.2
152 validate-via-docker-all : validate-via-docker-8.4.4
153 validate-via-docker-all : validate-via-docker-8.6.5
154 validate-via-docker-all : validate-via-docker-8.8.4
155 validate-via-docker-all : validate-via-docker-8.10.4
157 validate-dockerfiles : .docker/validate-8.10.4.dockerfile
158 validate-dockerfiles : .docker/validate-8.8.4.dockerfile
159 validate-dockerfiles : .docker/validate-8.6.5.dockerfile
160 validate-dockerfiles : .docker/validate-8.4.4.dockerfile
161 validate-dockerfiles : .docker/validate-8.2.2.dockerfile
163 .docker/validate-%.dockerfile : .docker/validate.dockerfile.zinza cabal-dev-scripts/src/GenValidateDockerfile.hs
164 cabal run --builddir=dist-newstyle-meta --project-file=cabal.project.meta gen-validate-dockerfile -- $* $< $@
166 # This is good idea anyway
167 # and we have a test relying on this limit being sufficiently small
168 DOCKERARGS:=--ulimit nofile=1024:1024
170 validate-via-docker-8.2.2:
171 docker build $(DOCKERARGS) -t cabal-validate:8.2.2 -f .docker/validate-8.2.2.dockerfile .
173 validate-via-docker-8.4.4:
174 docker build $(DOCKERARGS) -t cabal-validate:8.4.4 -f .docker/validate-8.4.4.dockerfile .
176 validate-via-docker-8.6.5:
177 docker build $(DOCKERARGS) -t cabal-validate:8.6.5 -f .docker/validate-8.6.5.dockerfile .
179 validate-via-docker-8.8.4:
180 docker build $(DOCKERARGS) -t cabal-validate:8.8.4 -f .docker/validate-8.8.4.dockerfile .
182 validate-via-docker-8.10.4:
183 docker build $(DOCKERARGS) -t cabal-validate:8.10.4 -f .docker/validate-8.10.4.dockerfile .
185 validate-via-docker-old:
186 docker build $(DOCKERARGS) -t cabal-validate:older -f .docker/validate-old.dockerfile .
188 # Weeder
189 weeder :
190 cabal build all --project-file=cabal.project.weeder
191 weeder | less
193 # tags
194 .PHONY : tags
195 tags :
196 hasktags -b Cabal-syntax/src Cabal/src Cabal-described/src cabal-install/src cabal-testsuite/src
198 # bootstrapping
199 ##############################################################################
201 bootstrap-json-%: phony
202 cabal build --project-file=cabal.project.release --with-compiler=ghc-$* --dry-run cabal-install:exe:cabal
203 cp dist-newstyle/cache/plan.json bootstrap/linux-$*.plan.json
204 @# -v0 to avoid build output on stdout
205 cd bootstrap && cabal run -v0 cabal-bootstrap-gen -- linux-$*.plan.json \
206 | python3 -m json.tool > linux-$*.json
208 BOOTSTRAP_GHC_VERSIONS := 9.0.2 9.2.8 9.4.8 9.6.4 9.8.2
210 bootstrap-jsons: $(BOOTSTRAP_GHC_VERSIONS:%=bootstrap-json-%)
212 # documentation
213 ##############################################################################
215 .PHONY: users-guide
216 users-guide:
217 $(MAKE) -C doc users-guide
219 .PHONY: users-guide-requirements
220 users-guide-requirements:
221 $(MAKE) -C doc users-guide-requirements
223 ifeq ($(shell uname), Darwin)
224 PROCS := $(shell sysctl -n hw.logicalcpu)
225 else
226 PROCS := $(shell nproc)
227 endif