This release use aligns with Intel(r) Composer XE 2013 SP1 Product Update 2 New features * The library can now be built with clang (though wiht some limitations since clang does not support 128 bit floats) * Support for Vtune analysis of load imbalance * Code contribution from Steven Noonan to build the runtime for ARM* architecture processors * First implementation of runtime API for OpenMP cancellation Bug Fixes * Fixed hang on Windows (only) when using KMP_BLOCKTIME=0 llvm-svn: 197914
439 lines
14 KiB
Makefile
439 lines
14 KiB
Makefile
# common-tools.mk #
|
|
|
|
#
|
|
#//===----------------------------------------------------------------------===//
|
|
#//
|
|
#// The LLVM Compiler Infrastructure
|
|
#//
|
|
#// This file is dual licensed under the MIT and the University of Illinois Open
|
|
#// Source Licenses. See LICENSE.txt for details.
|
|
#//
|
|
#//===----------------------------------------------------------------------===//
|
|
#
|
|
|
|
# --------------------------------------------------------------------------------------------------
|
|
# Dev tools and general options (like -fpic, -O2 or -g).
|
|
# --------------------------------------------------------------------------------------------------
|
|
|
|
# c -- C compiler.
|
|
# cxx -- C++ compiler.
|
|
# cpp -- C preprocessor.
|
|
# fort -- Fortran compiler.
|
|
# as -- Assembler.
|
|
# ar -- Librarian (static library maker).
|
|
# ld -- Linker (dynamic library maker).
|
|
# *-out -- Flag denoting output file. If space between flag and file name required, add explicit
|
|
# space to variable, e. g.: "c-out = -o$(space)".
|
|
# *-flags -- Flags to appropriate program, e. g. c-flags -- flags for C compiler, etc.
|
|
|
|
# --- Common definitions ---
|
|
|
|
# Add current directory (it contains generated files).
|
|
# Note: It is important to specify current dir as "./" (not just "."). Otherwise Intel compiler
|
|
# on Windows* OS generates such a dependency: "kmp_runtime.obj: .\kmp_i18n.inc", and make complains
|
|
# "No rule to build .\kmp_i18n.inc". Using "./" solves the problem.
|
|
cpp-flags += -I ./
|
|
# For non-x86 architecture
|
|
ifeq "$(filter 32 32e 64,$(arch))" ""
|
|
cpp-flags += $(shell pkg-config --cflags libffi)
|
|
endif
|
|
# Add all VPATH directories to path for searching include files.
|
|
cpp-flags += $(foreach i,$(VPATH),-I $(i))
|
|
|
|
|
|
# Shouldn't this be being set from the command line somehow?
|
|
cpp-flags += -D USE_ITT_BUILD
|
|
|
|
ifeq "$(OPTIMIZATION)" "on"
|
|
cpp-flags += -D NDEBUG
|
|
else
|
|
cpp-flags += -D _DEBUG -D BUILD_DEBUG
|
|
endif
|
|
|
|
# --- Linux* OS, Intel(R) Many Integrated Core Architecture and OS X* definitions ---
|
|
|
|
ifneq "$(filter lin lrb mac,$(os))" ""
|
|
# --- C/C++ ---
|
|
ifeq "$(c)" ""
|
|
c = icc
|
|
endif
|
|
# C++ compiler is a complement to C compiler.
|
|
ifeq "$(c)" "icc"
|
|
cxx = icpc
|
|
endif
|
|
ifeq "$(c)" "gcc"
|
|
cxx = g++
|
|
endif
|
|
ifeq "$(c)" "clang"
|
|
cxx = clang++
|
|
endif
|
|
# Output file flag.
|
|
c-out = -o$(space)
|
|
cxx-out = -o$(space)
|
|
# Compile only, no link.
|
|
c-flags += -c
|
|
cxx-flags += -c
|
|
# Generating dependecy file.
|
|
c-flags-m += -M -MG
|
|
cxx-flags-m += -M -MG
|
|
# Enable C99 language.
|
|
ifneq "$(CPLUSPLUS)" "on"
|
|
c-flags += -std=gnu99
|
|
endif
|
|
# Generate position-independent code (a must for shared objects).
|
|
ifeq "$(LINK_TYPE)" "dyna"
|
|
c-flags += -fPIC
|
|
cxx-flags += -fPIC
|
|
endif
|
|
# Emit debugging information.
|
|
ifeq "$(DEBUG_INFO)" "on"
|
|
c-flags += -g
|
|
cxx-flags += -g
|
|
endif
|
|
# Instrument program for profiling, gather extra information.
|
|
ifeq "$(COVERAGE)" "on"
|
|
ifeq "$(c)" "icc"
|
|
c-flags += -prof_genx
|
|
endif
|
|
ifeq "$(cxx)" "icpc"
|
|
cxx-flags += -prof_genx
|
|
endif
|
|
endif
|
|
# Turn optimization on or off.
|
|
ifeq "$(OPTIMIZATION)" "on"
|
|
# -inline-min-size=1 improves performance of PARALLEL EPCC up to 10% on fxi64lin01,
|
|
# doesn't change performance on fxe64lin01.
|
|
# Presence of the -inline-min-size=1 switch should only help
|
|
# to promote performance stability between changes,
|
|
# even if it has no observable impact right now.
|
|
ifneq "$(filter icl icl.exe,$(c))" ""
|
|
c-flags += -O2 -inline-min-size=1
|
|
else
|
|
c-flags += -O2
|
|
endif
|
|
ifneq "$(filter icl icl.exe,$(cxx))" ""
|
|
cxx-flags += -O2 -inline-min-size=1
|
|
else
|
|
cxx-flags += -O2
|
|
endif
|
|
else
|
|
c-flags += -O0
|
|
cxx-flags += -O0
|
|
endif
|
|
# --- Assembler ---
|
|
ifeq "$(c)" "icc"
|
|
as = icc
|
|
endif
|
|
ifeq "$(c)" "gcc"
|
|
as = gcc
|
|
endif
|
|
ifeq "$(c)" "clang"
|
|
as = clang
|
|
endif
|
|
as-out = -o$(space)
|
|
as-flags += $(cpp-flags)
|
|
# Compile only, no link.
|
|
as-flags += -c
|
|
as-flags += -x assembler-with-cpp
|
|
# --- Fortran ---
|
|
ifeq "$(c)" "icc"
|
|
fort = ifort
|
|
endif
|
|
ifeq "$(c)" "gcc"
|
|
fort = gfortran
|
|
endif
|
|
ifeq "$(c)" "clang"
|
|
fort = gfortran
|
|
endif
|
|
ifeq "$(fort)" ""
|
|
fort = ifort
|
|
endif
|
|
fort-out = -o$(space)
|
|
fort-flags += -c
|
|
endif
|
|
|
|
# --- Linux* OS definitions ---
|
|
|
|
ifeq "$(os)" "lin"
|
|
# --- C/C++ ---
|
|
# On lin_32, we want to maintain stack alignment to be conpatible with GNU binaries built with
|
|
# compiler.
|
|
ifeq "$(c)" "icc"
|
|
ifeq "$(arch)" "32"
|
|
c-flags += -falign-stack=maintain-16-byte
|
|
cxx-flags += -falign-stack=maintain-16-byte
|
|
endif
|
|
# Generate code that will run on any Pentium or later processor.
|
|
ifeq "$(arch)" "32"
|
|
c-flags += -mia32
|
|
cxx-flags += -mia32
|
|
endif
|
|
endif
|
|
ifeq "$(c)" "gcc"
|
|
ifeq "$(arch)" "arm"
|
|
c-flags += -marm
|
|
endif
|
|
endif
|
|
# --- Librarian ---
|
|
ar = ar
|
|
ar-out = $(empty)
|
|
ar-flags += cr
|
|
# --- Linker ---
|
|
# Use ld by default, however, makefile may specify ld=$(c) before including devtools.mk.
|
|
ifeq "$(ld)" ""
|
|
ld = $(c)
|
|
endif
|
|
ld-flags-dll += -shared
|
|
ifeq "$(ld)" "ld"
|
|
ld-out = -o$(space)
|
|
ifeq "$(arch)" "32"
|
|
ld-flags += -m elf_i386
|
|
endif
|
|
ifeq "$(arch)" "32e"
|
|
ld-flags += -m elf_x86_64
|
|
endif
|
|
ld-flags += -x -lc -ldl
|
|
ld-flags += -z noexecstack
|
|
ld-flags-dll += -soname=$(@F)
|
|
endif
|
|
ifeq "$(ld)" "$(c)"
|
|
ld-out = $(c-out)
|
|
ld-flags += -Wl,-z,noexecstack
|
|
ld-flags-dll += -Wl,-soname=$(@F)
|
|
endif
|
|
ifeq "$(ld)" "$(cxx)"
|
|
ld-out = $(cxx-out)
|
|
ld-flags += -Wl,-z,noexecstack
|
|
ld-flags-dll += -Wl,-soname=$(@F)
|
|
endif
|
|
endif
|
|
|
|
# --- Intel(R) Many Integrated Core Architecture definitions ---
|
|
|
|
ifeq "$(os)" "lrb"
|
|
# --- C/C++ ---
|
|
# Intel(R) Many Integrated Core Architecture specific options, need clarification for purpose:
|
|
#c-flags += -mmic -mP2OPT_intrin_disable_name=memcpy -mP2OPT_intrin_disable_name=memset -mGLOB_freestanding -mGLOB_nonstandard_lib -nostdlib -fno-builtin
|
|
#cxx-flags += -mmic -mP2OPT_intrin_disable_name=memcpy -mP2OPT_intrin_disable_name=memset -mGLOB_freestanding -mGLOB_nonstandard_lib -nostdlib -fno-builtin
|
|
# icc for lrb has a bug: it generates dependencies for target like file.obj, while real object
|
|
# files are named file.o. -MT is a workaround for the problem.
|
|
c-flags-m += -MT $(basename $@).o
|
|
cxx-flags-m += -MT $(basename $@).o
|
|
# --- Librarian ---
|
|
ar = ar
|
|
ar-out = $(empty)
|
|
ar-flags += cr
|
|
# --- Linker ---
|
|
# Use $(c) by default, however, makefile may specify another linker (e.g. ld=ld) before including devtools.mk.
|
|
ifeq "$(ld)" ""
|
|
ld = $(c)
|
|
endif
|
|
ifeq "$(ld)" "ld"
|
|
ld-out = -o$(space)
|
|
ld-flags += -m elf_l1om_fbsd
|
|
ld-flags-dll += -shared -x -lc
|
|
ld-flags-dll += -soname=$(@F)
|
|
# Now find out path to libraries.
|
|
ld-flags-L := $(shell $(c) -Wl,-v -\# 2>&1 | grep -e "-L")
|
|
$(call debug,ld-flags-L)
|
|
# Remove continuation characters; first add a space to the end (" -Lpath1 /" -> "-Lpath1 / ")
|
|
ld-flags-L := $(filter-out \,$(ld-flags-L))
|
|
$(call debug,ld-flags-L)
|
|
# Linker treats backslash ('\') as an escape symbol, so replace it with forward slash.
|
|
ld-flags-L := $(subst \,/,$(ld-flags-L))
|
|
$(call debug,ld-flags-L)
|
|
ld-flags += $(ld-flags-L)
|
|
endif
|
|
ifeq "$(ld)" "$(c)"
|
|
ld-out = $(c-out)
|
|
ld-flags-dll += -shared -Wl,-x -Wl,-soname=$(@F)
|
|
endif
|
|
ifeq "$(ld)" "$(cxx)"
|
|
ld-out = $(cxx-out)
|
|
ld-flags-dll += -shared -Wl,-x -Wl,-soname=$(@F)
|
|
endif
|
|
endif
|
|
|
|
# --- OS X* definitions ---
|
|
|
|
ifeq "$(os)" "mac"
|
|
# --- Librarian ---
|
|
ar = libtool
|
|
ar-out = -o$(space)
|
|
ar-flags += -static
|
|
# --- Linker ---
|
|
# Use C compiler as linker by default, however, makefile may specify ld=$(libtool) before
|
|
# including devtools.mk.
|
|
ifeq "$(ld)" ""
|
|
ld = $(c)
|
|
endif
|
|
ifeq "$(ld)" "libtool"
|
|
ld-out = -o$(space)
|
|
ld-flags-dll += -dynamic
|
|
ld-flags += -lc -ldl
|
|
endif
|
|
ifeq "$(ld)" "$(c)"
|
|
ld-out = $(c-out)
|
|
ld-flags-dll += -dynamiclib
|
|
endif
|
|
ifeq "$(ld)" "$(cxx)"
|
|
ld-out = $(cxx-out)
|
|
ld-flags-dll += -dynamiclib
|
|
endif
|
|
# These options suitable for any linker, either C compiler or libtool.
|
|
ld-flags-dll += -headerpad_max_install_names
|
|
ld-flags-dll += -install_name $(@F)
|
|
endif
|
|
|
|
# --- Windows* OS definitions ---
|
|
|
|
ifeq "$(os)" "win"
|
|
# Disable warning "function "..." (declared at line ... of ...) was declared deprecated...".
|
|
cpp-flags += -D_CRT_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE
|
|
# --- C/C++ ---
|
|
ifeq "$(c)" ""
|
|
c = icl.exe
|
|
endif
|
|
cxx = $(c)
|
|
# Often default icl.cfg file in compiler bin/ directory contains options -Qvc and
|
|
# -Qlocation,link. Setting ICLCFG (and IFORTCFG) to specially prepared empty config file
|
|
# overrides default config.
|
|
ICLCFG = $(tools_dir)icc.cfg
|
|
IFORTCFG = $(tools_dir)icc.cfg
|
|
export ICLCFG
|
|
export IFORTCFG
|
|
# Output file.
|
|
c-out = -o$(space)
|
|
cxx-out = -o$(space)
|
|
# Disable annoying compiler logo.
|
|
c-flags += -nologo
|
|
cxx-flags += -nologo
|
|
# Generate code that will run on any Pentium or later processor.
|
|
ifeq "$(arch)" "32"
|
|
c-flags += -arch:ia32
|
|
cxx-flags += -arch:ia32
|
|
endif
|
|
# Compile only, no link.
|
|
c-flags += -c
|
|
cxx-flags += -c
|
|
# -QM -- Generate dependency file.
|
|
# -QMM -- do not include system headers. On Windows* OS, system headers may be located in
|
|
# "C:\Program Files\...", but path with space confuses make, so we exclude system
|
|
# headers.
|
|
# -QMG -- Treat missed headers as generated. We do have some generated include files.
|
|
c-flags-m += -QM -QMM -QMG
|
|
cxx-flags-m += -QM -QMM -QMG
|
|
# Enable C99 language.
|
|
ifneq "$(CPLUSPLUS)" "on"
|
|
c-flags += -Qstd=gnu99
|
|
endif
|
|
# Enable C++ exception handling.
|
|
# ??? Why we disable it on Linux* OS?
|
|
cxx-flags += -EHsc
|
|
ifeq "$(arch)" "32"
|
|
ifneq "$(filter icl icl.exe,$(c))" ""
|
|
c-flags += -Qsafeseh
|
|
endif
|
|
ifneq "$(filter icl icl.exe,$(cxx))" ""
|
|
cxx-flags += -Qsafeseh
|
|
endif
|
|
endif
|
|
# Emit debugging information.
|
|
ifeq "$(DEBUG_INFO)" "on"
|
|
c-flags += -Zi
|
|
cxx-flags += -Zi
|
|
endif
|
|
# Instrument program for profiling, gather extra information.
|
|
ifeq "$(COVERAGE)" "on"
|
|
c-flags += -Qprof_genx
|
|
cxx-flags += -Qprof_genx
|
|
endif
|
|
# Turn optimization on or off.
|
|
ifeq "$(OPTIMIZATION)" "on"
|
|
# Presence of the -inline-min-size=1 switch should only help
|
|
# to promote performance stability between changes,
|
|
# even if it has no observable impact right now.
|
|
# See the Linux* OS section above.
|
|
ifneq "$(filter icl icl.exe,$(c))" ""
|
|
c-flags += -O2 -Qinline-min-size=1
|
|
else
|
|
c-flags += -O2
|
|
endif
|
|
ifneq "$(filter icl icl.exe,$(cxx))" ""
|
|
cxx-flags += -O2 -Qinline-min-size=1
|
|
else
|
|
cxx-flags += -O2
|
|
endif
|
|
else
|
|
c-flags += -Od
|
|
cxx-flags += -Od
|
|
# Enable stack frame runtime error checking.
|
|
# !!! 0Obsolete option. Should use /RTC instead.
|
|
c-flags += -RTC1
|
|
cxx-flags += -RTC1
|
|
endif
|
|
# --- Assembler ---
|
|
ifeq "$(arch)" "32"
|
|
as = ml
|
|
endif
|
|
ifeq "$(arch)" "32e"
|
|
as = ml64
|
|
endif
|
|
ifeq "$(as)" "ias"
|
|
as-out = -o$(space)
|
|
endif
|
|
ifneq "$(filter ml ml64,$(as))" ""
|
|
as-out = -Fo
|
|
as-flags += -nologo -c
|
|
endif
|
|
# --- Fortran ---
|
|
fort = ifort
|
|
fort-out = -o$(space)
|
|
fort-flags += -nologo
|
|
fort-flags += -c
|
|
# --- Librarian ---
|
|
ar = link.exe
|
|
ar-out = -out:
|
|
# Generate static library. Must be the first option.
|
|
ar-flags += -lib
|
|
# Turn off tool banner.
|
|
ar-flags += -nologo
|
|
# --- Linker ---
|
|
ld = link.exe
|
|
ld-out = -out:
|
|
# Generate dynamic library.
|
|
ld-flags-dll += -dll
|
|
# Turn off tool banner.
|
|
ld-flags += -nologo
|
|
# Generate pdb (Program DataBase, debug information) file.
|
|
# If DEBUG_INFO is on, generate normal (full-featured) pdb file. Otherwise, we need only
|
|
# stripped pdb. But stripped pdb cannot be generated alone, we have to generate normal *and*
|
|
# stripped pdb. After generating both pdb files we rename stripped pdb to normal pdb name (see
|
|
# rules.mk).
|
|
ifeq "$(DEBUG_INFO)" "on"
|
|
ld-flags += $(if $(pdb_file),-debug -pdb:$(pdb_file))
|
|
else
|
|
ld-flags += $(if $(pdb_file),-debug -pdb:$(pdb_file) -pdbstripped:$(pdb_file).stripped)
|
|
endif
|
|
# Use def file, if $(def_file) is specified.
|
|
ld-flags += $(if $(def_file),-def:$(def_file))
|
|
# Generate import library, if $(imp_file) is specified.
|
|
ld-flags += $(if $(imp_file),-implib:$(imp_file))
|
|
# Specify architecture.
|
|
ifeq "$(arch)" "32"
|
|
ar-flags += -machine:i386
|
|
ld-flags += -machine:i386
|
|
endif
|
|
ifeq "$(arch)" "32e"
|
|
ar-flags += -machine:amd64
|
|
ld-flags += -machine:amd64
|
|
endif
|
|
# SAFESEH
|
|
ifeq "$(arch)" "32"
|
|
as-flags += -safeseh
|
|
ld-flags += -safeseh
|
|
endif
|
|
endif
|
|
|
|
# end of file #
|