diff --git a/src/build/Common.gmake b/src/build/Common.gmake new file mode 100644 index 0000000000000000000000000000000000000000..7791dc969d51b64984773d09a52e075929e094d0 --- /dev/null +++ b/src/build/Common.gmake @@ -0,0 +1,198 @@ +######################################################################### +# # +# Common macro setup for GNU make # +# # +# Common Build Macros REQUIRED: # +# SRC_ROOT - *MUST* be set to the src dir # +# # +# Common Build Macros Used: # +# DEBUG - Create a debug build # +# RELEASE - Create a release build # +# (Mutually exclusive, if both are set, RELEASE # +# is cleared) # +# DONT_CLOBBER_CC - Do not change the default setting of CC # +# OBJPATH_SUFFIX - Suffix appended to OBJPATH usefull for compiling # +# different options of the same source file # +# # +# Common Build Macros Defined: # +# OBJODIR - Object output dir # +# LIBODIR - Library output dir # +# EXEODIR - Executable output dir # +# DEBUG - Set for debug builds # +# RELEASE - Set for release builds # +# One of DEBUG or RELEASE is always set! # +# QUIET - Target command prefix to show/not show commands # +# (Toggled off by setting VERBOSE) # +# CFLAGS - Common C and C++ compiler flags # +# CCFLAGS - C specific compiler flags # +# CXXFLAGS - C++ specific compiler flags # +# LDFLAGS - Linker flags # +# CC - C compiler # +# CXX - C++ compiler # +# EXEFILE - Executable file extension (Includes .) # +# OFILE - Object file extension (Includes .) # +# SOFILE - Shared object (DLL) file extension (Includes .) # +# LIBFILE - Static library file extension (Include .) # +# LIBPREFIX - Prefix to library filename # +# LIBS - Library names (Appropriate for dependencies) # +# LIB_LDFLAGS - Libraries appropriate for link command-line usage # +# COMPILE_MSG - Message saying a target is being compiled # +# DIRSEP - The directory seperator this system likes most # +# VERSION - Synchronet version number in MAJOR.MINOR format # +# (Numeric ONLY) # +# # +######################################################################### + +# Set VERSION +ifndef VERSION + VERSION := 3.12 +endif + +# Set DEBUG +ifdef DEBUG + ifdef RELEASE + undef RELEASE + endif +endif + +ifndef DEBUG + ifndef RELEASE + DEBUG := 1 + endif +endif + +# VERBOSE/QUIET +ifndef VERBOSE + QUIET := @ +endif + +# Compiler-specific options +CFLAGS += -MMD +ifdef BUILD_DEPENDS + ifdef DONT_CLOBBER_CC + CC ?= gcc + else + CC := gcc + endif + CCPRE := $(CC) + CC := $(SRC_ROOT)/build/mkdep -a + CXX := $(SRC_ROOT)/build/mkdep -a + LD := echo + COMPILE_MSG := Depending +else + ifdef DONT_CLOBBER_CC + CC ?= gcc + else + CC := gcc + endif + CCPRE := $(CC) + CXX ?= g++ + LD ?= ld + COMPILE_MSG := Compiling +endif + +ifdef DEBUG + BUILD = debug +else + BUILD = release +endif +BUILDPATH ?= $(BUILD) + +# Get OS +ifndef os + os := $(shell uname) +endif +os := $(shell echo $(os) | tr '[A-Z]' '[a-z]' | tr ' ' '_') + +machine := $(shell if uname -m | egrep -v "(i[3456789]|x)86" > /dev/null; then uname -m | tr "[A-Z]" "[a-z]" | tr " " "_" ; fi) +ifeq ($(machine),sun4u) + CFLAGS += -D__BIG_ENDIAN__ +endif +ifeq ($(machine),) + machine := $(os) +else + machine := $(os).$(machine) +endif + +LIBODIR := $(CCPRE).$(machine).lib.$(BUILDPATH) +OBJODIR := $(CCPRE).$(machine).obj.$(BUILDPATH)$(OBJPATH_SUFFIX) +EXEODIR := $(CCPRE).$(machine).exe.$(BUILDPATH) +LDFLAGS += -L$(LIBODIR) + +ifeq ($(os),netbsd) + DELETE := rm -f +else + ifeq ($(os),openbsd) + DELETE := rm -f + else + ifeq ($(os),sunos) + DELETE := rm -f + else + DELETE = rm -fv + endif + endif +endif + +LIBPREFIX := lib +DIRSEP := / +OFILE := .o +EXEFILE := +SOFILE := .so +LIBFILE := .a + +ifeq ($(os),openbsd) + SOFILE := $(SOFILE)$(VERSION) +else + ifeq ($(os),darwin) + SOFILE = .dylib + endif +endif + +# OS Specific Flags +ifeq ($(os),sunos) # Solaris + CFLAGS += -D__solaris__ -DNEEDS_DAEMON -DNEEDS_FORKPTY -DNEEDS_SETENV -DNEEDS_CFMAKERAW +endif +ifeq ($(os),netbsd) # NetBSD + CFLAGS += -D__unix__ -I/usr/pkg/include -I/usr/pkg/pthreads/include -DNEEDS_FORKPTY +endif +ifeq ($(os),darwin) + CFLAGS += -D__unix__ -fno-common -D__DARWIN__ + LDFLAGS += -lm +endif + +ifdef DEBUG + CFLAGS += -ggdb + CFLAGS += -D_DEBUG +else # RELEASE + CFLAGS := -O3 $(CFLAGS) +endif + +-include targets.mk +-include $(SRC_ROOT)/rules.mk +-include objects.mk # defines $(OBJS) +-include libobjs.mk # defines $(LIB_OBJS) + +# Implicit C Compile Rule +$(OBJODIR)/%.o : %.c $(BUILD_DEPENDS) + @echo $(COMPILE_MSG) $< + $(QUIET)$(CC) $(CFLAGS) $(CCFLAGS) -o $@ -c $< + +# Implicit C++ Compile Rule +$(OBJODIR)/%.o : %.cpp $(BUILD_DEPENDS) + @echo $(COMPILE_MSG) $< + $(QUIET)$(CXX) $(CFLAGS) $(CXXFLAGS) -o $@ -c $< + +depend: + $(QUIET)$(DELETE) $(OBJODIR)/.depend + $(QUIET)$(DELETE) $(LIBODIR)/.depend + $(QUIET)$(DELETE) $(EXEODIR)/.depend + $(QUIET)$(MAKE) BUILD_DEPENDS=FORCE + +FORCE: + +-include $(OBJODIR)/.depend +-include $(LIBODIR)/.depend +-include $(EXEODIR)/.depend +-include $(OBJODIR)/*.d +-include $(LIBODIR)/*.d +-include $(EXEODIR)/*.d