Ticket #6350: mingw.jam

File mingw.jam, 7.3 KB (added by anonymous, 11 years ago)

mingw jam file

Line 
1# Copyright 2003 Christopher Currie
2# Copyright 2006 Dave Abrahams
3# Copyright 2003, 2004, 2005, 2006 Vladimir Prus
4# Copyright 2005-2007 Mat Marcus
5# Copyright 2005-2007 Adobe Systems Incorporated
6# Copyright 2007-2010 Rene Rivera
7# Distributed under the Boost Software License, Version 1.0.
8# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
9
10# Please see http://article.gmane.org/gmane.comp.lib.boost.build/3389/
11# for explanation why it's a separate toolset.
12
13import "class" : new ;
14import feature : feature ;
15import toolset : flags ;
16import type ;
17import common ;
18import generators ;
19import path : basename ;
20import version ;
21import property-set ;
22import regex ;
23import errors ;
24
25#############################################################################
26
27if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
28{
29 .debug-configuration = true ;
30}
31
32feature.extend toolset : mingw ;
33import gcc ;
34toolset.inherit-generators mingw : gcc : gcc.mingw.link gcc.mingw.link.dll ;
35toolset.inherit-flags mingw : gcc ;
36toolset.inherit-rules mingw : gcc ;
37
38generators.override mingw.prebuilt : builtin.prebuilt ;
39generators.override mingw.searched-lib-generator : searched-lib-generator ;
40
41# Override generators.
42generators.override mingw.compile.c.pch : pch.default-c-pch-generator ;
43generators.override mingw.compile.c++.pch : pch.default-cpp-pch-generator ;
44
45generators.register-c-compiler gcc.compile.c++.preprocess : CPP : PREPROCESSED_CPP : <toolset>mingw ;
46generators.register-c-compiler gcc.compile.c.preprocess : C : PREPROCESSED_C : <toolset>mingw ;
47generators.register-c-compiler gcc.compile.c++ : CPP : OBJ : <toolset>mingw ;
48generators.register-c-compiler gcc.compile.c : C : OBJ : <toolset>mingw ;
49generators.register-c-compiler gcc.compile.asm : ASM : OBJ : <toolset>mingw ;
50generators.register-fortran-compiler gcc.compile.fortran : FORTRAN FORTRAN90 : OBJ : <toolset>mingw ;
51
52generators.override mingw.compile.c++.preprocess : gcc.compile.c++.preprocess ;
53generators.override mingw.compile.c.preprocess : gcc.compile.c.preprocess ;
54generators.override mingw.compile.c++ : gcc.compile.c++ ;
55generators.override mingw.compile.c : gcc.compile.c ;
56generators.override mingw.compile.asm : gcc.compile.asm ;
57generators.override mingw.compile.fortran : gcc.compile.fortran ;
58
59# Initializes the mingw toolset for the given version. If necessary, command may
60# be used to specify where the compiler is located. The parameter 'options' is a
61# space-delimited list of options, each one specified as
62# <option-name>option-value. Valid option names are: cxxflags, linkflags and
63# linker-type. Accepted linker-type values are aix, darwin, gnu, hpux, osf or
64# sun and the default value will be selected based on the current OS.
65rule init ( version ? : command * : options * : requirement * )
66{
67 #1): use user-provided command
68 local tool-command = ;
69 if $(command)
70 {
71 tool-command = [ common.get-invocation-command-nodefault gcc : g++ : $(command) ] ;
72 if ! $(tool-command)
73 {
74 errors.error "toolset gcc initialization:" :
75 "provided command '$(command)' not found" :
76 "initialized from" [ errors.nearest-user-location ] ;
77 }
78 }
79 #2): enforce user-provided version
80 else if $(version)
81 {
82 tool-command = [ common.get-invocation-command-nodefault gcc : "g++-$(version[1])" ] ;
83
84 #2.1) fallback: check whether "g++" reports the requested version
85 if ! $(tool-command)
86 {
87 tool-command = [ common.get-invocation-command-nodefault gcc : g++ ] ;
88 if $(tool-command)
89 {
90 local tool-command-string = $(tool-command:J=" ") ;
91 local tool-version = [ MATCH "^([0-9.]+)" : [ SHELL "$(tool-command-string) -dumpversion" ] ] ;
92 if $(tool-version) != $(version)
93 {
94 # Permit a match betwen two-digit version specified by the user
95 # (e.g. 4.4) and 3-digit version reported by gcc.
96 # Since only two digits are present in binary name anyway,
97 # insisting that user specify 3-digit version when
98 # configuring Boost.Build while it's not required on
99 # command like would be strange.
100 local stripped = [ MATCH "^([0-9]+\.[0-9]+).*" : $(tool-version) ] ;
101 if $(stripped) != $(version)
102 {
103 errors.error "toolset gcc initialization:" :
104 "version '$(version)' requested but 'g++-$(version)' not found and version '$(tool-version)' of default '$(tool-command)' does not match" :
105 "initialized from" [ errors.nearest-user-location ] ;
106 tool-command = ;
107 }
108 # Use full 3-digit version to be compatible with the 'using gcc ;' case
109 version = $(tool-version) ;
110 }
111 }
112 else
113 {
114 errors.error "toolset gcc initialization:" :
115 "version '$(version)' requested but neither 'g++-$(version)' nor default 'g++' found" :
116 "initialized from" [ errors.nearest-user-location ] ;
117 }
118 }
119 }
120 #3) default: no command and no version specified, try using default command "g++"
121 else
122 {
123 tool-command = [ common.get-invocation-command-nodefault gcc : g++ ] ;
124 if ! $(tool-command)
125 {
126 errors.error "toolset gcc initialization:" :
127 "no command provided, default command 'g++' not found" :
128 "initialized from" [ errors.nearest-user-location ] ;
129 }
130 }
131
132 # Information about the gcc command...
133 # The command.
134 local command = $(tool-command) ;
135
136 # The version as reported by the compiler
137 local real-version ;
138
139 # The flavor of compiler.
140 local flavor = [ feature.get-values <flavor> : $(options) ] ;
141
142 flavor ?= mingw ;
143
144 # - Autodetect the version if not given.
145 if $(command)
146 {
147 # - The 'command' variable can have multiple elements. When calling
148 # the SHELL builtin we need a single string.
149 local command-string = $(command:J=" ") ;
150 real-version = [ MATCH "^([0-9.]+)"
151 : [ SHELL "$(command-string) -dumpversion" ] ] ;
152 version ?= $(real-version) ;
153 }
154
155 # - Define the condition for this toolset instance.
156 local condition =
157 [ common.check-init-parameters mingw $(requirement) : version $(version) : flavor $(flavor) ] ;
158
159 # - Set the toolset generic common options.
160 common.handle-options mingw : $(condition) : $(command) : $(options) ;
161
162 # - Set the link flags common with the GCC toolset.
163 gcc.init-link-flags mingw gnu $(condition) ;
164}