📄 gen_make.py
字号:
## gen_make.py -- generate makefiles and dependencies#import osimport sysimport stringimport gen_baseimport generator.swig.header_wrappersimport generator.swig.checkout_swig_headerimport generator.swig.external_runtimeimport generator.util.executable_exec = generator.util.executablefrom gen_base import build_path_join, build_path_strip, build_path_splitfile, \ build_path_basename, build_path_dirname, build_path_retreat, uniquetry: Trueexcept NameError: True = 1 False = 0class Generator(gen_base.GeneratorBase): _extension_map = { ('exe', 'target'): '$(EXEEXT)', ('exe', 'object'): '.o', ('lib', 'target'): '.la', ('lib', 'object'): '.lo', } def __init__(self, fname, verfname, options=None): gen_base.GeneratorBase.__init__(self, fname, verfname, options) self.section_counter = 0 self.assume_shared_libs = False if ('--assume-shared-libs', '') in options: self.assume_shared_libs = True def begin_section(self, description): self.section_counter = self.section_counter + 1 count = self.section_counter self.ofile.write('\n########################################\n') self.ofile.write('# Section %d: %s\n' % (count, description)) self.ofile.write('########################################\n\n') def write(self): self.ofile = open('build-outputs.mk', 'w') self.ofile.write('# DO NOT EDIT -- AUTOMATICALLY GENERATED\n') install_deps = self.graph.get_deps(gen_base.DT_INSTALL) install_sources = self.graph.get_all_sources(gen_base.DT_INSTALL) # ensure consistency between runs install_deps.sort() install_sources.sort(lambda s1, s2: cmp(s1.name, s2.name)) ######################################## self.begin_section('Global make variables') for target in install_sources: if isinstance(target, gen_base.TargetRaModule) or \ isinstance(target, gen_base.TargetFsModule): # name of the module: strip 'libsvn_' and upper-case it name = string.upper(target.name[7:]) # construct a list of the other .la libs to link against retreat = build_path_retreat(target.path) deps = [ target.filename ] link = [ build_path_join(retreat, target.filename) ] for source in self.graph.get_sources(gen_base.DT_LINK, target.name): if not isinstance(source, gen_base.TargetLib) or source.external_lib: continue deps.append(source.filename) link.append(build_path_join(retreat, source.filename)) self.ofile.write('%s_DEPS = %s\n' '%s_LINK = %s\n\n' % (name, string.join(deps, ' '), name, string.join(link, ' '))) # write a list of directories in which things are built # get all the test scripts' directories script_dirs = map(build_path_dirname, self.scripts + self.bdb_scripts) # remove duplicate directories between targets and tests build_dirs = unique(self.target_dirs + script_dirs + self.swig_dirs) self.ofile.write('BUILD_DIRS = %s\n\n' % string.join(build_dirs)) # write lists of test files # deps = all, progs = not including those marked "testing = skip" self.ofile.write('BDB_TEST_DEPS = %s\n\n' % string.join(self.bdb_test_deps + self.bdb_scripts)) self.ofile.write('BDB_TEST_PROGRAMS = %s\n\n' % string.join(self.bdb_test_progs + self.bdb_scripts)) self.ofile.write('TEST_DEPS = %s\n\n' % string.join(self.test_deps + self.scripts)) self.ofile.write('TEST_PROGRAMS = %s\n\n' % string.join(self.test_progs + self.scripts)) # write list of all manpages self.ofile.write('MANPAGES = %s\n\n' % string.join(self.manpages)) # write a list of files to remove during "make clean" cfiles = [ ] for target in install_sources: # .la files are handled by the standard 'clean' rule; clean all the # other targets if not isinstance(target, gen_base.TargetScript) \ and not isinstance(target, gen_base.TargetProject) \ and not isinstance(target, gen_base.TargetI18N) \ and not isinstance(target, gen_base.TargetJava) \ and not target.external_lib \ and target.filename[-3:] != '.la': cfiles.append(target.filename) cfiles.sort() self.ofile.write('CLEAN_FILES = %s\n\n' % string.join(cfiles)) # this is here because autogen-standalone needs it too self.ofile.write('SWIG_INCLUDES = -I$(abs_srcdir)/subversion/include \\\n' ' -I$(abs_srcdir)/subversion/bindings/swig \\\n' ' -I$(abs_srcdir)/subversion/bindings/swig/include \\\n' ' -I$(abs_srcdir)/subversion/bindings/swig/proxy \\\n' ' -I$(abs_builddir)/subversion/bindings/swig/proxy \\\n' ' $(SVN_APR_INCLUDES) $(SVN_APRUTIL_INCLUDES)\n\n') if self.release_mode: self.ofile.write('RELEASE_MODE = 1\n\n') ######################################## self.begin_section('SWIG headers (wrappers and external runtimes)') if not self.release_mode: for swig in (generator.swig.header_wrappers, generator.swig.checkout_swig_header, generator.swig.external_runtime): gen = swig.Generator(self.conf, "swig") gen.write_makefile_rules(self.ofile) ######################################## self.begin_section('SWIG autogen rules') # write dependencies and build rules for generated .c files swig_c_deps = self.graph.get_deps(gen_base.DT_SWIG_C) swig_c_deps.sort(lambda (t1, s1), (t2, s2): cmp(t1.filename, t2.filename)) swig_lang_deps = {} for lang in self.swig.langs: swig_lang_deps[lang] = [] short = self.swig.short for objname, sources in swig_c_deps: lang = objname.lang swig_lang_deps[lang].append(str(objname)) for lang in self.swig.langs: lang_deps = string.join(swig_lang_deps[lang]) self.ofile.write( 'autogen-swig-%s: %s\n' % (short[lang], lang_deps) + 'autogen-swig: autogen-swig-%s\n' % short[lang] + '\n') self.ofile.write('\n') ######################################## self.begin_section('Rules to build SWIG .c files from .i files') for objname, sources in swig_c_deps: deps = string.join(map(str, sources)) source = str(sources[0]) source_dir = build_path_dirname(source) opts = self.swig.opts[objname.lang] if not self.release_mode: self.ofile.write('%s: %s\n' % (objname, deps) + '\t$(SWIG) $(SWIG_INCLUDES) %s ' % opts + '-o $@ $(top_srcdir)/%s\n' % source ) self.ofile.write('\n') ######################################## self.begin_section('Individual target build rules') for target_ob in install_sources: if isinstance(target_ob, gen_base.TargetScript): # there is nothing to build continue target = target_ob.name if isinstance(target_ob, gen_base.TargetJava): path = target_ob.output_dir else: path = target_ob.path retreat = build_path_retreat(path) # get the source items (.o and .la) for the link unit objects = [ ] object_srcs = [ ] headers = [ ] header_classes = [ ] header_class_filenames = [ ] deps = [ ] libs = [ ] for link_dep in self.graph.get_sources(gen_base.DT_LINK, target_ob.name): if isinstance(link_dep, gen_base.TargetJava): deps.append(link_dep.name) elif isinstance(link_dep, gen_base.TargetLinked): if link_dep.external_lib: libs.append(link_dep.external_lib) elif link_dep.external_project: # FIXME: This is a temporary workaround to fix build breakage # expeditiously. It is of questionable validity for a build # node to have external_project but not have external_lib. pass else: # append the output of the target to our stated dependencies if not self.assume_shared_libs: deps.append(link_dep.filename) # link against the library libs.append(build_path_join(retreat, link_dep.filename)) elif isinstance(link_dep, gen_base.ObjectFile): # link in the object file objects.append(link_dep.filename) for dep in self.graph.get_sources(gen_base.DT_OBJECT, link_dep, gen_base.SourceFile): object_srcs.append( build_path_join('$(abs_srcdir)', dep.filename)) elif isinstance(link_dep, gen_base.HeaderFile): # link in the header file # N.B. that filename_win contains the '_'-escaped class name headers.append(link_dep.filename_win) header_classes.append(link_dep.classname) for dep in self.graph.get_sources(gen_base.DT_OBJECT, link_dep, gen_base.ObjectFile): header_class_filenames.append(dep.filename) else: ### we don't know what this is, so we don't know what to do with it raise UnknownDependency for nonlib in self.graph.get_sources(gen_base.DT_NONLIB, target_ob.name): if isinstance(nonlib, gen_base.TargetLinked): if not nonlib.external_lib: deps.append(nonlib.filename) targ_varname = string.replace(target, '-', '_') objnames = string.join(build_path_strip(path, objects)) # Output value of path variable self.ofile.write('%s_PATH = %s\n' % (targ_varname, path)) # Add additional install dependencies if necessary if target_ob.add_install_deps: self.ofile.write('install-%s: %s\n' % (target_ob.install, target_ob.add_install_deps))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -