125 lines
3.6 KiB
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)))
|