blob: dc366d68c4691a525c4a145df7eaab1b7f918d33 [file] [log] [blame]
.PHONY: all tidy clean distclean confclean
.SECONDARY:
.SUFFIXES:
#.SUFFIXES: .c .cpp .cxx .cc .h .hpp .o .a .bc .ll .jar $(SHLIBEXT) $(EXEEXT)
all::
###############################################################################
# Main options
###############################################################################
BUILD_NAME=$(VMKIT_BUILD_NAME)
ifneq ($(ASSERT),1)
COMMON_CFLAGS+=-DNDEBUG
endif
ifeq ($(DEBUG),1)
COMMON_CFLAGS+=-g3 -fno-limit-debug-info
endif
ifeq ($(OPTIMIZED),1)
LLC_FLAGS+= -O=3
OPT_FLAGS+= -disable-opt
CPPGEN_FLAGS+=-strip-debug
COMMON_CFLAGS+= -O3
else
LLC_FLAGS+=-O=0 -asm-verbose
OPT_FLAGS+=-disable-opt -inline
CPPGEN_FLAGS+=-disable-opt
COMMON_CFLAGS+=-O0
PRECOMPILER_OPT+=-disable-opt
endif
LLC_FLAGS+=-disable-cfi -disable-fp-elim -relocation-model=pic
OPT_FLAGS+=-disable-cfi -disable-fp-elim
INCLUDES+=-I$(PROJ_SRC_CWD) -I$(PROJ_SRC_ROOT)/include -I$(PROJ_SRC_ROOT)/lib/vmkit/MMTk -I$(BUILD_DIR) \
-I$(shell $(LLVM_CONFIG) --includedir) -I$(shell $(LLVM_CONFIG) --src-root)
WARN_CFLAGS= -Wall -Wno-long-long -Wno-variadic-macros -Wno-unused-private-field -Wno-unused-variable
COMMON_CFLAGS+= $(INCLUDES) -ansi -pedantic $(WARN_CFLAGS) -fPIC \
-D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS \
-fno-strict-aliasing -fno-omit-frame-pointer -fvisibility-inlines-hidden
CFLAGS+=$(COMMON_CFLAGS)
CXXFLAGS+=$(COMMON_CFLAGS) -Woverloaded-virtual -Wcast-qual -fno-exceptions $(LLVM_RTTI)
LDFLAGS+=$(COMMON_CFLAGS) $(shell $(LLVM_CONFIG) --ldflags) $(LDOPT)
SHOPT+=$(COMMON_CFLAGS)
LIBS+=$(shell $(LLVM_CONFIG) --libs) -lz
DEPEND_OPTIONS=-MMD -MP -MF "$(BUILD_DIR)/$$*.d.tmp" -MT "$(BUILD_DIR)/$$*.bc" -MT "$(BUILD_DIR)/$$*.d"
DOM=then mv -f "$(BUILD_DIR)/$$*.d.tmp" "$(BUILD_DIR)/$$*.d"; else rm -f "$(BUILD_DIR)/$$*.d.tmp"; exit 1; fi
###############################################################################
# Nice printing
###############################################################################
ifndef PROF
PROF=.
all::
$(Echo) "Entering compilation process"
endif
EchoMsg="[$(PROJECT_NAME) $(PROF)]:"
Echo=@echo $(EchoMsg)
ifndef VERBOSE
SUB_OPT=--no-print-directory
Verb:=@
endif
###############################################################################
# Recursive target managment
###############################################################################
RECURSIVE_TARGETS=all clean distclean
$(RECURSIVE_TARGETS)::
$(Verb) for f in $(DIRS); do \
$(MAKE) $(SUB_OPT) -C $$f $@ PROF=$(PROF)/$$f; \
if [ $$? != 0 ]; then echo "$(EchoMsg) abort with error in $(PROF)/$$f"; exit 1; fi \
done; exit 0;
tidy:
$(Echo) Cleaning temporary files
$(Verb) find $(PROJ_OBJ_ROOT) -iname "*~" -exec rm -f {} \;
clean::
$(Echo) "Cleaning compilation files"
$(Verb) rm -Rf $(BUILD_NAME)
distclean::
$(Echo) "Cleaning all compilation files"
$(Verb) rm -Rf Release* Debug* Unoptimized*
confclean: clean
$(Echo) Cleaning configuration
$(Verb) rm -Rf $(PROJ_OBJ_ROOT)/Makefile.common
$(Verb) rm -Rf $(PROJ_OBJ_ROOT)/config.status $(PROJ_OBJ_ROOT)/config.log
$(Verb) rm -Rf $(PROJ_OBJ_ROOT)/autoconf/autom4te.cache $(PROJ_OBJ_ROOT)/autoconf/configure.bak
%/.dir:
$(Verb) $(MKDIR) $(dir $@) && $(TOUCH) $@
###############################################################################
# Build system managment
###############################################################################
#SELF=$(PROJ_SRC_ROOT)/Makefile.rules $(PROJ_OBJ_ROOT)/Makefile.common Makefile
$(LEVEL)/Makefile.common: $(PROJ_OBJ_ROOT)/Makefile.common
define define_config_rule
$$(PROJ_OBJ_ROOT)/$1: $$(PROJ_SRC_ROOT)/$1.in $$(PROJ_SRC_ROOT)/configure
$(Echo) "Regenerating project files $$1"
$(Verb) cd $(PROJ_OBJ_ROOT) && ./config.status -q --$2=$1
$(Verb) touch $$@
endef
$(foreach cur,$(CONFIG_FILES),$(eval $(call define_config_rule,$(cur),file)))
$(foreach cur,$(CONFIG_HEADERS),$(eval $(call define_config_rule,$(cur),header)))
$(PROJ_OBJ_ROOT)/configure: $(PROJ_SRC_ROOT)/autoconf/configure.ac $(PROJ_SRC_ROOT)/autoconf/AutoRegen.sh
$(Echo) "Rebootstraping project"
$(Verb) cd $(PROJ_SRC_ROOT)/autoconf && ./AutoRegen.sh
$(Verb) cd $(PROJ_OBJ_ROOT) && ./config.status --recheck
###############################################################################
# Build directories and generated binaries
###############################################################################
BIN_DIR=$(PROJ_OBJ_ROOT)/$(BUILD_NAME)/bin
LIB_DIR=$(PROJ_OBJ_ROOT)/$(BUILD_NAME)/lib
BUILD_DIR=$(PROJ_OBJ_CWD)/$(BUILD_NAME)
STATIC_GC_PASS_LIB=$(LIB_DIR)/static-gc-pass$(SHLIBEXT)
STATIC_GC_PRINTER_LIB=$(LIB_DIR)/static-gc-printer$(SHLIBEXT)
VMJC=$(BIN_DIR)/vmjc$(EXEEXT)
PRECOMPILER=$(BIN_DIR)/precompiler
###############################################################################
# Main targets
###############################################################################
ifdef TOOL
MODULE=$(TOOL)
all:: $(BIN_DIR)/$(TOOL)$(EXEEXT)
endif
ifdef LIBRARY
MODULE=$(LIBRARY)
all:: $(LIB_DIR)/$(LIBRARY)$(SHLIBEXT)
endif
ifdef MODULE_WITH_GC
MODULE=$(MODULE_WITH_GC)
NEED_GC=1
endif
###############################################################################
# GC passes
###############################################################################
ifdef NEED_GC
LLC_GC_FLAGS+=-load=$(STATIC_GC_PRINTER_LIB)
GC_ID=-gc
%$(GC_ID).bc: %.bc
$(Echo) "Preparing GC '$(notdir $<)'"
$(Verb) $(LOPT) -load=$(STATIC_GC_PASS_LIB) $(OPT_FLAGS) -StaticGCPass $< -o $@
endif
###############################################################################
# Module
###############################################################################
ifdef MODULE
MODULE_A=$(LIB_DIR)/lib$(MODULE).a
all:: $(MODULE_A)
ifdef EXTRACT_FUNCTIONS
all:: $(LIB_DIR)/$(MODULE)-inliner.o
MODULE_A_DEP=$(LIB_DIR)/$(MODULE)-inliner.o
NEED_BC=1
endif
define all-suffixes
$(wildcard *$1) $(filter %$1, $(GEN))
endef
CLANG_FILES=$(patsubst %.c,$(BUILD_DIR)/%,$(call all-suffixes,.c)) \
$(patsubst %.cc,$(BUILD_DIR)/%,$(call all-suffixes,.cc)) \
$(patsubst %.cpp,$(BUILD_DIR)/%,$(call all-suffixes,.cpp))
BC_FILES=$(addsuffix .bc,$(CLANG_FILES)) $(addprefix $(BUILD_DIR)/,$(filter %.bc, $(GEN)))
ifdef NEED_BC
# if we need bytecode, we link a module with all the bc in the build_dir directory, optimize this module
# assemble this module and finally create the archive
all:: $(LIB_DIR)/$(MODULE).bc
$(LIB_DIR)/$(MODULE).bc $(LIB_DIR)/$(MODULE)-inliner.bc: $(LIB_DIR)/%.bc: $(BUILD_DIR)/%$(GC_ID).bc $(LIB_DIR)/.dir
$(Verb) $(CP) $< $@
$(BUILD_DIR)/$(MODULE).bc: $(BC_FILES) $(patsubst %, $(LIB_DIR)/%.bc,$(MODULE_USE))
$(Echo) "Linking module '$(notdir $@)'"
$(Verb) $(LLVMLINK) $^ -o $@
MODULE_A_DEP+=$(BUILD_DIR)/$(MODULE)$(GC_ID).o
else
# for most of the module, we avoid a full module creation, mainly because I have bugs in llc
# in this case, we build a set of .o files and archive them together
# each .o is optimized and assembled
MODULE_A_DEP=$(patsubst %.bc,%$(GC_ID).o,$(BC_FILES)) $(patsubst %, $(LIB_DIR)/lib%.a,$(MODULE_USE))
endif
###############################################################################
# OpenJDK definitions
###############################################################################
ifeq ($(MODULE), Classpath)
ifeq ($(CLASSPATH_IMPL), openjdk)
VMKIT_OPENJDK_ZIP=$(BUILD_DIR)/vmkit-openjdk.zip
CLASSES_DIR=$(PROJ_SRC_CWD)/classes
MODULE_A_DEP+=$(VMKIT_OPENJDK_ZIP)
OPENJDK_JAVA_SOURCES=$(PROJ_SRC_CWD)/java/lang/VMString.java
endif
endif
$(MODULE_A): $(MODULE_A_DEP) $(LIB_DIR)/.dir
$(Echo) "Building archive '$(notdir $@)'"
-$(Verb) $(RM) -f $@
$(Verb) $(Archive) $@ $(MODULE_A_DEP)
$(Verb) $(Ranlib) $@
endif
###############################################################################
# Inliner
###############################################################################
$(BUILD_DIR)/$(MODULE)-inliner.cc: $(BUILD_DIR)/$(MODULE)$(GC_ID).bc $(SELF)
$(Echo) "Generating inliner $(notdir $@)"
$(Verb) doit() { \
echo '#include "vmkit/InlineCommon.h"'; \
echo 'using namespace llvm;'; \
echo 'namespace vmkit {'; \
for F in $(EXTRACT_FUNCTIONS); do \
$(LOPT) $(CPPGEN_FLAGS) $< -o - | $(LLC) $(LLC_FLAGS) -march=cpp -cppgen=function -cppfor=$$F -o - \
| sed -e "s/makeLLVMFunction/makeLLVMFunction_$(MODULE)_$$F/"; [ $$? -ne 0 ] && exit 1; \
done; \
echo "void makeLLVMFunctions_$(MODULE)(Module *mod) {"; \
for F in $(EXTRACT_FUNCTIONS); do \
echo " vmkit::makeLLVMFunction_$(MODULE)_$$F(mod);"; \
done; \
echo "}"; \
echo "}"; \
exit 0; \
}; doit > $@
###############################################################################
# Linking
###############################################################################
DEP_LIBS=$(patsubst %,$(LIB_DIR)/lib%.a,$(LINK_USE))
$(BIN_DIR)/$(TOOL)$(EXEEXT): $(MODULE_A) $(DEP_LIBS) $(BUILD_DIR)/frametables.o $(SELF) $(BIN_DIR)/.dir
$(Echo) "Linking executable '$(notdir $@)'"
$(Verb) $(CLANGXX) -o $@ $(LDFLAGS) $(MODULE_A) $(BUILD_DIR)/frametables.o $(DEP_LIBS) $(DEP_LIBS) $(LIBS)
$(LIB_DIR)/$(LIBRARY)$(SHLIBEXT): $(MODULE_A) $(DEP_LIBS) $(SELF) $(LIB_DIR)/.dir
$(Echo) "Linking shared library '$(notdir $@)'"
$(Verb) $(CLANGXX) -o $@ $(SHOPT) -shared -Wl,--whole-archive $(MODULE_A) -Wl,--no-whole-archive $(DEP_LIBS)
###############################################################################
# Frametables
###############################################################################
$(BUILD_DIR)/frametables.cc: $(MODULE_A) $(DEP_LIBS) $(SELF) $(BUILD_DIR)/.dir
$(Echo) "Generating frametables of $(notdir $(TOOL))" #$(notdir $(DEP_LIBS))"
$(Verb) doit() { \
F="$(MODULE_A) $(DEP_LIBS)"; \
echo '#include "vmkit/MethodInfo.h"'; \
echo 'using namespace vmkit;'; \
$(NM) $$F | grep __frametable | sed 's/\([a-f0-9]*\) \([a-zA-Z]*\) _*\([a-zA-Z0-9_]*\)/extern "C" CompiledFrames \3;/'; \
echo 'CompiledFrames* vmkit::initialFrametables[] = {'; \
$(NM) $$F | grep __frametable | sed 's/\([a-f0-9]*\) \([a-zA-Z]*\) _*\([a-zA-Z0-9_]*\)/\&\3,/'; \
echo "0"; \
echo "};"; \
}; doit > $@
###############################################################################
# vmkit runtime generated files
###############################################################################
ifdef VMKIT_RUNTIME_OUT
all:: $(BUILD_DIR)/$(VMKIT_RUNTIME_OUT)
BUILT_INC+=$(BUILD_DIR)/$(VMKIT_RUNTIME_OUT)
$(BUILD_DIR)/$(VMKIT_RUNTIME_OUT): $(VMKIT_RUNTIME_IN) $(SELF) $(BUILD_DIR)/.dir
$(Echo) "Generating '$(notdir $@)'"
$(Verb) cat $(VMKIT_RUNTIME_IN) | $(LLVMAS) -o - | $(LLC) $(LLC_FLAGS) -march=cpp -cppgen=contents -o $@
endif
###############################################################################
# object rules
###############################################################################
%.o: %.bc
$(Echo) "Assembling '$(notdir $<)'"
$(Verb) $(LLC) $(LLC_FLAGS) $(LLC_GC_FLAGS) -filetype=obj $< -o $@
define define_compile_rule
$(BUILD_DIR)/%.bc: %$1 $(BUILT_INC) $(SELF) $(BUILD_DIR)/.dir
$(Echo) "Compiling '$$(notdir $$<)'"
$(Verb) if $2 $3 $(DEPEND_OPTIONS) -emit-llvm -c "$$<" -o $$@; $(DOM)
$(BUILD_DIR)/%.bc: $(BUILD_DIR)/%$1 $(BUILT_INC) $(SELF) $(BUILD_DIR)/.dir
$(Echo) "Compiling '$$(notdir $$<)'"
$(Verb) if $2 $3 $(DEPEND_OPTIONS) -emit-llvm -c "$$<" -o $$@; $(DOM)
endef
$(eval $(call define_compile_rule,.cpp,$(CLANGXX),$(CXXFLAGS)))
$(eval $(call define_compile_rule,.cc,$(CLANGXX),$(CXXFLAGS)))
$(eval $(call define_compile_rule,.c,$(CLANG),$(CFLAGS)))
ifneq ($(MAKECMDGOALS),tidy)
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),distclean)
-include $(addsuffix .d,$(CLANG_FILES))
endif
endif
endif