Newer
Older
#===-- Makefile.common - Common make rules for LLVM -------*- makefile -*--====
#
# This file is included by all of the LLVM makefiles. This file defines common
# rules to do things like compile a .cpp file or generate dependancy info.
# These are platform dependant, so this is the file used to specify these
# system dependant operations.
#
# The following functionality can be set by setting incoming variables.
# The variable $(LEVEL) *must* be set:
#
# 1. LEVEL - The level of the current subdirectory from the top of the
# MagicStats view. This level should be expressed as a path, for
# example, ../.. for two levels deep.
#
# 2. DIRS - A list of subdirectories to be built. Fake targets are set up
# so that each of the targets "all", "install", and "clean" each build
# the subdirectories before the local target. DIRS are guaranteed to be
# built in order.
# 3. PARALLEL_DIRS - A list of subdirectories to be built, but that may be
# built in any order. All DIRS are built in order before PARALLEL_DIRS are
# built, which are then built in any order.
#
# 4. Source - If specified, this sets the source code filenames. If this
# is not set, it defaults to be all of the .cpp, .c, .y, and .l files
# in the current directory. Also, if you want to build files in addition
# to the local files, you can use the ExtraSource variable
# 5. SourceDir - If specified, this specifies a directory that the source files
# are in, if they are not in the current directory. This should include a
# trailing / character.
#
# 6. PROJ_COMPILE - If set to 1, then this makefile can also be used to
# compile other projects using llvm. Note if this option is set then the
# following *must* hold
# PROJLEVEL should be set to the top of the source directory for the
# project files
# LEVEL should be set to the top of LLVM source tree
# LLVM_LIB_DIR should be set to the top of the LLVM build tree
#
#
#===-----------------------------------------------------------------------====
# Configuration file to set paths specific to local installation of LLVM
#
include $(LEVEL)/Makefile.config
John Criswell
committed
###########################################################################
# Directory Configuration
# This section of the Makefile determines what is where. To be
# specific, there are several locations that need to be defined:
#
John Criswell
committed
# o LLVM_SRC_ROOT : The root directory of the LLVM source code.
# o LLVM_OBJ_ROOT : The root directory containing the built LLVM code.
#
# o BUILD_SRC_DIR : The directory containing the code to build.
# o BUILD_SRC_ROOT : The root directory of the code to build.
#
# o BUILD_OBJ_DIR : The directory in which compiled code will be placed.
# o BUILD_OBJ_ROOT : The root directory in which compiled code is placed.
#
###########################################################################
John Criswell
committed
#
# Set the source build directory. That is almost always the current directory.
#
ifndef BUILD_SRC_DIR
BUILD_SRC_DIR = $(shell pwd)
Chris Lattner
committed
endif
John Criswell
committed
# Set the source root directory.
#
ifndef BUILD_SRC_ROOT
BUILD_SRC_ROOT = $(BUILD_SRC_DIR)/$(LEVEL)
endif
John Criswell
committed
#
# Set the object build directory. Its location depends upon the source path
# and where object files should go.
#
ifndef BUILD_OBJ_DIR
ifeq ($(OBJ_ROOT),.)
BUILD_OBJ_DIR = $(shell pwd)
John Criswell
committed
BUILD_OBJ_DIR := $(OBJ_ROOT)$(patsubst $(HOME)%,%,$(shell cd $(BUILD_SRC_DIR); pwd))
endif
endif
John Criswell
committed
#
# Set the root of the object directory.
#
ifndef BUILD_OBJ_ROOT
ifeq ($(OBJ_ROOT),.)
BUILD_OBJ_ROOT = $(shell cd $(LEVEL); pwd)
John Criswell
committed
BUILD_OBJ_ROOT := $(OBJ_ROOT)$(patsubst $(HOME)%,%,$(shell cd $(LEVEL); pwd))
endif
endif
John Criswell
committed
#
# Set the LLVM source directory.
# It is typically the root directory of what we're compiling now.
#
ifndef LLVM_SRC_ROOT
LLVM_SRC_ROOT = $(BUILD_SRC_ROOT)
endif
John Criswell
committed
# Set the LLVM object directory.
#
ifndef LLVM_OBJ_ROOT
LLVM_OBJ_ROOT = $(BUILD_OBJ_ROOT)
John Criswell
committed
# Figure out how to do platform specific stuff on this platform. This is really
# gross and should be autoconfiscated (automake actually), but should hopefully
# work on Linux and solaris (SunOS).
#
UNAME := $(shell uname)
include $(LLVM_SRC_ROOT)/Makefile.$(UNAME)
ifdef SHARED_LIBRARY
# if SHARED_LIBRARY is specified, the default is to build the dynamic lib
dynamic ::
John Criswell
committed
# Default Rule: Make sure it's also a :: rule
all ::
John Criswell
committed
# Default for install is to at least build everything...
install ::
John Criswell
committed
# Default rule for test. It ensures everything has a test rule
test::
#--------------------------------------------------------------------
# Variables derived from configuration options...
#--------------------------------------------------------------------
#BinInstDir=/usr/local/bin
#LibInstDir=/usr/local/lib/xxx
John Criswell
committed
PURIFY := $(PURIFY) -cache-dir="$(BUILD_OBJ_ROOT)/../purifycache" -chain-length="30" -messages=all
Chris Lattner
committed
ifdef ENABLE_PROFILING
ENABLE_OPTIMIZED = 1
CONFIGURATION := Profile
else
ifdef ENABLE_OPTIMIZED
CONFIGURATION := Release
else
CONFIGURATION := Debug
endif
endif
John Criswell
committed
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
###########################################################################
# Library Locations
# These variables describe various library locations:
#
# DEST* = Location of where libraries that are built will be placed.
# LLVM* = Location of LLVM libraries used for linking.
# PROJ* = Location of previously built libraries used for linking.
###########################################################################
# Libraries that are being built
DESTLIBDEBUG := $(BUILD_OBJ_ROOT)/lib/Debug
DESTLIBRELEASE := $(BUILD_OBJ_ROOT)/lib/Release
DESTLIBPROFILE := $(BUILD_OBJ_ROOT)/lib/Profile
DESTLIBCURRENT := $(BUILD_OBJ_ROOT)/lib/$(CONFIGURATION)
# LLVM libraries used for linking
LLVMLIBDEBUGSOURCE := $(LLVM_OBJ_ROOT)/lib/Debug
LLVMLIBRELEASESOURCE := $(LLVM_OBJ_ROOT)/lib/Release
LLVMLIBPROFILESOURCE := $(LLVM_OBJ_ROOT)/lib/Profile
LLVMLIBCURRENTSOURCE := $(LLVM_OBJ_ROOT)/lib/$(CONFIGURATION)
# Libraries that were built that will now be used for linking
PROJLIBDEBUGSOURCE := $(BUILD_OBJ_ROOT)/lib/Debug
PROJLIBRELEASESOURCE := $(BUILD_OBJ_ROOT)/lib/Release
PROJLIBPROFILESOURCE := $(BUILD_OBJ_ROOT)/lib/Profile
PROJLIBCURRENTSOURCE := $(BUILD_OBJ_ROOT)/lib/$(CONFIGURATION)
###########################################################################
# Tool Locations
# These variables describe various tool locations:
#
# DEST* = Location of where tools that are built will be placed.
# LLVM* = Location of LLVM tools used for building.
# PROJ* = Location of previously built tools used for linking.
###########################################################################
DESTTOOLDEBUG := $(BUILD_OBJ_ROOT)/tools/Debug
DESTTOOLRELEASE := $(BUILD_OBJ_ROOT)/tools/Release
DESTTOOLPROFILE := $(BUILD_OBJ_ROOT)/tools/Profile
DESTTOOLCURRENT := $(BUILD_OBJ_ROOT)/tools/$(CONFIGURATION)
LLVMTOOLDEBUG := $(LLVM_OBJ_ROOT)/tools/Debug
LLVMTOOLRELEASE := $(LLVM_OBJ_ROOT)/tools/Release
LLVMTOOLPROFILE := $(LLVM_OBJ_ROOT)/tools/Profile
LLVMTOOLCURRENT := $(LLVM_OBJ_ROOT)/tools/$(CONFIGURATION)
PROJTOOLDEBUG := $(BUILD_OBJ_ROOT)/tools/Debug
PROJTOOLRELEASE := $(BUILD_OBJ_ROOT)/tools/Release
PROJTOOLPROFILE := $(BUILD_OBJ_ROOT)/tools/Profile
PROJTOOLCURRENT := $(BUILD_OBJ_ROOT)/tools/$(CONFIGURATION)
# Verbosity levels
Chris Lattner
committed
ifndef VERBOSE
VERB := @
endif
#---------------------------------------------------------
# Compilation options...
#---------------------------------------------------------
John Criswell
committed
###########################################################################
# Special tools used while building the LLVM tree. Burg is built as part of the
# utils directory.
John Criswell
committed
###########################################################################
BURG := $(LLVMTOOLCURRENT)/burg
RunBurg := $(BURG) $(BURG_OPTS)
John Criswell
committed
TBLGEN := $(LLVMTOOLCURRENT)/tblgen
Vikram S. Adve
committed
# This automatically enables optimized builds.
Chris Lattner
committed
ifdef ENABLE_PROFILING
Vikram S. Adve
committed
PROFILE = -pg
Chris Lattner
committed
endif
John Criswell
committed
###########################################################################
# Compile Time Flags
###########################################################################
#
# Include both the project headers and the LLVM headers for compilation
#
CPPFLAGS += -I$(BUILD_SRC_ROOT)/include -I$(LLVM_SRC_ROOT)/include
# By default, strip symbol information from executable
Chris Lattner
committed
ifndef KEEP_SYMBOLS
STRIP = $(PLATFORMSTRIPOPTS)
STRIP_WARN_MSG = "(without symbols) "
endif
# Allow gnu extensions...
CPPFLAGS += -D_GNU_SOURCE
John Criswell
committed
CompileCommonOpts := -Wall -W -Wwrite-strings -Wno-unused -I$(LEVEL)/include
CompileOptimizeOpts := -O3 -DNDEBUG -finline-functions -fshort-enums
Compile := $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(CompileCommonOpts)
CompileG := $(Compile) -g -D_DEBUG
CompileO := $(Compile) $(CompileOptimizeOpts) -felide-constructors -fomit-frame-pointer
CompileP := $(Compile) $(CompileOptimizeOpts) -felide-constructors $(PROFILE)
# Compile a c file, don't link...
CompileC := $(CC) -c $(CPPFLAGS) $(CCFLAGS) $(CompileCommonOpts)
CompileCG := $(CompileC) -g -D_DEBUG
CompileCO := $(CompileC) $(CompileOptimizeOpts) -fomit-frame-pointer
CompileCP := $(CompileC) $(CompileOptimizeOpts) $(PROFILE)
ifdef ENABLE_PURIFY # To enable purify, build with 'gmake ENABLE_PURIFY=1'
Vikram S. Adve
committed
Link := $(PURIFY) $(CXX) -static
else
Vikram S. Adve
committed
Link := $(CXX)
endif
# include both projlib source and llvmlib source
LinkG := $(Link) -g -L$(PROJLIBDEBUGSOURCE) -L$(LLVMLIBDEBUGSOURCE) $(STRIP)
LinkO := $(Link) -O3 -L$(PROJLIBRELEASESOURCE) -L$(LLVMLIBRELEASESOURCE)
LinkP := $(Link) -O3 -L$(PROJLIBPROFILESOURCE) -L$(LLVMLIBPROFILESOURCE) $(PROFILE)
else
LinkG := $(Link) -g -L$(LLVMLIBDEBUGSOURCE) $(STRIP)
LinkO := $(Link) -O3 -L$(LLVMLIBRELEASESOURCE)
LinkP := $(Link) -O3 -L$(LLVMLIBPROFILESOURCE) $(PROFILE)
endif
# Create one .o file from a bunch of .o files...
Relink = ${LD} -r
# MakeSO - Create a .so file from a .o files...
Vikram S. Adve
committed
MakeSO := $(CXX) $(MakeSharedObjectOption)
MakeSOO := $(MakeSO) -O3
Vikram S. Adve
committed
MakeSOP := $(MakeSOO) $(PROFILE)
# Create dependancy file from CPP file, send to stdout.
John Criswell
committed
Depend := $(CXX) -MM -I$(LEVEL)/include $(CPPFLAGS)
DependC := $(CC) -MM -I$(LEVEL)/include $(CPPFLAGS)
AR = ${AR_PATH} cq
#----------------------------------------------------------
# Source includes all of the cpp files, and objects are derived from the
# source files...
# The local Makefile can list other Source files via ExtraSource = ...
ifndef Source
Source := $(ExtraSource) $(wildcard *.cpp *.c *.y *.l)
Objs := $(sort $(patsubst Debug/%.o, %.o, $(addsuffix .o,$(notdir $(basename $(Source))))))
John Criswell
committed
ObjectsO := $(addprefix $(BUILD_OBJ_DIR)/Release/,$(Objs))
ObjectsP := $(addprefix $(BUILD_OBJ_DIR)/Profile/,$(Objs))
ObjectsG := $(addprefix $(BUILD_OBJ_DIR)/Debug/,$(Objs))
#---------------------------------------------------------
# Handle the DIRS and PARALLEL_DIRS options
#---------------------------------------------------------
$(VERB) for dir in ${DIRS}; do \
(cd $$dir; $(MAKE) $@) || exit 1; \
done
# Handle PARALLEL_DIRS
ifdef PARALLEL_DIRS
all :: $(addsuffix /.makeall , $(PARALLEL_DIRS))
install :: $(addsuffix /.makeinstall, $(PARALLEL_DIRS))
clean :: $(addsuffix /.makeclean , $(PARALLEL_DIRS))
test :: $(addsuffix /.maketest , $(PARALLEL_DIRS))
%/.makeall %/.makeinstall %/.makeclean %/.maketest:
$(VERB) cd $(@D); $(MAKE) $(subst $(@D)/.make,,$@)
endif
#---------------------------------------------------------
# Handle the LIBRARYNAME option - used when building libs...
#---------------------------------------------------------
#
# When libraries are built, they are allowed to optionally define the
# DONT_BUILD_RELINKED make variable, which, when defined, prevents a .o file
# from being built for the library. This .o files may then be linked to by a
# tool if the tool does not need (or want) the semantics a .a file provides
# (linking in only object files that are "needed"). If a library is never to
# be used in this way, it is better to define DONT_BUILD_RELINKED, and define
# BUILD_ARCHIVE instead.
#
# Some libraries must be built as .a files (libscalar for example) because if
# it's built as a .o file, then all of the constituent .o files in it will be
# linked into tools (for example gccas) even if they only use one of the parts
# of it. For this reason, sometimes it's useful to use libraries as .a files.
# Make sure there isn't any extranous whitespace on the LIBRARYNAME option
LIBRARYNAME := $(strip $(LIBRARYNAME))
LIBNAME_O := $(DESTLIBRELEASE)/lib$(LIBRARYNAME).so
LIBNAME_P := $(DESTLIBPROFILE)/lib$(LIBRARYNAME).so
LIBNAME_G := $(DESTLIBDEBUG)/lib$(LIBRARYNAME).so
LIBNAME_AO := $(DESTLIBRELEASE)/lib$(LIBRARYNAME).a
LIBNAME_AP := $(DESTLIBPROFILE)/lib$(LIBRARYNAME).a
LIBNAME_AG := $(DESTLIBDEBUG)/lib$(LIBRARYNAME).a
LIBNAME_OBJO := $(DESTLIBRELEASE)/$(LIBRARYNAME).o
LIBNAME_OBJP := $(DESTLIBPROFILE)/$(LIBRARYNAME).o
LIBNAME_OBJG := $(DESTLIBDEBUG)/$(LIBRARYNAME).o
Chris Lattner
committed
# dynamic target builds a shared object version of the library...
dynamic:: $(DESTLIBCURRENT)/lib$(LIBRARYNAME).so
Chris Lattner
committed
# Does the library want a .o version built?
all:: $(DESTLIBCURRENT)/$(LIBRARYNAME).o
Chris Lattner
committed
# Does the library want an archive version built?
ifdef BUILD_ARCHIVE
all:: $(DESTLIBCURRENT)/lib$(LIBRARYNAME).a
$(LIBNAME_O): $(ObjectsO) $(LibSubDirs) $(DESTLIBRELEASE)/.dir
@echo ======= Linking $(LIBRARYNAME) release library =======
$(VERB) $(MakeSOO) -o $@ $(ObjectsO) $(LibSubDirs) $(LibLinkOpts)
$(LIBNAME_P): $(ObjectsP) $(LibSubDirs) $(DESTLIBPROFILE)/.dir
Vikram S. Adve
committed
@echo ======= Linking $(LIBRARYNAME) profile library =======
$(VERB) $(MakeSOP) -o $@ $(ObjectsP) $(LibSubDirs) $(LibLinkOpts)
$(LIBNAME_G): $(ObjectsG) $(LibSubDirs) $(DESTLIBDEBUG)/.dir
@echo ======= Linking $(LIBRARYNAME) debug library =======
$(VERB) $(MakeSO) -g -o $@ $(ObjectsG) $(LibSubDirs) $(LibLinkOpts)
$(LIBNAME_AO): $(ObjectsO) $(LibSubDirs) $(DESTLIBRELEASE)/.dir
@echo ======= Linking $(LIBRARYNAME) release library =======
@rm -f $@
$(VERB) $(AR) $@ $(ObjectsO) $(LibSubDirs)
$(LIBNAME_AP): $(ObjectsP) $(LibSubDirs) $(DESTLIBPROFILE)/.dir
Vikram S. Adve
committed
@echo ======= Linking $(LIBRARYNAME) profile library =======
@rm -f $@
$(VERB) $(AR) $@ $(ObjectsP) $(LibSubDirs)
$(LIBNAME_AG): $(ObjectsG) $(LibSubDirs) $(DESTLIBDEBUG)/.dir
@echo ======= Linking $(LIBRARYNAME) debug library =======
@rm -f $@
$(VERB) $(AR) $@ $(ObjectsG) $(LibSubDirs)
$(LIBNAME_OBJO): $(ObjectsO) $(LibSubDirs) $(DESTLIBRELEASE)/.dir
@echo "Linking $@"
$(VERB) $(Relink) -o $@ $(ObjectsO) $(LibSubDirs)
$(LIBNAME_OBJP): $(ObjectsP) $(LibSubDirs) $(DESTLIBPROFILE)/.dir
Vikram S. Adve
committed
@echo "Linking $@"
$(VERB) $(Relink) -o $@ $(ObjectsP) $(LibSubDirs)
$(LIBNAME_OBJG): $(ObjectsG) $(LibSubDirs) $(DESTLIBDEBUG)/.dir
@echo "Linking $@"
$(VERB) $(Relink) -o $@ $(ObjectsG) $(LibSubDirs)
#------------------------------------------------------------------------
# Create a TAGS database for emacs
#------------------------------------------------------------------------
Chris Lattner
committed
etags -l c++ `find include lib tools -name '*.cpp' -o -name '*.h'`
all:: tags
endif
#------------------------------------------------------------------------
# Handle the TOOLNAME option - used when building tool executables...
#------------------------------------------------------------------------
#
# The TOOLNAME option should be used with a USEDLIBS variable that tells the
# libraries (and the order of the libs) that should be linked to the
# tool. USEDLIBS should contain a list of library names (some with .a extension)
# that are automatically linked in as .o files unless the .a suffix is added.
#
ifdef TOOLNAME
# TOOLEXENAME* - These compute the output filenames to generate...
John Criswell
committed
TOOLEXENAME_G := $(DESTTOOLDEBUG)/$(TOOLNAME)
TOOLEXENAME_O := $(DESTTOOLRELEASE)/$(TOOLNAME)
TOOLEXENAME_P := $(DESTTOOLPROFILE)/$(TOOLNAME)
TOOLEXENAMES := $(DESTTOOLCURRENT)/$(TOOLNAME)
# USED_LIBS_OPTIONS - Compute the options line that add -llib1 -llib2, etc.
PROJ_LIBS_OPTIONS := $(patsubst %.a.o, -l%, $(addsuffix .o, $(USEDLIBS)))
PROJ_LIBS_OPTIONS_G := $(patsubst %.o, $(PROJLIBDEBUGSOURCE)/%.o, $(PROJ_LIBS_OPTIONS))
PROJ_LIBS_OPTIONS_O := $(patsubst %.o, $(PROJLIBRELEASESOURCE)/%.o,$(PROJ_LIBS_OPTIONS))
PROJ_LIBS_OPTIONS_P := $(patsubst %.o, $(PROJLIBPROFILESOURCE)/%.o,$(PROJ_LIBS_OPTIONS))
LLVM_LIBS_OPTIONS := $(patsubst %.a.o, -l%, $(addsuffix .o, $(LLVMLIBS)))
LLVM_LIBS_OPTIONS_G := $(patsubst %.o, $(LLVMLIBDEBUGSOURCE)/%.o, $(LLVM_LIBS_OPTIONS))
LLVM_LIBS_OPTIONS_O := $(patsubst %.o, $(LLVMLIBRELEASESOURCE)/%.o,$(LLVM_LIBS_OPTIONS))
LLVM_LIBS_OPTIONS_P := $(patsubst %.o, $(LLVMLIBPROFILESOURCE)/%.o,$(LLVM_LIBS_OPTIONS))
LIB_OPTS_G := $(LLVM_LIBS_OPTIONS_G) $(PROJ_LIBS_OPTIONS_G)
LIB_OPTS_O := $(LLVM_LIBS_OPTIONS_O) $(PROJ_LIBS_OPTIONS_P)
LIB_OPTS_P := $(LLVM_LIBS_OPTIONS_P) $(PROJ_LIBS_OPTIONS_P)
# USED_LIB_PATHS - Compute the path of the libraries used so that tools are
# rebuilt if libraries change. This has to make sure to handle .a/.so and .o
# files seperately.
STATICUSEDLIBS := $(patsubst %.a.o, lib%.a, $(addsuffix .o, $(USEDLIBS)))
USED_LIB_PATHS_G := $(addprefix $(DESTLIBDEBUG)/, $(STATICUSEDLIBS))
USED_LIB_PATHS_O := $(addprefix $(DESTLIBRELEASE)/, $(STATICUSEDLIBS))
USED_LIB_PATHS_P := $(addprefix $(DESTLIBPROFILE)/, $(STATICUSEDLIBS))
LINK_OPTS := $(TOOLLINKOPTS) $(PLATFORMLINKOPTS)
# Tell make that we need to rebuild subdirectories before we can link the tool.
# This affects things like LLI which has library subdirectories.
$(USED_LIB_PATHS_G) $(USED_LIB_PATHS_O) $(USED_LIB_PATHS_P): \
$(addsuffix /.makeall, $(PARALLEL_DIRS))
$(VERB) rm -f $(TOOLEXENAMES)
John Criswell
committed
$(TOOLEXENAME_G): $(ObjectsG) $(USED_LIB_PATHS_G) $(DESTTOOLDEBUG)/.dir
@echo ======= Linking $(TOOLNAME) debug executable $(STRIP_WARN_MSG)=======
$(VERB) $(LinkG) -o $@ $(ObjectsG) $(LIB_OPTS_G) $(LINK_OPTS)
John Criswell
committed
$(TOOLEXENAME_O): $(ObjectsO) $(USED_LIB_PATHS_O) $(DESTTOOLRELEASE)/.dir
@echo ======= Linking $(TOOLNAME) release executable =======
$(VERB) $(LinkO) -o $@ $(ObjectsO) $(LIB_OPTS_O) $(LINK_OPTS)
John Criswell
committed
$(TOOLEXENAME_P): $(ObjectsP) $(USED_LIB_PATHS_P) $(DESTTOOLPROFILE)/.dir
Vikram S. Adve
committed
@echo ======= Linking $(TOOLNAME) profile executable =======
$(VERB) $(LinkP) -o $@ $(ObjectsP) $(LIB_OPTS_P) $(LINK_OPTS)
Vikram S. Adve
committed
endif
#---------------------------------------------------------
John Criswell
committed
.PRECIOUS: $(BUILD_OBJ_DIR)/Depend/.dir
.PRECIOUS: $(BUILD_OBJ_DIR)/Debug/.dir $(BUILD_OBJ_DIR)/Release/.dir
# Create .o files in the ObjectFiles directory from the .cpp and .c files...
John Criswell
committed
$(BUILD_OBJ_DIR)/Release/%.o: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Release/.dir
@echo "Compiling $<"
$(VERB) $(CompileO) $< -o $@
John Criswell
committed
$(BUILD_OBJ_DIR)/Release/%.o: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Release/.dir
John Criswell
committed
$(BUILD_OBJ_DIR)/Profile/%.o: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Profile/.dir
Vikram S. Adve
committed
@echo "Compiling $<"
$(VERB) $(CompileP) $< -o $@
John Criswell
committed
$(BUILD_OBJ_DIR)/Profile/%.o: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Profile/.dir
@echo "Compiling $<"
$(VERB) $(CompileCP) $< -o $@
John Criswell
committed
$(BUILD_OBJ_DIR)/Debug/%.o: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Debug/.dir
@echo "Compiling $<"
$(VERB) $(CompileG) $< -o $@
John Criswell
committed
$(BUILD_OBJ_DIR)/Debug/%.o: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Debug/.dir
#
# Rules for building lex/yacc files
#
LEX_FILES = $(filter %.l, $(Source))
LEX_OUTPUT = $(LEX_FILES:%.l=%.cpp)
YACC_FILES = $(filter %.y, $(Source))
YACC_OUTPUT = $(addprefix $(YACC_FILES:%.y=%), .h .cpp .output)
.PRECIOUS: $(LEX_OUTPUT) $(YACC_OUTPUT)
# Create a .cpp source file from a flex input file... this uses sed to cut down
# on the warnings emited by GCC...
#
# The last line is a gross hack to work around flex aparently not being able to
# resize the buffer on a large token input. Currently, for uninitialized string
# buffers in LLVM we can generate very long tokens, so this is a hack around it.
# FIXME. (f.e. char Buffer[10000]; )
#
$(FLEX) -t $< | sed '/^find_rule/d' | \
sed 's/void yyunput/inline void yyunput/' | \
sed 's/void \*yy_flex_realloc/inline void *yy_flex_realloc/' | \
sed 's/#define YY_BUF_SIZE 16384/#define YY_BUF_SIZE (16384*64)/' > $@
%.c: %.y # Cancel built-in rules for yacc
%.h: %.y # Cancel built-in rules for yacc
@echo Bison\'ing $<...
$(VERB) $(BISON) -v -d -p $(<:%Parser.y=%) $*.y
$(VERB) mv -f $*.tab.c $*.cpp
$(VERB) mv -f $*.tab.h $*.h
$(VERB) mkdir -p $*
# To create postscript files from dot files...
%.ps: %.dot
dot -Tps < $< > $@
John Criswell
committed
$(VERB) rm -rf $(BUILD_OBJ_DIR)/Debug $(BUILD_OBJ_DIR)/Release $(BUILD_OBJ_DIR)/Profile $(BUILD_OBJ_DIR)/Depend
$(VERB) rm -f core core.[0-9][0-9]* *.o *.d *.so *~ *.flc
$(VERB) rm -f $(LEX_OUTPUT) $(YACC_OUTPUT)
# If dependencies were generated for the file that included this file,
SourceBaseNames := $(basename $(notdir $(filter-out Debug/%, $(Source))))
John Criswell
committed
SourceDepend := $(SourceBaseNames:%=$(BUILD_OBJ_DIR)/Depend/%.d)
# Create dependencies for the *.cpp files...
#$(SourceDepend): \x
John Criswell
committed
$(BUILD_OBJ_DIR)/Depend/%.d: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Depend/.dir
$(VERB) $(Depend) $< | sed 's|$*\.o *|$(BUILD_OBJ_DIR)/Release/& $(BUILD_OBJ_DIR)/Profile/& $(BUILD_OBJ_DIR)/Debug/& $(BUILD_OBJ_DIR)/Depend/$(@F)|g' > $@
# Create dependencies for the *.c files...
#$(SourceDepend): \x
John Criswell
committed
$(BUILD_OBJ_DIR)/Depend/%.d: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Depend/.dir
$(VERB) $(DependC) $< | sed 's|$*\.o *|Release/& Profile/& Debug/& Depend/$(@F)|g' > $@
-include $(SourceDepend)