Newer
Older
#===-- Makefile.rules - Common make rules for LLVM ---------*- Makefile -*--===#
#
# The LLVM Compiler Infrastructure
#
# This file was developed by the LLVM research group and is distributed under
# the University of Illinois Open Source License. See LICENSE.TXT for details.
#
#===------------------------------------------------------------------------===#
# This file is included by all of the LLVM makefiles. For details on how to use
# it properly, please see the document MakefileGuide.html in the docs directory.
#===-----------------------------------------------------------------------====
John Criswell
committed
#
# Set the VPATH so that we can find source files.
John Criswell
committed
#
VPATH=$(BUILD_SRC_DIR)
###############################################################################
# TARGETS: Define standard targets that can be invoked
###############################################################################
John Criswell
committed
#--------------------------------------------------------------------
# Define the various target sets
#--------------------------------------------------------------------
RECURSIVE_TARGETS := all clean check install uninstall
LOCAL_TARGETS := all-local clean-local check-local install-local printvars\
TOPLEV_TARGETS := dist dist-check dist-clean tags
USER_TARGETS := $(RECURSIVE_TARGETS) $(LOCAL_TARGETS) $(TOPLEV_TARGETS)
INTERNAL_TARGETS := preconditions \
install-config-dir install-shared-library install-bytecode-library \
install-archive-library install-relinked-library install-tool \
uninstall-config-dir uninstall-shared-library uninstall-bytecode-library \
uninstall-archive-library uninstall-relinked-library uninstall-tool
#--------------------------------------------------------------------
# Mark all of these targets as phony to avoid implicit rule search
#--------------------------------------------------------------------
#--------------------------------------------------------------------
# Make sure all the user-target rules are double colon rules and that
# the preconditions are run first.
#--------------------------------------------------------------------
all :: all-local
check:: check-local
clean:: clean-local
install :: install-local
uninstall :: uninstall-local
check-local :: all-local
install-local :: all-local
###############################################################################
# SUFFIXES: Reset the list of suffixes we know how to build
###############################################################################
.SUFFIXES:
.SUFFIXES: .c .cpp .h .hpp .y .l .lo .o .a $(SHLIBEXT) .bc .td .ps .dot $(SUFFIXES)
###############################################################################
# VARIABLES: Set up various variables based on configuration data
###############################################################################
#--------------------------------------------------------------------
#--------------------------------------------------------------------
Chris Lattner
committed
ifdef ENABLE_PROFILING
CONFIGURATION := Profile
CXXFLAGS += -O3 -DNDEBUG -felide-constructors -finline-functions -pg
CFLAGS += -O3 -DNDEBUG -pg
LDFLAGS += -O3 -DNDEBUG -pg
Chris Lattner
committed
else
ifdef ENABLE_OPTIMIZED
CONFIGURATION := Release
CXXFLAGS += -O3 -DNDEBUG -finline-functions -felide-constructors -fomit-frame-pointer
CFLAGS += -O3 -DNDEBUG -fomit-frame-pointer
LDFLAGS += -O3 -DNDEBUG
Chris Lattner
committed
else
CONFIGURATION := Debug
CXXFLAGS += -g -D_DEBUG
CFLAGS += -g -D_DEBUG
LDFLAGS += -g -D_DEBUG
KEEP_SYMBOLS := 1
Chris Lattner
committed
endif
endif
ARFLAGS := cru
#--------------------------------------------------------------------
# Directory locations
#--------------------------------------------------------------------
OBJDIR := $(BUILD_OBJ_DIR)/$(CONFIGURATION)
LIBDIR := $(BUILD_OBJ_ROOT)/lib/$(CONFIGURATION)
TOOLDIR := $(BUILD_OBJ_ROOT)/tools/$(CONFIGURATION)
LLVMLIBDIR := $(LLVM_OBJ_ROOT)/lib/$(CONFIGURATION)
LLVMTOOLDIR := $(LLVM_OBJ_ROOT)/tools/$(CONFIGURATION)
#--------------------------------------------------------------------
# Full Paths To Compiled Tools and Utilities
#--------------------------------------------------------------------
LIBTOOL := $(LLVM_OBJ_ROOT)/mklib
LLVMAS := $(LLVMTOOLDIR)/llvm-as$(EXEEXT)
BURG := $(LLVMTOOLDIR)/burg$(EXEEXT)
TBLGEN := $(LLVMTOOLDIR)/tblgen$(EXEEXT)
GCCLD := $(LLVMTOOLDIR)/gccld$(EXEEXT)
LLVMGCC := PATH=$(LLVMTOOLDIR):$(PATH) $(LLVMGCCDIR)/bin/gcc
LLVMGXX := PATH=$(LLVMTOOLDIR):$(PATH) $(LLVMGCCDIR)/bin/g++
# Need a better way to compute this.
LLVMGCCLIBDIR := $(dir $(shell $(LLVMGCC) -print-file-name=libgcc.a))/
#--------------------------------------------------------------------
# Adjust to user's request
#--------------------------------------------------------------------
John Criswell
committed
ifndef SHARED_LIBRARY
LIBTOOL += --tag=disable-shared
else
LDFLAGS += -rpath $(LIBDIR)
endif
Chris Lattner
committed
ifndef VERBOSE
VERB := @
LIBTOOL += --silent
AR += >/dev/null 2>/dev/null
CONFIGUREFLAGS += >$(BUILD_OBJ_DIR)/configure.out 2>&1
else
CONFIGUREFLAGS :=
endif
# By default, strip symbol information from executable
Chris Lattner
committed
ifndef KEEP_SYMBOLS
STRIP = $(PLATFORMSTRIPOPTS)
STRIP_WARN_MSG = "(without symbols)"
endif
ifdef TOOLNAME
LDFLAGS += -rpath $(TOOLDIR) -export-dynamic $(TOOLLINKOPTS)
endif
# Use TOOLLINKOPTSB to pass options to the linker like library search
# path etc.
# Note that this is different from TOOLLINKOPTS, these options
# are passed to the linker *before* the USEDLIBS options are passed.
# e.g. usage TOOLLINKOPTSB = -L/home/xxx/lib
ifdef TOOLLINKOPTSB
LDFLAGS += $(TOOLLINKOPTSB)
endif
#----------------------------------------------------------
# Options To Invoke Tools
#----------------------------------------------------------
CompileCommonOpts := -Wall -W -Wwrite-strings -Wno-unused
CPPFLAGS += -I$(BUILD_OBJ_DIR) \
-I$(BUILD_SRC_DIR) \
-I$(BUILD_SRC_ROOT)/include \
-I$(BUILD_OBJ_ROOT)/include \
-I$(LLVM_OBJ_ROOT)/include \
-I$(LLVM_SRC_ROOT)/include \
-D_GNU_SOURCE -D__STDC_LIMIT_MACROS
Compile.C = $(CC) $(CPPFLAGS) $(CompileCommonOpts) -c $(CFLAGS)
Compile.CXX = $(CXX) $(CPPFLAGS) $(CompileCommonOpts) $(CXXFLAGS) -c
LTCompile.C = $(LIBTOOL) --mode=compile $(Compile.C)
LTCompile.CXX = $(LIBTOOL) --tag=CXX --mode=compile $(Compile.CXX)
BCCompile.CXX = $(LLVMGXX) $(CPPFLAGS) $(CompileCommonOpts) $(CXXFLAGS) -c
BCCompile.C = $(LLVMGCC) $(CPPFLAGS) $(CompileCommonOpts) $(CFLAGS) -c
Link = $(LIBTOOL) --tag=CXX --mode=link $(CXX) $(CPPFLAGS) \
Relink = $(LIBTOOL) --tag=CXX --mode=link $(CXX)
BCLinkLib = $(LLVMGCC) -shared -nostdlib
Burg = $(BURG) -I $(BUILD_SRC_DIR)
TableGen = $(TBLGEN) -I $(BUILD_SRC_DIR)
Archive = $(AR) $(ARFLAGS)
ifdef RANLIB
else
endif
#----------------------------------------------------------
# Get the list of source files
#----------------------------------------------------------
ifndef SOURCES
SOURCES := $(notdir $(wildcard $(BUILD_SRC_DIR)/*.cpp \
$(BUILD_SRC_DIR)/*.cc $(BUILD_SRC_DIR)/*.c $(BUILD_SRC_DIR)/*.y \
$(BUILD_SRC_DIR)/*.l))
endif
ifdef BUILT_SOURCES
SOURCES += $(filter %.cpp %.c %.cc %.y %.l,$(BUILT_SOURCES))
#----------------------------------------------------------
# Types of objects that can be built from sources
#----------------------------------------------------------
BASENAME_SOURCES := $(sort $(basename $(SOURCES)))
ObjectsO := $(BASENAME_SOURCES:%=$(OBJDIR)/%.o)
ObjectsLO := $(BASENAME_SOURCES:%=$(OBJDIR)/%.lo)
ObjectsBC := $(BASENAME_SOURCES:%=$(OBJDIR)/%.bc)
###############################################################################
# DIRECTORIES: Handle recursive descent of directory structure
###############################################################################
#---------------------------------------------------------
#---------------------------------------------------------
$(VERB) for dir in $(DIRS); do \
if [ ! -f $$dir/Makefile ]; then \
$(MKDIR) $$dir; \
cp $(BUILD_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
fi; \
#---------------------------------------------------------
# Handle the EXPERIMENTAL_DIRS options ensuring success
# after each directory is built.
#---------------------------------------------------------
ifdef EXPERIMENTAL_DIRS
$(RECURSIVE_TARGETS)::
$(VERB) for dir in $(EXPERIMENTAL_DIRS); do \
if [ ! -f $$dir/Makefile ]; then \
$(MKDIR) $$dir; \
cp $(BUILD_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
fi; \
done
endif
#---------------------------------------------------------
# Handle the PARALLEL_DIRS options for parallel construction
#---------------------------------------------------------
# Unfortunately, this list must be maintained if new
# recursive targets are added.
all :: $(addsuffix /.makeall , $(PARALLEL_DIRS))
clean :: $(addsuffix /.makeclean , $(PARALLEL_DIRS))
check :: $(addsuffix /.makecheck , $(PARALLEL_DIRS))
install :: $(addsuffix /.makeinstall , $(PARALLEL_DIRS))
uninstall:: $(addsuffix /.makeuninstall,$(PARALLEL_DIRS))
Parallel_Targets := $(foreach T,$(RECURSIVE_TARGETS),%/.make$(T))
$(Parallel_Targets) :
$(VERB) if [ ! -f $(@D)/Makefile ]; then \
$(MKDIR) $(@D); \
cp $(BUILD_SRC_DIR)/$(@D)/Makefile $(@D)/Makefile; \
fi; \
#---------------------------------------------------------
# Handle the OPTIONAL_DIRS options for directores that may
# or may not exist.
#---------------------------------------------------------
John Criswell
committed
ifdef OPTIONAL_DIRS
$(VERB) for dir in $(OPTIONAL_DIRS); do \
if [ -d $(BUILD_SRC_DIR)/$$dir ]; then\
if [ ! -f $$dir/Makefile ]; then \
$(MKDIR) $$dir; \
cp $(BUILD_SRC_DIR)/$$dir/Makefile $$dir/Makefile; \
fi; \
fi \
John Criswell
committed
done
endif
#---------------------------------------------------------
# Handle the CONFIG_FILES options
#---------------------------------------------------------
ifdef CONFIG_FILES
$(VERB)$(ECHO) Installing Configuration Files To $(sysconfdir)
$(VERB)for file in $(CONFIG_FILES); do \
$(INSTALL) $(BUILD_SRC_DIR)/$${file} $(sysconfdir) ; \
done
uninstall-local:: uninstall-config-dir
uninstall-config-dir:
$(VERB)$(ECHO) Uninstalling Configuration Files From $(sysconfdir)
$(VERB)for file in $(CONFIG_FILES); do \
endif
###############################################################################
# Library Build Rules: Four ways to build a library
###############################################################################
# Make sure there isn't any extranous whitespace on the LIBRARYNAME option
LIBRARYNAME := $(strip $(LIBRARYNAME))
LIBNAME_LA := $(LIBDIR)/lib$(LIBRARYNAME).la
LIBNAME_A := $(LIBDIR)/lib$(LIBRARYNAME).a
LIBNAME_O := $(LIBDIR)/$(LIBRARYNAME).o
LIBNAME_BC := $(LIBDIR)/lib$(LIBRARYNAME).bc
#---------------------------------------------------------
# Shared Library Targets:
# If the user asked for a shared library to be built
# with the SHARED_LIBRARY variable, then we provide
# targets for building them.
#---------------------------------------------------------
ifdef SHARED_LIBRARY
$(LIBNAME_LA): $(BUILT_SOURCES) $(ObjectsLO) $(LIBDIR)/.dir
@$(ECHO) Linking shared library $(notdir $@)
$(VERB) $(Link) -o $@ $(ObjectsLO)
$(VERB) $(LIBTOOL) --mode=install $(INSTALL) $@ $(LIBDIR)
$(VERB) $(RM) -f $(LIBNAME_LA)
endif
DestSharedLib = $(libdir)/lib$(LIBRARYNAME)$(SHLIBEXT)
install-local:: install-shared-library
install-shared-library: $(DestSharedLib)
$(DestSharedLib): $(LIBNAME_LA)
@$(ECHO) Installing shared library $(DestSharedLib)
$(VERB) $(MKDIR) $(libdir)
$(VERB) $(LIBTOOL) --mode=install $(INSTALL) $(LIBNAME_LA) $(DestSharedLib)
$(VERB) $(LIBTOOL) --finish $(libdir)
uninstall-local:: uninstall-shared-library
uninstall-shared-library:
@$(ECHO) Uninstalling shared library $(DestSharedLib)
$(VERB) $(RM) -f $(DestSharedLib)
#---------------------------------------------------------
# Bytecode Library Targets:
# If the user asked for a bytecode library to be built
# with the BYTECODE_LIBRARY variable, then we provide
# targets for building them.
#---------------------------------------------------------
ifdef BYTECODE_LIBRARY
BCLinkLib += -Xlinker -internalize-public-api-list=$(EXPORTED_SYMBOL_LIST)
ifdef EXPORTED_SYMBOL_FILE
BCLinkLib += -Xlinker -internalize-public-api-file=$(EXPORTED_SYMBOL_FILE)
BCLinkLib += -Xlinker -disable-internalize
$(LIBNAME_BC): $(BUILT_SOURCES) $(ObjectsBC) $(LIBDIR)/.dir
@$(ECHO) Linking bytecode library $(notdir $@)
$(VERB) $(BCLinkLib) -o $@ $(ObjectsBC)
$(VERB) $(RM) -f $(LIBNAME_BC)
endif
DestBytecodeLib = $(bytecode_libdir)/lib$(LIBRARYNAME).bc
install-local:: install-bytecode-library
install-bytecode-library: $(DestBytecodeLib)
Vikram S. Adve
committed
$(DestBytecodeLib): $(LIBNAME_BC) $(bytecode_libdir)
@$(ECHO) Installing bytecode library $(DestBytecodeLib)
$(VERB) $(INSTALL) $< $@
uninstall-local:: uninstall-bytecode-library
uninstall-bytecode-library:
@$(ECHO) Uninstalling bytecode library $(DestBytecodeLib)
$(VERB) $(RM) -f $(DestBytecodeLib)
endif
# Does the library want a .o version built?
ifndef DONT_BUILD_RELINKED
$(LIBNAME_O): $(BUILT_SOURCES) $(ObjectsO) $(LIBDIR)/.dir
$(VERB) $(Relink) -o $@ $(ObjectsO)
Vikram S. Adve
committed
$(VERB) $(RM) -f $(LIBNAME_O)
endif
DestRelinkedLib = $(libdir)/$(LIBRARYNAME).o
install-local:: install-relinked-library
install-relinked-library: $(DestRelinkedLib)
$(DestRelinkedLib): $(LIBNAME_O)
@$(ECHO) Installing object library $(DestRelinkedLib)
$(VERB) $(MKDIR) $(libdir)
$(VERB) $(LIBTOOL) --mode=install $(INSTALL) $(LIBNAME_O) $(DestRelinkedLib)
uninstall-local:: uninstall-relinked-library
uninstall-relinked-library:
@$(ECHO) Uninstalling object library $(DestRelinkedLib)
$(VERB) $(RM) -f $(DestRelinkedLib)
endif
# Does the library want an archive version built?
ifdef BUILD_ARCHIVE
$(LIBNAME_A): $(BUILT_SOURCES) $(ObjectsO) $(LIBDIR)/.dir
$(VERB)$(RM) -f $@
$(VERB) $(Archive) $@ $(ObjectsO)
$(VERB) $(Ranlib) $@
$(VERB) $(RM) -f $(LIBNAME_A)
endif
DestArchiveLib := $(libdir)/lib$(LIBRARYNAME).a
install-local:: install-archive-library
install-archive-library: $(DestArchiveLib)
$(DestArchiveLib): $(LIBNAME_A)
@$(ECHO) Installing archive library $(DestArchiveLib)
$(VERB) $(MKDIR) $(libdir)
$(VERB) $(LIBTOOL) --mode=install $(INSTALL) $(LIBNAME_A) $(DestArchiveLib)
uninstall-local:: uninstall-archive-library
uninstall-archive-library:
@$(ECHO) Uninstalling archive library $(DestArchiveLib)
$(VERB) $(RM) -f $(DestArchiveLib)
endif
###############################################################################
# Tool Build Rules: Build executable tool based on TOOLNAME option
###############################################################################
ifdef TOOLNAME
#---------------------------------------------------------
# TOOLLINKOPTSB to pass options to the linker like library search path etc
# Note that this is different from TOOLLINKOPTS, these options
# are passed to the linker *before* the USEDLIBS options are passed.
# e.g. usage TOOLLINKOPTSB = -L/home/xxx/lib
#---------------------------------------------------------
ifdef TOOLLINKOPTSB
Link += $(TOOLLINKOPTSB)
endif
# TOOLEXENAME - This is the output filenames to generate
TOOLEXENAME := $(TOOLDIR)/$(TOOLNAME)
# LIBS_OPTIONS - Compute the options lines that add -llib1 -llib2, etc.
PROJ_LIBS_OPTIONS := $(patsubst %.a.o, -l%, $(addsuffix .o, $(USEDLIBS)))
PROJ_LIBS_OPTIONS := $(patsubst %.o, $(LIBDIR)/%.o, $(PROJ_LIBS_OPTIONS))
LLVM_LIBS_OPTIONS := $(patsubst %.a.o, -l%, $(addsuffix .o, $(LLVMLIBS)))
LLVM_LIBS_OPTIONS := $(patsubst %.o, $(LLVMLIBDIR)/%.o, $(LLVM_LIBS_OPTIONS))
# USED_LIBS/LIBS_PATHS - Compute dependent library file paths
PROJ_USED_LIBS := $(patsubst %.a.o, lib%.a, $(addsuffix .o, $(USEDLIBS)))
LLVM_USED_LIBS := $(patsubst %.a.o, lib%.a, $(addsuffix .o, $(LLVMLIBS)))
PROJ_LIBS_PATHS := $(addprefix $(LIBDIR)/,$(PROJ_USED_LIBS))
LLVM_LIBS_PATHS := $(addprefix $(LLVMLIBDIR)/,$(LLVM_USED_LIBS))
# Concatenate all the optoins
LINK_OPTS := $(TOOLLINKOPTS) $(PROJ_LIBS_OPTIONS) $(LLVM_LIBS_OPTIONS)
# Handle compression libraries automatically
ifeq ($(HAVE_BZIP2),1)
LIBS += -lbz2
endif
ifeq ($(HAVE_ZLIB),1)
LIBS += -lz
endif
# Tell make that we need to rebuild subdirectories before we can link the tool.
# This affects things like LLI which has library subdirectories.
$(TOOLEXENAME): $(addsuffix /.makeall, $(PARALLEL_DIRS))
all-local:: $(TOOLEXENAME)
John Criswell
committed
$(VERB) $(RM) -f $(TOOLEXENAME)
$(TOOLEXENAME): $(BUILT_SOURCES) $(ObjectsO) $(PROJ_LIBS_PATHS) $(LLVM_LIBS_PATHS) $(TOOLDIR)/.dir
@$(ECHO) Linking $(CONFIGURATION) executable $(TOOLNAME) $(STRIP_WARN_MSG)
$(VERB) $(Link) -o $@ $(ObjectsO) $(PROJ_LIBS_OPTIONS) $(LLVM_LIBS_OPTIONS) $(LIBS)
@$(ECHO) ======= Finished linking $(CONFIGURATION) executable $(TOOLNAME) $(STRIP_WARN_MSG)
install-local:: install-tool
DestTool = $(bindir)/$(TOOLNAME)
install-tool: $(DestTool)
$(DestTool): $(TOOLEXENAME)
@$(ECHO) Installing $(DestTool)
$(VERB) $(INSTALL) $(TOOLEXENAME) $(bindir)
uninstall-local:: uninstall-tool
uninstall-tool:
@$(ECHO) Uninstalling $(DestTool)
$(VERB) $(RM) -f $(DestTool)
endif
ifndef DISABLE_AUTO_DEPENDENCIES
# Create .lo files in the OBJDIR directory from the .cpp and .c files...
ifdef SHARED_LIBRARY
$(OBJDIR)/%.lo $(OBJDIR)/%.o: %.cpp $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.cpp For Shared Library"
$(VERB) if $(LTCompile.CXX) -MD -MT $@ -MP -MF $(OBJDIR)/$*.LACXXd $< -o $@ ; \
then $(MV) -f "$(OBJDIR)/$*.LACXXd" "$(OBJDIR)/$*.d"; \
$(OBJDIR)/%.lo $(OBJDIR)/%.o: %.c $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.c For Shared Library"
$(VERB) if $(LTCompile.C) -MD -MT $@ -MP -MF $(OBJDIR)/$*.LACd $< -o $@ ; \
then $(MV) -f "$(OBJDIR)/$*.LACd" "$(OBJDIR)/$*.d"; \
$(OBJDIR)/%.o: %.cpp $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.cpp For Archive"
$(VERB) if $(Compile.CXX) -MD -MT $@ -MP -MF $(OBJDIR)/$*.CXXd $< -o $@ ; \
then $(MV) -f "$(OBJDIR)/$*.CXXd" "$(OBJDIR)/$*.d"; \
$(OBJDIR)/%.o: %.c $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.c For Archive"
$(VERB) if $(Compile.C) -MD -MT $@ -MP -MF $(OBJDIR)/$*.Cd $< -o $@ ; \
then $(MV) -f "$(OBJDIR)/$*.Cd" "$(OBJDIR)/$*.d"; \
# Create .bc files in the OBJDIR directory from .cpp and .c files...
$(OBJDIR)/%.bc: %.cpp $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.cpp to bytecode"
$(VERB) if $(BCCompile.CXX) -MD -MT $@ -MP -MF "$(OBJDIR)/$*.BCCXXd" $< -o $@ ; \
then $(MV) -f "$(OBJDIR)/$*.BCCXXd" "$(OBJDIR)/$*.d"; \
$(OBJDIR)/%.bc: %.c $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.c to bytecode"
$(VERB) if $(BCCompile.C) -MD -MT $@ -MP -MF "$(OBJDIR)/$*.BCCd" $< -o $@ ; \
then $(MV) -f "$(OBJDIR)/$*.BCCd" "$(OBJDIR)/$*.d"; \
else
ifdef SHARED_LIBRARY
$(OBJDIR)/%.lo $(OBJDIR)/%.o: %.cpp $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.cpp For Shared Library"
$(LTCompile.CXX) $< -o $@
$(OBJDIR)/%.lo $(OBJDIR)/%.o: %.c $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.cpp For Shared Library"
$(OBJDIR)/%.o: %.cpp $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.cpp For Archive"
Vikram S. Adve
committed
$(OBJDIR)/%.o: %.c $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.cpp For Archive"
# Create .bc files in the OBJDIR directory from .cpp and .c files...
$(OBJDIR)/%.bc: %.cpp $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.cpp To Bytecode"
$(BCCompileCPP) $< -o $@
$(OBJDIR)/%.bc: %.c $(OBJDIR)/.dir
@$(ECHO) "Compiling $(CONFIGURATION) $*.c To Bytecode"
$(BCCompileC) $< -o $@
endif
$(OBJDIR)/%.bc: %.ll $(OBJDIR)/.dir $(LLVMAS)
@$(ECHO) "Compiling $*.ll To Bytecode"
$(VERB) $(LLVMAS) $< -f -o $@
ifdef TARGET
TDFILES := $(strip $(wildcard $(BUILD_SRC_DIR)/*.td) $(LLVM_SRC_ROOT)/lib/Target/Target.td)
$(BUILT_SOURCES): $(TDFILES)
%GenRegisterNames.inc : %.td
@echo "Building $(<F) register names with tblgen"
$(VERB) $(TableGen) -gen-register-enums -o $@ $<
%GenRegisterInfo.h.inc : %.td
@echo "Building $(<F) register information header with tblgen"
$(VERB) $(TableGen) -gen-register-desc-header -o $@ $<
Vikram S. Adve
committed
%GenRegisterInfo.inc : %.td
@echo "Building $(<F) register info implementation with tblgen"
$(VERB) $(TableGen) -gen-register-desc -o $@ $<
%GenInstrNames.inc : %.td
@echo "Building $(<F) instruction names with tblgen"
$(VERB) $(TableGen) -gen-instr-enums -o $@ $<
%GenInstrInfo.inc : %.td
@echo "Building $(<F) instruction information with tblgen"
$(VERB) $(TableGen) -gen-instr-desc -o $@ $<
%GenAsmWriter.inc : %.td
@echo "Building $(<F) assembly writer with tblgen"
$(VERB) $(TableGen) -gen-asm-writer -o $@ $<
%GenATTAsmWriter.inc : %.td
@echo "Building $(<F) AT&T assembly writer with tblgen"
$(VERB) $(TableGen) -gen-asm-writer -o $@ $<
%GenIntelAsmWriter.inc : %.td
@echo "Building $(<F) Intel assembly writer with tblgen"
$(VERB) $(TableGen) -gen-asm-writer -asmwriternum=1 -o $@ $<
%GenInstrSelector.inc: %.td
@echo "Building $(<F) instruction selector with tblgen"
$(VERB) $(TableGen) -gen-instr-selector -o $@ $<
%GenCodeEmitter.inc:: %.td
@echo "Building $(<F) code emitter with tblgen"
$(VERB) $(TableGen) -gen-emitter -o $@ $<
$(VERB) rm -f *.inc
endif
#
# Rules for building lex/yacc files
#
LEX_OUTPUT = $(LEX_FILES:%.l=%.cpp)
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] )
@$(ECHO) Flexing $<
$(VERB) $(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)/' \
> $@.tmp
$(VERB) cmp -s $@ $@.tmp > /dev/null || $(MV) -f $@.tmp $@
Chris Lattner
committed
@# remove the output of flex if it didn't get moved over...
@rm -f $@.tmp
%.c: %.y # Cancel built-in rules for yacc
%.h: %.y # Cancel built-in rules for yacc
@$(ECHO) "Bisoning $*.y"
$(VERB) $(BISON) -v -d -p $(<F:%Parser.y=%) -o $*.tab.c $<
$(VERB) cmp -s $*.tab.c $*.cpp > /dev/null || $(MV) -f $*.tab.c $*.cpp
$(VERB) cmp -s $*.tab.h $*.h > /dev/null || $(MV) -f $*.tab.h $*.h
Chris Lattner
committed
@# If the files were not updated, don't leave them lying around...
@rm -f $*.tab.c $*.tab.h
$(VERB) $(MKDIR) $* > /dev/null
@$(DATE) > $@
.PRECIOUS: $(OBJDIR)/.dir $(LIBDIR)/.dir $(TOOLDIR)/.dir $(LLVMLIBDIR)/.dir
.PRECIOUS: $(LLVMTOOLDIR)/.dir
ifneq ($(DOT),false)
%.ps: %.dot
$(DOT) -Tps < $< > $@
else
$(ECHO) "Cannot build $@: The program dot is not installed"
endif
#
# This rules ensures that header files that are removed still have a rule for
# which they can be "generated." This allows make to ignore them and
# reproduce the dependency lists.
#
John Criswell
committed
%.h:: ;
$(VERB) $(RM) -f core core.[0-9][0-9]* *.o *.d *~ *.flc
ifneq ($(strip $(SHLIBEXT)),) # Extra paranoia - make real sure SHLIBEXT is set
$(VERB) $(RM) -f *$(SHLIBEXT)
endif
ifneq ($(strip $(LEX_OUTPUT)),)
$(VERB) $(RM) -f $(LEX_OUTPUT)
endif
ifneq ($(strip $(YACC_OUTPUT)),)
$(VERB) $(RM) -f $(YACC_OUTPUT)
endif
###############################################################################
# DEPENDENCIES: Include the dependency files if we should
###############################################################################
# If its not one of the cleaning targets
ifneq ($strip($(filter-out clean clean-local dist-clean, $(MAKECMDGOALS))),)
# Get the list of dependency files
DependFiles := $(basename $(filter %.cpp %.c %.cc, $(SOURCES)))
DependFiles := $(patsubst %,$(BUILD_OBJ_DIR)/$(CONFIGURATION)/%.d,$(DependFiles))
-include /dev/null $(DependFiles)
Misha Brukman
committed
endif
endif # ifndef DISABLE_AUTO_DEPENDENCIES
################################################################################
# PRECONDITIONS - that which must be built/checked first
################################################################################
OBJMKFILE := $(BUILD_OBJ_DIR)/Makefile
SRCMKFILE := $(BUILD_SRC_DIR)/Makefile
CONFIGURE := $(LLVM_SRC_ROOT)/configure
CONFIG_STATUS := $(LLVM_OBJ_ROOT)/config.status
MAKE_CONFIG_IN := $(LLVM_SRC_ROOT)/Makefile.config.in
MAKE_CONFIG := $(LLVM_OBJ_ROOT)/Makefile.config
#------------------------------------------------------------------------
# List of the preconditions
#------------------------------------------------------------------------
preconditions: $(CONFIG_STATUS) $(MAKE_CONFIG) $(OBJMKFILE)
$(filter-out clean clean-local,USER_TARGETS):: $(BUILT_SOURCES)
$(VERB) $(RM) -f $(BUILT_SOURCES)
#------------------------------------------------------------------------
# Make sure we're not using a stale configuration
#------------------------------------------------------------------------
.PRECIOUS: $(CONFIG_STATUS)
$(CONFIG_STATUS): $(CONFIGURE)
@$(ECHO) Reconfiguring with $<
$(VERB) $(CONFIG_STATUS) --recheck $(CONFIGUREFLAGS)
#------------------------------------------------------------------------
# Make sure the configuration makefile is up to date
#------------------------------------------------------------------------
$(MAKE_CONFIG): $(MAKE_CONFIG_IN) $(CONFIG_STATUS)
@$(ECHO) Regenerating $@
$(VERB) cd $(LLVM_OBJ_ROOT) ; $(CONFIG_STATUS) Makefile.config
#------------------------------------------------------------------------
# If the Makefile in the source tree has been updated, copy it over into the
# build tree. But, only do this if the source and object makefiles differ
#------------------------------------------------------------------------
ifneq ($(OBJMKFILE),$(SRCMKFILE))
.PRECIOUS: $(OBJMKFILE)
$(OBJMKFILE): $(SRCMKFILE)
$(VERB) $(MKDIR) $(@D)
$(VERB) cp -f $< $@
endif
###############################################################################
###############################################################################
.PHONY: dist dist-chck dist-clean distdir dist-gzip dist-bzip2 dist-zip
ifeq ($(BUILD_SRC_DIR),$(BUILD_OBJ_DIR))
dist dist-check dist-clean dist-gzip dist-bzip2 dist-zip ::
@$(ECHO) ERROR: Target $@ only available with OBJ_DIR != SRC_DIR
else
ifeq ($(LLVM_TARBALL_NAME),)
$(error LLVM_TARBALL_NAME is empty. Please rerun configure)
endif
ifneq ($(LEVEL),.)
dist dist-check dist-clean dist-gzip dist-bzip2 dist-zip ::
@$(ECHO) ERROR: You must run $@ from $(BUILD_OBJ_ROOT)
DistTopCheck :=
else
DistTopCheck := check
dist-gzip: distdir
@$(ECHO) Packing gzipped distribution tar file.
$(VERB) $(TAR) chf - "$(TopDistDir)" | gzip -c > "$(DistTarGZip)"
dist-bzip2: distdir
@$(ECHO) Packing bzipped distribution tar file.
$(VERB) $(TAR) chf - $(DistName) | $(BZIP2) -c >$(DistTarBZ2)
dist-zip: distdir
@$(ECHO) Packing zipped distribution file.
$(VERB) rm -f $(DistZip)
$(VERB) $(ZIP) -rq $(DistZip) $(DistName)
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
dist :: distdir
@$(ECHO) Packing gzipped distribution tar file.
$(VERB) $(TAR) chf - $(DistName) | $(GZIP) -c >$(DistTarGZip)
@$(ECHO) Packing bzipped distribution tar file.
$(VERB) $(TAR) chf - $(DistName) | $(BZIP2) -c >$(DistTarBZ2)
@$(ECHO) Packing zipped distribution file.
$(VERB) rm -f $(DistZip)
$(VERB) $(ZIP) -rq $(DistZip) $(DistName)
@$(ECHO) ===== DISTRIBUTION PACKAGING SUCESSFUL =====
dist-check:: dist
dist-clean::
@$(ECHO) Cleaning distribution files
$(VERB) $(RM) -rf $(DistTarGZip) $(DistTarBZ2) $(DistZip) $(DistName)
endif
DistName := $(LLVM_TARBALL_NAME)
DistDir := $(BUILD_OBJ_ROOT)/$(DistName)
TopDistDir := $(DistDir)
DistTarGZip := $(BUILD_OBJ_ROOT)/$(DistName).tar.gz
DistZip := $(BUILD_OBJ_ROOT)/$(DistName).zip
DistTarBZ2 := $(BUILD_OBJ_ROOT)/$(DistName).tar.bz2
DistAlways := CREDITS.TXT LICENSE.TXT README.txt README AUTHORS COPYING \
ChangeLog INSTALL NEWS Makefile Makefile.common Makefile.rules \
Makefile.config.in
DistSources := $(filter-out projects,$(SOURCES) $(EXTRA_DIST))
DistSubDirs := $(filter-out projects,$(SUBDIRS))
DistFiles := $(DistAlways) $(DistSources)
RmDistDir := { test ! -d $(DistDir) || { \
find $(DistDir) -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -rf $(DistDir); }; }
distdir : $(DistTopCheck) $(DistSources)
@$(ECHO) Building Distribution Directory $(DistDir)
$(VERB) $(RmDistDir)
$(VERB) $(MKDIR) $(DistDir)
$(VERB) srcdirstrip=`echo "$(BUILD_SRC_DIR)" | sed 's|.|.|g'`; \
srcrootstrip=`echo "$(BUILD_SRC_ROOT)" | sed 's|.|.|g'`; \
for file in $(DistFiles) ; do \
case "$$file" in \
$(BUILD_SRC_DIR)/*) file=`echo "$$file" | sed "s#^$$srcdirstrip/##"`;; \
$(BUILD_SRC_ROOT)/*) file=`echo "$$file" | sed "s#^$srcrootstrip/#$(BUILD_OBJ_ROOT)/#"`;; \
esac; \
if test -f "$$file" || test -d "$$file" ; then \
from_dir=. ; \
else \
from_dir=$(BUILD_SRC_DIR); \
fi; \
to_dir=`echo "$$file" | sed -e 's#/[^/]*$$##'`; \
if test "$$to_dir" != "$$file" && test "$$to_dir" != "."; then \
to_dir="$(DistDir)/$$dir"; \
$(MKDIR) "$$to_dir" ; \
else \
to_dir="$(DistDir)"; \
fi; \
mid_dir=`echo "$$file" | sed -n -e 's#^\(.*\)/[^/]*$$#\1#p'`; \
if test -n "$$mid_dir" ; then \
$(MKDIR) "$$to_dir/$$mid_dir" ; \
fi ; \
if test -d "$$from_dir/$$file"; then \
if test -d "$(BUILD_SRC_DIR)/$$file" && \
test "$$from_dir" != "$(BUILD_SRC_DIR)" ; then \
cp -pR "$(BUILD_SRC_DIR)/$$file" "$$to_dir" || exit 1; \
fi; \
cp -pR $$from_dir/$$file $$to_dir || exit 1; \
elif test -f "$$from_dir/$$file" ; then \
cp -p "$$from_dir/$$file" "$(DistDir)/$$file" || exit 1; \
elif test -L "$$from_dir/$$file" ; then \
cp -pd "$$from_dir/$$file" $(DistDir)/$$file || exit 1; \
elif echo "$(DistAlways)" | grep -v "$$file" >/dev/null ; then \
$(ECHO) "===== WARNING: Distribution Source $$from_dir/$$file Not Found!" ; \
elif test "$(VERB)" != '@' ; then \
$(ECHO) "Skipping non-existent $$from_dir/$$file" ; \
fi; \
done
$(VERB) for subdir in $(SUBDIRS) ; do \
if test "$$subdir" \!= "." ; then \
test -d "$(DistDir)/$$subdir" || $(MKDIR) "$(DistDir)/$$subdir" || exit 1; \
new_distdir="$(DistDir)/$$subdir" ; \
( cd $$subdir && $(MAKE) DistDir="$$new_distdir" distdir ) || exit 1; \
fi; \
done
$(VERB) $(MAKE) DistDir="$(DistDir)" dist-hook
-$(VERB) find $(DistDir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(SHELL) $(INSTALL_SH) -c -m a+r {} {} \; \
|| chmod -R a+r $(DistDir)
dist-hook::
endif
###############################################################################
# TOP LEVEL - targets only to apply at the top level directory
###############################################################################
ifeq ($(LEVEL),.)
#------------------------------------------------------------------------
# Install support for project's include files:
#------------------------------------------------------------------------
install-local::
@$(ECHO) Installing include files
$(VERB) $(MKDIR) $(includedir)
$(VERB) if [ -d "$(BUILD_SRC_ROOT)/include" ] ; then \
cd $(BUILD_SRC_ROOT)/include && \
find . -path '*/Internal' -prune -o '(' -type f \