| # -*- Makefile -*- |
| # |
| # $Id$ |
| # |
| # common makefile definitions shared by all GNUmakefile.* |
| # |
| ######################################################################## |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed |
| # with this work for additional information regarding copyright |
| # ownership. The ASF licenses this file to you under the Apache |
| # License, Version 2.0 (the "License"); you may not use this file |
| # except in compliance with the License. You may obtain a copy of |
| # the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| # implied. See the License for the specific language governing |
| # permissions and limitations under the License. |
| # |
| # Copyright 1999-2007 Rogue Wave Software, Inc. |
| # |
| ######################################################################## |
| |
| SHELL = /bin/sh |
| |
| # specify path to find to avoid problems with example named 'find' |
| FIND = /usr/bin/find |
| |
| # set common variables used in makefiles |
| BINDIR = $(BUILDDIR)/bin |
| LIBDIR = $(BUILDDIR)/lib |
| |
| # provide a value if it isn't already set by make |
| ifeq ($(CURDIR),) |
| CURDIR := $(shell pwd) |
| endif |
| |
| INCLUDES = -I$(TOPDIR)/include -I$(BUILDDIR)/include |
| |
| ALL_FILES := "*" |
| |
| ifneq ($(AS_EXT),"") |
| ifneq ($(AS_EXT),".") # special value -- ignore atomic |
| |
| # if the assembly file extension is non-empty and not the dot, |
| # add all files with that extension to the list of files to |
| # compile |
| ALL_FILES := $(foreach dir,$(SRCDIRS),\ |
| $(wildcard $(dir)/*.cpp $(dir)/*.msg $(dir)/*$(AS_EXT))) |
| endif |
| endif |
| |
| ifeq ($(ALL_FILES),"*") |
| # traverse all subdirectories and get the names of all source files |
| ALL_FILES := $(foreach dir,$(SRCDIRS), $(wildcard $(dir)/*.cpp $(dir)/*.msg)) |
| endif |
| |
| |
| # SRCDIRS must be defined in GNUmakefile that includes this file |
| ifeq ($(ONE_REPOSITORY),) |
| |
| # using a separate template instantiation repository for each source |
| # and object file (i.e., when each source produces one executable) |
| ifneq ($(CXX_REPOSITORY),) |
| |
| # define a function, CXX.repo, that returns the name of the template |
| # instantiation repository from the name of a source or object file |
| # and a unique suffix (so that each program has its own and the same |
| # names with different definitions do not cause conflicts) |
| # |
| # e.g., Compaq C++ where this will expand to something like |
| # -ptr foo.ti |
| # or IBM VisualAge/XLC++ where it will be along the lines of |
| # --qtempinc=foo.ti |
| # or |
| # --qtemplateregistry=foo.ti |
| # |
| ifeq ($(findstring =,$(CXX_REPOSITORY)),=) |
| CXX.repo = $(CXX_REPOSITORY)$(basename $(notdir $(1))).ti |
| else |
| CXX.repo = $(CXX_REPOSITORY) $(basename $(notdir $(1))).ti |
| endif |
| else # ifeq ($(CXX_REPOSITORY),) |
| ifeq ($(CXX),CC) |
| ifeq ($(findstring SunOS,$(PLATFORM)),SunOS) |
| # set SUNWS_CACHE_NAME to the basename of the file being compiled |
| # followed by .ti, to override the default template repository, |
| # SunWS_cache |
| tmp := $(CXX) |
| CXX = |
| CXX += SUNWS_CACHE_NAME=$(*F).ti |
| CXX += $(tmp) |
| |
| tmp := $(LD) |
| LD = |
| LD += SUNWS_CACHE_NAME=$(*F).ti |
| LD += $(tmp) |
| endif # SunOS |
| endif # SunPro |
| endif # neq ($(CXX_REPOSITORY),) |
| else # ifneq ($(ONE_REPOSITORY),) |
| ifneq ($(CXX_REPOSITORY),) |
| |
| # using a template instantiation repository shared by all sources |
| # (i.e., when creating a single executable or library out of all |
| # the object files |
| ifeq ($(findstring =,$(CXX_REPOSITORY)),=) |
| CXX.repo = $(CXX_REPOSITORY)repository.ti |
| else |
| CXX.repo = $(CXX_REPOSITORY) repository.ti |
| endif |
| endif |
| endif |
| |
| CPPFLAGS += $(INCLUDES) |
| CXXFLAGS += $(WARNFLAGS) |
| |
| VPATH := $(SRCDIRS) |
| |
| SRCS := $(notdir $(filter %.cpp %$(AS_EXT),$(ALL_FILES))) |
| SRCS := $(sort $(filter-out $(OMIT_SRCS),$(SRCS))) |
| |
| OBJS := $(patsubst %.cpp,%.o,$(filter %.cpp,$(SRCS))) |
| OBJS += $(patsubst %$(AS_EXT),%.o,$(filter %$(AS_EXT),$(SRCS))) |
| OBJS := $(sort $(OBJS)) |
| |
| DEPS := |
| |
| # message files - text files used to generate a catalog - see gencat(1) |
| MSGFILES = $(filter %.msg,$(ALL_FILES)) |
| |
| |
| ifeq ($(TARGET),) |
| # generate binaries or scripts (in constrained environments) |
| ifeq ($(NO_A_DOT_OUT),) |
| TARGET := $(patsubst %.o,%,$(OBJS)) |
| else |
| TARGET := $(patsubst %.o,%.sh,$(OBJS)) |
| endif |
| endif #ifneq ($(TARGET),) |
| |
| # link with the produced library and the math library |
| # (take care not to try to link the library with itself) |
| ifeq ($(findstring $(LIBNAME),$(TARGET)),) |
| LDFLAGS += -L$(LIBDIR) |
| # set the GNU make variable LDLIBS to the names of the libraries |
| # to link with (make puts $(LDLIBS) last on the link line in |
| # implicit rules) |
| LDLIBS := -l$(LIBBASE) $(LDLIBS) -lm |
| endif # ifneq ($(LIBNAME),$findstring ($(LIBNAME),$(TARGET))) |
| |
| |
| # file to write log of the build to |
| LOGFILE = /dev/null |
| |
| # if LOGFILE is being created, tee command output into it |
| # IMPORTANT: $(TEEOPTS) must be last on the command line |
| ifneq ($(LOGFILE),/dev/null) |
| TEEOPTS = 2>&1 | tee -a $(LOGFILE) |
| endif |
| |
| # set the RUNTARGET variable to command line args if $RUN isn't set |
| ifeq ($(RUN),) |
| RUNTARGET := $(filter-out run_all runall run,$(MAKECMDGOALS)) |
| else |
| RUNTARGET := $(RUN) |
| endif |
| |
| ifeq ($(RUNTARGET),) |
| RUNTARGET := $(shell echo ./$(TARGET) | sed "s/ / .\//g") |
| endif |
| |
| |
| # append command line options to standard flags |
| CPPFLAGS += $(CPPOPTS) |
| CXXFLAGS += $(CXXOPTS) |
| LDFLAGS += $(LDOPTS) |
| ARFLAGS += $(AROPTS) |
| RUNFLAGS += $(RUNOPTS) |