diff --git a/gcc/.gitignore b/gcc/.gitignore new file mode 100644 index 0000000..f137a38 --- /dev/null +++ b/gcc/.gitignore @@ -0,0 +1,3 @@ +obj/ +well512a_* + diff --git a/gcc/Makefile b/gcc/Makefile new file mode 100644 index 0000000..fb505c2 --- /dev/null +++ b/gcc/Makefile @@ -0,0 +1,118 @@ +.DEFAULT_GOAL := all + +# --- Input variables --- +BUILD ?= release +ifeq ($(findstring $(BUILD),debug release),) + $(error BUILD must be set to debug or release) +endif + +# Build all executables by default. +APPS ?= well512a + +# If the VERBOSE flag isn't set, then mute superfluous output. +ifeq ($(VERBOSE),) + HUSH_COMPILE = @echo "Compiling $<"; + HUSH_LINK = @echo "Linking $@"; + HUSH_GENERATE = @echo "Generating $@"; + HUSH_CLEAN = @ +endif + +# --- Internal variables --- +ARCH := $(shell uname -p) +SRC_ROOT := $(abspath ..) +OUTPUT_DIR := $(SRC_ROOT)/gcc +INTERMEDIATE_DIR := $(SRC_ROOT)/gcc/obj +BUILD_DIR := $(INTERMEDIATE_DIR)/$(BUILD) + +ARFLAGS = r +LDFLAGS = + +# Always enable debug information. +CFLAGS += -g + +# Flags to generate dependency information. +CFLAGS += -MD -MP -MT $@ + +# Predefined flags. +ifeq ($(BUILD), debug) + CFLAGS += -D_DEBUG +endif + +# Enable compiler optimizations for everything except debug. +# Note that a very aggresssive optimization level is used and it may not be +# valid for all standard compliant programs. Reduce this level on individual +# files or modules as needed. +ifneq ($(BUILD), debug) + CFLAGS += -Ofast +endif + +# Flag to turn on extended instruction sets for the compiler. +CFLAGS += -msse2 + +# Let C++ inherit all C flags. +CXXFLAGS = $(CFLAGS) + +# --- Internal functions --- +app_exe = $(OUTPUT_DIR)/$(1)_$(ARCH)_$(BUILD) +objs_from_src = $(patsubst $(SRC_ROOT)/%, $(BUILD_DIR)/%.o, $(basename $(1))) +objs_from_src_in = $(call objs_from_src, $(shell find $(1) -name "*.cpp" -o -name "*.c")) +objs_from_src_in_no_recurse = $(call objs_from_src, $(shell find $(1) -maxdepth 1 -name "*.cpp" -o -name "*.c")) + + +# --- well512a application --- +ifneq ($(filter well512a,$(APPS)),) + +WELL512A_EXE := $(call app_exe,well512a) +WELL512A_OBJS := $(call objs_from_src_in,$(SRC_ROOT)) +EXES += $(WELL512A_EXE) +OBJS += $(WELL512A_OBJS) + +$(WELL512A_EXE): $(WELL512A_OBJS) $(LIBS) + +endif + + +# --- Build rules --- + +# Dependencies. +DEPS = $(OBJS:.o=.d) +-include $(DEPS) + +.PHONY: all clean cleanall help + +all: $(EXES) + +clean: + @echo "Cleaning..." + $(HUSH_CLEAN) $(RM) -r $(BUILD_DIR) + +cleanall: + @echo "Cleaning all..." + $(HUSH_CLEAN) $(RM) -r $(INTERMEDIATE_DIR) + +help: + @echo "BUILD = Build mode. One of:" + @echo " debug (default)" + @echo " release (optimizations)" + @echo "APPS = Applications to build. Defaults to all." + @echo "VERBOSE = Full output from commands if set." + +# It's important that libraries are specified last as Ubuntu uses "ld --as-needed" by default. +# Only the static libraries referenced by the object files will be linked into the executable. +# Beware that circular dependencies doesn't work with this flag. +$(EXES): + @mkdir -p $(@D) + $(HUSH_LINK) $(CXX) -o $@ $^ $(LDFLAGS) + +$(BUILD_DIR)/%.a: + @mkdir -p $(@D) + $(HUSH_GENERATE) $(AR) $(ARFLAGS) $@ $^ +# $(HUSH_GENERATE) $(AR) $(ARFLAGS) $@ $^ 2> /dev/null + +$(BUILD_DIR)/%.o: $(SRC_ROOT)/%.c + @mkdir -p $(@D) + $(HUSH_COMPILE) $(CC) -c $(CFLAGS) -o $@ $< + +$(BUILD_DIR)/%.o: $(SRC_ROOT)/%.cpp + @mkdir -p $(@D) + $(HUSH_COMPILE) $(CXX) -c $(CXXFLAGS) -o $@ $< diff --git a/main.cpp b/main.cpp index 7e7f59f..bfd9a32 100644 --- a/main.cpp +++ b/main.cpp @@ -29,6 +29,7 @@ #include "RandomWELL512a.h" #include "RandomWELL512a_SSE2.h" #include "WELL512a.h" +#include // Needed for memcmp(). void Benchmark() {