msrpc.py
2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
###
#This file is a part of the NVDA project.
#URL: http://www.nvda-project.org/
#Copyright 2006-2010 NVDA contributers.
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU General Public License version 2.0, as published by
#the Free Software Foundation.
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#This license can be found at:
#http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
###
#MSRPC tool
#Provides the MSRPCStubs builder which can use MIDL to generate header, client stub, and server stub files from an IDL.
from SCons import Util
from SCons.Builder import Builder
#This build emitter tells the builder that a header file, a client stub c file, and a server stub c file will be generated
def MSRPCStubs_buildEmitter(target,source,env):
base,ext=Util.splitext(str(target[0] if len(target)>0 else source[0]))
newTargets=['%s.h'%base]
if not env['MSRPCStubs_noServer']:
newTargets.append('%s_S.c'%base)
if not env['MSRPCStubs_noClient']:
newTargets.append('%s_C.c'%base)
return (newTargets,source)
def MSRPCStubs_builder_actionGenerator(target,source,env,for_signature):
sources=[]
for src in source:
src=str(src)
if src.endswith('.acf'):
sources.append('/acf %s'%src)
else:
sources.append(src)
sources=" ".join(sources)
targets=[]
for tg in target:
tg=str(tg)
if tg.endswith('.h'):
targets.append('/header %s'%tg)
elif tg.endswith('_S.c'):
targets.append('/sstub %s'%tg)
elif tg.endswith('_C.c'):
targets.append('/cstub %s'%tg)
else:
raise ValueError("Don't know what to do with %s"%tg)
targets=" ".join(targets)
noServer="/server none" if env.get('MSRPCStubs_noServer',False) else ""
noClient="/client none" if env.get('MSRPCStubs_noClient',False) else ""
prefix=env.get('MSRPCStubs_prefix',"")
if prefix:
prefix="/prefix all %s"%prefix
serverPrefix=env.get('MSRPCStubs_serverPrefix',"")
if serverPrefix:
serverPrefix="/prefix server %s"%serverPrefix
clientPrefix=env.get('MSRPCStubs_clientPrefix',"")
if clientPrefix:
clientPrefix="/prefix client %s"%clientPrefix
return " ".join(['${MIDL}','${MIDLFLAGS}',noServer,noClient,prefix,serverPrefix,clientPrefix,targets,sources])
MSRPCStubs_builder=Builder(
generator=MSRPCStubs_builder_actionGenerator,
src_suffix=['.idl','.acf'],
emitter=MSRPCStubs_buildEmitter,
)
def exists(env):
from SCons.Tool import midl
return midl.exists(env)
def generate(env):
if not 'MIDL' in env:
from SCons.Tool import midl
midl.generate(env)
env['BUILDERS']['MSRPCStubs']=MSRPCStubs_builder
env['MSRPCStubs_noServer']=False
env['MSRPCStubs_noClient']=False