tinyriscv/sim/remote_bitbang/Makefile

125 lines
3.6 KiB
Makefile

# Copyright (C) 2020 ETH Zurich and University of Bologna
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Author: Robert Balas (balasr@iis.ee.ethz.ch)
CFLAGS = -Wall -Wextra -Wno-missing-field-initializers \
-Wno-unused-function -Wno-missing-braces \
-O2 -g -march=native \
-DENABLE_LOGGING -DNDEBUG
CFLAGS_DBG =
# we need gnu11 and no-strict-aliasing
ALL_CFLAGS = -std=gnu11 -fno-strict-aliasing $(CFLAGS)
ALL_CFLAGS_DBG = -std=gnu11 -Wall -Wextra -Wno-missing-field-initializers \
-Wno-unused-function -Wno-missing-braces \
-O0 -g -fno-strict-aliasing \
-fsanitize=address -fno-omit-frame-pointer \
-DENABLE_LOGGING -DENABLE_DEBUG $(CFLAGS_DBG)\
# -fsanitize=undefined \
# -fsanitize=leak \
# TODO: better path?
LIB_DIRS =
LIBS =
INCLUDE_DIRS = ./
LDFLAGS = $(addprefix -L, $(LIB_DIRS))
LDLIBS = $(addprefix -l, $(LIBS))
SRCS = remote_bitbang.c sim_jtag.c
OBJS = $(SRCS:.c=.o)
INCLUDES = $(addprefix -I, $(INCLUDE_DIRS))
HEADERS = $(wildcard *.h)
# libs
SV_LIB = librbs.so
# header file dependency generation
DEPDIR := .d
DEPDIRS := $(addsuffix /$(DEPDIR),.)
# goal: make gcc put a dependency file called obj.Td (derived from subdir/obj.o)
# in subdir/.d/
DEPFLAGS = -MT $@ -MMD -MP -MF $(@D)/$(DEPDIR)/$(patsubst %.o,%.Td,$(@F))
# move gcc generated header dependencies to DEPDIR
# this rename step is here to make the header dependency generation "atomic"
POSTCOMPILE = @mv -f $(@D)/$(DEPDIR)/$(patsubst %.o,%.Td,$(@F)) \
$(@D)/$(DEPDIR)/$(patsubst %.o,%.d,$(@F)) && touch $@
# GNU recommendations for install targets
prefix = /usr/local
exec_prefix = $(prefix)
bindir = $(exec_prefix)/bin
libdir = $(exec_prefix)/lib
includedir = $(prefix)/include
INSTALL = install
INSTALL_PROGRAM = $(INSTALL)
INSTALL_DATA = ${INSTALL} -m 644
CTAGS = ctags
# compilation targets
all: sv-lib
debug: ALL_CFLAGS = $(ALL_CFLAGS_DBG)
debug: all
sv-lib: ALL_CFLAGS += -fPIC
sv-lib: $(SV_LIB)
#compilation boilerplate
$(SV_LIB): $(OBJS)
$(LD) -shared -E --exclude-libs ALL -o $(SV_LIB) $(LDFLAGS) \
$(OBJS) $(LDLIBS)
# $@ = name of target
# $< = first dependency
%.o: %.c
%.o: %.c $(DEPDIR)/%.d $(DEPDIRS)
$(CC) $(DEPFLAGS) $(ALL_CFLAGS) $(INCLUDES) $(LDFLAGS) \
-c $(CPPFLAGS) $< -o $@ $(LDLIBS)
$(POSTCOMPILE)
# check if we need to create the dependencies folders (gcc doesn't)
$(DEPDIRS):
$(shell mkdir -p $(DEPDIRS) > /dev/null)
# make won't fail if the dependency file doesn't exist
$(addsuffix /$(DEPDIR)/%.d,. main benchmark test dpi): ;
# prevent automatic deletion as intermediate file
.PRECIOUS: $(addsuffix /$(DEPDIR)/%.d,. main benchmark test dpi)
# emacs tag generation
.PHONY: TAGS
TAGS:
$(CTAGS) -R -e -h=".c.h" --tag-relative=always \
. $(LIB_DIRS) $(INCLUDE_DIRS) $(BINUTILS_PATH)/bfd
# TODO: missing install targets
# cleanup
.PHONY: clean
clean:
rm -rf $(SV_LIB) $(OBJS) $(DEPDIRS)
.PHONY: distclean
distclean: clean
rm -f TAGS
# include auto generated header dependency information
include $(wildcard $(addsuffix /*.d,$(DEPDIRS)))