# if there is Makefile.local file then include it -include Makefile.local CXX = g++ ifeq ($(DEBUG), TRUE) OPTIM_FLAGS = -g -O0 -DDEBUG RPG_DEBUG_TARGET = debug else OPTIM_FLAGS = -g -O3 RPG_DEBUG_TARGET = endif CFLAGS = -Wall -Wextra LDFLAGS = -lpthread -lrt EXTLIBS_DIR = ../extlibs PAPI_DIR = $(EXTLIBS_DIR)/papi FFTW_DIR = $(EXTLIBS_DIR)/fftw/dist RPG_DIR = $(EXTLIBS_DIR)/rpg RPG_BIN_DIR = $(RPG_DIR)/bin RPG_SRC_DIR = $(RPG_DIR)/src RPG_INCLUDE_DIR = $(RPG_SRC_DIR)/include RPG_MODULES_DIR = $(RPG_SRC_DIR)/modules/cpp # this tells RPG parts that it's built as part of RIP export RIP_SUPPORT=TRUE CFLAGS += -DRIP_SUPPORT=TRUE VALGRIND_INCLUDE_DIR = $(EXTLIBS_DIR)/valgrind/include GENERAL_INCLUDE_DIR = $(RPG_SRC_DIR)/general # include EXTLIBS_DIR and rpg modules directory CFLAGS += -I $(EXTLIBS_DIR) -I $(GENERAL_INCLUDE_DIR) -I $(VALGRIND_INCLUDE_DIR) # RDTSCP ifdef RDTSCP ifeq ($(RDTSCP), TRUE) CFLAGS += -DRIP_RDTSCP endif else # this will try to find "AuthenticAMD" string in "/proc/cpuinfo" on # first "vendor_id" line # if AuthenticAMD string is found then # rdtscp (AMD only instruction) will be used (rather than cpuid and rdtsc) ifneq (,$(findstring AuthenticAMD, $(shell grep -m 1 vendor_id /proc/cpuinfo))) CFLAGS += -DRIP_RDTSCP endif endif # PAPI ifdef PAPI ifeq ($(PAPI), TRUE) LDLIBS += $(PAPI_DIR)/src/libpapi.a CFLAGS += -I $(PAPI_DIR)/src -DENABLE_PAPI endif else # here we try to find libpapi.a # let's make presumption that if someone compiles PAPI, they also want to use it # and vice versa ifneq (, $(wildcard $(PAPI_DIR)/src/libpapi.a)) LDLIBS += $(PAPI_DIR)/src/libpapi.a CFLAGS += -I $(PAPI_DIR)/src -DENABLE_PAPI endif endif # RPG modules; the modules are not compiled in by default RPG_LIBS = RPG_MODULES_HEADER = RPG_MAKE_DEPENDENCY = ifdef RPG_MODULES ifeq ($(RPG_MODULES), TRUE) #RPG modules needs fft FFTW = TRUE RPG_LIBS_BASE = modules.a shared.a ripglue/ripglue.o ripglue/modules_*.a RPG_LIBS = $(addprefix $(RPG_BIN_DIR)/, $(RPG_LIBS_BASE)) RPG_MODULES_HEADER = $(RPG_INCLUDE_DIR)/modules.h RPG_MAKE_DEPENDENCY = rpg_all CFLAGS += -DRPG_MODULES -I $(RPG_INCLUDE_DIR) -I $(RPG_MODULES_DIR) endif endif ifdef USE_CACHE_SIMULATOR ifeq ($(USE_CACHE_SIMULATOR), TRUE) CFLAGS += -DUSE_CACHE_SIMULATOR endif endif ifdef USE_VALGRIND ifeq ($(USE_VALGRIND), TRUE) CFLAGS += -DENABLE_VALGRIND endif endif ifdef STRESSMARK_SYNC ifeq ($(STRESSMARK_SYNC), TRUE) CFLAGS += -DSTRESSMARK_SYNC endif endif # FFTW ifdef FFTW ifeq ($(FFTW), TRUE) LDLIBS += $(FFTW_DIR)/lib/libfftw3.a CFLAGS += -I $(FFTW_DIR)/include -DENABLE_FFTW endif endif SRCS_RIP = $(shell find src/benchframework src/benchutils src/benchmarks -name '*.cpp') SRCS_PLOT = $(shell find src/plotframework src/plotters -name '*.cpp') \ src/benchframework/logger.cpp \ src/benchframework/riplib.cpp \ src/benchframework/paramsloader.cpp \ src/benchframework/resultfile.cpp \ src/benchframework/colorallocator.cpp OBJS_RIP = $(SRCS_RIP:.cpp=.o) OBJS_PLOT = $(SRCS_PLOT:.cpp=.o) EXECUTABLES = rip ripplot .PHONY: all rpg_all all: $(RPG_MAKE_DEPENDENCY) $(EXECUTABLES) define compile-rpg = @$(MAKE) -C $(RPG_SRC_DIR) $(RPG_DEBUG_TARGET) @$(MAKE) -C $(RPG_SRC_DIR) ripglue endef rpg_all: $(compile-rpg) rip: $(OBJS_RIP) $(RPG_LIBS) $(CXX) $(CFLAGS) $(OPTIM_FLAGS) $(LDFLAGS) $(OBJS_RIP) $(RPG_LIBS) $(LDLIBS) -o $@ ripplot: $(OBJS_PLOT) $(CXX) $(CFLAGS) $(OPTIM_FLAGS) $(OBJS_PLOT) -o $@ $(RPG_LIBS): $(compile-rpg) $(RPG_MODULES_HEADER): $(compile-rpg) dropcaches: cd utils/dropcaches && make enable %.o: %.cpp $(RPG_MODULES_HEADER) $(CXX) $(CFLAGS) $(OPTIM_FLAGS) -c $< -o $@ clean: rm -f $(EXECUTABLES) $(shell find src -name '*.o') $(shell find src -name '*.d') ifdef RPG_MODULES @$(MAKE) -C $(RPG_SRC_DIR) clean endif debug: $(MAKE) DEBUG=TRUE # AUTO DEPENDENCY # thx to http://ttsiodras.googlepages.com/makefile.html # Dependency file compilation %.d: %.cpp $(RPG_MODULES_HEADER) @echo Generating dependencies for $< @set -e ; $(CXX) -MM -MP -MT $(<:.cpp=.o) $(CFLAGS) $(OPTIM_FLAGS) $< > $@ # Build a Dependency list by replacing the .cpp extension to .d DEPS_RIP = $(SRCS_RIP:.cpp=.d) DEPS_PLOT = $(SRCS_PLOT:.cpp=.d) # Unless "make clean" is called, include the dependency files # which are auto-generated. Don't fail if they are missing # (-include), since they will be missing in the first invocation! ifneq ($(MAKECMDGOALS), clean) -include ${DEPS_RIP} -include ${DEPS_PLOT} endif