lh-l4v/spec/haskell/Makefile

100 lines
3.0 KiB
Makefile

#
# Copyright 2014, General Dynamics C4 Systems
#
# SPDX-License-Identifier: GPL-2.0-only
#
BOOT_MODULES = Kernel/CSpace Kernel/Thread Kernel/FaultHandler \
Kernel/VSpace Kernel/Init Model/PSpace Object/TCB Object/CNode \
Object/ObjectType Object/Endpoint Object/Interrupt \
Object/IOPort/X64
BOOT_FILES=$(BOOT_MODULES:%=src/SEL4/%.lhs-boot)
CUSTOM_BOOT_FILES = src/SEL4/Object/Structures.lhs-boot
# We use the cabal executable that we installed via stack,
# and use the PATH from `stack exec` to find it.
# However, cabal refuses to run when the GHC_PACKAGE_PATH
# variable is set, so we use `stack-path` to clear
# GHC_PACKAGE_PATH first.
CABAL=stack exec -- ./stack-path cabal
CABAL_CONFIGURE=$(CABAL) v1-configure
CABAL_BUILD=$(CABAL) v1-build
CABAL_SANDBOX=$(CABAL) v1-sandbox
CABAL_UPDATE=$(CABAL) v1-update
CABAL_INSTALL=$(CABAL) v1-install
# warnings that are useless during large Haskell updates
GHC_DEV_OPTS=--ghc-options=""
all: build-aarch64 build-riscv build-arm build-arm-hyp-nosmmu build-x64
sandbox: .stack-work
$(CABAL_SANDBOX) init
$(CABAL_UPDATE)
$(CABAL_INSTALL) --dependencies-only
build-arm: sandbox $(BOOT_FILES)
$(CABAL_CONFIGURE) --configure-option="arm-kzm" \
--flags="ArchArm" \
--builddir="dist/arm"
$(CABAL_BUILD) --builddir="dist/arm"
build-arm-hyp: sandbox $(BOOT_FILES) $(CUSTOM_BOOT_FILES)
$(CABAL_CONFIGURE) --configure-option="arm-tk1" \
--flags="ArchArmHyp -FFI" \
--builddir="dist/arm-hyp"
$(CABAL_BUILD) --builddir="dist/arm-hyp"
build-arm-hyp-nosmmu: sandbox $(BOOT_FILES) $(CUSTOM_BOOT_FILES)
$(CABAL_CONFIGURE) --configure-option="arm-tk1-nosmmu" \
--flags="ArchArmHyp -FFI" \
--builddir="dist/arm-hyp-nosmmu"
$(CABAL_BUILD) --builddir="dist/arm-hyp-nosmmu"
build-x64: sandbox $(BOOT_FILES)
$(CABAL_CONFIGURE) --configure-option="x64-pc99" \
--flags="ArchX64 -FFI" \
--builddir="dist/x64"
$(CABAL_BUILD) --builddir="dist/x64"
build-riscv: sandbox $(BOOT_FILES)
$(CABAL_CONFIGURE) --configure-option="riscv-hifive" \
--flags="ArchRiscV -FFI" \
--builddir="dist/riscv"
$(CABAL_BUILD) --builddir="dist/riscv"
build-aarch64: sandbox $(BOOT_FILES)
$(CABAL_CONFIGURE) --configure-option="aarch64-tx2" \
--flags="ArchAArch64 -FFI" \
--builddir="dist/aarch64"
$(CABAL_BUILD) --builddir="dist/aarch64"
# We assume that if the .stack-work directory exists,
# we don't need to install ghc, cabal, nor fetch the cabal
# package database.
# We make this assumption to avoid hitting the network on
# every build.
# However, this means that if .stack-work exists, but the
# cabal package database is missing, the build will fail.
.stack-work:
mkdir -p ~/.stack
stack --install-ghc build cabal-install
$(CUSTOM_BOOT_FILES):
echo "never run mkhsboot for hand-crafted lhs-boot files"
%.lhs-boot: %.lhs mkhsboot.pl
perl mkhsboot.pl -l < $< > $@
clean:
rm -f $(BOOT_FILES)
$(CABAL) clean
realclean:
rm -rf $(BOOT_FILES) dist .stack-work .cabal-sandbox cabal.sandbox.config
.PHONY: all build-arm build-arm-hyp build-x64 clean sandbox realclean