riscv-openocd/Makefile

115 lines
4.4 KiB
Makefile

# The default target
.PHONY: all
all:
BINDIR := bin
OBJDIR := obj
SRCDIR := src
UBUNTU ?= x86_64-linux-gnu
WINDOWS ?= i686-w64-mingw32
# FIXME: Detect the native platform
NATIVE ?= $(UBUNTU)
OBJ_NATIVE := $(OBJDIR)/$(NATIVE)
OBJ_UBUNTU := $(OBJDIR)/$(UBUNTU)
OBJ_WIN64 := $(OBJDIR)/$(WINDOWS)
SRC_RGT := $(SRCDIR)/riscv-gnu-toolchain
SRC_EXPAT := $(SRCDIR)/libexpat/expat
SRC_ZLIB := $(SRCDIR)/zlib
# The version that will be appended to the various tool builds.
VERSION ?= $(shell cd $(SRC_RGT); git describe --tags | sed s/^v//g)
# The actual output of this repository is a set of tarballs.
.PHONY: windows
windows: $(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-$(WINDOWS).zip
windows: $(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-$(WINDOWS).tar.gz
windows: $(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-$(WINDOWS).src.tar.gz
.PHONY: ubuntu
ubuntu: $(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-$(UBUNTU).tar.gz
ubuntu: $(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-$(UBUNTU).src.tar.gz
# FIXME: Check to see if the Windows tools should be built based on the
# presence of the Windows cross compiler.
all: windows
all: ubuntu
# Some special riscv-gnu-toolchain configure flags for specific targets.
x86_64-linux-gnu-rgt-configue :=
i686-w64-mingw32-rgt-configure := --without-system-zlib
# There's enough % rules that make starts blowing intermediate files away.
.SECONDARY:
# Builds riscv-gnu-toolchain for various targets.
$(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-%.zip: \
$(OBJDIR)/%/stamps/riscv-gnu-toolchain/install.stamp
$(eval $@_TARGET := $(patsubst $(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-%.zip,%,$@))
mkdir -p $(dir $@)
cd $(OBJDIR)/$($@_TARGET)/install; zip -r $(abspath $@) riscv64-unknown-elf-gcc-$(VERSION)-$($@_TARGET)
$(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-%.tar.gz: \
$(OBJDIR)/%/stamps/riscv-gnu-toolchain/install.stamp
$(eval $@_TARGET := $(patsubst $(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-%.tar.gz,%,$@))
mkdir -p $(dir $@)
tar -C $(OBJDIR)/$($@_TARGET)/install -c riscv64-unknown-elf-gcc-$(VERSION)-$($@_TARGET) | gzip > $(abspath $@)
$(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-%.src.tar.gz: \
$(OBJDIR)/%/stamps/riscv-gnu-toolchain/install.stamp
$(eval $@_TARGET := $(patsubst $(BINDIR)/riscv64-unknown-elf-gcc-$(VERSION)-%.src.tar.gz,%,$@))
mkdir -p $(dir $@)
tar -C $(OBJDIR)/$($@_TARGET)/build -c . | gzip > $(abspath $@)
$(OBJDIR)/%/stamps/riscv-gnu-toolchain/install.stamp: \
$(OBJDIR)/%/stamps/expat/install.stamp \
$(OBJDIR)/%/build/riscv-gnu-toolchain/stamp
$(eval $@_TARGET := $(patsubst $(OBJDIR)/%/stamps/riscv-gnu-toolchain/install.stamp,%,$@))
$(eval $@_BUILD := $(patsubst %/stamps/riscv-gnu-toolchain/install.stamp,%/build/riscv-gnu-toolchain,$@))
$(eval $@_INSTALL := $(patsubst %/stamps/riscv-gnu-toolchain/install.stamp,%/install/riscv64-unknown-elf-gcc-$(VERSION)-$($@_TARGET),$@))
mkdir -p $($@_BUILD)
cd $($@_BUILD); ./configure --prefix=$(abspath $($@_INSTALL)) --with-host=$($@_TARGET) $($($@_TARGET)-rgt-configure) --enable-multilib
$(MAKE) PATH="$(abspath $(OBJ_NATIVE)/install/riscv64-unknown-elf-gcc-$(VERSION)-$(NATIVE)/bin:$(PATH))" -C $($@_BUILD)
mkdir -p $(dir $@)
date > $@
$(OBJDIR)/%/build/riscv-gnu-toolchain/stamp:
rm -rf $(dir $@)
mkdir -p $(dir $@)
cp -r $(SRC_RGT)/* $(dir $@)
cd $(dir $@)/riscv-gcc; ./contrib/download_prerequisites
date > $@
# The Windows build requires the native toolchain. The dependency is enforced
# here, PATH allows the tools to get access.
$(OBJ_WIN64)/stamps/riscv-gnu-toolchain/install.stamp: \
$(OBJ_NATIVE)/stamps/riscv-gnu-toolchain/install.stamp
# OpenOCD requires a GDB that's been build with expat support so it can read
# the target XML files.
$(OBJDIR)/%/stamps/expat/install.stamp: \
$(OBJDIR)/%/build/expat/configure
$(eval $@_TARGET := $(patsubst $(OBJDIR)/%/stamps/expat/install.stamp,%,$@))
$(eval $@_BUILD := $(patsubst %/stamps/expat/install.stamp,%/build/expat,$@))
$(eval $@_INSTALL := $(patsubst %/stamps/expat/install.stamp,%/install,$@))
mkdir -p $($@_BUILD)
cd $($@_BUILD); ./configure --prefix=$(abspath $($@_INSTALL)) --host=$($@_TARGET)
$(MAKE) -C $($@_BUILD) buildlib
$(MAKE) -C $($@_BUILD) installlib
mkdir -p $(dir $@)
date > $@
$(OBJDIR)/%/build/expat/configure:
rm -rf $(dir $@)
mkdir -p $(dir $@)
cp -r $(SRC_EXPAT)/* $(dir $@)
cd $(dir $@); ./buildconf.sh
touch -c $@
# Targets that don't build anything
.PHONY: clean
clean::
rm -rf $(OBJDIR) $(BINDIR)