| 1 | #! /usr/bin/env python
|
|---|
| 2 |
|
|---|
| 3 | """Freeze a Python script into a binary.
|
|---|
| 4 |
|
|---|
| 5 | usage: freeze [options...] script [module]...
|
|---|
| 6 |
|
|---|
| 7 | Options:
|
|---|
| 8 | -p prefix: This is the prefix used when you ran ``make install''
|
|---|
| 9 | in the Python build directory.
|
|---|
| 10 | (If you never ran this, freeze won't work.)
|
|---|
| 11 | The default is whatever sys.prefix evaluates to.
|
|---|
| 12 | It can also be the top directory of the Python source
|
|---|
| 13 | tree; then -P must point to the build tree.
|
|---|
| 14 |
|
|---|
| 15 | -P exec_prefix: Like -p but this is the 'exec_prefix', used to
|
|---|
| 16 | install objects etc. The default is whatever sys.exec_prefix
|
|---|
| 17 | evaluates to, or the -p argument if given.
|
|---|
| 18 | If -p points to the Python source tree, -P must point
|
|---|
| 19 | to the build tree, if different.
|
|---|
| 20 |
|
|---|
| 21 | -e extension: A directory containing additional .o files that
|
|---|
| 22 | may be used to resolve modules. This directory
|
|---|
| 23 | should also have a Setup file describing the .o files.
|
|---|
| 24 | On Windows, the name of a .INI file describing one
|
|---|
| 25 | or more extensions is passed.
|
|---|
| 26 | More than one -e option may be given.
|
|---|
| 27 |
|
|---|
| 28 | -o dir: Directory where the output files are created; default '.'.
|
|---|
| 29 |
|
|---|
| 30 | -m: Additional arguments are module names instead of filenames.
|
|---|
| 31 |
|
|---|
| 32 | -a package=dir: Additional directories to be added to the package's
|
|---|
| 33 | __path__. Used to simulate directories added by the
|
|---|
| 34 | package at runtime (eg, by OpenGL and win32com).
|
|---|
| 35 | More than one -a option may be given for each package.
|
|---|
| 36 |
|
|---|
| 37 | -l file: Pass the file to the linker (windows only)
|
|---|
| 38 |
|
|---|
| 39 | -d: Debugging mode for the module finder.
|
|---|
| 40 |
|
|---|
| 41 | -q: Make the module finder totally quiet.
|
|---|
| 42 |
|
|---|
| 43 | -h: Print this help message.
|
|---|
| 44 |
|
|---|
| 45 | -x module Exclude the specified module. It will still be imported
|
|---|
| 46 | by the frozen binary if it exists on the host system.
|
|---|
| 47 |
|
|---|
| 48 | -X module Like -x, except the module can never be imported by
|
|---|
| 49 | the frozen binary.
|
|---|
| 50 |
|
|---|
| 51 | -E: Freeze will fail if any modules can't be found (that
|
|---|
| 52 | were not excluded using -x or -X).
|
|---|
| 53 |
|
|---|
| 54 | -i filename: Include a file with additional command line options. Used
|
|---|
| 55 | to prevent command lines growing beyond the capabilities of
|
|---|
| 56 | the shell/OS. All arguments specified in filename
|
|---|
| 57 | are read and the -i option replaced with the parsed
|
|---|
| 58 | params (note - quoting args in this file is NOT supported)
|
|---|
| 59 |
|
|---|
| 60 | -s subsystem: Specify the subsystem (For Windows only.);
|
|---|
| 61 | 'console' (default), 'windows', 'service' or 'com_dll'
|
|---|
| 62 |
|
|---|
| 63 | -w: Toggle Windows (NT or 95) behavior.
|
|---|
| 64 | (For debugging only -- on a win32 platform, win32 behavior
|
|---|
| 65 | is automatic.)
|
|---|
| 66 |
|
|---|
| 67 | -r prefix=f: Replace path prefix.
|
|---|
| 68 | Replace prefix with f in the source path references
|
|---|
| 69 | contained in the resulting binary.
|
|---|
| 70 |
|
|---|
| 71 | Arguments:
|
|---|
| 72 |
|
|---|
| 73 | script: The Python script to be executed by the resulting binary.
|
|---|
| 74 |
|
|---|
| 75 | module ...: Additional Python modules (referenced by pathname)
|
|---|
| 76 | that will be included in the resulting binary. These
|
|---|
| 77 | may be .py or .pyc files. If -m is specified, these are
|
|---|
| 78 | module names that are search in the path instead.
|
|---|
| 79 |
|
|---|
| 80 | NOTES:
|
|---|
| 81 |
|
|---|
| 82 | In order to use freeze successfully, you must have built Python and
|
|---|
| 83 | installed it ("make install").
|
|---|
| 84 |
|
|---|
| 85 | The script should not use modules provided only as shared libraries;
|
|---|
| 86 | if it does, the resulting binary is not self-contained.
|
|---|
| 87 | """
|
|---|
| 88 |
|
|---|
| 89 |
|
|---|
| 90 | # Import standard modules
|
|---|
| 91 |
|
|---|
| 92 | import modulefinder
|
|---|
| 93 | import getopt
|
|---|
| 94 | import os
|
|---|
| 95 | import sys
|
|---|
| 96 |
|
|---|
| 97 |
|
|---|
| 98 | # Import the freeze-private modules
|
|---|
| 99 |
|
|---|
| 100 | import checkextensions
|
|---|
| 101 | import makeconfig
|
|---|
| 102 | import makefreeze
|
|---|
| 103 | import makemakefile
|
|---|
| 104 | import parsesetup
|
|---|
| 105 | import bkfile
|
|---|
| 106 |
|
|---|
| 107 |
|
|---|
| 108 | # Main program
|
|---|
| 109 |
|
|---|
| 110 | def main():
|
|---|
| 111 | # overridable context
|
|---|
| 112 | prefix = None # settable with -p option
|
|---|
| 113 | exec_prefix = None # settable with -P option
|
|---|
| 114 | extensions = []
|
|---|
| 115 | exclude = [] # settable with -x option
|
|---|
| 116 | addn_link = [] # settable with -l, but only honored under Windows.
|
|---|
| 117 | path = sys.path[:]
|
|---|
| 118 | modargs = 0
|
|---|
| 119 | debug = 1
|
|---|
| 120 | odir = ''
|
|---|
| 121 | win = sys.platform[:3] == 'win'
|
|---|
| 122 | replace_paths = [] # settable with -r option
|
|---|
| 123 | error_if_any_missing = 0
|
|---|
| 124 |
|
|---|
| 125 | # default the exclude list for each platform
|
|---|
| 126 | if win: exclude = exclude + [
|
|---|
| 127 | 'dos', 'dospath', 'mac', 'macpath', 'macfs', 'MACFS', 'posix',
|
|---|
| 128 | 'os2', 'ce', 'riscos', 'riscosenviron', 'riscospath',
|
|---|
| 129 | ]
|
|---|
| 130 |
|
|---|
| 131 | fail_import = exclude[:]
|
|---|
| 132 |
|
|---|
| 133 | # output files
|
|---|
| 134 | frozen_c = 'frozen.c'
|
|---|
| 135 | config_c = 'config.c'
|
|---|
| 136 | target = 'a.out' # normally derived from script name
|
|---|
| 137 | makefile = 'Makefile'
|
|---|
| 138 | subsystem = 'console'
|
|---|
| 139 |
|
|---|
| 140 | # parse command line by first replacing any "-i" options with the
|
|---|
| 141 | # file contents.
|
|---|
| 142 | pos = 1
|
|---|
| 143 | while pos < len(sys.argv)-1:
|
|---|
| 144 | # last option can not be "-i", so this ensures "pos+1" is in range!
|
|---|
| 145 | if sys.argv[pos] == '-i':
|
|---|
| 146 | try:
|
|---|
| 147 | options = open(sys.argv[pos+1]).read().split()
|
|---|
| 148 | except IOError, why:
|
|---|
| 149 | usage("File name '%s' specified with the -i option "
|
|---|
| 150 | "can not be read - %s" % (sys.argv[pos+1], why) )
|
|---|
| 151 | # Replace the '-i' and the filename with the read params.
|
|---|
| 152 | sys.argv[pos:pos+2] = options
|
|---|
| 153 | pos = pos + len(options) - 1 # Skip the name and the included args.
|
|---|
| 154 | pos = pos + 1
|
|---|
| 155 |
|
|---|
| 156 | # Now parse the command line with the extras inserted.
|
|---|
| 157 | try:
|
|---|
| 158 | opts, args = getopt.getopt(sys.argv[1:], 'r:a:dEe:hmo:p:P:qs:wX:x:l:')
|
|---|
| 159 | except getopt.error, msg:
|
|---|
| 160 | usage('getopt error: ' + str(msg))
|
|---|
| 161 |
|
|---|
| 162 | # proces option arguments
|
|---|
| 163 | for o, a in opts:
|
|---|
| 164 | if o == '-h':
|
|---|
| 165 | print __doc__
|
|---|
| 166 | return
|
|---|
| 167 | if o == '-d':
|
|---|
| 168 | debug = debug + 1
|
|---|
| 169 | if o == '-e':
|
|---|
| 170 | extensions.append(a)
|
|---|
| 171 | if o == '-m':
|
|---|
| 172 | modargs = 1
|
|---|
| 173 | if o == '-o':
|
|---|
| 174 | odir = a
|
|---|
| 175 | if o == '-p':
|
|---|
| 176 | prefix = a
|
|---|
| 177 | if o == '-P':
|
|---|
| 178 | exec_prefix = a
|
|---|
| 179 | if o == '-q':
|
|---|
| 180 | debug = 0
|
|---|
| 181 | if o == '-w':
|
|---|
| 182 | win = not win
|
|---|
| 183 | if o == '-s':
|
|---|
| 184 | if not win:
|
|---|
| 185 | usage("-s subsystem option only on Windows")
|
|---|
| 186 | subsystem = a
|
|---|
| 187 | if o == '-x':
|
|---|
| 188 | exclude.append(a)
|
|---|
| 189 | if o == '-X':
|
|---|
| 190 | exclude.append(a)
|
|---|
| 191 | fail_import.append(a)
|
|---|
| 192 | if o == '-E':
|
|---|
| 193 | error_if_any_missing = 1
|
|---|
| 194 | if o == '-l':
|
|---|
| 195 | addn_link.append(a)
|
|---|
| 196 | if o == '-a':
|
|---|
| 197 | apply(modulefinder.AddPackagePath, tuple(a.split("=", 2)))
|
|---|
| 198 | if o == '-r':
|
|---|
| 199 | f,r = a.split("=", 2)
|
|---|
| 200 | replace_paths.append( (f,r) )
|
|---|
| 201 |
|
|---|
| 202 | # modules that are imported by the Python runtime
|
|---|
| 203 | implicits = []
|
|---|
| 204 | for module in ('site', 'warnings',):
|
|---|
| 205 | if module not in exclude:
|
|---|
| 206 | implicits.append(module)
|
|---|
| 207 |
|
|---|
| 208 | # default prefix and exec_prefix
|
|---|
| 209 | if not exec_prefix:
|
|---|
| 210 | if prefix:
|
|---|
| 211 | exec_prefix = prefix
|
|---|
| 212 | else:
|
|---|
| 213 | exec_prefix = sys.exec_prefix
|
|---|
| 214 | if not prefix:
|
|---|
| 215 | prefix = sys.prefix
|
|---|
| 216 |
|
|---|
| 217 | # determine whether -p points to the Python source tree
|
|---|
| 218 | ishome = os.path.exists(os.path.join(prefix, 'Python', 'ceval.c'))
|
|---|
| 219 |
|
|---|
| 220 | # locations derived from options
|
|---|
| 221 | version = sys.version[:3]
|
|---|
| 222 | if win:
|
|---|
| 223 | extensions_c = 'frozen_extensions.c'
|
|---|
| 224 | if ishome:
|
|---|
| 225 | print "(Using Python source directory)"
|
|---|
| 226 | binlib = exec_prefix
|
|---|
| 227 | incldir = os.path.join(prefix, 'Include')
|
|---|
| 228 | config_h_dir = exec_prefix
|
|---|
| 229 | config_c_in = os.path.join(prefix, 'Modules', 'config.c.in')
|
|---|
| 230 | frozenmain_c = os.path.join(prefix, 'Python', 'frozenmain.c')
|
|---|
| 231 | makefile_in = os.path.join(exec_prefix, 'Makefile')
|
|---|
| 232 | if win:
|
|---|
| 233 | frozendllmain_c = os.path.join(exec_prefix, 'Pc\\frozen_dllmain.c')
|
|---|
| 234 | else:
|
|---|
| 235 | binlib = os.path.join(exec_prefix,
|
|---|
| 236 | 'lib', 'python%s' % version, 'config')
|
|---|
| 237 | incldir = os.path.join(prefix, 'include', 'python%s' % version)
|
|---|
| 238 | config_h_dir = os.path.join(exec_prefix, 'include',
|
|---|
| 239 | 'python%s' % version)
|
|---|
| 240 | config_c_in = os.path.join(binlib, 'config.c.in')
|
|---|
| 241 | frozenmain_c = os.path.join(binlib, 'frozenmain.c')
|
|---|
| 242 | makefile_in = os.path.join(binlib, 'Makefile')
|
|---|
| 243 | frozendllmain_c = os.path.join(binlib, 'frozen_dllmain.c')
|
|---|
| 244 | supp_sources = []
|
|---|
| 245 | defines = []
|
|---|
| 246 | includes = ['-I' + incldir, '-I' + config_h_dir]
|
|---|
| 247 |
|
|---|
| 248 | # sanity check of directories and files
|
|---|
| 249 | check_dirs = [prefix, exec_prefix, binlib, incldir]
|
|---|
| 250 | if not win:
|
|---|
| 251 | # These are not directories on Windows.
|
|---|
| 252 | check_dirs = check_dirs + extensions
|
|---|
| 253 | for dir in check_dirs:
|
|---|
| 254 | if not os.path.exists(dir):
|
|---|
| 255 | usage('needed directory %s not found' % dir)
|
|---|
| 256 | if not os.path.isdir(dir):
|
|---|
| 257 | usage('%s: not a directory' % dir)
|
|---|
| 258 | if win:
|
|---|
| 259 | files = supp_sources + extensions # extensions are files on Windows.
|
|---|
| 260 | else:
|
|---|
| 261 | files = [config_c_in, makefile_in] + supp_sources
|
|---|
| 262 | for file in supp_sources:
|
|---|
| 263 | if not os.path.exists(file):
|
|---|
| 264 | usage('needed file %s not found' % file)
|
|---|
| 265 | if not os.path.isfile(file):
|
|---|
| 266 | usage('%s: not a plain file' % file)
|
|---|
| 267 | if not win:
|
|---|
| 268 | for dir in extensions:
|
|---|
| 269 | setup = os.path.join(dir, 'Setup')
|
|---|
| 270 | if not os.path.exists(setup):
|
|---|
| 271 | usage('needed file %s not found' % setup)
|
|---|
| 272 | if not os.path.isfile(setup):
|
|---|
| 273 | usage('%s: not a plain file' % setup)
|
|---|
| 274 |
|
|---|
| 275 | # check that enough arguments are passed
|
|---|
| 276 | if not args:
|
|---|
| 277 | usage('at least one filename argument required')
|
|---|
| 278 |
|
|---|
| 279 | # check that file arguments exist
|
|---|
| 280 | for arg in args:
|
|---|
| 281 | if arg == '-m':
|
|---|
| 282 | break
|
|---|
| 283 | # if user specified -m on the command line before _any_
|
|---|
| 284 | # file names, then nothing should be checked (as the
|
|---|
| 285 | # very first file should be a module name)
|
|---|
| 286 | if modargs:
|
|---|
| 287 | break
|
|---|
| 288 | if not os.path.exists(arg):
|
|---|
| 289 | usage('argument %s not found' % arg)
|
|---|
| 290 | if not os.path.isfile(arg):
|
|---|
| 291 | usage('%s: not a plain file' % arg)
|
|---|
| 292 |
|
|---|
| 293 | # process non-option arguments
|
|---|
| 294 | scriptfile = args[0]
|
|---|
| 295 | modules = args[1:]
|
|---|
| 296 |
|
|---|
| 297 | # derive target name from script name
|
|---|
| 298 | base = os.path.basename(scriptfile)
|
|---|
| 299 | base, ext = os.path.splitext(base)
|
|---|
| 300 | if base:
|
|---|
| 301 | if base != scriptfile:
|
|---|
| 302 | target = base
|
|---|
| 303 | else:
|
|---|
| 304 | target = base + '.bin'
|
|---|
| 305 |
|
|---|
| 306 | # handle -o option
|
|---|
| 307 | base_frozen_c = frozen_c
|
|---|
| 308 | base_config_c = config_c
|
|---|
| 309 | base_target = target
|
|---|
| 310 | if odir and not os.path.isdir(odir):
|
|---|
| 311 | try:
|
|---|
| 312 | os.mkdir(odir)
|
|---|
| 313 | print "Created output directory", odir
|
|---|
| 314 | except os.error, msg:
|
|---|
| 315 | usage('%s: mkdir failed (%s)' % (odir, str(msg)))
|
|---|
| 316 | base = ''
|
|---|
| 317 | if odir:
|
|---|
| 318 | base = os.path.join(odir, '')
|
|---|
| 319 | frozen_c = os.path.join(odir, frozen_c)
|
|---|
| 320 | config_c = os.path.join(odir, config_c)
|
|---|
| 321 | target = os.path.join(odir, target)
|
|---|
| 322 | makefile = os.path.join(odir, makefile)
|
|---|
| 323 | if win: extensions_c = os.path.join(odir, extensions_c)
|
|---|
| 324 |
|
|---|
| 325 | # Handle special entry point requirements
|
|---|
| 326 | # (on Windows, some frozen programs do not use __main__, but
|
|---|
| 327 | # import the module directly. Eg, DLLs, Services, etc
|
|---|
| 328 | custom_entry_point = None # Currently only used on Windows
|
|---|
| 329 | python_entry_is_main = 1 # Is the entry point called __main__?
|
|---|
| 330 | # handle -s option on Windows
|
|---|
| 331 | if win:
|
|---|
| 332 | import winmakemakefile
|
|---|
| 333 | try:
|
|---|
| 334 | custom_entry_point, python_entry_is_main = \
|
|---|
| 335 | winmakemakefile.get_custom_entry_point(subsystem)
|
|---|
| 336 | except ValueError, why:
|
|---|
| 337 | usage(why)
|
|---|
| 338 |
|
|---|
| 339 |
|
|---|
| 340 | # Actual work starts here...
|
|---|
| 341 |
|
|---|
| 342 | # collect all modules of the program
|
|---|
| 343 | dir = os.path.dirname(scriptfile)
|
|---|
| 344 | path[0] = dir
|
|---|
| 345 | mf = modulefinder.ModuleFinder(path, debug, exclude, replace_paths)
|
|---|
| 346 |
|
|---|
| 347 | if win and subsystem=='service':
|
|---|
| 348 | # If a Windows service, then add the "built-in" module.
|
|---|
| 349 | mod = mf.add_module("servicemanager")
|
|---|
| 350 | mod.__file__="dummy.pyd" # really built-in to the resulting EXE
|
|---|
| 351 |
|
|---|
| 352 | for mod in implicits:
|
|---|
| 353 | mf.import_hook(mod)
|
|---|
| 354 | for mod in modules:
|
|---|
| 355 | if mod == '-m':
|
|---|
| 356 | modargs = 1
|
|---|
| 357 | continue
|
|---|
| 358 | if modargs:
|
|---|
| 359 | if mod[-2:] == '.*':
|
|---|
| 360 | mf.import_hook(mod[:-2], None, ["*"])
|
|---|
| 361 | else:
|
|---|
| 362 | mf.import_hook(mod)
|
|---|
| 363 | else:
|
|---|
| 364 | mf.load_file(mod)
|
|---|
| 365 |
|
|---|
| 366 | # Add the main script as either __main__, or the actual module name.
|
|---|
| 367 | if python_entry_is_main:
|
|---|
| 368 | mf.run_script(scriptfile)
|
|---|
| 369 | else:
|
|---|
| 370 | mf.load_file(scriptfile)
|
|---|
| 371 |
|
|---|
| 372 | if debug > 0:
|
|---|
| 373 | mf.report()
|
|---|
| 374 | print
|
|---|
| 375 | dict = mf.modules
|
|---|
| 376 |
|
|---|
| 377 | if error_if_any_missing:
|
|---|
| 378 | missing = mf.any_missing()
|
|---|
| 379 | if missing:
|
|---|
| 380 | sys.exit("There are some missing modules: %r" % missing)
|
|---|
| 381 |
|
|---|
| 382 | # generate output for frozen modules
|
|---|
| 383 | files = makefreeze.makefreeze(base, dict, debug, custom_entry_point,
|
|---|
| 384 | fail_import)
|
|---|
| 385 |
|
|---|
| 386 | # look for unfrozen modules (builtin and of unknown origin)
|
|---|
| 387 | builtins = []
|
|---|
| 388 | unknown = []
|
|---|
| 389 | mods = dict.keys()
|
|---|
| 390 | mods.sort()
|
|---|
| 391 | for mod in mods:
|
|---|
| 392 | if dict[mod].__code__:
|
|---|
| 393 | continue
|
|---|
| 394 | if not dict[mod].__file__:
|
|---|
| 395 | builtins.append(mod)
|
|---|
| 396 | else:
|
|---|
| 397 | unknown.append(mod)
|
|---|
| 398 |
|
|---|
| 399 | # search for unknown modules in extensions directories (not on Windows)
|
|---|
| 400 | addfiles = []
|
|---|
| 401 | frozen_extensions = [] # Windows list of modules.
|
|---|
| 402 | if unknown or (not win and builtins):
|
|---|
| 403 | if not win:
|
|---|
| 404 | addfiles, addmods = \
|
|---|
| 405 | checkextensions.checkextensions(unknown+builtins,
|
|---|
| 406 | extensions)
|
|---|
| 407 | for mod in addmods:
|
|---|
| 408 | if mod in unknown:
|
|---|
| 409 | unknown.remove(mod)
|
|---|
| 410 | builtins.append(mod)
|
|---|
| 411 | else:
|
|---|
| 412 | # Do the windows thang...
|
|---|
| 413 | import checkextensions_win32
|
|---|
| 414 | # Get a list of CExtension instances, each describing a module
|
|---|
| 415 | # (including its source files)
|
|---|
| 416 | frozen_extensions = checkextensions_win32.checkextensions(
|
|---|
| 417 | unknown, extensions, prefix)
|
|---|
| 418 | for mod in frozen_extensions:
|
|---|
| 419 | unknown.remove(mod.name)
|
|---|
| 420 |
|
|---|
| 421 | # report unknown modules
|
|---|
| 422 | if unknown:
|
|---|
| 423 | sys.stderr.write('Warning: unknown modules remain: %s\n' %
|
|---|
| 424 | ' '.join(unknown))
|
|---|
| 425 |
|
|---|
| 426 | # windows gets different treatment
|
|---|
| 427 | if win:
|
|---|
| 428 | # Taking a shortcut here...
|
|---|
| 429 | import winmakemakefile, checkextensions_win32
|
|---|
| 430 | checkextensions_win32.write_extension_table(extensions_c,
|
|---|
| 431 | frozen_extensions)
|
|---|
| 432 | # Create a module definition for the bootstrap C code.
|
|---|
| 433 | xtras = [frozenmain_c, os.path.basename(frozen_c),
|
|---|
| 434 | frozendllmain_c, os.path.basename(extensions_c)] + files
|
|---|
| 435 | maindefn = checkextensions_win32.CExtension( '__main__', xtras )
|
|---|
| 436 | frozen_extensions.append( maindefn )
|
|---|
| 437 | outfp = open(makefile, 'w')
|
|---|
| 438 | try:
|
|---|
| 439 | winmakemakefile.makemakefile(outfp,
|
|---|
| 440 | locals(),
|
|---|
| 441 | frozen_extensions,
|
|---|
| 442 | os.path.basename(target))
|
|---|
| 443 | finally:
|
|---|
| 444 | outfp.close()
|
|---|
| 445 | return
|
|---|
| 446 |
|
|---|
| 447 | # generate config.c and Makefile
|
|---|
| 448 | builtins.sort()
|
|---|
| 449 | infp = open(config_c_in)
|
|---|
| 450 | outfp = bkfile.open(config_c, 'w')
|
|---|
| 451 | try:
|
|---|
| 452 | makeconfig.makeconfig(infp, outfp, builtins)
|
|---|
| 453 | finally:
|
|---|
| 454 | outfp.close()
|
|---|
| 455 | infp.close()
|
|---|
| 456 |
|
|---|
| 457 | cflags = ['$(OPT)']
|
|---|
| 458 | cppflags = defines + includes
|
|---|
| 459 | libs = [os.path.join(binlib, 'libpython$(VERSION).a')]
|
|---|
| 460 |
|
|---|
| 461 | somevars = {}
|
|---|
| 462 | if os.path.exists(makefile_in):
|
|---|
| 463 | makevars = parsesetup.getmakevars(makefile_in)
|
|---|
| 464 | for key in makevars.keys():
|
|---|
| 465 | somevars[key] = makevars[key]
|
|---|
| 466 |
|
|---|
| 467 | somevars['CFLAGS'] = ' '.join(cflags) # override
|
|---|
| 468 | somevars['CPPFLAGS'] = ' '.join(cppflags) # override
|
|---|
| 469 | files = [base_config_c, base_frozen_c] + \
|
|---|
| 470 | files + supp_sources + addfiles + libs + \
|
|---|
| 471 | ['$(MODLIBS)', '$(LIBS)', '$(SYSLIBS)']
|
|---|
| 472 |
|
|---|
| 473 | outfp = bkfile.open(makefile, 'w')
|
|---|
| 474 | try:
|
|---|
| 475 | makemakefile.makemakefile(outfp, somevars, files, base_target)
|
|---|
| 476 | finally:
|
|---|
| 477 | outfp.close()
|
|---|
| 478 |
|
|---|
| 479 | # Done!
|
|---|
| 480 |
|
|---|
| 481 | if odir:
|
|---|
| 482 | print 'Now run "make" in', odir,
|
|---|
| 483 | print 'to build the target:', base_target
|
|---|
| 484 | else:
|
|---|
| 485 | print 'Now run "make" to build the target:', base_target
|
|---|
| 486 |
|
|---|
| 487 |
|
|---|
| 488 | # Print usage message and exit
|
|---|
| 489 |
|
|---|
| 490 | def usage(msg):
|
|---|
| 491 | sys.stdout = sys.stderr
|
|---|
| 492 | print "Error:", msg
|
|---|
| 493 | print "Use ``%s -h'' for help" % sys.argv[0]
|
|---|
| 494 | sys.exit(2)
|
|---|
| 495 |
|
|---|
| 496 |
|
|---|
| 497 | main()
|
|---|