################################################## # Makefile.std # Aaron Stump, Spring 1998 # Modified by Clark Barrett, Spring 2005 ################################################## ################################################## # # This Makefile can be included by other Makefiles # to get certain rules defined. This Makefile # assumes the following (items marked with # '**' cannot be left undefined, but all others # can be). Note that you should define at most one # of LIBRARY or EXECUTABLE # # ** 1. $(SRC) gives the names of all the # source (*.cpp) files for your target. # 2. $(OTHER_OBJ) gives the names of any # object files that should be linked in # with the executable or library but # not themselves built. # 3. $(HEADERS) gives the names of all # the header files for your target. # 4. $(EXECUTABLE) gives the name of the # executable you're trying to compile, # if you're trying to compile an # executable. # 5. $(LIBRARY) gives the name of the # library you're trying to compile, # if you're trying to compile a library. # 6. if $(OPTIMIZED) is defined, an optimized # target is built. Otherwise, a debug # target is built. # 7. The options listed below have defaults # that you may want to override. ################################################## # # To review: # # What rule should delete the dynamic cvc3 binary? clean or spotty # What rule should delete the dynamic libs? clean or spotty # What rule should delete the dynamic link libcvc3.dylib in libs? clean or spotty # What rule should delete logs? (regressions.log) clean or distclean # What rule should delete autoconf-generated files? distclean # (config.log, config.status, configure, autom4ta.cache) # What rule should delete configure-generated files? distclean # (those derived from *.in: # ./bin/cvc2smt.in ./bin/libmerge.in ./bin/run_tests.in ./doc/Doxyfile.in # ./doc/Makefile.in ./LICENSE.in ./Makefile.local.in) # test/Makefile's clean should delete test/obj/**/*.o, test/bin/**/test # testc/Makefile's clean ... # cleaning test1.cvc? # How about library version information? ################################################## ################################################## # Compute flags and platform based on options ################################################## #Default platform is generic ifndef PLATFORM PLATFORM = generic endif ifeq ($(OPTGDB),1) LOCAL_CXXFLAGS = -g DEBUG_PLATFORM = else ifeq ($(OPTIMIZED),1) LOCAL_CXXFLAGS = -O2 DEBUG_PLATFORM = else LOCAL_CXXFLAGS = -DDEBUG -g DEBUG_PLATFORM = -debug endif endif ifeq ($(GCOV),1) LOCAL_CXXFLAGS += -fprofile-arcs -ftest-coverage GTOOLS_PLATFORM = -gcov else ifeq ($(GPROF),1) LOCAL_CXXFLAGS += -pg GTOOLS_PLATFORM = -gprof endif endif PLATFORM_WITH_OPTIONS = $(PLATFORM)$(DEBUG_PLATFORM)$(GTOOLS_PLATFORM) ################################################## # Set variables to defaults if not already set ################################################## ifdef BASE_DIR SRC_DIR = $(BASE_DIR) OBJ_DIR = $(BASE_DIR)/obj/$(PLATFORM_WITH_OPTIONS) else BASE_DIR=$(TOP) endif ifndef SRC_DIR SRC_DIR = $(TOP)/src/$(MODULE) endif ifndef OBJ_DIR OBJ_DIR = $(TOP)/obj/$(MODULE)/$(PLATFORM_WITH_OPTIONS) endif ifndef EXE_DIR EXE_DIR=$(BASE_DIR)/bin/$(PLATFORM_WITH_OPTIONS) endif ifndef LIB_DIR LIB_DIR = $(TOP)/lib/$(PLATFORM_WITH_OPTIONS) endif #Default C++ suffix is cpp ifndef CPPSUFFIX CPPSUFFIX = cpp endif #Default compiler/linker is g++ ifndef CXX CXX = g++ endif #Default linker is same as CXX ifndef LD LD = $(CXX) endif #Default include directory is current directory ifndef INCLUDE_DIR INCLUDE_DIR=-I. endif #Default directory for link libraries is current directory ifndef LD_LIB_DIR LD_LIB_DIR=-L. endif #If TRANSIENT is defined, clean will remove those files #automatically. By default, no transient files. ifndef TRANSIENT TRANSIENT= endif LOCAL_CXXFLAGS += -Wall $(INCLUDE_DIR) ifdef EXTRAFLAGS LOCAL_CXXFLAGS += $(EXTRAFLAGS) endif ################################################## # Objects from Sources ################################################## OBJ = $(patsubst %.$(CPPSUFFIX), $(OBJ_DIR)/%.o, $(SRC)) $(OBJ_DIR)/%.o : %.$(CPPSUFFIX) @mkdir -p $(OBJ_DIR) $(CXX) $(CXXFLAGS) $(LOCAL_CXXFLAGS) $(CPPFLAGS) -c $< -o $@ ################################################## # executables and libraries ################################################## .PHONY: all depend clean real_clean spotty print_src ifeq ($(STATIC),1) STATIC_FLAG_TARGET = $(STATIC_FLAG) LIB_SUFFIX = $(STATIC_LIB_SUFFIX) EXE_DIR_STATIC_OR_DYNAMIC = $(EXE_DIR)/static else CXXFLAGS += $(DYNAMIC_FLAG) STATIC_FLAG_TARGET = LIB_SUFFIX = $(SHARED_LIB_SUFFIX) EXE_DIR_STATIC_OR_DYNAMIC = $(EXE_DIR) endif ifdef EXECUTABLE # Compile executable BUILD_SPECIFIC_TARGET = $(EXE_DIR_STATIC_OR_DYNAMIC)/$(EXECUTABLE) BUILD_INDEPENDENT_TARGET = $(BASE_DIR)/bin/$(EXECUTABLE) all: $(MAKE) $(BUILD_SPECIFIC_TARGET) @rm -f $(BUILD_INDEPENDENT_TARGET) ln -sf $(BUILD_SPECIFIC_TARGET) $(BUILD_INDEPENDENT_TARGET) $(BUILD_SPECIFIC_TARGET): $(OBJ) $(OTHER_OBJ) $(OTHER_DEPENDENCIES) @mkdir -p $(EXE_DIR_STATIC_OR_DYNAMIC) $(LD) $(STATIC_FLAG_TARGET) $(LOCAL_CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ) \ $(OTHER_OBJ) $(LD_LIB_DIR) $(LD_LIBS) else ifdef LIBRARY # Compile library SHARED_LIBRARY = $(patsubst %.$(STATIC_LIB_SUFFIX),%.$(SHARED_LIB_SUFFIX),$(LIBRARY)) STATIC_LIB_TARGET = $(LIB_DIR)/$(LIBRARY) SHARED_LIB_TARGET = $(LIB_DIR)/$(SHARED_LIBRARY) BUILD_SPECIFIC_TARGET = $(STATIC_LIB_TARGET) ifneq ($(STATIC),1) BUILD_SPECIFIC_TARGET += $(SHARED_LIB_TARGET) endif all: $(BUILD_SPECIFIC_TARGET) $(SHARED_LIB_TARGET): $(OBJ) $(OTHER_OBJ) @mkdir -p $(LIB_DIR) $(CXX) $(SHARED) -o $@ $(OBJ) $(OTHER_OBJ) $(STATIC_LIB_TARGET): $(OBJ) $(OTHER_OBJ) @mkdir -p $(LIB_DIR) ar ruvs $@ $(OBJ) $(OTHER_OBJ) @#ranlib $@ else LIB_OR_EXE = 0 endif endif ifeq ($(LIB_OR_EXE),0) else ################################################## # depend ################################################## MAKEFILE_DEPS=$(OBJ_DIR)/Makefile.deps MAKEFILE_DEPS_TMP=$(OBJ_DIR)/Makefile.tmp MAKEFILE_DEPS_TMP2=$(OBJ_DIR)/Makefile.tmp2 ifndef MY_DEPEND depend: $(SRC) $(HEADERS) $(OTHER_DEPEND) @mkdir -p $(OBJ_DIR) @-rm -f $(MAKEFILE_DEPS) $(MAKEFILE_DEPS_TMP) $(MAKEFILE_DEPS_TMP2) @echo '# Dependencies for C++ files' >> $(MAKEFILE_DEPS_TMP) @echo >> $(MAKEFILE_DEPS_TMP) @echo "Making dependencies for $(SRC)" $(CXX) -M $(CXXFLAGS) $(LOCAL_CXXFLAGS) $(CPPFLAGS) $(SRC) >> $(MAKEFILE_DEPS_TMP) @echo >> $(MAKEFILE_DEPS_TMP) @sed -e '/^.*:/ s#^#$(OBJ_DIR)/#' < $(MAKEFILE_DEPS_TMP) > $(MAKEFILE_DEPS_TMP2) @cat $(MAKEFILE_DEPS_TMP2) > $(MAKEFILE_DEPS) @rm -f $(MAKEFILE_DEPS_TMP) $(MAKEFILE_DEPS_TMP2) endif $(MAKEFILE_DEPS): $(SRC) $(HEADERS) $(OTHER_DEPENDENCY_MAKEFILES) @mkdir -p $(OBJ_DIR) @touch $(MAKEFILE_DEPS) @$(MAKE) --no-print-directory depend ################################################## # clean # # Remove all generated files. ################################################## clean: $(MAKEFILE_DEPS) rm -f $(OBJ) $(BUILD_SPECIFIC_TARGET) $(TRANSIENT) $(MAKEFILE_DEPS) \ $(MAKEFILE_DEPS_TMP) $(MAKEFILE_DEPS_TMP2) $(BUILD_INDEPENDENT_TARGET) distclean: rm -f $(TRANSIENT) ################################################## # spotty # # Remove just the executable or library ################################################## spotty: rm -f $(BUILD_SPECIFIC_TARGET) $(BUILD_INDEPENDENT_TARGET) ################################################## # print_src # # Print all the source files (*.cpp and *.h) for the module ################################################## ifndef FILELIST FILELIST = /dev/null endif # Normally, *.cpp files are the sources. However, if SRC includes # dynamically generated files (e.g. parser files from *.lex and # *.yacc), then SRC_ORIG must be defined to include the true source # files. ifndef SRC_ORIG SRC_ORIG = $(SRC) endif print_src: echo "Collecting files from " src/$(MODULE) @echo $(patsubst %, src/$(MODULE)/%, $(SRC_ORIG)) \ $(patsubst %, src/$(MODULE)/%, $(HEADERS)) \ src/$(MODULE)/Makefile \ >> $(FILELIST) include $(MAKEFILE_DEPS) endif