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)
64 except AttributeError:
66 batfile=conf.bldnode.make_node('waf-print-msvc-%d.bat'%conf.msvc_cnt)
67 batfile.write("""@echo off
72 echo INCLUDE=%%INCLUDE%%
73 echo LIB=%%LIB%%;%%LIBPATH%%
75 sout=conf.cmd_and_log(['cmd.exe','/E:on','/V:on','/C',batfile.abspath()])
76 lines=sout.splitlines()
79 MSVC_PATH=MSVC_INCDIR=MSVC_LIBDIR=None
81 if line.startswith('PATH='):
83 MSVC_PATH=path.split(';')
84 elif line.startswith('INCLUDE='):
85 MSVC_INCDIR=[i for i in line[8:].split(';')if i]
86 elif line.startswith('LIB='):
87 MSVC_LIBDIR=[i for i in line[4:].split(';')if i]
88 if None in(MSVC_PATH,MSVC_INCDIR,MSVC_LIBDIR):
89 conf.fatal('msvc: Could not find a valid architecture for building (get_msvc_version_3)')
92 compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler)
93 cxx=conf.find_program(compiler_name,path_list=MSVC_PATH)
98 conf.cmd_and_log(cxx+['/help'],env=env)
100 debug('msvc: get_msvc_version: %r %r %r -> failure'%(compiler,version,target))
102 conf.fatal('msvc: cannot run the compiler (in get_msvc_version)')
104 debug('msvc: get_msvc_version: %r %r %r -> OK',compiler,version,target)
106 conf.env[compiler_name]=''
107 return(MSVC_PATH,MSVC_INCDIR,MSVC_LIBDIR)
109 def gather_wsdk_versions(conf,versions):
110 version_pattern=re.compile('^v..?.?\...?.?')
112 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Microsoft SDKs\\Windows')
115 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows')
121 version=Utils.winreg.EnumKey(all_versions,index)
125 if not version_pattern.match(version):
128 msvc_version=Utils.winreg.OpenKey(all_versions,version)
129 path,type=Utils.winreg.QueryValueEx(msvc_version,'InstallationFolder')
132 if os.path.isfile(os.path.join(path,'bin','SetEnv.cmd')):
134 for target,arch in all_msvc_platforms:
136 targets.append((target,(arch,conf.get_msvc_version('wsdk',version,'/'+target,os.path.join(path,'bin','SetEnv.cmd')))))
137 except conf.errors.ConfigurationError:
139 versions.append(('wsdk '+version[1:],targets))
140 def gather_wince_supported_platforms():
141 supported_wince_platforms=[]
143 ce_sdk=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Windows CE Tools\\SDKs')
146 ce_sdk=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Windows CE Tools\\SDKs')
150 return supported_wince_platforms
154 sdk_device=Utils.winreg.EnumKey(ce_sdk,ce_index)
158 sdk=Utils.winreg.OpenKey(ce_sdk,sdk_device)
160 path,type=Utils.winreg.QueryValueEx(sdk,'SDKRootDir')
163 path,type=Utils.winreg.QueryValueEx(sdk,'SDKInformation')
164 path,xml=os.path.split(path)
168 path,device=os.path.split(path)
170 path,device=os.path.split(path)
171 for arch,compiler in all_wince_platforms:
173 if os.path.isdir(os.path.join(path,device,'Lib',arch)):
174 platforms.append((arch,compiler,os.path.join(path,device,'Include',arch),os.path.join(path,device,'Lib',arch)))
176 supported_wince_platforms.append((device,platforms))
177 return supported_wince_platforms
178 def gather_msvc_detected_versions():
179 version_pattern=re.compile('^(\d\d?\.\d\d?)(Exp)?$')
181 for vcver,vcvar in(('VCExpress','Exp'),('VisualStudio','')):
183 prefix='SOFTWARE\\Wow6432node\\Microsoft\\'+vcver
184 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,prefix)
187 prefix='SOFTWARE\\Microsoft\\'+vcver
188 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,prefix)
194 version=Utils.winreg.EnumKey(all_versions,index)
198 match=version_pattern.match(version)
202 versionnumber=float(match.group(1))
203 detected_versions.append((versionnumber,version+vcvar,prefix+"\\"+version))
206 detected_versions.sort(key=fun)
207 return detected_versions
209 def gather_msvc_targets(conf,versions,version,vc_path):
211 if os.path.isfile(os.path.join(vc_path,'vcvarsall.bat')):
212 for target,realtarget in all_msvc_platforms[::-1]:
214 targets.append((target,(realtarget,conf.get_msvc_version('msvc',version,target,os.path.join(vc_path,'vcvarsall.bat')))))
215 except conf.errors.ConfigurationError:
217 elif os.path.isfile(os.path.join(vc_path,'Common7','Tools','vsvars32.bat')):
219 targets.append(('x86',('x86',conf.get_msvc_version('msvc',version,'x86',os.path.join(vc_path,'Common7','Tools','vsvars32.bat')))))
220 except conf.errors.ConfigurationError:
222 elif os.path.isfile(os.path.join(vc_path,'Bin','vcvars32.bat')):
224 targets.append(('x86',('x86',conf.get_msvc_version('msvc',version,'',os.path.join(vc_path,'Bin','vcvars32.bat')))))
225 except conf.errors.ConfigurationError:
228 versions.append(('msvc '+version,targets))
230 def gather_wince_targets(conf,versions,version,vc_path,vsvars,supported_platforms):
231 for device,platforms in supported_platforms:
233 for platform,compiler,include,lib in platforms:
234 winCEpath=os.path.join(vc_path,'ce')
235 if not os.path.isdir(winCEpath):
238 common_bindirs,_1,_2=conf.get_msvc_version('msvc',version,'x86',vsvars)
239 except conf.errors.ConfigurationError:
241 if os.path.isdir(os.path.join(winCEpath,'lib',platform)):
242 bindirs=[os.path.join(winCEpath,'bin',compiler),os.path.join(winCEpath,'bin','x86_'+compiler)]+common_bindirs
243 incdirs=[os.path.join(winCEpath,'include'),os.path.join(winCEpath,'atlmfc','include'),include]
244 libdirs=[os.path.join(winCEpath,'lib',platform),os.path.join(winCEpath,'atlmfc','lib',platform),lib]
245 cetargets.append((platform,(platform,(bindirs,incdirs,libdirs))))
247 versions.append((device+' '+version,cetargets))
249 def gather_winphone_targets(conf,versions,version,vc_path,vsvars):
251 for target,realtarget in all_msvc_platforms[::-1]:
253 targets.append((target,(realtarget,conf.get_msvc_version('winphone',version,target,vsvars))))
254 except conf.errors.ConfigurationError ,e:
257 versions.append(('winphone '+version,targets))
259 def gather_msvc_versions(conf,versions):
261 for(v,version,reg)in gather_msvc_detected_versions():
264 msvc_version=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,reg+"\\Setup\\VC")
266 msvc_version=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,reg+"\\Setup\\Microsoft Visual C++")
267 path,type=Utils.winreg.QueryValueEx(msvc_version,'ProductDir')
268 vc_paths.append((version,os.path.abspath(str(path))))
271 wince_supported_platforms=gather_wince_supported_platforms()
272 for version,vc_path in vc_paths:
273 vs_path=os.path.dirname(vc_path)
274 vsvars=os.path.join(vs_path,'Common7','Tools','vsvars32.bat')
275 if wince_supported_platforms and os.path.isfile(vsvars):
276 conf.gather_wince_targets(versions,version,vc_path,vsvars,wince_supported_platforms)
277 vsvars=os.path.join(vs_path,'VC','WPSDK','WP80','vcvarsphoneall.bat')
278 if os.path.isfile(vsvars):
279 conf.gather_winphone_targets(versions,'8.0',vc_path,vsvars)
280 for version,vc_path in vc_paths:
281 vs_path=os.path.dirname(vc_path)
282 conf.gather_msvc_targets(versions,version,vc_path)
284 def gather_icl_versions(conf,versions):
285 version_pattern=re.compile('^...?.?\....?.?')
287 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Intel\\Compilers\\C++')
290 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Intel\\Compilers\\C++')
296 version=Utils.winreg.EnumKey(all_versions,index)
300 if not version_pattern.match(version):
303 for target,arch in all_icl_platforms:
305 if target=='intel64':targetDir='EM64T_NATIVE'
306 else:targetDir=target
307 Utils.winreg.OpenKey(all_versions,version+'\\'+targetDir)
308 icl_version=Utils.winreg.OpenKey(all_versions,version)
309 path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
310 batch_file=os.path.join(path,'bin','iclvars.bat')
311 if os.path.isfile(batch_file):
313 targets.append((target,(arch,conf.get_msvc_version('intel',version,target,batch_file))))
314 except conf.errors.ConfigurationError:
318 for target,arch in all_icl_platforms:
320 icl_version=Utils.winreg.OpenKey(all_versions,version+'\\'+target)
321 path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
322 batch_file=os.path.join(path,'bin','iclvars.bat')
323 if os.path.isfile(batch_file):
325 targets.append((target,(arch,conf.get_msvc_version('intel',version,target,batch_file))))
326 except conf.errors.ConfigurationError:
331 versions.append(('intel '+major,targets))
333 def gather_intel_composer_versions(conf,versions):
334 version_pattern=re.compile('^...?.?\...?.?.?')
336 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Intel\\Suites')
339 all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Intel\\Suites')
345 version=Utils.winreg.EnumKey(all_versions,index)
349 if not version_pattern.match(version):
352 for target,arch in all_icl_platforms:
354 if target=='intel64':targetDir='EM64T_NATIVE'
355 else:targetDir=target
357 defaults=Utils.winreg.OpenKey(all_versions,version+'\\Defaults\\C++\\'+targetDir)
359 if targetDir=='EM64T_NATIVE':
360 defaults=Utils.winreg.OpenKey(all_versions,version+'\\Defaults\\C++\\EM64T')
363 uid,type=Utils.winreg.QueryValueEx(defaults,'SubKey')
364 Utils.winreg.OpenKey(all_versions,version+'\\'+uid+'\\C++\\'+targetDir)
365 icl_version=Utils.winreg.OpenKey(all_versions,version+'\\'+uid+'\\C++')
366 path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
367 batch_file=os.path.join(path,'bin','iclvars.bat')
368 if os.path.isfile(batch_file):
370 targets.append((target,(arch,conf.get_msvc_version('intel',version,target,batch_file))))
371 except conf.errors.ConfigurationError ,e:
373 compilervars_warning_attr='_compilervars_warning_key'
374 if version[0:2]=='13'and getattr(conf,compilervars_warning_attr,True):
375 setattr(conf,compilervars_warning_attr,False)
376 patch_url='http://software.intel.com/en-us/forums/topic/328487'
377 compilervars_arch=os.path.join(path,'bin','compilervars_arch.bat')
378 for vscomntool in('VS110COMNTOOLS','VS100COMNTOOLS'):
379 if vscomntool in os.environ:
380 vs_express_path=os.environ[vscomntool]+r'..\IDE\VSWinExpress.exe'
381 dev_env_path=os.environ[vscomntool]+r'..\IDE\devenv.exe'
382 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)):
383 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))
387 versions.append(('intel '+major,targets))
389 def get_msvc_versions(conf):
390 if not conf.env['MSVC_INSTALLED_VERSIONS']:
392 conf.gather_icl_versions(lst)
393 conf.gather_intel_composer_versions(lst)
394 conf.gather_wsdk_versions(lst)
395 conf.gather_msvc_versions(lst)
396 conf.env['MSVC_INSTALLED_VERSIONS']=lst
397 return conf.env['MSVC_INSTALLED_VERSIONS']
399 def print_all_msvc_detected(conf):
400 for version,targets in conf.env['MSVC_INSTALLED_VERSIONS']:
402 for target,l in targets:
403 Logs.info("\t"+target)
405 def detect_msvc(conf,arch=False):
406 versions=get_msvc_versions(conf)
407 return setup_msvc(conf,versions,arch)
409 def find_lt_names_msvc(self,libname,is_static=False):
410 lt_names=['lib%s.la'%libname,'%s.la'%libname,]
411 for path in self.env['LIBPATH']:
413 laf=os.path.join(path,la)
415 if os.path.exists(laf):
416 ltdict=Utils.read_la_file(laf)
418 if ltdict.get('libdir',''):
419 lt_libdir=ltdict['libdir']
420 if not is_static and ltdict.get('library_names',''):
421 dllnames=ltdict['library_names'].split()
422 dll=dllnames[0].lower()
423 dll=re.sub('\.dll$','',dll)
424 return(lt_libdir,dll,False)
425 elif ltdict.get('old_library',''):
426 olib=ltdict['old_library']
427 if os.path.exists(os.path.join(path,olib)):
428 return(path,olib,True)
429 elif lt_libdir!=''and os.path.exists(os.path.join(lt_libdir,olib)):
430 return(lt_libdir,olib,True)
432 return(None,olib,True)
434 raise self.errors.WafError('invalid libtool object file: %s'%laf)
435 return(None,None,None)
437 def libname_msvc(self,libname,is_static=False):
439 lib=re.sub('\.lib$','',lib)
440 if lib in g_msvc_systemlibs:
442 lib=re.sub('^lib','',lib)
445 (lt_path,lt_libname,lt_static)=self.find_lt_names_msvc(lib,is_static)
446 if lt_path!=None and lt_libname!=None:
448 return os.path.join(lt_path,lt_libname)
450 _libpaths=[lt_path]+self.env['LIBPATH']
452 _libpaths=self.env['LIBPATH']
453 static_libs=['lib%ss.lib'%lib,'lib%s.lib'%lib,'%ss.lib'%lib,'%s.lib'%lib,]
454 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,]
457 libnames=dynamic_libs+static_libs
458 for path in _libpaths:
459 for libn in libnames:
460 if os.path.exists(os.path.join(path,libn)):
461 debug('msvc: lib found: %s'%os.path.join(path,libn))
462 return re.sub('\.lib$','',libn)
463 self.fatal("The library %r could not be found"%libname)
464 return re.sub('\.lib$','',libname)
466 def check_lib_msvc(self,libname,is_static=False,uselib_store=None):
467 libn=self.libname_msvc(libname,is_static)
469 uselib_store=libname.upper()
470 if False and is_static:
471 self.env['STLIB_'+uselib_store]=[libn]
473 self.env['LIB_'+uselib_store]=[libn]
475 def check_libs_msvc(self,libnames,is_static=False):
476 for libname in Utils.to_list(libnames):
477 self.check_lib_msvc(libname,is_static)
479 conf.autodetect(True)
481 conf.msvc_common_flags()
483 conf.cxx_load_tools()
486 conf.link_add_flags()
487 conf.visual_studio_add_flags()
489 def no_autodetect(conf):
490 conf.env.NO_MSVC_DETECT=1
493 def autodetect(conf,arch=False):
498 compiler,version,path,includes,libdirs,arch=conf.detect_msvc(True)
501 compiler,version,path,includes,libdirs=conf.detect_msvc()
503 v['INCLUDES']=includes
505 v['MSVC_COMPILER']=compiler
507 v['MSVC_VERSION']=float(version)
509 v['MSVC_VERSION']=float(version[:-3])
510 def _get_prog_names(conf,compiler):
511 if compiler=='intel':
519 return compiler_name,linker_name,lib_name
522 if sys.platform=='cygwin':
523 conf.fatal('MSVC module does not work under cygwin Python!')
526 compiler=v['MSVC_COMPILER']
527 version=v['MSVC_VERSION']
528 compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler)
529 v.MSVC_MANIFEST=(compiler=='msvc'and version>=8)or(compiler=='wsdk'and version>=6)or(compiler=='intel'and version>=11)
531 if v['CXX']:cxx=v['CXX']
532 elif'CXX'in conf.environ:cxx=conf.environ['CXX']
533 cxx=conf.find_program(compiler_name,var='CXX',path_list=path)
534 env=dict(conf.environ)
535 if path:env.update(PATH=';'.join(path))
536 if not conf.cmd_and_log(cxx+['/nologo','/help'],env=env):
537 conf.fatal('the msvc compiler could not be identified')
539 v['CC_NAME']=v['CXX_NAME']='msvc'
540 if not v['LINK_CXX']:
541 link=conf.find_program(linker_name,path_list=path)
542 if link:v['LINK_CXX']=link
543 else:conf.fatal('%s was not found (linker)'%linker_name)
546 v['LINK_CC']=v['LINK_CXX']
548 stliblink=conf.find_program(lib_name,path_list=path,var='AR')
549 if not stliblink:return
550 v['ARFLAGS']=['/NOLOGO']
552 conf.find_program('MT',path_list=path,var='MT')
553 v['MTFLAGS']=['/NOLOGO']
556 except Errors.WafError:
557 warn('Resource compiler not found. Compiling resource file is disabled')
559 def visual_studio_add_flags(self):
561 try:v.prepend_value('INCLUDES',[x for x in self.environ['INCLUDE'].split(';')if x])
562 except Exception:pass
563 try:v.prepend_value('LIBPATH',[x for x in self.environ['LIB'].split(';')if x])
564 except Exception:pass
566 def msvc_common_flags(conf):
568 v['DEST_BINFMT']='pe'
569 v.append_value('CFLAGS',['/nologo'])
570 v.append_value('CXXFLAGS',['/nologo'])
571 v['DEFINES_ST']='/D%s'
573 v['CC_TGT_F']=['/c','/Fo']
575 v['CXX_TGT_F']=['/c','/Fo']
576 if(v.MSVC_COMPILER=='msvc'and v.MSVC_VERSION>=8)or(v.MSVC_COMPILER=='wsdk'and v.MSVC_VERSION>=6):
577 v['CC_TGT_F']=['/FC']+v['CC_TGT_F']
578 v['CXX_TGT_F']=['/FC']+v['CXX_TGT_F']
579 v['CPPPATH_ST']='/I%s'
580 v['AR_TGT_F']=v['CCLNK_TGT_F']=v['CXXLNK_TGT_F']='/OUT:'
581 v['CFLAGS_CONSOLE']=v['CXXFLAGS_CONSOLE']=['/SUBSYSTEM:CONSOLE']
582 v['CFLAGS_NATIVE']=v['CXXFLAGS_NATIVE']=['/SUBSYSTEM:NATIVE']
583 v['CFLAGS_POSIX']=v['CXXFLAGS_POSIX']=['/SUBSYSTEM:POSIX']
584 v['CFLAGS_WINDOWS']=v['CXXFLAGS_WINDOWS']=['/SUBSYSTEM:WINDOWS']
585 v['CFLAGS_WINDOWSCE']=v['CXXFLAGS_WINDOWSCE']=['/SUBSYSTEM:WINDOWSCE']
586 v['CFLAGS_CRT_MULTITHREADED']=v['CXXFLAGS_CRT_MULTITHREADED']=['/MT']
587 v['CFLAGS_CRT_MULTITHREADED_DLL']=v['CXXFLAGS_CRT_MULTITHREADED_DLL']=['/MD']
588 v['CFLAGS_CRT_MULTITHREADED_DBG']=v['CXXFLAGS_CRT_MULTITHREADED_DBG']=['/MTd']
589 v['CFLAGS_CRT_MULTITHREADED_DLL_DBG']=v['CXXFLAGS_CRT_MULTITHREADED_DLL_DBG']=['/MDd']
591 v['LIBPATH_ST']='/LIBPATH:%s'
592 v['STLIB_ST']='%s.lib'
593 v['STLIBPATH_ST']='/LIBPATH:%s'
594 v.append_value('LINKFLAGS',['/NOLOGO'])
595 if v['MSVC_MANIFEST']:
596 v.append_value('LINKFLAGS',['/MANIFEST'])
597 v['CFLAGS_cshlib']=[]
598 v['CXXFLAGS_cxxshlib']=[]
599 v['LINKFLAGS_cshlib']=v['LINKFLAGS_cxxshlib']=['/DLL']
600 v['cshlib_PATTERN']=v['cxxshlib_PATTERN']='%s.dll'
601 v['implib_PATTERN']='%s.lib'
602 v['IMPLIB_ST']='/IMPLIB:%s'
603 v['LINKFLAGS_cstlib']=[]
604 v['cstlib_PATTERN']=v['cxxstlib_PATTERN']='%s.lib'
605 v['cprogram_PATTERN']=v['cxxprogram_PATTERN']='%s.exe'
606 @after_method('apply_link')
608 def apply_flags_msvc(self):
609 if self.env.CC_NAME!='msvc'or not getattr(self,'link_task',None):
611 is_static=isinstance(self.link_task,ccroot.stlink_task)
612 subsystem=getattr(self,'subsystem','')
614 subsystem='/subsystem:%s'%subsystem
615 flags=is_static and'ARFLAGS'or'LINKFLAGS'
616 self.env.append_value(flags,subsystem)
618 for f in self.env.LINKFLAGS:
621 pdbnode=self.link_task.outputs[0].change_ext('.pdb')
622 self.link_task.outputs.append(pdbnode)
623 if getattr(self,'install_task',None):
624 self.pdb_install_task=self.bld.install_files(self.install_task.dest,pdbnode,env=self.env)
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.extend(Utils.to_list(env['MTFLAGS']))
656 lst.extend(['-manifest',manifest])
657 lst.append('-outputresource:%s;%s'%(outfile,mode))
658 return self.exec_command(lst)
659 def quote_response_command(self,flag):
660 if flag.find(' ')>-1:
661 for x in('/LIBPATH:','/IMPLIB:','/OUT:','/I'):
662 if flag.startswith(x):
663 flag='%s"%s"'%(x,flag[len(x):])
668 def exec_response_command(self,cmd,**kw):
671 if sys.platform.startswith('win')and isinstance(cmd,list)and len(' '.join(cmd))>=8192:
673 cmd=[self.quote_response_command(x)for x in cmd]
674 (fd,tmp)=tempfile.mkstemp()
675 os.write(fd,'\r\n'.join(i.replace('\\','\\\\')for i in cmd[1:]))
677 cmd=[program,'@'+tmp]
678 ret=self.generator.bld.exec_command(cmd,**kw)
686 def exec_command_msvc(self,*k,**kw):
687 if isinstance(k[0],list):
691 if a=='/Fo'or a=='/doc'or a[-1]==':':
698 env=dict(self.env.env or os.environ)
699 env.update(PATH=';'.join(self.env['PATH']))
701 bld=self.generator.bld
703 if not kw.get('cwd',None):
705 except AttributeError:
706 bld.cwd=kw['cwd']=bld.variant_dir
707 ret=self.exec_response_command(k[0],**kw)
708 if not ret and getattr(self,'do_manifest',None):
711 def wrap_class(class_name):
712 cls=Task.classes.get(class_name,None)
715 derived_class=type(class_name,(cls,),{})
716 def exec_command(self,*k,**kw):
717 if self.env['CC_NAME']=='msvc':
718 return self.exec_command_msvc(*k,**kw)
720 return super(derived_class,self).exec_command(*k,**kw)
721 derived_class.exec_command=exec_command
722 derived_class.exec_response_command=exec_response_command
723 derived_class.quote_response_command=quote_response_command
724 derived_class.exec_command_msvc=exec_command_msvc
725 derived_class.exec_mf=exec_mf
726 if hasattr(cls,'hcode'):
727 derived_class.hcode=cls.hcode
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')