source: SConstruct @ 238

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

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

misc documentation fixes

File size: 6.2 KB
RevLine 
[232]1import sys
2import os
3
[226]4cflags = '-std=gnu99 -pedantic -Wall -D_FILE_OFFSET_BITS=64 -DREGFI_WIN32'
[189]5
[232]6libiconv_path='.export/win32/libiconv/'
7libpthreads_path='.export/win32/libpthreads/'
[191]8libpthread_name='pthreadGC2'
[232]9libtalloc_path='.export/win32/libtalloc/'
[191]10
[238]11source_targets=('src-trunk', 'src-0.99.0')
12win32_targets=('win32-trunk', 'win32-0.99.0')
13all_targets = source_targets+win32_targets
[191]14
[232]15
16def parse_target(target):
[222]17    chunks = target.split('-')
[232]18    if len(chunks) != 2:
[222]19        return None
[232]20    return chunks
[191]21
22def version2input(version):
23    if version == 'trunk':
24        return 'trunk/'
25    else:
26        return 'releases/%s/' % version
27
28
[232]29export_cmds='''
30rm -rf .export
[238]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
[187]34'''
35
[232]36version_cmds='''
[238]37echo 'REGFI_VERSION="%(version)s"' > .export/%(path)s/regfi_version.py
[232]38'''
39
[234]40svnversion_cmds='''
[238]41svn info svn+ssh://%(user)s@sentinelchicken.org/home/projects/subversion/reglookup\
[234]42  | grep "Last Changed Rev:" | cut -d' ' -f 4 \
[238]43  | sed 's/^/REGFI_VERSION="svn-/' | sed 's/$/"/' > .export/%(path)s/regfi_version.py
[234]44'''
45
[232]46cleanup_cmds='''
47rm -rf .export
48'''
49
50source_cmds='''
[234]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 .
[232]55'''+cleanup_cmds
56
[191]57win32_cmds='''
[232]58mkdir -p .release/%s/python/pyregfi
[191]59cp %s/src/*.exe .release/%s
[225]60
61cp %s/pyregfi-distutils.py .release/%s/setup.py
62cp %s/python/pyregfi/*.py .release/%s/python/pyregfi
63
[232]64cp .export/win32/libiconv/bin/*.dll .export/win32/libpthreads/bin/*.dll .export/win32/libtalloc/bin/*.dll trunk/lib/*.dll .release/%s
[191]65cd .release && zip -r %s.zip %s
66mv .release/%s.zip . && rm -rf .release
[232]67'''+cleanup_cmds
[187]68
[209]69
[189]70def generate_cmds(source, target, env, for_signature):
71    ret_val = ''
[232]72    input_prefix = str(source[0])+'/'
73
[189]74    for t in target:
[232]75        ttype,version = parse_target(str(t))
76        t_base = 'reglookup-%s-%s' % (ttype, version)
[191]77
[232]78        if ttype == 'src':
[234]79            ret_val += source_cmds % (input_prefix, t_base, t_base, t_base,
80                                      t_base, t_base, t_base)
[232]81        elif ttype == 'win32':
[191]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',
[195]90                            libpthreads_path+'include',
91                            libtalloc_path+'include']
[191]92            env['LIBPATH']=[input_prefix+'lib',
93                            libiconv_path+'lib',
[195]94                            libpthreads_path+'lib',
95                            libtalloc_path+'lib']
96            env['LIBS']=['m', libpthread_name, 'iconv', 'regfi', 'talloc']
[222]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']
[191]102
[222]103            # Build libregfi.dll
104            #   Core regfi source
[191]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']
[222]110            regfi_o = env.Object(lib_src)
[191]111
[222]112            regfi_obj = []
113            for s in lib_src:
114                regfi_obj.append(s[0:-1]+'o')
[191]115
[226]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.
[222]119            env.Command(input_prefix+'lib/libregfi.o', regfi_o+extra_obj,
120                        'i586-mingw32msvc-dlltool --export-all-symbols'
[226]121                        +' --add-stdcall-alias  --dllname libregfi.dll -e $TARGET'
[222]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',
[226]127                        'i586-mingw32msvc-gcc ' + cflags
128                        + ' --shared -Wl,--out-implib -add-stdcall-alias -o $TARGET $SOURCE %s'
[222]129                        % ' '.join(regfi_obj+extra_obj))
130
[191]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
[225]137            ret_val += win32_cmds % (t_base,input_prefix,t_base,input_prefix,
[232]138                                     t_base,input_prefix,t_base,
139                                     t_base,t_base,t_base,t_base)
[191]140
[189]141    return ret_val
[187]142
[188]143
[189]144release_builder = Builder(generator = generate_cmds,
[232]145                          suffix = '',
[189]146                          src_suffix = '',
[232]147                          prefix='')
[188]148
[189]149env = Environment()
[232]150env['ENV']['SSH_AGENT_PID'] = os.environ['SSH_AGENT_PID']
151env['ENV']['SSH_AUTH_SOCK'] = os.environ['SSH_AUTH_SOCK']
[189]152env['BUILDERS']['Release'] = release_builder
[188]153
[222]154if len(COMMAND_LINE_TARGETS) == 0:
155    print('Acceptable targets: %s' % repr(all_targets))
[189]156
[195]157for target in COMMAND_LINE_TARGETS:
[222]158    if target not in all_targets:
159        print('ERROR: cannot build "%s".  Acceptable targets: %s'
160              % (target, repr(all_targets)))
[232]161        sys.exit(1)
162    AlwaysBuild(target)
163    ttype,version = parse_target(target)
[189]164
[238]165    params = {'user':os.environ['USER'],
166              'path':version2input(version),
167              'version':version}
168    env.Execute(export_cmds % params)
[234]169    if version == 'trunk':
[238]170        print env.Execute(svnversion_cmds % params)
[234]171    else:
[238]172        env.Execute(version_cmds % params)
173    env.Release(target, Dir('.export/'+params['path']))
[232]174
[187]175Default(None)
Note: See TracBrowser for help on using the repository browser.