You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

280 lines
8.8 KiB

##############################################################
#
# This file contains the following:
# 1. All the common make targets which depend on the variables defined
# in the per-directory makefile.rules files. The independent targets
# are defined in makefile.config in this directory.
# 2. Default rules for building pintools and test applications.
# 3. Default test recipes.
#
##############################################################
##############################################################
#
# make targets
#
##############################################################
###### Finalize definitions - add prefixes and suffixes ######
TESTS := $(TEST_TOOL_ROOTS:%=%.wrap) $(TEST_ROOTS:%=%.wrap)
SANITY := $(SANITY_SUBSET:%=%.wrap)
TOOLS := $(TEST_TOOL_ROOTS:%=$(OBJDIR)%$(PINTOOL_SUFFIX)) $(TOOL_ROOTS:%=$(OBJDIR)%$(PINTOOL_SUFFIX))
SA_TOOLS := $(SA_TOOL_ROOTS:%=$(OBJDIR)%$(SATOOL_SUFFIX))
APPS := $(APP_ROOTS:%=$(OBJDIR)%$(EXE_SUFFIX))
OBJECTS := $(OBJECT_ROOTS:%=$(OBJDIR)%$(OBJ_SUFFIX))
DLLS := $(DLL_ROOTS:%=$(OBJDIR)$(DLL_PREFIX)%$(DLL_SUFFIX))
LIBS := $(LIB_ROOTS:%=$(OBJDIR)%$(LIB_SUFFIX))
###### Create the output directory ######
# Create the output directory.
dir: $(OBJDIR)
obj-%:
mkdir -p $@
# Add the output directory as an order-only dependency to all the binaries and tests.
# Order-only dependencies are all the dependencies that follow the "|" character.
# These dependencies do not mandate rebuilding the target if the dependency changed,
# only that the dependended-on file exists.
# In this case, we require that $(OBJDIR) exist, but we don't care if it has changed.
$(TEST_TOOL_ROOTS:%=%.test) $(TEST_ROOTS:%=%.test): %: | dir
$(TESTS) $(SANITY): %: | dir
$(TOOLS) $(TOOLS:%$(PINTOOL_SUFFIX)=%$(OBJ_SUFFIX)) $(SA_TOOLS) $(SA_TOOLS:%$(SATOOL_SUFFIX)=%$(OBJ_SUFFIX)): %: | dir
$(APPS) $(OBJECTS) $(DLLS) $(LIBS): %: | dir
###### Build ######
# Build the tools.
tools: dir $(TOOLS) $(SA_TOOLS)
# Build the applications.
apps: dir $(APPS)
# Build the additional object files.
objects: dir $(OBJECTS)
# Build the additional dlls.
dlls: dir $(DLLS)
# Build the static libraries.
libs: dir $(LIBS)
# Build the program which checks the hardware for avx support.
avxcheck: $(CHECKAVX)
# Build the program which checks the hardware for avx2 support.
avx2check: $(CHECKAVX2)
# Build the program which checks the hardware for tsx support.
tsxcheck: $(CHECKTSX)
# Build the program which checks the hardware for avx512f support.
avx512fcheck: $(CHECKAVX512F)
###### Install ######
# Build all and run a predefined installer where applicable.
install: all
$(INSTALLER) $(INSTALL_FLAGS)
@echo install complete!
###### Test ######
# Run all tests.
test: $(TESTS)
# Run the "short" sanity list.
sanity: $(SANITY)
summary:
$(TOOLS_ROOT)/Utils/testsummary
###### Cleanup ######
# Remove any files that were created by the make process.
clean:
-rm -rf $(OBJDIR) *.out* *.log* *.xml *.makefile.copy *.core core.*
clean-remote:
-$(INSTALLER) $(INSTALL_FLAGS) --clean
###### Build the common components - for internal use ######
$(TESTAPP):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)cp-pin$(EXE_SUFFIX)
$(HELLO_APP):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)hello$(EXE_SUFFIX)
$(HELLO_APP_DWARF4):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)hello_dwarf4$(EXE_SUFFIX)
$(DISABLE_ASLR):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)disable-aslr$(EXE_SUFFIX)
$(ATTACH_LAUNCHER):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)attachLauncher$(EXE_SUFFIX)
$(THREAD_APP):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)thread_app$(EXE_SUFFIX)
$(INSCOUNT_TOOL):
$(MAKE) -C $(TOOLS_ROOT)/ManualExamples dir $(OBJDIR)inscount0$(PINTOOL_SUFFIX)
$(CHECKAVX):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)avx_check$(EXE_SUFFIX)
$(CHECKAVX2):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)avx2_check$(EXE_SUFFIX)
$(CHECKTSX):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)tsx_check$(EXE_SUFFIX)
$(CHECKAVX512F):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)avx512f_check$(EXE_SUFFIX)
$(THREADLIB):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)threadlib$(OBJ_SUFFIX)
$(RUNNABLE):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)runnable$(OBJ_SUFFIX)
$(THREADPOOL):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)thread_pool$(OBJ_SUFFIX)
$(SYSMEMORY):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)sys_memory$(OBJ_SUFFIX)
$(REGVALLIB):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)regvallib$(LIB_SUFFIX)
$(CONTROLLERLIB):
$(MAKE) -C $(TOOLS_ROOT)/InstLib dir $(OBJDIR)controller$(LIB_SUFFIX)
$(SUPPORTS_AVX_OBJ):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)supports_avx$(OBJ_SUFFIX)
$(SUPPORTS_AVX2_OBJ):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)supports_avx2$(OBJ_SUFFIX)
$(SUPPORTS_AVX512F_OBJ):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)supports_avx512f$(OBJ_SUFFIX)
$(SET_XMM_SCRATCHES_OBJ):
$(MAKE) -C $(TOOLS_ROOT)/Utils dir $(OBJDIR)set_xmm_scratches_asm$(OBJ_SUFFIX)
###### Automated testing utilities - for internal use ######
$(OBJDIR)%.tested:
touch $@
$(OBJDIR)%.failed:
touch $@
# Prevent these from being deleted if the test recipe fails.
.PRECIOUS: $(OBJDIR)%.tested $(OBJDIR)%.failed
# Don't delete the files generated in the Utils directory.
.PRECIOUS: $(TESTAPP) $(HELLO_APP) $(HELLO_APP_DWARF4) $(DISABLE_ASLR) $(ATTACH_LAUNCHER) $(THREAD_APP)
.PRECIOUS: $(CHECKAVX) $(CHECKAVX2) $(CHECKTSX) $(CHECKAVX512F)
.PRECIOUS: $(THREADLIB) $(SUPPORTS_AVX_OBJ) $(SUPPORTS_AVX2_OBJ) $(SUPPORTS_AVX512F_OBJ) $(SET_XMM_SCRATCHES_OBJ)
.PRECIOUS: $(RUNNABLE) $(THREADPOOL) $(SYSMEMORY)
# Accelerate the make process and prevent errors.
.PHONY: tools apps objects dlls libs avxcheck tsxcheck install test sanity summary clean %.test %.wrap
##############################################################
#
# Default build rules
#
##############################################################
###### Default build rules for tools ######
# Build the intermediate object file.
$(OBJDIR)%$(OBJ_SUFFIX): %.cpp
$(CXX) $(TOOL_CXXFLAGS) $(COMP_OBJ)$@ $<
# Build the intermediate object file.
$(OBJDIR)%$(OBJ_SUFFIX): %.c
$(CC) $(TOOL_CFLAGS) $(COMP_OBJ)$@ $<
# Build the tool as a dll (shared object).
$(OBJDIR)%$(PINTOOL_SUFFIX): $(OBJDIR)%$(OBJ_SUFFIX)
$(LINKER) $(TOOL_LDFLAGS) $(LINK_EXE)$@ $< $(TOOL_LPATHS) $(TOOL_LIBS)
# Build the static analysis tools.
$(SA_TOOLS): %$(SATOOL_SUFFIX): %$(OBJ_SUFFIX)
$(LINKER) $(SATOOL_LDFLAGS) $(LINK_EXE)$@ $^ $(SATOOL_LPATHS) $(SATOOL_LIBS)
# Don't delete the object files and dlls.
.PRECIOUS: $(OBJDIR)%$(OBJ_SUFFIX) $(OBJDIR)%$(PINTOOL_SUFFIX)
###### Default build rules for asm objects ######
# Source and target have the same name.
$(OBJDIR)%$(OBJ_SUFFIX): %$(ASM_SUFFIX)
$(ASMBLR) $(ASM_FLAGS) $(COMP_OBJ)$@ $<
# Target name includes the string "_asm".
$(OBJDIR)%_asm$(OBJ_SUFFIX): %$(ASM_SUFFIX)
$(ASMBLR) $(ASM_FLAGS) $(COMP_OBJ)$@ $<
# Several source versions depending on architecture.
$(OBJDIR)%$(OBJ_SUFFIX): %_$(TARGET)$(ASM_SUFFIX)
$(ASMBLR) $(ASM_FLAGS) $(COMP_OBJ)$@ $<
# Same as above, but target name includes the string "_asm".
$(OBJDIR)%_asm$(OBJ_SUFFIX): %_$(TARGET)$(ASM_SUFFIX)
$(ASMBLR) $(ASM_FLAGS) $(COMP_OBJ)$@ $<
# Several source versions depending on OS type.
$(OBJDIR)%$(OBJ_SUFFIX): %_$(OS_TYPE)$(ASM_SUFFIX)
$(ASMBLR) $(ASM_FLAGS) $(COMP_OBJ)$@ $<
# Same as above, but target name includes the string "_asm".
$(OBJDIR)%_asm$(OBJ_SUFFIX): %_$(OS_TYPE)$(ASM_SUFFIX)
$(ASMBLR) $(ASM_FLAGS) $(COMP_OBJ)$@ $<
# Several source versions depending on architecture and OS type.
$(OBJDIR)%$(OBJ_SUFFIX): %_$(TARGET)_$(OS_TYPE)$(ASM_SUFFIX)
$(ASMBLR) $(ASM_FLAGS) $(COMP_OBJ)$@ $<
# Same as above, but target name includes the string "_asm".
$(OBJDIR)%_asm$(OBJ_SUFFIX): %_$(TARGET)_$(OS_TYPE)$(ASM_SUFFIX)
$(ASMBLR) $(ASM_FLAGS) $(COMP_OBJ)$@ $<
###### Default build rules for applications ######
$(OBJDIR)%$(EXE_SUFFIX): %.cpp
$(APP_CXX) $(APP_CXXFLAGS) $(COMP_EXE)$@ $< $(APP_LDFLAGS) $(APP_LIBS) $(CXX_LPATHS) $(CXX_LIBS)
$(OBJDIR)%$(EXE_SUFFIX): %.c
$(APP_CC) $(APP_CXXFLAGS) $(COMP_EXE)$@ $< $(APP_LDFLAGS) $(APP_LIBS)
##############################################################
#
# Default test recipes
#
##############################################################
###### Default test rules ######
# This wrapper is used by the nightly testing system. No need to use it outside of this file.
%.wrap: $(OBJDIR) $(OBJDIR)%.tested $(OBJDIR)%.failed
$(MAKE) $(@:.wrap=.test) $(MAKE_TESTFLAGS)
rm $(OBJDIR)$(@:.wrap=.failed)
# Not all tools produce output so the .out file might not be created. We don't want the test to fail in this case,
# so we ignore possible failures of the final rm command.
%.test: $(OBJDIR) $(OBJDIR)%$(PINTOOL_SUFFIX) $(TESTAPP)
$(PIN) -t $(OBJDIR)$(@:.test=)$(PINTOOL_SUFFIX) -- $(TESTAPP) makefile $(OBJDIR)$(@:.test=.makefile.copy) \
> $(OBJDIR)$(@:.test=.out) 2>&1
$(CMP) makefile $(OBJDIR)$(@:.test=.makefile.copy)
$(RM) $(OBJDIR)$(@:.test=.makefile.copy)
-$(RM) $(OBJDIR)$(@:.test=.out)