source: SConstruct@ 240

Last change on this file since 240 was 238, checked in by tim, 14 years ago

moved development documentation back to old location, adjusted build scripts accordingly

misc documentation fixes

File size: 6.2 KB
Line 
1import sys
2import os
3
4cflags = '-std=gnu99 -pedantic -Wall -D_FILE_OFFSET_BITS=64 -DREGFI_WIN32'
5
6libiconv_path='.export/win32/libiconv/'
7libpthreads_path='.export/win32/libpthreads/'
8libpthread_name='pthreadGC2'
9libtalloc_path='.export/win32/libtalloc/'
10
11source_targets=('src-trunk', 'src-0.99.0')
12win32_targets=('win32-trunk', 'win32-0.99.0')
13all_targets = source_targets+win32_targets
14
15
16def parse_target(target):
17 chunks = target.split('-')
18 if len(chunks) != 2:
19 return None
20 return chunks
21
22def version2input(version):
23 if version == 'trunk':
24 return 'trunk/'
25 else:
26 return 'releases/%s/' % version
27
28
29export_cmds='''
30rm -rf .export
31svn export --depth files svn+ssh://%(user)s@sentinelchicken.org/home/projects/subversion/reglookup .export
32svn export svn+ssh://%(user)s@sentinelchicken.org/home/projects/subversion/reglookup/win32 .export/win32
33svn export svn+ssh://%(user)s@sentinelchicken.org/home/projects/subversion/reglookup/%(path)s .export/%(path)s
34'''
35
36version_cmds='''
37echo 'REGFI_VERSION="%(version)s"' > .export/%(path)s/regfi_version.py
38'''
39
40svnversion_cmds='''
41svn info svn+ssh://%(user)s@sentinelchicken.org/home/projects/subversion/reglookup\
42 | grep "Last Changed Rev:" | cut -d' ' -f 4 \
43 | sed 's/^/REGFI_VERSION="svn-/' | sed 's/$/"/' > .export/%(path)s/regfi_version.py
44'''
45
46cleanup_cmds='''
47rm -rf .export
48'''
49
50source_cmds='''
51mv %s .export/%s
52cd .export/%s && scons doc
53cd .export && tar cf %s.tar %s && gzip -9 %s.tar
54mv .export/%s.tar.gz .
55'''+cleanup_cmds
56
57win32_cmds='''
58mkdir -p .release/%s/python/pyregfi
59cp %s/src/*.exe .release/%s
60
61cp %s/pyregfi-distutils.py .release/%s/setup.py
62cp %s/python/pyregfi/*.py .release/%s/python/pyregfi
63
64cp .export/win32/libiconv/bin/*.dll .export/win32/libpthreads/bin/*.dll .export/win32/libtalloc/bin/*.dll trunk/lib/*.dll .release/%s
65cd .release && zip -r %s.zip %s
66mv .release/%s.zip . && rm -rf .release
67'''+cleanup_cmds
68
69
70def generate_cmds(source, target, env, for_signature):
71 ret_val = ''
72 input_prefix = str(source[0])+'/'
73
74 for t in target:
75 ttype,version = parse_target(str(t))
76 t_base = 'reglookup-%s-%s' % (ttype, version)
77
78 if ttype == 'src':
79 ret_val += source_cmds % (input_prefix, t_base, t_base, t_base,
80 t_base, t_base, t_base)
81 elif ttype == 'win32':
82 env['platform']='cygwin'
83 env['CC']='i586-mingw32msvc-cc'
84 env['AR']='i586-mingw32msvc-ar'
85 env['RANLIB']='i586-mingw32msvc-ranlib'
86
87 env['CFLAGS']=cflags
88 env['CPPPATH']=[input_prefix+'include',
89 libiconv_path+'include',
90 libpthreads_path+'include',
91 libtalloc_path+'include']
92 env['LIBPATH']=[input_prefix+'lib',
93 libiconv_path+'lib',
94 libpthreads_path+'lib',
95 libtalloc_path+'lib']
96 env['LIBS']=['m', libpthread_name, 'iconv', 'regfi', 'talloc']
97
98 # Third-party dependencies
99 extra_obj=['%s/lib/lib%s.a' % (libpthreads_path, libpthread_name),
100 libiconv_path+'/lib/libiconv.dll.a',
101 libtalloc_path+'/lib/libtalloc.dll.a']
102
103 # Build libregfi.dll
104 # Core regfi source
105 lib_src = [input_prefix+'lib/regfi.c',
106 input_prefix+'lib/winsec.c',
107 input_prefix+'lib/range_list.c',
108 input_prefix+'lib/lru_cache.c',
109 input_prefix+'lib/void_stack.c']
110 regfi_o = env.Object(lib_src)
111
112 regfi_obj = []
113 for s in lib_src:
114 regfi_obj.append(s[0:-1]+'o')
115
116 # XXX: Several options here may not be necessary.
117 # Need to investigate why stdcall interfaces don't seem to be
118 # working on Windows.
119 env.Command(input_prefix+'lib/libregfi.o', regfi_o+extra_obj,
120 'i586-mingw32msvc-dlltool --export-all-symbols'
121 +' --add-stdcall-alias --dllname libregfi.dll -e $TARGET'
122 +' -l %slib/libregfi.dll.a %s'
123 % (input_prefix, ' '.join(regfi_obj)))
124
125 env.Command(input_prefix+'lib/libregfi.dll',
126 input_prefix+'lib/libregfi.o',
127 'i586-mingw32msvc-gcc ' + cflags
128 + ' --shared -Wl,--out-implib -add-stdcall-alias -o $TARGET $SOURCE %s'
129 % ' '.join(regfi_obj+extra_obj))
130
131 # Executables
132 reglookup = env.Program(input_prefix+'src/reglookup.exe',
133 [input_prefix+'src/reglookup.c']+extra_obj)
134 reglookup_recover = env.Program(input_prefix+'src/reglookup-recover.exe',
135 [input_prefix+'src/reglookup-recover.c']+extra_obj)
136
137 ret_val += win32_cmds % (t_base,input_prefix,t_base,input_prefix,
138 t_base,input_prefix,t_base,
139 t_base,t_base,t_base,t_base)
140
141 return ret_val
142
143
144release_builder = Builder(generator = generate_cmds,
145 suffix = '',
146 src_suffix = '',
147 prefix='')
148
149env = Environment()
150env['ENV']['SSH_AGENT_PID'] = os.environ['SSH_AGENT_PID']
151env['ENV']['SSH_AUTH_SOCK'] = os.environ['SSH_AUTH_SOCK']
152env['BUILDERS']['Release'] = release_builder
153
154if len(COMMAND_LINE_TARGETS) == 0:
155 print('Acceptable targets: %s' % repr(all_targets))
156
157for target in COMMAND_LINE_TARGETS:
158 if target not in all_targets:
159 print('ERROR: cannot build "%s". Acceptable targets: %s'
160 % (target, repr(all_targets)))
161 sys.exit(1)
162 AlwaysBuild(target)
163 ttype,version = parse_target(target)
164
165 params = {'user':os.environ['USER'],
166 'path':version2input(version),
167 'version':version}
168 env.Execute(export_cmds % params)
169 if version == 'trunk':
170 print env.Execute(svnversion_cmds % params)
171 else:
172 env.Execute(version_cmds % params)
173 env.Release(target, Dir('.export/'+params['path']))
174
175Default(None)
Note: See TracBrowser for help on using the repository browser.