Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/tools/release/make_tarballs.py @ 29

Last change on this file since 29 was 29, checked in by landauf, 17 years ago

updated boost from 1_33_1 to 1_34_1

File size: 15.6 KB
Line 
1# Copyright (c) MetaCommunications, Inc. 2003-2004
2#
3# Distributed under the Boost Software License, Version 1.0.
4# (See accompanying file LICENSE_1_0.txt or copy at
5# http://www.boost.org/LICENSE_1_0.txt)
6
7import sys
8import os
9import shutil
10import optparse
11
12
13import utils
14
15my_location  = os.path.abspath( os.path.dirname( sys.argv[0] ) )
16
17def accept_args( args ):
18    #( release_version, cvs_tag, sf_user, temp_dir, start_step ) = accept_args( sys.argv[ 1: ] )
19    parser = optparse.OptionParser()
20    parser.add_option( "-v", "--release-version", dest="release_version", metavar="release-version", help="release version (e.g. 1.32.0)")
21    parser.add_option( "", "--tag",  dest="tag", help="CVS tag" )
22    parser.add_option( "-r", "--cvs-branch", dest="cvs_branch", metavar="cvs-branch"
23                       , help = "cvs branch to get the sources from (e.g RC_1_32_0). Important: it is case sensitive" )
24    parser.add_option( "-u", "--sf-user", dest="sf_user", metavar="sf-user"
25                       , help = "SourceForge user name (for CVS)" )
26    parser.add_option( "-t", "--toolset", dest="toolset", help="toolset to use to build needed tools" )
27    parser.add_option( "-s", "--start-step", dest="start_step" )
28    parser.usage = "make_tarballs [options] target_directory \n\n" + \
29                   "Requirements:\n" + \
30                   "  CVS:\n"+ \
31                   "    cvs             - (windows) to export sources with windows newlines \n" + \
32                   "    /usr/bin/cvs    - (cygwin) to export sources with posix newlines\n" + \
33                   "  Utilities:\n" + \
34                   "    mv              - (cygwin) posix move\n" + \
35                   "    /usr/bin/find   - (cygwin) to export sources with posix newlines\n" + \
36                   "    7z              - to create zipball\n" + \
37                   "  BoostBook generation:\n" + \
38                   "    bjam\n" + \
39                   "    user-config.jam - in user directory ($HOME/%HOME%)  for BoostBook generation\n" + \
40                   "    java\n" + \
41                   "    doxygen\n"
42   
43   
44
45    ( options, args ) = parser.parse_args( args )
46
47    temp_dir = None
48    start_step = None
49    if ( len( args ) > 0 ): temp_dir = args[0]
50
51   
52    ( version, tag, user, toolset, start_step ) =  ( options.release_version
53                                         , options.cvs_branch
54                                         , options.sf_user
55                                         , options.toolset
56                                         , options.start_step )
57
58    if ( start_step is None ): start_step = ""
59
60    def required( value, name ):
61       if ( value is None ):
62            print "%s should be specified." % name
63            parser.print_help()
64            sys.exit( 1 )
65       
66    required( version, "version" )
67    required( tag, "tag" )
68    required( user, "user" )
69    required( temp_dir, "temp_dir" )
70    required( toolset, "toolset" )
71                       
72    return ( version, tag, user, toolset, temp_dir, start_step )
73
74
75def remove_directory( directory ):
76    if os.path.exists( directory ):
77        print "    Removing  directory %s" % directory
78        os.system( 'rd /s /q "%s"' % directory )
79   
80def clean_directory( directory ):
81    remove_directory( directory )
82    print "    Creating directory %s" % directory
83    os.makedirs( directory )
84
85def listdir_recursively( root, path="" ):
86    # recursive listdir
87    files = []
88    try:
89        for file in os.listdir(os.path.join(root, path)):
90            pathname = os.path.join(path, file)
91            if os.path.isdir(os.path.join(root, pathname)):
92                files.extend(listdir_recursively(root, pathname))
93            else:
94                files.append(pathname)
95    except OSError:
96        pass
97    return files
98
99def find_file( root, name ):
100    print root
101    files = listdir_recursively( root )
102    for file in files:
103        # print file
104        if os.path.basename( file ) == name:
105            return os.path.join( root, file )
106    return None
107
108start_dir = os.getcwd()
109
110class make_tarballs( utils.step_controller ):
111    def __init__( self, release_version, cvs_tag, sf_user, toolset, temp_dir, start_step ):
112        utils.step_controller.__init__( self, start_step )
113        self.release_version_ = release_version
114        self.cvs_tag_         = cvs_tag
115        self.sf_user_         = sf_user
116        self.toolset_         = toolset
117        self.temp_dir_        = temp_dir
118   
119    def run( self ):
120        archives = []
121
122        win_build_results = self.build_win( self.release_version_
123                                         , self.cvs_tag_
124                                         , self.sf_user_
125                                         , self.temp_dir_ )
126        archives.extend( win_build_results[1] )
127       
128        archives.extend( self.build_unix( self.release_version_
129                                         , self.cvs_tag_
130                                         , self.sf_user_
131                                         , self.temp_dir_
132                                         , win_build_results[0] ) )
133
134       
135        #    os.chdir( start_dir )
136        #    for archive in archives:
137        #        shutil.copy( archive, start_dir )
138
139
140    def make_temp_platform( self, temp, platform ):
141        temp_platform = os.path.join( temp, platform )
142        if not self.is_skipping():
143            clean_directory( temp_platform )
144        return temp_platform
145
146    def cvs_export( self, sf_user, cvs_tag, release_version, shell = "%s" ):
147        if not self.is_skipping():
148            print "    Exporting..."
149            cvs_export_template = 'cvs -d:ext:%(user)s@cvs.sourceforge.net:/cvsroot/boost -z9 export -r %(branch)s boost'
150
151            cmd = cvs_export_template % { "user": sf_user
152                                          , "branch" : cvs_tag }
153
154            print cmd
155            os.system( shell % cmd )
156            os.system( "del /S/F/Q .cvsignore >nul" )
157            # have to use mv instead of os.rename - cygwin cvs sets strange directory permssions
158            # which Windows rename or Python's os.rename cannot deal with
159            os.system( "mv boost boost_%s" % release_version )
160        return "boost_%s" % release_version
161
162    def build_win( self, release_version, cvs_tag, sf_user, temp_dir ):
163
164        if "win.export":
165            self.start_step( "win.export", "Exporting windows copy" )
166
167            temp_win = self.make_temp_platform( temp_dir, "win" )
168            os.chdir( temp_win )
169
170            exported_dir = self.cvs_export( sf_user, cvs_tag, release_version )
171            self.finish_step( "win.export" )
172       
173        self.make_docs( os.path.abspath( exported_dir ), temp_dir )
174
175        if self.start_step( "win.make_readonly", "Making all files writable" ):
176            os.chdir( temp_win )
177            utils.checked_system( [ "attrib /S -R *.*" ] )
178            self.finish_step( "win.make_readonly" )
179       
180        zip_name = "boost_%s.zip" % release_version
181        os.chdir( temp_win )
182
183       
184        if self.start_step( "win.zip", "    Zipping" ):
185             print "    Zipping"
186             if os.path.exists( zip_name ): os.unlink( zip_name )
187
188             utils.checked_system( ["7z a -r -tzip %s %s\* > %s" % ( zip_name, "boost_%s" % release_version, zip_name + ".log" ) ] )
189             self.finish_step( "win.zip" )
190
191
192        return ( os.path.abspath( exported_dir ), [ os.path.abspath( zip_name ) ] )
193
194    def make_docs( self, boost_directory, temp_dir ):
195        boostbook_temp = os.path.join( boost_directory, "bin.v2" )
196        tools_directory = os.path.join( temp_dir, "tools" )
197        if not os.path.exists( tools_directory ):
198            os.makedirs( tools_directory )
199
200        if self.start_step( "win.make_docs.setup_tools", "Setting up BoostBook tools" ):
201            sys.path.append( sys.path[0] + "/../boostbook" )
202            print sys.path
203            import setup_boostbook
204            os.environ[ "BOOST_ROOT" ] = boost_directory
205            setup_boostbook.setup_boostbook( os.path.join( temp_dir, "tools" ) )
206
207        if self.start_step( "win.make_docs.clean", "Clearing \"bin.v2" ):
208            if os.path.exists( boostbook_temp ):
209                shutil.rmtree( boostbook_temp )
210            self.finish_step( "win.make_docs.clean" )
211
212           
213        cd = os.getcwd()
214        os.chdir( os.path.join( boost_directory, "doc" )  )
215
216        if self.start_step( "win.make_docs.correct_permissions", "Making html's writable" ):
217            utils.checked_system( 
218                [ 
219                "cd html"
220                , "attrib -R *"
221                , "cd .."
222                ] )
223            self.finish_step( "win.make_docs.correct_permissions" )
224
225        def generate( output_format ):
226            if self.start_step( "win.make_docs.%s" % output_format, '    Generating %s' % output_format ):
227                utils.checked_system( [ 
228                    # "set HOME=%s" % my_location
229                     "%s -d2 --v2 %s " % ( bjam_path(), output_format )
230                    ] )
231                self.finish_step( "win.make_docs.%s" % output_format )
232       
233        generate( "html" )
234        generate( "docbook" )
235        generate( "fo" )
236
237        if self.start_step( "win.make_docs.copy_docs", "Copying docs into doc directory" ):
238            shutil.copy( os.path.join( boostbook_temp, "doc", self.toolset_, "debug", "boost.docbook" ), "boost.docbook" )
239            shutil.copy( os.path.join( boostbook_temp, "doc", self.toolset_, "debug", "boost.fo" ), "boost.fo" )
240            self.finish_step( "win.make_docs.copy_docs" )
241
242
243        if self.start_step( "win.make_docs.clean2", "Copying docs into doc directory" ):           
244            shutil.rmtree( boostbook_temp )
245            shutil.rmtree( "xml" )
246            self.finish_step( "win.make_docs.clean2" )
247
248        if self.start_step( "win.make_docs.bb_userman", "Creating Boost.Build user manual" ):
249            os.chdir( os.path.join( boost_directory, "tools", "build", "v2", "doc" ) )
250
251            utils.checked_system( [ 
252#                    "set HOME=%s" % my_location
253                    "%s -d2 --v2 pdf" % bjam_path()
254                    ] )
255
256            for f in [ "userman.pdf" ]:
257                shutil.copy( find_file( os.path.join( boostbook_temp ), f ), f  )
258
259            shutil.rmtree( boostbook_temp )
260            self.finish_step( "win.make_docs.bb_userman" )
261
262        if self.start_step( "win.make_docs.clean3", boost_directory ):
263            for i in os.walk( boost_directory ):
264                for f in i[2]:
265                    full_path = os.path.join( i[0], f )
266                    if os.path.splitext( f )[1] in [ ".boostbook" ] \
267                        and os.access( full_path, os.W_OK ):
268                        os.unlink( full_path )
269            self.finish_step( "win.make_docs.clean3" )
270                       
271
272    def correct_executable_permissions( self, path ):
273        if not self.is_skipping():
274            print "    Correcting permissions"
275            for i in os.walk( path ):
276                for f in i[2]:
277                    if os.path.splitext( f )[1] in ( ".css", ".hpp", ".cpp",\
278                                                     ".html", ".htm", ".rst", \
279                                                     ".pdf", ".xml", ".png",\
280                                                     ".jpg", ".vcproj", ".pattern2", \
281                                                     ".jam", ".bat", ".sty", ".diff" ) \
282                       or os.path.basename( f ).lower() in ( "jamfile", "todo", "makefile", "jamrules", "gnumakefile" ):
283                        print os.path.join( i[0], f )
284                        os.system( "chmod a-x %s" % os.path.join( i[0], f ) )
285
286       
287    def build_unix( self, release_version, cvs_tag, sf_user, temp_dir, win_build_dir ):
288
289        self.start_step( "unix.export", "Exporting unix copy" )
290
291        temp_unix = self.make_temp_platform( temp_dir, "unix" )
292        os.chdir( temp_unix )
293
294        exported_dir = self.cvs_export( sf_user, cvs_tag, release_version, "bash -c \"/usr/bin/%s\"" )
295        self.correct_executable_permissions( "." )
296        self.finish_step( "unix.export" )
297
298        self.copy_docs_to_unix( os.path.abspath( exported_dir )
299                                , win_build_dir )
300
301        if self.start_step( "unix.make_readonly", "Making all files readonly" ):
302            utils.checked_system( [ "chmod -R a-w+r,u+w %s" % temp_unix ] )
303            utils.checked_system( [ "bash -c /usr/bin/find %s -type d -exec chmod u+w {} ;" % temp_unix ] )
304            self.finish_step( "unix.make_readonly" )
305
306        gz_archive_name = "boost_%s" % release_version + ".tar.gz"
307        if self.start_step( "unix.gz", "    Making .gz" ):
308            if os.path.exists( gz_archive_name  ):  os.unlink( gz_archive_name  )
309            os.system( "tar cfz %s %s" % ( gz_archive_name, "boost_%s" % release_version ) )
310            self.finish_step( "unix.gz" )
311
312        bz2_archive_name = "boost_%s" % release_version + ".tar.bz2"
313        if self.start_step( "unix.bz2", "    Making .bz2" ):
314            if os.path.exists( bz2_archive_name  ):  os.unlink( bz2_archive_name )
315            os.system( 'bash -c "gunzip -c %s | bzip2 > %s"' % ( gz_archive_name, bz2_archive_name ) )
316            self.finish_step( "unix.bz2" )
317           
318        return [ os.path.abspath( x ) for x in ( gz_archive_name, bz2_archive_name ) ]
319
320    def remove_x_permission( self, directory ):
321        for i in os.walk( directory ):
322            for f in i[1]:
323                os.system( "chmod a=xr,u=rwx %s" % os.path.join( i[0], f ) )
324            for f in i[2]:
325                os.system( "chmod a=r,u=rw %s" % os.path.join( i[0], f ) )
326       
327    def copy_docs_to_unix( self, unix_boost_directory, win_boost_directory ):
328        if self.start_step( "unix.copy_docs", "Copying docs to unix copy" ):
329            doc_directory = os.path.join( unix_boost_directory, "doc" )
330            doc_html_directory = os.path.join( doc_directory, "html" )
331            remove_directory( doc_html_directory )
332            utils.checked_system( [
333                "cp -R %s %s " % ( os.path.join( win_boost_directory, "doc", "html" )
334                                , doc_html_directory )
335                ] )
336            for f in [ "boost.docbook", "boost.fo" ]:
337                utils.checked_system( [
338                    "cp %s %s" % ( os.path.join( win_boost_directory, "doc", f )
339                                    , os.path.join( doc_directory, f ) )
340                    ] )
341
342            self.remove_x_permission( doc_directory )
343
344            boost_build_doc_directory = os.path.join( unix_boost_directory, "tools", "build", "v2", "doc" )
345            boost_build_doc_html_directory = os.path.join( boost_build_doc_directory, "html" )
346           
347            remove_directory( boost_build_doc_html_directory )
348            utils.checked_system( [
349                "cp -R %s %s " % ( os.path.join( win_boost_directory, "tools", "build", "v2", "doc", "html" )
350                                , boost_build_doc_html_directory ) ] )
351
352            for f in [ "userman.pdf" ]:
353                utils.checked_system( [
354                    "cp %s %s " % ( os.path.join( win_boost_directory, "tools", "build", "v2", "doc", f )
355                                    , os.path.join( boost_build_doc_directory, f ) ) ] )
356
357            self.remove_x_permission( boost_build_doc_directory )
358            self.finish_step( "unix.copy_docs" )
359
360
361def bjam_path():
362    if os.path.exists( os.path.join( my_location, "bjam.exe" ) ):
363        return os.path.join( my_location, "bjam.exe" )
364    else:
365        return "bjam.exe"
366       
367def main():
368    ( release_version, cvs_tag, sf_user, toolset, temp_dir, start_step ) = accept_args( sys.argv[ 1: ] )
369
370    make_tarballs( release_version, cvs_tag, sf_user, toolset, temp_dir, start_step  ).run()
371   
372if __name__ == "__main__":
373    main()
Note: See TracBrowser for help on using the repository browser.