# 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)))