source: SConstruct @ 238

Last change on this file since 238 was 238, checked in by tim, 12 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.