mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-27 22:15:18 +00:00
4c99bf65e8
of the llvm source directory. The main modification was to add new environment variables: one set for llvm entities and another set for source entities current being compiled. This should make the Makefile more flexible and easier to understand as each environment variable only does one thing. llvm-svn: 6679
605 lines
22 KiB
Makefile
605 lines
22 KiB
Makefile
#===-- 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
|
|
|
|
###########################################################################
|
|
# Directory Configuration
|
|
# This section of the Makefile determines what is where. To be
|
|
# specific, there are several locations that need to be defined:
|
|
#
|
|
# 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.
|
|
#
|
|
###########################################################################
|
|
|
|
#
|
|
# Set the source build directory. That is almost always the current directory.
|
|
#
|
|
ifndef BUILD_SRC_DIR
|
|
BUILD_SRC_DIR = $(shell pwd)
|
|
endif
|
|
|
|
#
|
|
# Set the source root directory.
|
|
#
|
|
ifndef BUILD_SRC_ROOT
|
|
BUILD_SRC_ROOT = $(BUILD_SRC_DIR)/$(LEVEL)
|
|
endif
|
|
|
|
#
|
|
# 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)
|
|
else
|
|
BUILD_OBJ_DIR := $(OBJ_ROOT)$(patsubst $(HOME)%,%,$(shell cd $(BUILD_SRC_DIR); pwd))
|
|
endif
|
|
endif
|
|
|
|
#
|
|
# Set the root of the object directory.
|
|
#
|
|
ifndef BUILD_OBJ_ROOT
|
|
ifeq ($(OBJ_ROOT),.)
|
|
BUILD_OBJ_ROOT = $(shell cd $(LEVEL); pwd)
|
|
else
|
|
BUILD_OBJ_ROOT := $(OBJ_ROOT)$(patsubst $(HOME)%,%,$(shell cd $(LEVEL); pwd))
|
|
endif
|
|
endif
|
|
|
|
#
|
|
# 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
|
|
|
|
#
|
|
# Set the LLVM object directory.
|
|
#
|
|
ifndef LLVM_OBJ_ROOT
|
|
LLVM_OBJ_ROOT = $(BUILD_OBJ_ROOT)
|
|
endif
|
|
|
|
# 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 ::
|
|
endif
|
|
|
|
# Default Rule: Make sure it's also a :: rule
|
|
all ::
|
|
|
|
# Default for install is to at least build everything...
|
|
install ::
|
|
|
|
# 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
|
|
#DocInstDir=/usr/doc/xxx
|
|
|
|
BURG_OPTS = -I
|
|
|
|
PURIFY := $(PURIFY) -cache-dir="$(BUILD_OBJ_ROOT)/../purifycache" -chain-length="30" -messages=all
|
|
|
|
ifdef ENABLE_PROFILING
|
|
ENABLE_OPTIMIZED = 1
|
|
CONFIGURATION := Profile
|
|
else
|
|
ifdef ENABLE_OPTIMIZED
|
|
CONFIGURATION := Release
|
|
else
|
|
CONFIGURATION := Debug
|
|
endif
|
|
endif
|
|
|
|
###########################################################################
|
|
# 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
|
|
ifndef VERBOSE
|
|
VERB := @
|
|
endif
|
|
|
|
#---------------------------------------------------------
|
|
# Compilation options...
|
|
#---------------------------------------------------------
|
|
|
|
###########################################################################
|
|
# Special tools used while building the LLVM tree. Burg is built as part of the
|
|
# utils directory.
|
|
###########################################################################
|
|
BURG := $(LLVMTOOLCURRENT)/burg
|
|
RunBurg := $(BURG) $(BURG_OPTS)
|
|
|
|
TBLGEN := $(LLVMTOOLCURRENT)/tblgen
|
|
|
|
# Enable this for profiling support with 'gprof'
|
|
# This automatically enables optimized builds.
|
|
ifdef ENABLE_PROFILING
|
|
PROFILE = -pg
|
|
endif
|
|
|
|
###########################################################################
|
|
# 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
|
|
ifndef KEEP_SYMBOLS
|
|
STRIP = $(PLATFORMSTRIPOPTS)
|
|
STRIP_WARN_MSG = "(without symbols) "
|
|
endif
|
|
|
|
# Allow gnu extensions...
|
|
CPPFLAGS += -D_GNU_SOURCE
|
|
|
|
# -Wno-unused-parameter
|
|
CompileCommonOpts := -Wall -W -Wwrite-strings -Wno-unused -I$(LEVEL)/include
|
|
CompileOptimizeOpts := -O3 -DNDEBUG -finline-functions -fshort-enums
|
|
|
|
# Compile a cpp file, don't link...
|
|
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)
|
|
|
|
|
|
# Link final executable
|
|
|
|
ifdef ENABLE_PURIFY # To enable purify, build with 'gmake ENABLE_PURIFY=1'
|
|
Link := $(PURIFY) $(CXX) -static
|
|
else
|
|
Link := $(CXX)
|
|
endif
|
|
|
|
ifdef PROJ_COMPILE
|
|
# 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...
|
|
MakeSO := $(CXX) $(MakeSharedObjectOption)
|
|
MakeSOO := $(MakeSO) -O3
|
|
MakeSOP := $(MakeSOO) $(PROFILE)
|
|
|
|
# Create dependancy file from CPP file, send to stdout.
|
|
Depend := $(CXX) -MM -I$(LEVEL)/include $(CPPFLAGS)
|
|
DependC := $(CC) -MM -I$(LEVEL)/include $(CPPFLAGS)
|
|
|
|
# Archive a bunch of .o files into a .a file...
|
|
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)
|
|
endif
|
|
|
|
Objs := $(sort $(patsubst Debug/%.o, %.o, $(addsuffix .o,$(notdir $(basename $(Source))))))
|
|
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
|
|
#---------------------------------------------------------
|
|
|
|
ifdef DIRS
|
|
all install clean test ::
|
|
$(VERB) for dir in ${DIRS}; do \
|
|
(cd $$dir; $(MAKE) $@) || exit 1; \
|
|
done
|
|
endif
|
|
|
|
# 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.
|
|
|
|
ifdef LIBRARYNAME
|
|
|
|
# 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
|
|
|
|
# dynamic target builds a shared object version of the library...
|
|
dynamic:: $(DESTLIBCURRENT)/lib$(LIBRARYNAME).so
|
|
|
|
# Does the library want a .o version built?
|
|
ifndef DONT_BUILD_RELINKED
|
|
all:: $(DESTLIBCURRENT)/$(LIBRARYNAME).o
|
|
endif
|
|
|
|
# Does the library want an archive version built?
|
|
ifdef BUILD_ARCHIVE
|
|
all:: $(DESTLIBCURRENT)/lib$(LIBRARYNAME).a
|
|
endif
|
|
|
|
$(LIBNAME_O): $(ObjectsO) $(LibSubDirs) $(DESTLIBRELEASE)/.dir
|
|
@echo ======= Linking $(LIBRARYNAME) release library =======
|
|
$(VERB) $(MakeSOO) -o $@ $(ObjectsO) $(LibSubDirs) $(LibLinkOpts)
|
|
|
|
$(LIBNAME_P): $(ObjectsP) $(LibSubDirs) $(DESTLIBPROFILE)/.dir
|
|
@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
|
|
@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
|
|
@echo "Linking $@"
|
|
$(VERB) $(Relink) -o $@ $(ObjectsP) $(LibSubDirs)
|
|
|
|
$(LIBNAME_OBJG): $(ObjectsG) $(LibSubDirs) $(DESTLIBDEBUG)/.dir
|
|
@echo "Linking $@"
|
|
$(VERB) $(Relink) -o $@ $(ObjectsG) $(LibSubDirs)
|
|
|
|
endif
|
|
|
|
#------------------------------------------------------------------------
|
|
# Create a TAGS database for emacs
|
|
#------------------------------------------------------------------------
|
|
|
|
ifeq ($(LEVEL), .)
|
|
tags:
|
|
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...
|
|
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))
|
|
|
|
all:: $(TOOLEXENAMES)
|
|
clean::
|
|
$(VERB) rm -f $(TOOLEXENAMES)
|
|
|
|
$(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)
|
|
|
|
$(TOOLEXENAME_O): $(ObjectsO) $(USED_LIB_PATHS_O) $(DESTTOOLRELEASE)/.dir
|
|
@echo ======= Linking $(TOOLNAME) release executable =======
|
|
$(VERB) $(LinkO) -o $@ $(ObjectsO) $(LIB_OPTS_O) $(LINK_OPTS)
|
|
|
|
$(TOOLEXENAME_P): $(ObjectsP) $(USED_LIB_PATHS_P) $(DESTTOOLPROFILE)/.dir
|
|
@echo ======= Linking $(TOOLNAME) profile executable =======
|
|
$(VERB) $(LinkP) -o $@ $(ObjectsP) $(LIB_OPTS_P) $(LINK_OPTS)
|
|
|
|
endif
|
|
|
|
|
|
|
|
#---------------------------------------------------------
|
|
.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...
|
|
$(BUILD_OBJ_DIR)/Release/%.o: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Release/.dir
|
|
@echo "Compiling $<"
|
|
$(VERB) $(CompileO) $< -o $@
|
|
|
|
$(BUILD_OBJ_DIR)/Release/%.o: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Release/.dir
|
|
$(VERB) $(CompileCO) $< -o $@
|
|
|
|
$(BUILD_OBJ_DIR)/Profile/%.o: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Profile/.dir
|
|
@echo "Compiling $<"
|
|
$(VERB) $(CompileP) $< -o $@
|
|
|
|
$(BUILD_OBJ_DIR)/Profile/%.o: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Profile/.dir
|
|
@echo "Compiling $<"
|
|
$(VERB) $(CompileCP) $< -o $@
|
|
|
|
$(BUILD_OBJ_DIR)/Debug/%.o: $(SourceDir)%.cpp $(BUILD_OBJ_DIR)/Debug/.dir
|
|
@echo "Compiling $<"
|
|
$(VERB) $(CompileG) $< -o $@
|
|
|
|
$(BUILD_OBJ_DIR)/Debug/%.o: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Debug/.dir
|
|
$(VERB) $(CompileCG) $< -o $@
|
|
|
|
#
|
|
# 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]; )
|
|
#
|
|
%.cpp: %.l
|
|
$(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)/' > $@
|
|
|
|
# Rule for building the bison parsers...
|
|
%.c: %.y # Cancel built-in rules for yacc
|
|
%.h: %.y # Cancel built-in rules for yacc
|
|
%.cpp %.h : %.y
|
|
@echo Bison\'ing $<...
|
|
$(VERB) $(BISON) -v -d -p $(<:%Parser.y=%) $*.y
|
|
$(VERB) mv -f $*.tab.c $*.cpp
|
|
$(VERB) mv -f $*.tab.h $*.h
|
|
|
|
# To create the directories...
|
|
%/.dir:
|
|
$(VERB) mkdir -p $*
|
|
@date > $@
|
|
|
|
# To create postscript files from dot files...
|
|
%.ps: %.dot
|
|
dot -Tps < $< > $@
|
|
|
|
# 'make clean' nukes the tree
|
|
clean::
|
|
$(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,
|
|
# include the dependancies now...
|
|
#
|
|
SourceBaseNames := $(basename $(notdir $(filter-out Debug/%, $(Source))))
|
|
SourceDepend := $(SourceBaseNames:%=$(BUILD_OBJ_DIR)/Depend/%.d)
|
|
|
|
# Create dependencies for the *.cpp files...
|
|
#$(SourceDepend): \x
|
|
$(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
|
|
$(BUILD_OBJ_DIR)/Depend/%.d: $(SourceDir)%.c $(BUILD_OBJ_DIR)/Depend/.dir
|
|
$(VERB) $(DependC) $< | sed 's|$*\.o *|Release/& Profile/& Debug/& Depend/$(@F)|g' > $@
|
|
|
|
ifneq ($(SourceDepend),)
|
|
-include $(SourceDepend)
|
|
endif
|