blob: a9c9fbcee6556c5758db3dbfa4d58f848752d7d9 [file] [log] [blame]
# 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 #