1 #!/usr/bin/env python2.5
3 # Armadillo File Manager
4 # Copyright (c) 2010-2011, Robert Sesek <http://www.bluestatic.org>
6 # This program is free software: you can redistribute it and/or modify it under
7 # the terms of the GNU General Public License as published by the Free Software
8 # Foundation, either version 3 of the License, or any later version.
19 ROOT
= os
.path
.dirname(os
.path
.realpath(__file__
))
20 SRC_PATH
= os
.path
.join(ROOT
, 'src')
21 PROD_PATH
= os
.path
.join(ROOT
, 'out')
22 FE_PATH
= os
.path
.join(ROOT
, 'web_frontend')
24 CLOSURE_SVN
= 'http://closure-library.googlecode.com/svn/trunk/'
26 CLOSURE_DEST
= os
.path
.join(ROOT
, 'closure')
27 CLOSURE_COMPILER
= os
.path
.join(ROOT
, 'closure-compiler.jar')
28 CLOSURE_CALCDEPS
= os
.path
.join(CLOSURE_DEST
, 'closure', 'bin', 'calcdeps.py')
30 VERSION_FILE
= os
.path
.join(FE_PATH
, 'version.js.proto')
59 PRODUCT_NAME
= 'armadillo'
61 # The Golang version (hg id).
62 BACK_END_COMPILER_VERSION
= 'c5c62aeb6267 release/release.r56/weekly.2011-03-07.1'
68 def _ObjFileName(gofile
):
69 gofile
= os
.path
.basename(gofile
)
70 return os
.path
.join(PROD_PATH
, os
.path
.splitext(gofile
)[0] + '.' + O_EXTENSION
)
73 print '=== Pulling Dependencies ==='
74 if os
.path
.exists(CLOSURE_DEST
):
75 handle
= subprocess
.Popen([ 'svn', 'info', CLOSURE_DEST
], stdout
= subprocess
.PIPE
)
77 for line
in handle
.stdout
:
78 if line
.startswith('Revision'):
79 if not line
.startswith('Revision: ' + CLOSURE_REV
):
80 subprocess
.Popen([ 'svn', 'update', '-r', CLOSURE_REV
, CLOSURE_DEST
]).wait()
82 print ' Closure @ ' + CLOSURE_REV
84 subprocess
.Popen([ 'svn', 'checkout', '-r', CLOSURE_REV
, CLOSURE_SVN
, CLOSURE_DEST
]).wait()
86 def _CompileBackEnd():
87 for gofile
in SOURCES
:
88 gofile
= os
.path
.join(SRC_PATH
, gofile
)
89 args
= [ COMPILER
, gofile
]
90 print ' ' + ' '.join(args
)
91 handle
= subprocess
.Popen(args
, stdout
= sys
.stdout
, stderr
= sys
.stderr
)
95 objects
= map(_ObjFileName
, SOURCES
)
96 args
= [ LINKER
, '-o', os
.path
.join(PROD_PATH
, PRODUCT_NAME
), 'main.' + O_EXTENSION
]
97 print ' ' + ' ' .join(args
)
98 handle
= subprocess
.Popen(args
, stdout
= sys
.stdout
, stderr
= sys
.stderr
)
101 def _StampVersion(options
):
102 print '=== Version Stamp ==='
103 if os
.path
.exists(VERSION_FILE
):
104 gitcrement
= subprocess
.Popen([ 'gitcrement', 'next' ], stdout
= subprocess
.PIPE
, cwd
= ROOT
)
106 build_stamp
= gitcrement
.stdout
.read().strip()
107 time_stamp
= str(int(time
.time()))
109 fd
= open(VERSION_FILE
, 'a+')
111 lines
= fd
.readlines()
115 line
= re
.sub(r
'(BUILD =) ([0-9\.]+)', r
'\1 ' + build_stamp
, line
)
116 line
= re
.sub(r
'(STAMP =) ([0-9]+)', r
'\1 ' + time_stamp
, line
)
119 print ' BUILD ' + build_stamp
+ ' @ ' + time_stamp
120 if options
.compile_fe
:
121 mfiles
= subprocess
.Popen([ 'git', 'ls-files', '-m' ], stdout
= subprocess
.PIPE
, cwd
= ROOT
)
123 versioned_stamp_file
= string
.replace(VERSION_FILE
, '.proto', '')
124 shutil
.copy(VERSION_FILE
, versioned_stamp_file
)
125 print ' COPY version.js.proto -> version.js'
126 if not len(mfiles
.stdout
.readlines()):
127 subprocess
.Popen([ 'git', 'commit', '--author=Armadillo Build Script <armadillo@bluestatic.org>',
128 '-m', 'Stamp version.js @ ' + build_stamp
+ '.', versioned_stamp_file
], stdout
= sys
.stdout
,
129 stderr
= sys
.stderr
).wait()
131 def _CompileFrontEnd(options
):
135 print '=== Copying Resources ==='
136 fe_resources
= os
.path
.join(PROD_PATH
, 'fe')
137 subprocess
.Popen([ 'rm', '-rf', fe_resources
]).wait()
138 os
.mkdir(fe_resources
)
139 for resource
in RESOURCES_FE
:
140 print ' COPY ' + resource
141 shutil
.copy(os
.path
.join(FE_PATH
, resource
), fe_resources
)
142 fd
= open(os
.path
.join(fe_resources
, 'closure.css'), 'w+')
143 fd
.write('/*=== Generated Resources for Closure Library ===*/')
144 for resource
in RESOURCES_CLOSURE
:
145 print ' COPY closure/' + resource
146 respath
= os
.path
.join(CLOSURE_DEST
, 'closure', 'goog', 'css', resource
)
147 ofd
= open(respath
, 'r')
148 fd
.write('\n\n/*=== File: ' + respath
.replace(ROOT
, '/') + ' ===*/\n')
149 fd
.writelines(ofd
.readlines())
154 _StampVersion(options
)
157 print '=== Compiling Front End ==='
158 outfile
= os
.path
.join(PROD_PATH
, 'fe', PRODUCT_NAME
+ '.js')
159 fe_sources
= map(lambda f
: '-i' + os
.path
.join(FE_PATH
, f
), SOURCES_FE
)
160 closure_sources
= os
.path
.join(CLOSURE_DEST
, 'closure', 'goog')
161 args
= [ CLOSURE_CALCDEPS
]
162 args
.extend(fe_sources
)
164 if options
.compile_fe
:
166 args
.extend([ '-p', closure_sources
, '-o', output
, '-c', CLOSURE_COMPILER
,
167 '--output_file', outfile
])
168 print ' ' + ' '.join(args
)
169 handle
= subprocess
.Popen(args
, stdout
= sys
.stdout
, stderr
= sys
.stderr
)
174 parser
= optparse
.OptionParser()
175 parser
.add_option('-c', '--closure_fe', action
="store_true", dest
="compile_fe",
176 help="Run the Front End inputs through the Closure Compiler")
177 parser
.add_option('-b', '--back-end', action
="store_true", dest
="backend_only",
178 help="Compiles only the back-end")
179 parser
.add_option('-f', '--front-end', action
="store_true", dest
="frontend_only",
180 help="Compiles only the front-end")
181 (options
, args
) = parser
.parse_args()
183 print '=== Starting Build ==='
186 if not options
.frontend_only
:
189 if not options
.backend_only
:
190 _CompileFrontEnd(options
)
192 if __name__
== '__main__':