3 # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
5 import os,sys,re,tempfile
6 from waflib import Utils,Task,Logs,Options,Errors
7 from waflib.Logs import debug,warn
8 from waflib.TaskGen import after_method,feature
9 from waflib.Configure import conf
10 from waflib.Tools import ccroot,c,cxx,ar,winres
12 aclui activeds ad1 adptif adsiid advapi32 asycfilt authz bhsupp bits bufferoverflowu cabinet
13 cap certadm certidl ciuuid clusapi comctl32 comdlg32 comsupp comsuppd comsuppw comsuppwd comsvcs
14 credui crypt32 cryptnet cryptui d3d8thk daouuid dbgeng dbghelp dciman32 ddao35 ddao35d
15 ddao35u ddao35ud delayimp dhcpcsvc dhcpsapi dlcapi dnsapi dsprop dsuiext dtchelp
16 faultrep fcachdll fci fdi framedyd framedyn gdi32 gdiplus glauxglu32 gpedit gpmuuid
17 gtrts32w gtrtst32hlink htmlhelp httpapi icm32 icmui imagehlp imm32 iphlpapi iprop
18 kernel32 ksguid ksproxy ksuser libcmt libcmtd libcpmt libcpmtd loadperf lz32 mapi
19 mapi32 mgmtapi minidump mmc mobsync mpr mprapi mqoa mqrt msacm32 mscms mscoree
20 msdasc msimg32 msrating mstask msvcmrt msvcurt msvcurtd mswsock msxml2 mtx mtxdm
21 netapi32 nmapinmsupp npptools ntdsapi ntdsbcli ntmsapi ntquery odbc32 odbcbcp
22 odbccp32 oldnames ole32 oleacc oleaut32 oledb oledlgolepro32 opends60 opengl32
23 osptk parser pdh penter pgobootrun pgort powrprof psapi ptrustm ptrustmd ptrustu
24 ptrustud qosname rasapi32 rasdlg rassapi resutils riched20 rpcndr rpcns4 rpcrt4 rtm
25 rtutils runtmchk scarddlg scrnsave scrnsavw secur32 sensapi setupapi sfc shell32
26 shfolder shlwapi sisbkup snmpapi sporder srclient sti strsafe svcguid tapi32 thunk32
27 traffic unicows url urlmon user32 userenv usp10 uuid uxtheme vcomp vcompd vdmdbg
28 version vfw32 wbemuuid webpost wiaguid wininet winmm winscard winspool winstrm
29 wintrust wldap32 wmiutils wow32 ws2_32 wsnmp32 wsock32 wst wtsapi32 xaswitch xolehlp
31 all_msvc_platforms=[('x64','amd64'),('x86','x86'),('ia64','ia64'),('x86_amd64','amd64'),('x86_ia64','ia64'),('x86_arm','arm')]
32 all_wince_platforms=[('armv4','arm'),('armv4i','arm'),('mipsii','mips'),('mipsii_fp','mips'),('mipsiv','mips'),('mipsiv_fp','mips'),('sh4','sh'),('x86','cex86')]
33 all_icl_platforms=[('intel64','amd64'),('em64t','amd64'),('ia32','x86'),('Itanium','ia64')]
35 opt.add_option('--msvc_version',type='string',help='msvc version, eg: "msvc 10.0,msvc 9.0"',default='')
36 opt.add_option('--msvc_targets',type='string',help='msvc targets, eg: "x64,arm"',default='')
37 def setup_msvc(conf,versions,arch=False):
38 platforms=getattr(Options.options,'msvc_targets','').split(',')
40 platforms=Utils.to_list(conf.env['MSVC_TARGETS'])or[i for i,j in all_msvc_platforms+all_icl_platforms+all_wince_platforms]
41 desired_versions=getattr(Options.options,'msvc_version','').split(',')
42 if desired_versions==['']:
43 desired_versions=conf.env['MSVC_VERSIONS']or[v for v,_ in versions][::-1]
44 versiondict=dict(versions)
45 for version in desired_versions:
47 targets=dict(versiondict[version])
48 for target in platforms:
50 arch,(p1,p2,p3)=targets[target]
51 compiler,revision=version.rsplit(' ',1)
53 return compiler,revision,p1,p2,p3,arch
55 return compiler,revision,p1,p2,p3
56 except KeyError:continue
57 except KeyError:continue
58 conf.fatal('msvc: Impossible to find a valid architecture for building (in setup_msvc)')
60 def get_msvc_version(conf,compiler,version,target,vcvars):
61 debug('msvc: get_msvc_version: %r %r %r',compiler,version,target)
62 batfile=conf.bldnode.make_node('waf-print-msvc.bat')
63 batfile.write("""@echo off
68 echo INCLUDE=%%INCLUDE%%
69 echo LIB=%%LIB%%;%%LIBPATH%%
71 sout=conf.cmd_and_log(['cmd','/E:on','/V:on','/C',batfile.abspath()])
72 lines=sout.splitlines()
75 MSVC_PATH=MSVC_INCDIR=MSVC_LIBDIR=None
77 if line.startswith('PATH='):
79 MSVC_PATH=path.split(';')
80 elif line.startswith('INCLUDE='):
81 MSVC_INCDIR=[i for i in line[8:].split(';')if i]
82 elif line.startswith('LIB='):
83 MSVC_LIBDIR=[i for i in line[4:].split(';')if i]
84 if None in(MSVC_PATH,MSVC_INCDIR,MSVC_LIBDIR):
85 conf.fatal('msvc: Could not find a valid architecture for building (get_msvc_version_3)')
88 compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler)
89 cxx=conf.find_program(compiler_name,path_list=MSVC_PATH)
90 cxx=conf.cmd_to_list(cxx)
95 conf.cmd_and_log(cxx+['/help'],env=env)
97 debug('msvc: get_msvc_version: %r %r %r -> failure'%(compiler,version,target))
99 conf.fatal('msvc: cannot run the compiler (in get_msvc_version)')
101 debug('msvc: get_msvc_version: %r %r %r -> OK',compiler,version,target)
103 conf.env[compiler_name]=''
104 return(MSVC_PATH,MSVC_INCDIR,MSVC_LIBDIR)
106 def gather_wsdk_versions(conf,versions):
107 version_pattern=re.compile('^v..?.?\...?.?')
109 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Microsoft SDKs\\Windows')
112 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows')
118 version=Utils.winreg.EnumKey(all_versions,index)
122 if not version_pattern.match(version):
125 msvc_version=Utils.winreg.OpenKey(all_versions,version)
126 path,type=Utils.winreg.QueryValueEx(msvc_version,'InstallationFolder')
129 if os.path.isfile(os.path.join(path,'bin','SetEnv.cmd')):
131 for target,arch in all_msvc_platforms:
133 targets.append((target,(arch,conf.get_msvc_version('wsdk',version,'/'+target,os.path.join(path,'bin','SetEnv.cmd')))))
134 except conf.errors.ConfigurationError:
136 versions.append(('wsdk '+version[1:],targets))
137 def gather_wince_supported_platforms():
138 supported_wince_platforms=[]
140 ce_sdk=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Windows CE Tools\\SDKs')
143 ce_sdk=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Windows CE Tools\\SDKs')
147 return supported_wince_platforms
151 sdk_device=Utils.winreg.EnumKey(ce_sdk,ce_index)
155 sdk=Utils.winreg.OpenKey(ce_sdk,sdk_device)
157 path,type=Utils.winreg.QueryValueEx(sdk,'SDKRootDir')
160 path,type=Utils.winreg.QueryValueEx(sdk,'SDKInformation')
161 path,xml=os.path.split(path)
165 path,device=os.path.split(path)
167 path,device=os.path.split(path)
168 for arch,compiler in all_wince_platforms:
170 if os.path.isdir(os.path.join(path,device,'Lib',arch)):
171 platforms.append((arch,compiler,os.path.join(path,device,'Include',arch),os.path.join(path,device,'Lib',arch)))
173 supported_wince_platforms.append((device,platforms))
174 return supported_wince_platforms
175 def gather_msvc_detected_versions():
176 version_pattern=re.compile('^(\d\d?\.\d\d?)(Exp)?$')
178 for vcver,vcvar in[('VCExpress','Exp'),('VisualStudio','')]:
180 prefix='SOFTWARE\\Wow6432node\\Microsoft\\'+vcver
181 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,prefix)
184 prefix='SOFTWARE\\Microsoft\\'+vcver
185 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,prefix)
191 version=Utils.winreg.EnumKey(all_versions,index)
195 match=version_pattern.match(version)
199 versionnumber=float(match.group(1))
200 detected_versions.append((versionnumber,version+vcvar,prefix+"\\"+version))
203 detected_versions.sort(key=fun)
204 return detected_versions
206 def gather_msvc_targets(conf,versions,version,vc_path):
208 if os.path.isfile(os.path.join(vc_path,'vcvarsall.bat')):
209 for target,realtarget in all_msvc_platforms[::-1]:
211 targets.append((target,(realtarget,conf.get_msvc_version('msvc',version,target,os.path.join(vc_path,'vcvarsall.bat')))))
212 except conf.errors.ConfigurationError:
214 elif os.path.isfile(os.path.join(vc_path,'Common7','Tools','vsvars32.bat')):
216 targets.append(('x86',('x86',conf.get_msvc_version('msvc',version,'x86',os.path.join(vc_path,'Common7','Tools','vsvars32.bat')))))
217 except conf.errors.ConfigurationError:
219 elif os.path.isfile(os.path.join(vc_path,'Bin','vcvars32.bat')):
221 targets.append(('x86',('x86',conf.get_msvc_version('msvc',version,'',os.path.join(vc_path,'Bin','vcvars32.bat')))))
222 except conf.errors.ConfigurationError:
225 versions.append(('msvc '+version,targets))
227 def gather_wince_targets(conf,versions,version,vc_path,vsvars,supported_platforms):
228 for device,platforms in supported_platforms:
230 for platform,compiler,include,lib in platforms:
231 winCEpath=os.path.join(vc_path,'ce')
232 if not os.path.isdir(winCEpath):
235 common_bindirs,_1,_2=conf.get_msvc_version('msvc',version,'x86',vsvars)
236 except conf.errors.ConfigurationError:
238 if os.path.isdir(os.path.join(winCEpath,'lib',platform)):
239 bindirs=[os.path.join(winCEpath,'bin',compiler),os.path.join(winCEpath,'bin','x86_'+compiler)]+common_bindirs
240 incdirs=[os.path.join(winCEpath,'include'),os.path.join(winCEpath,'atlmfc','include'),include]
241 libdirs=[os.path.join(winCEpath,'lib',platform),os.path.join(winCEpath,'atlmfc','lib',platform),lib]
242 cetargets.append((platform,(platform,(bindirs,incdirs,libdirs))))
244 versions.append((device+' '+version,cetargets))
246 def gather_winphone_targets(conf,versions,version,vc_path,vsvars):
248 for target,realtarget in all_msvc_platforms[::-1]:
250 targets.append((target,(realtarget,conf.get_msvc_version('winphone',version,target,vsvars))))
251 except conf.errors.ConfigurationError ,e:
254 versions.append(('winphone '+version,targets))
256 def gather_msvc_versions(conf,versions):
258 for(v,version,reg)in gather_msvc_detected_versions():
261 msvc_version=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,reg+"\\Setup\\VC")
263 msvc_version=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,reg+"\\Setup\\Microsoft Visual C++")
264 path,type=Utils.winreg.QueryValueEx(msvc_version,'ProductDir')
265 vc_paths.append((version,os.path.abspath(str(path))))
268 wince_supported_platforms=gather_wince_supported_platforms()
269 for version,vc_path in vc_paths:
270 vs_path=os.path.dirname(vc_path)
271 vsvars=os.path.join(vs_path,'Common7','Tools','vsvars32.bat')
272 if wince_supported_platforms and os.path.isfile(vsvars):
273 conf.gather_wince_targets(versions,version,vc_path,vsvars,wince_supported_platforms)
274 vsvars=os.path.join(vs_path,'VC','WPSDK','WP80','vcvarsphoneall.bat')
275 if os.path.isfile(vsvars):
276 conf.gather_winphone_targets(versions,'8.0',vc_path,vsvars)
277 for version,vc_path in vc_paths:
278 vs_path=os.path.dirname(vc_path)
279 conf.gather_msvc_targets(versions,version,vc_path)
281 def gather_icl_versions(conf,versions):
282 version_pattern=re.compile('^...?.?\....?.?')
284 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Intel\\Compilers\\C++')
287 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Intel\\Compilers\\C++')
293 version=Utils.winreg.EnumKey(all_versions,index)
297 if not version_pattern.match(version):
300 for target,arch in all_icl_platforms:
302 if target=='intel64':targetDir='EM64T_NATIVE'
303 else:targetDir=target
304 Utils.winreg.OpenKey(all_versions,version+'\\'+targetDir)
305 icl_version=Utils.winreg.OpenKey(all_versions,version)
306 path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
307 batch_file=os.path.join(path,'bin','iclvars.bat')
308 if os.path.isfile(batch_file):
310 targets.append((target,(arch,conf.get_msvc_version('intel',version,target,batch_file))))
311 except conf.errors.ConfigurationError:
315 for target,arch in all_icl_platforms:
317 icl_version=Utils.winreg.OpenKey(all_versions,version+'\\'+target)
318 path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
319 batch_file=os.path.join(path,'bin','iclvars.bat')
320 if os.path.isfile(batch_file):
322 targets.append((target,(arch,conf.get_msvc_version('intel',version,target,batch_file))))
323 except conf.errors.ConfigurationError:
328 versions.append(('intel '+major,targets))
330 def gather_intel_composer_versions(conf,versions):
331 version_pattern=re.compile('^...?.?\...?.?.?')
333 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Intel\\Suites')
336 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Intel\\Suites')
342 version=Utils.winreg.EnumKey(all_versions,index)
346 if not version_pattern.match(version):
349 for target,arch in all_icl_platforms:
351 if target=='intel64':targetDir='EM64T_NATIVE'
352 else:targetDir=target
354 defaults=Utils.winreg.OpenKey(all_versions,version+'\\Defaults\\C++\\'+targetDir)
356 if targetDir=='EM64T_NATIVE':
357 defaults=Utils.winreg.OpenKey(all_versions,version+'\\Defaults\\C++\\EM64T')
360 uid,type=Utils.winreg.QueryValueEx(defaults,'SubKey')
361 Utils.winreg.OpenKey(all_versions,version+'\\'+uid+'\\C++\\'+targetDir)
362 icl_version=Utils.winreg.OpenKey(all_versions,version+'\\'+uid+'\\C++')
363 path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
364 batch_file=os.path.join(path,'bin','iclvars.bat')
365 if os.path.isfile(batch_file):
367 targets.append((target,(arch,conf.get_msvc_version('intel',version,target,batch_file))))
368 except conf.errors.ConfigurationError ,e:
370 compilervars_warning_attr='_compilervars_warning_key'
371 if version[0:2]=='13'and getattr(conf,compilervars_warning_attr,True):
372 setattr(conf,compilervars_warning_attr,False)
373 patch_url='http://software.intel.com/en-us/forums/topic/328487'
374 compilervars_arch=os.path.join(path,'bin','compilervars_arch.bat')
375 for vscomntool in['VS110COMNTOOLS','VS100COMNTOOLS']:
376 if vscomntool in os.environ:
377 vs_express_path=os.environ[vscomntool]+r'..\IDE\VSWinExpress.exe'
378 dev_env_path=os.environ[vscomntool]+r'..\IDE\devenv.exe'
379 if(r'if exist "%VS110COMNTOOLS%..\IDE\VSWinExpress.exe"'in Utils.readf(compilervars_arch)and not os.path.exists(vs_express_path)and not os.path.exists(dev_env_path)):
380 Logs.warn(('The Intel compilervar_arch.bat only checks for one Visual Studio SKU ''(VSWinExpress.exe) but it does not seem to be installed at %r. ''The intel command line set up will fail to configure unless the file %r''is patched. See: %s')%(vs_express_path,compilervars_arch,patch_url))
384 versions.append(('intel '+major,targets))
386 def get_msvc_versions(conf):
387 if not conf.env['MSVC_INSTALLED_VERSIONS']:
389 conf.gather_icl_versions(lst)
390 conf.gather_intel_composer_versions(lst)
391 conf.gather_wsdk_versions(lst)
392 conf.gather_msvc_versions(lst)
393 conf.env['MSVC_INSTALLED_VERSIONS']=lst
394 return conf.env['MSVC_INSTALLED_VERSIONS']
396 def print_all_msvc_detected(conf):
397 for version,targets in conf.env['MSVC_INSTALLED_VERSIONS']:
399 for target,l in targets:
400 Logs.info("\t"+target)
402 def detect_msvc(conf,arch=False):
403 versions=get_msvc_versions(conf)
404 return setup_msvc(conf,versions,arch)
406 def find_lt_names_msvc(self,libname,is_static=False):
407 lt_names=['lib%s.la'%libname,'%s.la'%libname,]
408 for path in self.env['LIBPATH']:
410 laf=os.path.join(path,la)
412 if os.path.exists(laf):
413 ltdict=Utils.read_la_file(laf)
415 if ltdict.get('libdir',''):
416 lt_libdir=ltdict['libdir']
417 if not is_static and ltdict.get('library_names',''):
418 dllnames=ltdict['library_names'].split()
419 dll=dllnames[0].lower()
420 dll=re.sub('\.dll$','',dll)
421 return(lt_libdir,dll,False)
422 elif ltdict.get('old_library',''):
423 olib=ltdict['old_library']
424 if os.path.exists(os.path.join(path,olib)):
425 return(path,olib,True)
426 elif lt_libdir!=''and os.path.exists(os.path.join(lt_libdir,olib)):
427 return(lt_libdir,olib,True)
429 return(None,olib,True)
431 raise self.errors.WafError('invalid libtool object file: %s'%laf)
432 return(None,None,None)
434 def libname_msvc(self,libname,is_static=False):
436 lib=re.sub('\.lib$','',lib)
437 if lib in g_msvc_systemlibs:
439 lib=re.sub('^lib','',lib)
442 (lt_path,lt_libname,lt_static)=self.find_lt_names_msvc(lib,is_static)
443 if lt_path!=None and lt_libname!=None:
445 return os.path.join(lt_path,lt_libname)
447 _libpaths=[lt_path]+self.env['LIBPATH']
449 _libpaths=self.env['LIBPATH']
450 static_libs=['lib%ss.lib'%lib,'lib%s.lib'%lib,'%ss.lib'%lib,'%s.lib'%lib,]
451 dynamic_libs=['lib%s.dll.lib'%lib,'lib%s.dll.a'%lib,'%s.dll.lib'%lib,'%s.dll.a'%lib,'lib%s_d.lib'%lib,'%s_d.lib'%lib,'%s.lib'%lib,]
454 libnames=dynamic_libs+static_libs
455 for path in _libpaths:
456 for libn in libnames:
457 if os.path.exists(os.path.join(path,libn)):
458 debug('msvc: lib found: %s'%os.path.join(path,libn))
459 return re.sub('\.lib$','',libn)
460 self.fatal("The library %r could not be found"%libname)
461 return re.sub('\.lib$','',libname)
463 def check_lib_msvc(self,libname,is_static=False,uselib_store=None):
464 libn=self.libname_msvc(libname,is_static)
466 uselib_store=libname.upper()
467 if False and is_static:
468 self.env['STLIB_'+uselib_store]=[libn]
470 self.env['LIB_'+uselib_store]=[libn]
472 def check_libs_msvc(self,libnames,is_static=False):
473 for libname in Utils.to_list(libnames):
474 self.check_lib_msvc(libname,is_static)
476 conf.autodetect(True)
478 conf.msvc_common_flags()
480 conf.cxx_load_tools()
483 conf.link_add_flags()
484 conf.visual_studio_add_flags()
486 def no_autodetect(conf):
487 conf.env.NO_MSVC_DETECT=1
490 def autodetect(conf,arch=False):
495 compiler,version,path,includes,libdirs,arch=conf.detect_msvc(True)
498 compiler,version,path,includes,libdirs=conf.detect_msvc()
500 v['INCLUDES']=includes
502 v['MSVC_COMPILER']=compiler
504 v['MSVC_VERSION']=float(version)
506 v['MSVC_VERSION']=float(version[:-3])
507 def _get_prog_names(conf,compiler):
508 if compiler=='intel':
516 return compiler_name,linker_name,lib_name
519 if sys.platform=='cygwin':
520 conf.fatal('MSVC module does not work under cygwin Python!')
523 compiler=v['MSVC_COMPILER']
524 version=v['MSVC_VERSION']
525 compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler)
526 v.MSVC_MANIFEST=(compiler=='msvc'and version>=8)or(compiler=='wsdk'and version>=6)or(compiler=='intel'and version>=11)
528 if v['CXX']:cxx=v['CXX']
529 elif'CXX'in conf.environ:cxx=conf.environ['CXX']
530 cxx=conf.find_program(compiler_name,var='CXX',path_list=path)
531 cxx=conf.cmd_to_list(cxx)
532 env=dict(conf.environ)
533 if path:env.update(PATH=';'.join(path))
534 if not conf.cmd_and_log(cxx+['/nologo','/help'],env=env):
535 conf.fatal('the msvc compiler could not be identified')
537 v['CC_NAME']=v['CXX_NAME']='msvc'
538 if not v['LINK_CXX']:
539 link=conf.find_program(linker_name,path_list=path)
540 if link:v['LINK_CXX']=link
541 else:conf.fatal('%s was not found (linker)'%linker_name)
544 v['LINK_CC']=v['LINK_CXX']
546 stliblink=conf.find_program(lib_name,path_list=path,var='AR')
547 if not stliblink:return
548 v['ARFLAGS']=['/NOLOGO']
550 conf.find_program('MT',path_list=path,var='MT')
551 v['MTFLAGS']=['/NOLOGO']
554 except Errors.WafError:
555 warn('Resource compiler not found. Compiling resource file is disabled')
557 def visual_studio_add_flags(self):
559 try:v.prepend_value('INCLUDES',[x for x in self.environ['INCLUDE'].split(';')if x])
560 except Exception:pass
561 try:v.prepend_value('LIBPATH',[x for x in self.environ['LIB'].split(';')if x])
562 except Exception:pass
564 def msvc_common_flags(conf):
566 v['DEST_BINFMT']='pe'
567 v.append_value('CFLAGS',['/nologo'])
568 v.append_value('CXXFLAGS',['/nologo'])
569 v['DEFINES_ST']='/D%s'
571 v['CC_TGT_F']=['/c','/Fo']
573 v['CXX_TGT_F']=['/c','/Fo']
574 if(v.MSVC_COMPILER=='msvc'and v.MSVC_VERSION>=8)or(v.MSVC_COMPILER=='wsdk'and v.MSVC_VERSION>=6):
575 v['CC_TGT_F']=['/FC']+v['CC_TGT_F']
576 v['CXX_TGT_F']=['/FC']+v['CXX_TGT_F']
577 v['CPPPATH_ST']='/I%s'
578 v['AR_TGT_F']=v['CCLNK_TGT_F']=v['CXXLNK_TGT_F']='/OUT:'
579 v['CFLAGS_CONSOLE']=v['CXXFLAGS_CONSOLE']=['/SUBSYSTEM:CONSOLE']
580 v['CFLAGS_NATIVE']=v['CXXFLAGS_NATIVE']=['/SUBSYSTEM:NATIVE']
581 v['CFLAGS_POSIX']=v['CXXFLAGS_POSIX']=['/SUBSYSTEM:POSIX']
582 v['CFLAGS_WINDOWS']=v['CXXFLAGS_WINDOWS']=['/SUBSYSTEM:WINDOWS']
583 v['CFLAGS_WINDOWSCE']=v['CXXFLAGS_WINDOWSCE']=['/SUBSYSTEM:WINDOWSCE']
584 v['CFLAGS_CRT_MULTITHREADED']=v['CXXFLAGS_CRT_MULTITHREADED']=['/MT']
585 v['CFLAGS_CRT_MULTITHREADED_DLL']=v['CXXFLAGS_CRT_MULTITHREADED_DLL']=['/MD']
586 v['CFLAGS_CRT_MULTITHREADED_DBG']=v['CXXFLAGS_CRT_MULTITHREADED_DBG']=['/MTd']
587 v['CFLAGS_CRT_MULTITHREADED_DLL_DBG']=v['CXXFLAGS_CRT_MULTITHREADED_DLL_DBG']=['/MDd']
589 v['LIBPATH_ST']='/LIBPATH:%s'
590 v['STLIB_ST']='%s.lib'
591 v['STLIBPATH_ST']='/LIBPATH:%s'
592 v.append_value('LINKFLAGS',['/NOLOGO'])
593 if v['MSVC_MANIFEST']:
594 v.append_value('LINKFLAGS',['/MANIFEST'])
595 v['CFLAGS_cshlib']=[]
596 v['CXXFLAGS_cxxshlib']=[]
597 v['LINKFLAGS_cshlib']=v['LINKFLAGS_cxxshlib']=['/DLL']
598 v['cshlib_PATTERN']=v['cxxshlib_PATTERN']='%s.dll'
599 v['implib_PATTERN']='%s.lib'
600 v['IMPLIB_ST']='/IMPLIB:%s'
601 v['LINKFLAGS_cstlib']=[]
602 v['cstlib_PATTERN']=v['cxxstlib_PATTERN']='%s.lib'
603 v['cprogram_PATTERN']=v['cxxprogram_PATTERN']='%s.exe'
604 @after_method('apply_link')
606 def apply_flags_msvc(self):
607 if self.env.CC_NAME!='msvc'or not getattr(self,'link_task',None):
609 is_static=isinstance(self.link_task,ccroot.stlink_task)
610 subsystem=getattr(self,'subsystem','')
612 subsystem='/subsystem:%s'%subsystem
613 flags=is_static and'ARFLAGS'or'LINKFLAGS'
614 self.env.append_value(flags,subsystem)
616 for f in self.env.LINKFLAGS:
619 pdbnode=self.link_task.outputs[0].change_ext('.pdb')
620 self.link_task.outputs.append(pdbnode)
622 self.install_task.source.append(pdbnode)
623 except AttributeError:
626 @feature('cprogram','cshlib','cxxprogram','cxxshlib')
627 @after_method('apply_link')
628 def apply_manifest(self):
629 if self.env.CC_NAME=='msvc'and self.env.MSVC_MANIFEST and getattr(self,'link_task',None):
630 out_node=self.link_task.outputs[0]
631 man_node=out_node.parent.find_or_declare(out_node.name+'.manifest')
632 self.link_task.outputs.append(man_node)
633 self.link_task.do_manifest=True
639 self.do_manifest=False
640 outfile=self.outputs[0].abspath()
642 for out_node in self.outputs:
643 if out_node.name.endswith('.manifest'):
644 manifest=out_node.abspath()
649 if'cprogram'in self.generator.features or'cxxprogram'in self.generator.features:
651 elif'cshlib'in self.generator.features or'cxxshlib'in self.generator.features:
653 debug('msvc: embedding manifest in mode %r'%mode)
655 lst.append(env['MT'])
656 lst.extend(Utils.to_list(env['MTFLAGS']))
657 lst.extend(['-manifest',manifest])
658 lst.append('-outputresource:%s;%s'%(outfile,mode))
660 return self.exec_command(*lst)
661 def quote_response_command(self,flag):
662 if flag.find(' ')>-1:
663 for x in('/LIBPATH:','/IMPLIB:','/OUT:','/I'):
664 if flag.startswith(x):
665 flag='%s"%s"'%(x,flag[len(x):])
670 def exec_response_command(self,cmd,**kw):
673 if sys.platform.startswith('win')and isinstance(cmd,list)and len(' '.join(cmd))>=8192:
675 cmd=[self.quote_response_command(x)for x in cmd]
676 (fd,tmp)=tempfile.mkstemp()
677 os.write(fd,'\r\n'.join(i.replace('\\','\\\\')for i in cmd[1:]))
679 cmd=[program,'@'+tmp]
680 ret=self.generator.bld.exec_command(cmd,**kw)
688 def exec_command_msvc(self,*k,**kw):
689 if isinstance(k[0],list):
693 if a=='/Fo'or a=='/doc'or a[-1]==':':
700 env=dict(self.env.env or os.environ)
701 env.update(PATH=';'.join(self.env['PATH']))
703 bld=self.generator.bld
705 if not kw.get('cwd',None):
707 except AttributeError:
708 bld.cwd=kw['cwd']=bld.variant_dir
709 ret=self.exec_response_command(k[0],**kw)
710 if not ret and getattr(self,'do_manifest',None):
713 def wrap_class(class_name):
714 cls=Task.classes.get(class_name,None)
717 derived_class=type(class_name,(cls,),{})
718 def exec_command(self,*k,**kw):
719 if self.env['CC_NAME']=='msvc':
720 return self.exec_command_msvc(*k,**kw)
722 return super(derived_class,self).exec_command(*k,**kw)
723 derived_class.exec_command=exec_command
724 derived_class.exec_response_command=exec_response_command
725 derived_class.quote_response_command=quote_response_command
726 derived_class.exec_command_msvc=exec_command_msvc
727 derived_class.exec_mf=exec_mf
729 for k in'c cxx cprogram cxxprogram cshlib cxxshlib cstlib cxxstlib'.split():
731 def make_winapp(self,family):
732 append=self.env.append_unique
733 append('DEFINES','WINAPI_FAMILY=%s'%family)
734 append('CXXFLAGS','/ZW')
735 append('CXXFLAGS','/TP')
736 for lib_path in self.env.LIBPATH:
737 append('CXXFLAGS','/AI%s'%lib_path)
738 @feature('winphoneapp')
739 @after_method('process_use')
740 @after_method('propagate_uselib_vars')
741 def make_winphone_app(self):
742 make_winapp(self,'WINAPI_FAMILY_PHONE_APP')
743 conf.env.append_unique('LINKFLAGS','/NODEFAULTLIB:ole32.lib')
744 conf.env.append_unique('LINKFLAGS','PhoneAppModelHost.lib')
746 @after_method('process_use')
747 @after_method('propagate_uselib_vars')
748 def make_windows_app(self):
749 make_winapp(self,'WINAPI_FAMILY_DESKTOP_APP')