blob: bccdb1fa3a47f3893e8cc7f331b8d3744baf8b60 [file] [log] [blame]
# Copyright Vladimir Prus 2004.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt
# or copy at http://www.boost.org/LICENSE_1_0.txt)
# Importing common is needed because the rules we inherit here depend on it.
# That is nasty.
import common ;
import errors ;
import feature ;
import intel ;
import msvc ;
import os ;
import set ;
import toolset ;
import generators ;
import type ;
import path ;
feature.extend-subfeature toolset intel : platform : win ;
toolset.inherit-generators intel-win <toolset>intel <toolset-intel:platform>win : msvc ;
toolset.inherit-flags intel-win : msvc : : YLOPTION ;
toolset.inherit-rules intel-win : msvc ;
# Override default do-nothing generators.
generators.override intel-win.compile.c.pch : pch.default-c-pch-generator ;
generators.override intel-win.compile.c++.pch : pch.default-cpp-pch-generator ;
generators.override intel-win.compile.rc : rc.compile.resource ;
generators.override intel-win.compile.mc : mc.compile ;
toolset.flags intel-win.compile PCH_SOURCE <pch>on : <pch-source> ;
toolset.add-requirements <toolset>intel-win,<runtime-link>shared:<threading>multi ;
# Initializes the intel toolset for windows
rule init ( version ? : # the compiler version
command * : # the command to invoke the compiler itself
options * # Additional option: <compatibility>
# either 'vc6', 'vc7', 'vc7.1'
# or 'native'(default).
)
{
if $(version)
{
configure $(version) : $(command) : $(options) ;
}
else
{
if $(command)
{
errors.error "Autodetect of version from command not implemented!" ;
}
local intel_versions = [ get-autodetect-versions () ] ;
if ! $(intel_versions)
{
errors.error "No intel compiler version found!" ;
}
else
{
local msvc-version = [ feature.get-values <compatibility> : $(options) ] ; # On auto config mode the user can still request a msvc backend. If some intel compiler doesn't support it, don't try to configure it!
msvc-version = [ get-msvc-version-from-vc-string $(msvc-version) ] ;
for local v in $(intel_versions)
{
if [ is-msvc-supported $(v) : $(msvc-version) ]
{
configure $(v) : : $(options) ;
}
}
}
}
}
local rule configure ( version ? : command * : options * )
{
local compatibility =
[ feature.get-values <compatibility> : $(options) ] ;
# Allow to specify toolset and visual studio backend from commandline .e.g --toolset=intel-14.0-vc10
local vc_in_version = [ MATCH (vc[0-9]+(\\.[0-9]+)?)$ : $(version) ] ;
vc_in_version = $(vc_in_version[1]) ;
if $(compatibility) && $(vc_in_version)
{
if $(compatibility) != $(vc_in_version)
{
errors.error "feature compatibility and vc version in toolset present!" ;
}
}
if $(vc_in_version) && ! $(compatibility)
{
# vc Version must be stripped before check-init-parameters is called!
version = [ MATCH (.+)-vc.+$ : $(version) ] ;
compatibility = $(vc_in_version) ;
options += <compatibility>$(vc_in_version) ;
}
if $(compatibility)
{
configure-really $(version) : $(command) : $(options) : $(compatibility) ;
}
else
{
local msvc_versions = [ feature.values <toolset-msvc:version> ] ;
if ! $(msvc_versions)
{
ECHO notice: no msvc versions detected. trying auto detect ;
toolset.using msvc : all ;
msvc_versions = [ feature.values <toolset-msvc:version> ] ;
}
if ! $(.iclvars-$(version)-supported-vcs)
{
errors.error "Supported msvc versions not known for intel $(version)" ;
}
for local v in $(msvc_versions)
{
if [ MATCH "($(v))" : $(.iclvars-$(version)-supported-vcs) ]
{
# Strip trailing .0 from msvc version as intel compiler uses atm only major version for Qvc
local m = [ MATCH ([0-9]+).0$ : $(v) ] ;
if $(m)
{
v = $(m) ;
}
v = "vc$(v)" ;
local options_really = $(options) ;
options_really += <compatibility>$(v) ;
if $(.debug-configuration)
{
ECHO "configure: intel version: $(version) msvc version: $(v)" ;
}
configure-really $(version) : $(command) : $(options) : $(v) ;
}
}
if ! [ feature.values <toolset-intel:version> ]
{
errors.error "Failed to register an intel toolset!" ;
}
}
}
local rule configure-really ( version ? : command * : options * : compatibility )
{
local rewrite-setupscript = [ feature.get-values <rewrite-setup-scripts> : $(options) ] ;
local condition = [ common.check-init-parameters intel-win
: version $(version) : compatibility $(compatibility) ] ;
local m = [ MATCH ([0-9]+).* : $(version) ] ;
local major = $(m[1]) ;
if ! $(major)
{
errors.error "Major version not found: $(version)" ;
}
local msvc-version = [ get-msvc-version-from-vc-string $(compatibility) ] ;
if ! $(msvc-version)
{
errors.user-error "Invalid value for compatibility option:"
$(compatibility) ;
}
command = [ get-compiler-invocation-cmd $(major) : $(command) ] ;
common.handle-options intel-win : $(condition) : $(command) : $(options) ;
local root ;
if $(command)
{
root = [ common.get-absolute-tool-path $(command[-1]) ] ;
if $(major) >= 12
{
root = [ path.make $(root) ] ;
root = [ path.parent $(root) ] ;
}
root = $(root)/ ;
}
local setup ;
setup = [ path.glob $(root) : iclvars_*.bat ] ;
if ! $(setup)
{
setup = [ path.join $(root) "iclvars.bat" ] ;
setup = [ path.native $(setup) ] ;
}
local target_types ;
local iclvars_vs_arg ;
if $(major) >= 12
{
# if we have a known intel toolset check for visual studio compatibility
# if not trust parameters
if ! [ is-msvc-supported $(version) : $(msvc-version) ]
{
errors.error "msvc $(msvc-version) not supported for intel toolset version $(version)" ;
}
if $(.iclvars-version-alias-$(compatibility))
{
iclvars_vs_arg = $(.iclvars-version-alias-$(compatibility)) ;
}
else
{
errors.error "Don't know what parameter to pass for vc version ( $(compatibility) )" ;
}
# There are two possible paths for the 64-bit intel compiler,
# one for the IA32-Intel64 cross compiler, and one for the native
# 64 bit compiler. We prefer the latter one if it's installed,
# and don't rely on whether the OS reports whether we're 64 or 32 bit
# as that really only tells us which subsystem bjam is running in:
#
local intel64_path = [ path.join $(root) intel64 ] ;
if [ path.glob $(intel64_path) : icl.exe ]
{
target_types = ia32 intel64 ;
}
else
{
target_types = ia32 ia32_intel64 ;
}
}
else
{
target_types = default ;
iclvars_vs_arg = $(compatibility) ;
}
local default-assembler-intel64 = ml64 ;
local default-assembler-ia32_intel64 = ml64 ;
local default-assembler-ia32 = "ml -coff" ;
assembler = [ feature.get-values <assembler> : $(options) ] ;
for local c in $(target_types)
{
local cpu-conditions ;
local setup-call ;
if $(major) >= 12
{
local t = [ msvc.maybe-rewrite-setup intel-win : "\"$(setup)\"" : "$(c) $(iclvars_vs_arg)" : $(version) : $(rewrite-setupscript) ] ;
setup-call = "call $(t) > nul " ;
cpu-conditions = $(condition)/$(.cpu-arch-$(c)) ;
}
else
{
setup-call = "call \""$(setup)"\" $(compatibility) > nul " ;
cpu-conditions = $(condition) ;
}
if [ os.name ] = NT
{
setup-call = $(setup-call)"
" ;
}
else
{
setup-call = "cmd /S /C "$(setup-call)" \"&&\" " ;
}
if $(.debug-configuration)
{
for local cond in $(cpu-conditions)
{
ECHO "notice: [intel-cfg] condition: '$(cond)', setup: '$(setup-call)'" ;
}
}
local cpu-assembler = $(assembler) ;
cpu-assembler ?= $(default-assembler-$(c)) ;
toolset.flags intel-win.compile .CC $(cpu-conditions) : $(setup-call)icl ;
toolset.flags intel-win.link .LD $(cpu-conditions) : $(setup-call)xilink /nologo ;
toolset.flags intel-win.archive .LD $(cpu-conditions) : $(setup-call)xilink /lib /nologo ;
toolset.flags intel-win.link .MT $(cpu-conditions) : $(setup-call)mt -nologo ;
toolset.flags intel-win.compile .ASM $(cpu-conditions) : $(setup-call)$(cpu-assembler) -nologo ;
toolset.flags intel-win.compile .MC $(cpu-conditions) : $(setup-call)mc ;
toolset.flags intel-win.compile .RC $(cpu-conditions) : $(setup-call)rc ;
}
# Depending on the settings, running of tests require some runtime DLLs.
toolset.flags intel-win RUN_PATH $(condition) : $(root) ;
local C++FLAGS ;
C++FLAGS += /nologo ;
# Reduce the number of spurious error messages
C++FLAGS += /Qwn5 /Qwd985 ;
# Enable ADL
C++FLAGS += -Qoption,c,--arg_dep_lookup ; #"c" works for C++, too
# Disable Microsoft "secure" overloads in Dinkumware libraries since they
# cause compile errors with Intel versions 9 and 10.
if $(major) < 12
{
C++FLAGS += -D_SECURE_SCL=0 ;
}
if $(major) > 5
{
C++FLAGS += /Zc:forScope ; # Add support for correct for loop scoping.
}
# Add options recognized only by intel7 and above.
if $(major) >= 7
{
C++FLAGS += /Qansi_alias ;
}
if $(compatibility) = vc6
{
C++FLAGS +=
# Emulate VC6
/Qvc6
# No wchar_t support in vc6 dinkum library. Furthermore, in vc6
# compatibility-mode, wchar_t is not a distinct type from unsigned
# short.
-DBOOST_NO_INTRINSIC_WCHAR_T
;
}
else
{
if $(major) > 5
{
# Add support for wchar_t
C++FLAGS += /Zc:wchar_t
# Tell the dinkumware library about it.
-D_NATIVE_WCHAR_T_DEFINED
;
}
}
if $(compatibility) && $(compatibility) != native
{
C++FLAGS += /Q$(compatibility) ;
}
else
{
C++FLAGS +=
-Qoption,cpp,--arg_dep_lookup
# The following options were intended to disable the Intel compiler's
# 'bug-emulation' mode, but were later reported to be causing ICE with
# Intel-Win 9.0. It is not yet clear which options can be safely used.
# -Qoption,cpp,--const_string_literals
# -Qoption,cpp,--new_for_init
# -Qoption,cpp,--no_implicit_typename
# -Qoption,cpp,--no_friend_injection
# -Qoption,cpp,--no_microsoft_bugs
;
}
toolset.flags intel-win CFLAGS $(condition) : $(C++FLAGS) ;
# By default, when creating PCH, intel adds 'i' to the explicitly
# specified name of the PCH file. Of course, Boost.Build is not
# happy when compiler produces not the file it was asked for.
# The option below stops this behaviour.
toolset.flags intel-win CFLAGS : -Qpchi- ;
if ! $(compatibility)
{
# If there's no backend version, assume 7.1.
compatibility = vc7.1 ;
}
msvc-version = [ msvc.resolve-possible-msvc-version-alias $(msvc-version) ] ;
msvc.configure-version-specific intel-win : $(msvc-version) : $(condition) ;
}
local rule get-autodetect-versions
{
local result ;
for local v in $(.intel-autodetect-versions)
{
local major = [ MATCH ([0-9]+).* : $(v) ] ; # Use only major version
if [ get-icl-path-from-environment $(major) ]
{
result += $(v) ;
}
}
return $(result) ;
}
local rule get-icl-path-from-environment ( major_version )
{
local path = [ os.environ ICPP_COMPILER$(major_version) ] ;
if $(path)
{
path = [ path.make $(path) ] ;
local cmdpath ;
local subdirs = $(.icl-target-subdirectories) ;
while $(subdirs)
{
cmdpath = [ path.join $(path) "bin/$(subdirs[0])/icl.exe" ] ;
cmdpath = [ path.native $(cmdpath) ] ;
if [ path.exists $(cmdpath) ]
{
subdirs = ;
} else {
cmdpath = ;
subdirs = $(subdirs[2-]) ;
}
}
path = $(cmdpath) ;
}
return $(path) ;
}
local rule get-compiler-invocation-cmd ( major_version : command * )
{
if $(command)
{
return [ common.get-invocation-command intel-win : icl.exe : $(command) ] ;
}
else
{
local path = [ get-icl-path-from-environment $(major_version) ] ;
return [ common.get-invocation-command intel-win : icl.exe : $(path) ] ;
}
}
local rule is-msvc-supported ( intel-version : msvc-version )
{
if ! $(msvc-version)
{
return true ;
}
else
{
if $(.iclvars-$(intel-version)-supported-vcs)
{
if [ MATCH "($(msvc-version))" : $(.iclvars-$(intel-version)-supported-vcs) ]
{
return true ;
}
}
else
{
return true ;
}
}
}
local rule get-msvc-version-from-vc-string ( vc-string )
{
local r = [ MATCH "^vc([0-9]+(\\.[0-9]+)?)$" : $(vc-string) ] ;
return $(r[1]) ;
}
if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
{
.debug-configuration = true ;
}
# Copied from msvc.jam
# Supported CPU architectures.
.cpu-arch-ia32 =
<architecture>/<address-model>
<architecture>/<address-model>32
<architecture>x86/<address-model>
<architecture>x86/<address-model>32 ;
.cpu-arch-intel64 =
<architecture>/<address-model>64
<architecture>x86/<address-model>64 ;
.cpu-arch-ia32_intel64 =
<architecture>/<address-model>64
<architecture>x86/<address-model>64 ;
.intel-autodetect-versions = 14.0 13.0 12.0 ;
.iclvars-12.0-supported-vcs = "10.0 9.0 8.0" ;
.iclvars-12.1-supported-vcs = "10.0 9.0 8.0" ;
.iclvars-13.0-supported-vcs = "11.0 10.0 9.0" ;
.iclvars-14.0-supported-vcs = "12.0 11.0 10.0 9.0" ;
.iclvars-15.0-supported-vcs = "12.0 11.0 10.0 9.0" ;
.iclvars-version-alias-vc12 = vs2013 ;
.iclvars-version-alias-vc11 = vs2012 ;
.iclvars-version-alias-vc10 = vs2010 ;
.iclvars-version-alias-vc9 = vs2008 ;
.iclvars-version-alias-vc8 = vs2005 ;
.icl-target-subdirectories = ia32 ia32_intel64 intel64 ;
toolset.flags intel-win.link LIBRARY_OPTION <toolset>intel : "" ;
toolset.flags intel-win YLOPTION ;