| ############################################################################## |
| # Customizing behavior: |
| # |
| # You may override default behavior in a global and project-specific |
| # Makefile.defs file. The global file is read from $(PHYSBAM_MAKEFILE_DEFS) |
| # (if that's defined) and the project-specific file is read from |
| # <current_dir>/Makefile.defs |
| ############################################################################## |
| # Variables you may want to override: |
| # |
| # EXTRA_DEFS: |
| # Extra -D<var> flags |
| # PLATFORM: |
| # Specifies platform (e.g. pentium, pentium4, nocona). |
| # TYPE: |
| # Specifies build type (e.g. release, debug, profile). Typically |
| # set by calling e.g. "make TYPE=debug" from commandline. |
| # MACHINE_FLAGS: |
| # e.g. -march=pentium4, see below for default. |
| # WARNING FLAGS: |
| # e.g. -Wall, see below for default. |
| # USE_* and HAVE_* flags: |
| # See below |
| ############################################################################## |
| # Note about USE_* and HAVE_* flags: |
| # |
| # Project specifies which libraries it uses (either requires or makes |
| # optional) with the USE_* flags in the project's Makefile. |
| # e.g. USE_OPENGL=yes means the project needs/wants opengl support. |
| # |
| # Users/machines specify which libraries they have available with the HAVE_* |
| # flags. The default HAVE settings are below, and these can be overridden |
| # using the contents of the global $(PHYSBAM_MAKEFILE_DEFS) file or using the |
| # project specific Makefile.defs file. |
| # e.g. HAVE_OPENGL=yes means opengl is available on the current machine. |
| ############################################################################## |
| # Note about single and multiple targets: |
| # |
| # If TARGETS contains a single target then the main source file used will be |
| # $(MAIN_SRC) (or main.cpp by default) |
| # If TARGETS contains multiple files then each one's main source will be |
| # <target-name>.cpp |
| ############################################################################## |
| |
| SHELL = /bin/sh |
| |
| CC_FLAGS = $(CXXFLAGS) |
| |
| ifndef PHYSBAM_LIBDIR |
| ifndef PHYSBAM |
| PHYSBAM_LIBDIR = . |
| else |
| PHYSBAM_LIBDIR = $(PHYSBAM)/lib |
| endif |
| endif |
| |
| ifeq ($(TYPE),alpha) |
| # use Alpha threads library |
| USE_ALAMERE_PTHREADS=no |
| USE_ALAMERE_TASKQ=yes |
| else |
| # Alamere pthreads must be used to achieve scaling at low resolutions |
| # Alamere TaskQ should be enabled likewise |
| ifndef USE_ALAMERE_PTHREADS |
| USE_ALAMERE_PTHREADS=yes |
| endif |
| endif |
| |
| ifndef USE_ALAMERE_TASKQ |
| USE_ALAMERE_TASKQ=yes |
| endif |
| |
| ifeq ($(TYPE),noalamere) |
| USE_ALAMERE_PTHREADS=no |
| USE_ALAMERE_TASKQ=no |
| endif |
| |
| ifeq ($(TYPE),cachegrind) |
| # caveat: must run with environment variable PHYSBAM_THREADS = 1 |
| USE_ALAMERE_PTHREADS=no |
| USE_ALAMERE_TASKQ=no |
| CACHEGRIND_API_DIR = $(HOME)/cachegrind |
| PHYSBAM_CC = g++ |
| CC_FLAGS += -I$(CACHEGRIND_API_DIR) -DCACHEGRIND |
| LINK_FLAGS += -L$(CACHEGRIND_API_DIR) -lcachegrind |
| endif |
| |
| VTUNEAPIDIR =/opt/intel/vtune/rdc/analyzer |
| |
| ifeq ($(HOST),vpl11) |
| HAVE_VTUNE=yes |
| VTUNEAPIDIR = $(PHYSBAM)/VTune |
| SEPDIR = $(HOME)/sep |
| ifeq ($(ENABLE_VTUNE),yes) |
| # sampling library doesn't link with code compiled with icc 8.1 |
| PHYSBAM_CC = g++ |
| $(warning ***Enabling sampling support - compiling with g++***) |
| endif |
| endif |
| |
| #ifeq ($(HOST),vpl11) |
| #ENABLE_VTUNE=yes |
| #endif |
| |
| ifdef version |
| ifeq "$(version)" "pthreads" |
| # Using standard pthreads library |
| PTHREAD_CC_FLAGS = |
| PTHREAD_LINK_FLAGS = -pthread |
| endif |
| endif |
| |
| ifeq ($(USE_ALAMERE_TASKQ),yes) |
| TASKQ_DIR = $(PHYSBAM)/TaskQ |
| TASKQ_LIBDIR = $(TASKQ_DIR)/lib |
| TASKQ_INCLUDEDIR = $(TASKQ_DIR)/include |
| TASKQ_CC_FLAGS = -I$(TASKQ_INCLUDEDIR) -DUSE_ALAMERE_TASKQ |
| else |
| TASKQ_CC_FLAGS = |
| endif |
| |
| CC_FLAGS += $(PTHREAD_CC_FLAGS) $(TASKQ_CC_FLAGS) |
| |
| |
| ############################################################################## |
| # Default HAVE variables |
| ############################################################################## |
| |
| HAVE_OPENGL=yes |
| HAVE_FLTK=yes |
| HAVE_LIBJPEG=no |
| HAVE_FFTW=no |
| HAVE_OPENEXR=no |
| HAVE_COMPRESSION=no |
| |
| ############################################################################## |
| # Include global and local overrides |
| ############################################################################## |
| |
| ifdef PHYSBAM_MAKEFILE_DEFS |
| include $(PHYSBAM_MAKEFILE_DEFS) |
| endif |
| |
| -include Makefile.defs |
| |
| ############################################################################## |
| # Default build type and corresponding suffix |
| ############################################################################## |
| |
| ifndef PLATFORM |
| # Pseudo-platform to use for PARSEC release |
| PLATFORM = parsec |
| endif |
| |
| ifndef TYPE |
| TYPE = release |
| endif |
| |
| PLATFORM_SUFFIX := |
| TYPE_SUFFIX := |
| # SUFFIX is added to the executable name and the object directory |
| ifndef SUFFIX |
| ifneq ($(PLATFORM),pentium4) |
| PLATFORM_SUFFIX := _$(PLATFORM) |
| endif |
| ifneq ($(TYPE),release) |
| TYPE_SUFFIX := _$(TYPE) |
| endif |
| SUFFIX := $(PLATFORM_SUFFIX)$(TYPE_SUFFIX) |
| endif |
| |
| # Do not use a SUFFIX, PARSEC takes care of that |
| SUFFIX := |
| |
| ############################################################################## |
| # Default compiler |
| ############################################################################## |
| |
| ### x86 version ### |
| ifeq ($(USE_ALAMERE_TASKQ),yes) |
| LINK_FLAGS += $(TASKQ_LIBDIR)/taskQ.o |
| endif |
| ifeq ($(ENABLE_VTUNE),yes) |
| ifeq ($(HOST),vpl11) |
| CC_FLAGS += -I$(SEPDIR)/include -DENABLE_VTUNE |
| LINK_FLAGS += -L$(SEPDIR)/bin -lsampling |
| else |
| CC_FLAGS += -I$(VTUNEAPIDIR)/include -DENABLE_VTUNE |
| LINK_FLAGS += -L$(VTUNEAPIDIR)/bin -lVtuneApi -ldl |
| endif |
| endif |
| |
| ifndef PHYSBAM_CC |
| PHYSBAM_CC = $(CXX) |
| endif |
| |
| ifndef PHYSBAM_CC_DEPEND |
| PHYSBAM_CC_DEPEND = $(PHYSBAM_CC) |
| # PHYSBAM_CC_DEPEND = g++ |
| endif |
| |
| ifndef CC_DEPEND_FLAGS |
| CC_DEPEND_FLAGS = $(PTHREAD_CC_FLAGS) $(TASKQ_CC_FLAGS) |
| endif |
| |
| ifeq ($(HAVE_VTUNE),yes) |
| CC_DEPEND_FLAGS += -I$(VTUNEAPIDIR) -I$(SEPDIR)/include |
| endif |
| |
| # Link rules |
| LINK = $(PHYSBAM_CC) |
| ifndef AR |
| AR = ar |
| endif |
| ifeq ($(PHYSBAM_CC),icc) |
| LINK_FLAGS += -Kc++ $(PTHREAD_LINK_FLAGS) |
| CC_FLAGS += -D__thread=___thread |
| else |
| LINK_FLAGS += $(PTHREAD_LINK_FLAGS) |
| endif |
| ############################################################################## |
| # Default flags |
| ############################################################################## |
| |
| # Warning flags |
| ifndef WARNING_FLAGS |
| ifeq ($(findstring icc,$(PHYSBAM_CC)),) |
| WARNING_FLAGS = -w |
| else |
| WARNING_FLAGS = -w |
| endif |
| endif |
| CC_FLAGS += $(WARNING_FLAGS) |
| |
| # gcc with icc settings |
| ifneq ($(findstring icc,$(PHYSBAM_CC)),) |
| # CC_FLAGS += -cxxlib-gcc=/n/form/data/gcc-3.4 |
| # LINK_FLAGS += -cxxlib-gcc=/n/form/data/gcc-3.4 |
| # XXX mjh - duplicates other stuff XXX |
| ifdef USE_ALAMERE_THREADS |
| CC_FLAGS += -cxxlib-icc -Kc++ -DUSE_ALAMERE_THREADS -I/home/skuma16/alamereLib/include |
| LINK_FLAGS += -cxxlib-icc -Kc++ -L/home/skuma16/alamereLib/lib -lpthread -ltaskQpthreads |
| else |
| CC_FLAGS += -cxxlib-icc -Kc++ |
| LINK_FLAGS += -cxxlib-icc -Kc++ |
| endif |
| endif |
| |
| # Extra flags defined by user |
| CC_FLAGS += $(EXTRA_DEFS) |
| |
| LINK_FLAGS += -xW -lm -L$(PHYSBAM_LIBDIR) $(LDFLAGS) $(LIBS) |
| |
| # More type-specific flags (put quotes around strings so "debug" won't match "optdebug" |
| ifneq ($(findstring "$(TYPE)","release" "optdebug" "noalamere"),) |
| CC_FLAGS += -DNDEBUG |
| endif |
| |
| ifneq ($(findstring "$(TYPE)","debug" "optdebug"),) |
| CC_FLAGS += -g |
| LINK_FLAGS += -g |
| endif |
| |
| ifeq ($(TYPE),profile) |
| CC_FLAGS += -pg -fno-exceptions -DNDEBUG -O2 |
| LINK_FLAGS += -pg |
| endif |
| |
| ############################################################################## |
| # Libraries |
| ############################################################################## |
| |
| ifeq ($(USE_OPENGL)$(HAVE_OPENGL),yesyes) |
| LINK_LIBS += -lGL -lGLU -lglut -L/usr/X11R6/lib |
| endif |
| |
| ifeq ($(USE_FLTK)$(HAVE_FLTK),yesyes) |
| CC_FLAGS += -I/usr/X11R6/include |
| LINK_LIBS += -lfltk -L/usr/X11R6/lib -lXft |
| ifeq ($(USE_OPENGL)$(HAVE_OPENGL),yesyes) |
| LINK_LIBS += -lfltk_gl |
| endif |
| endif |
| |
| ifeq ($(USE_LIBJPEG)$(HAVE_LIBJPEG),yesyes) |
| CC_FLAGS += -DUSE_LIBJPEG |
| LINK_LIBS += -ljpeg |
| endif |
| |
| ifeq ($(USE_FFTW)$(HAVE_FFTW),yesyes) |
| CC_FLAGS += -DUSE_FFTW |
| LINK_LIBS += -lfftw3f -lfftw3 |
| endif |
| |
| ifeq ($(USE_OPENEXR)$(HAVE_OPENEXR),yesyes) |
| CC_FLAGS += -DUSE_OPENEXR -I$(PHYSBAM)/External_Libraries/OpenEXR/lib-linux/include/OpenEXR |
| # LINK_LIBS += -L$(PHYSBAM)/External_Libraries/OpenEXR/lib-linux/lib -lIlmImf -lImath -lHalf -lIex -lz |
| LINK_LIBS += $(PHYSBAM)/External_Libraries/OpenEXR/lib-linux/lib/libIlmImf.a \ |
| $(PHYSBAM)/External_Libraries/OpenEXR/lib-linux/lib/libImath.a \ |
| $(PHYSBAM)/External_Libraries/OpenEXR/lib-linux/lib/libHalf.a \ |
| $(PHYSBAM)/External_Libraries/OpenEXR/lib-linux/lib/libIex.a -lz |
| endif |
| |
| ifeq ($(USE_COMPRESSION)$(HAVE_COMPRESSION),yesyes) |
| CC_FLAGS += -DUSE_COMPRESSION |
| LINK_LIBS += -lgzstream$(PLATFORM_SUFFIX) -lz |
| endif |
| |
| ############################################################################## |
| # Build rules |
| ############################################################################## |
| |
| # Actual source location |
| SRC = $(LOCAL_SRC) |
| SRC += $(addprefix $(PUBLIC_LIBRARY_DIR)/,$(PUBLIC_LIBRARY_SRC)) |
| SRC += $(addprefix $(PERSONAL_LIBRARIES_DIR)/,$(PERSONAL_LIBRARIES_SRC)) |
| |
| # Location in build directory |
| MAPPED_SRC = $(LOCAL_SRC) |
| MAPPED_SRC += $(addprefix Public_Library/,$(PUBLIC_LIBRARY_SRC)) |
| MAPPED_SRC += $(addprefix Personal_Libraries/,$(PERSONAL_LIBRARIES_SRC)) |
| |
| OBJ_DIR = obj$(SUFFIX) |
| OBJ = $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(MAPPED_SRC)) |
| |
| ifeq ($(TARGET_TYPE),STATIC_LIBRARY) |
| |
| TARGET_NAMES = $(addsuffix $(SUFFIX).a,$(addprefix $(PHYSBAM_LIBDIR)/lib,$(TARGETS))) |
| |
| default: $(TARGET_NAMES) |
| |
| ifeq ($(words $(TARGETS)),1) # Single compilation target |
| |
| ALL_SRC = $(SRC) |
| ALL_MAPPED_SRC = $(MAPPED_SRC) |
| |
| $(TARGET_NAMES): %$(SUFFIX).a: $(OBJ) |
| mkdir -p $(PHYSBAM_LIBDIR) |
| rm -f $@ |
| $(AR) -r $@ $^ |
| else |
| |
| $(error "STATIC_LIBRARY does not support multiple targets") |
| |
| endif |
| |
| else |
| |
| TARGET_NAMES = $(addsuffix $(SUFFIX),$(TARGETS)) |
| LIBRARY_LINK_FLAGS = $(addsuffix $(SUFFIX),$(addprefix -l,$(LIBRARIES))) |
| LIBRARY_FILES = $(addsuffix $(SUFFIX).a,$(addprefix $(PHYSBAM_LIBDIR)/lib,$(LIBRARIES))) |
| LIBRARY_BUILD = $(addprefix BUILD_,$(LIBRARIES)) |
| |
| default: $(TARGET_NAMES) |
| |
| ifeq ($(words $(TARGETS)),1) # Single compilation target |
| |
| ifndef MAIN_SRC |
| MAIN_SRC = main.cpp |
| endif |
| ALL_SRC = $(MAIN_SRC) $(SRC) |
| ALL_MAPPED_SRC = $(MAIN_SRC) $(MAPPED_SRC) |
| MAIN_OBJ = $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(MAIN_SRC)) |
| |
| $(TARGET_NAMES): %$(SUFFIX): $(LIBRARY_FILES) $(MAIN_OBJ) $(OBJ) |
| $(LINK) -Wl,-o,$@ $(MAIN_OBJ) $(OBJ) $(LIBRARY_LINK_FLAGS) $(LINK_LIBS) $(LINK_FLAGS) |
| |
| else # Multiple compilation targets |
| |
| MAIN_SRC = $(addsuffix .cpp,$(TARGETS)) |
| ALL_SRC = $(MAIN_SRC) $(SRC) |
| ALL_MAPPED_SRC = $(MAIN_SRC) $(MAPPED_SRC) |
| |
| $(TARGET_NAMES): %$(SUFFIX): $(LIBRARY_FILES) $(OBJ_DIR)/%.o $(OBJ) |
| $(LINK) $(LINK_FLAGS) -o $@ $(OBJ_DIR)/$*.o $(OBJ) $(LIBRARY_LINK_FLAGS) $(LINK_LIBS) |
| |
| endif |
| |
| # Libraries |
| # Use "-include" to force it to recursively build the libraries *before* we start processing the local target |
| .PHONY: $(LIBRARY_BUILD) |
| BUILD_PhysBAM: |
| cd $(PHYSBAM)/Public_Library && $(MAKE) -f Makefile.PhysBAM |
| BUILD_PhysBAM_OpenGL: |
| cd $(PHYSBAM)/Public_Library && $(MAKE) -f Makefile.PhysBAM_OpenGL |
| BUILD_Eran_Library: |
| cd $(PHYSBAM)/Personal_Libraries/Eran_Library && $(MAKE) |
| BUILD_LIBRARIES: $(LIBRARY_BUILD) |
| |
| ifndef LOCAL |
| ifeq ($(findstring $(MAKECMDGOALS),clean clean_depend clean_objects),) |
| -include BUILD_LIBRARIES |
| endif |
| endif |
| |
| endif |
| |
| # how to compile each file |
| .SUFFIXES: |
| $(OBJ_DIR)/Public_Library/%.o: $(PUBLIC_LIBRARY_DIR)/%.cpp |
| $(PHYSBAM_CC) -c $(CC_FLAGS) -o $@ $< |
| |
| $(OBJ_DIR)/Personal_Libraries/%.o: $(PERSONAL_LIBRARIES_DIR)/%.cpp |
| $(PHYSBAM_CC) -c $(CC_FLAGS) -o $@ $< |
| |
| $(OBJ_DIR)/%.o: |
| $(PHYSBAM_CC) -c $(CC_FLAGS) -o $@ $< |
| |
| ############################################################################## |
| # Automatic dependency generation |
| ############################################################################## |
| # NOTE: In theory we should be able to create dependencies as we compile the files |
| # by adding something like the following to the compile directives above: |
| # -Wp,-MM,-MP,-MF$(OBJ_DIR)/$*.d,-MT$(OBJ_DIR)/$*.o |
| # but distcc does not seem smart enough to handle these arguments so this won't work for now... |
| |
| ALL_DEPENDENCIES = $(addprefix $(OBJ_DIR)/,$(ALL_MAPPED_SRC:.cpp=.d)) |
| |
| $(OBJ_DIR)/Public_Library/%.d: $(PUBLIC_LIBRARY_DIR)/%.cpp |
| @set -e; mkdir -p $(dir $@); rm -f $@; \ |
| echo "Generating $*.d"; \ |
| $(PHYSBAM_CC_DEPEND) $(CC_DEPEND_FLAGS) -MP -MM -MT $(OBJ_DIR)/$*.o -MT $(OBJ_DIR)/$*.d $< > $@ || ( echo "*** Removing $*.d" && rm -f $@ ); |
| |
| $(OBJ_DIR)/Personal_Libraries/%.d: $(PERSONAL_LIBRARIES_DIR)/%.cpp |
| @set -e; mkdir -p $(dir $@); rm -f $@; \ |
| echo "Generating $*.d"; \ |
| $(PHYSBAM_CC_DEPEND) $(CC_DEPEND_FLAGS) -MP -MM -MT $(OBJ_DIR)/$*.o -MT $(OBJ_DIR)/$*.d $< > $@ || ( echo "*** Removing $*.d" && rm -f $@ ); |
| |
| $(OBJ_DIR)/%.d: %.cpp |
| @set -e; mkdir -p $(dir $@); rm -f $@; \ |
| echo "Generating $*.d"; \ |
| $(PHYSBAM_CC_DEPEND) $(CC_DEPEND_FLAGS) -MP -MM -MT $(OBJ_DIR)/$*.o -MT $(OBJ_DIR)/$*.d $< > $@ || ( echo "*** Removing $*.d" && rm -f $@ ); |
| |
| ifeq ($(findstring $(MAKECMDGOALS),clean clean_depend clean_objects touch_depend touch_objects),) |
| -include $(ALL_DEPENDENCIES) |
| endif |
| |
| ############################################################################## |
| # Clean and Install |
| ############################################################################## |
| |
| .PHONY: install clean clean_depend clean_objects |
| |
| ifdef PHYSBAM_INSTALL |
| install: |
| @echo "Installing in $(PHYSBAM_INSTALL)" |
| cp -f $(TARGET_NAMES) $(PHYSBAM_INSTALL) |
| endif |
| |
| clean: |
| -find $(OBJ_DIR) \( -name \*.o -or -name \*.d \) -exec rm {} \; |
| -rm -f $(TARGET_NAMES) *core |
| |
| clean_depend: |
| -find $(OBJ_DIR) -name \*.d -exec rm {} \; |
| |
| clean_objects: |
| -find $(OBJ_DIR) -name \*.o -exec rm {} \; |
| |
| touch_depend: |
| -find $(OBJ_DIR) -name \*.d -exec touch {} \; |
| |
| touch_objects: |
| -find $(OBJ_DIR) -name \*.o -exec touch {} \; |