📄 gen_make.py
字号:
#
# gen_make.py -- generate makefiles and dependencies
#
import os
import sys
import string
import gen_base
from gen_base import build_path_join, build_path_strip, build_path_splitfile, \
build_path_basename, build_path_dirname, build_path_retreat
class Generator(gen_base.GeneratorBase):
_extension_map = {
('exe', 'target'): '$(EXEEXT)',
('exe', 'object'): '.o',
('lib', 'target'): '.la',
('lib', 'object'): '.lo',
}
def default_output(self, conf_path):
return os.path.splitext(os.path.basename(conf_path))[0] + '-outputs.mk'
def write(self, oname):
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.ofile = open(oname, 'w')
self.ofile.write('# DO NOT EDIT -- AUTOMATICALLY GENERATED\n\n')
# write various symbols at the top of the file so they will be
# defined before their use in dependency lines.
self.write_symbols(install_sources)
for target_ob in install_sources:
if isinstance(target_ob, gen_base.TargetScript):
# there is nothing to build
continue
sources = self.graph.get_sources(gen_base.DT_LINK, target_ob.name)
if isinstance(target_ob, gen_base.TargetI18N):
sources = sources + self.graph.get_sources(gen_base.DT_NONLIB, target_ob.name)
target = target_ob.name
if isinstance(target_ob, gen_base.TargetJava):
path = target_ob.classes
else:
path = target_ob.path
retreat = build_path_retreat(path)
# get the source items (.o and .la) for the link unit
objects = [ ]
deps = [ ]
libs = [ ]
for source in sources:
if isinstance(source, gen_base.TargetJava):
deps.append(source.name)
elif isinstance(source, gen_base.TargetLinked):
if source.external_lib:
libs.append(source.external_lib)
else:
# append the output of the target to our stated dependencies
deps.append(source.filename)
# link against the library
libs.append(build_path_join(retreat, source.filename))
elif isinstance(source, gen_base.ObjectFile):
# link in the object file
objects.append(source.filename)
elif isinstance(source, gen_base.HeaderFile):
# skip the header files.
pass
else:
### we don't know what this is, so we don't know what to do with it
raise UnknownDependency
targ_varname = string.replace(target, '-', '_')
objnames = string.join(build_path_strip(path, objects))
# 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))
if isinstance(target_ob, gen_base.TargetJava):
self.ofile.write(
'%s_DEPS = %s %s\n'
'%s: $(%s_DEPS)\n'
'\t%s -d %s -classpath %s:$(%s_CLASSPATH) '
% (targ_varname, target_ob.add_deps, string.join(objects + deps),
target_ob.name, targ_varname,
target_ob.link_cmd, target_ob.output_dir, target_ob.classes,
targ_varname))
for dep in target_ob.deps:
if isinstance(dep, gen_base.SourceFile):
self.ofile.write('%s ' % build_path_join('$(abs_srcdir)',
dep.filename))
elif isinstance(dep, gen_base.HeaderFile):
self.ofile.write('%s ' % dep.classname)
else:
print type(dep)
raise UnknownDependency
# Once the bytecodes have been compiled up, we produce the
# JAR.
if target_ob.jar:
self.ofile.write('\n\t$(JAR) cf %s -C %s %s' %
(build_path_join(target_ob.classes, target_ob.jar),
target_ob.classes,
string.join(target_ob.packages, ' ')))
self.ofile.write('\n\n')
elif isinstance(target_ob, gen_base.TargetI18N):
self.ofile.write(
'%s_DEPS = %s %s\n'
'%s: $(%s_DEPS)\n'
% (targ_varname, target_ob.add_deps, string.join(objects + deps),
target_ob.name, targ_varname))
else:
self.ofile.write(
'%s_DEPS = %s %s\n'
'%s_OBJECTS = %s\n'
'%s: $(%s_DEPS)\n'
'\tcd %s && %s -o %s %s $(%s_OBJECTS) %s $(LIBS)\n\n'
% (targ_varname, target_ob.add_deps, string.join(objects + deps),
targ_varname, objnames,
target_ob.filename, targ_varname,
path, target_ob.link_cmd,
build_path_basename(target_ob.filename),
(isinstance(target_ob, gen_base.TargetLib) and not
target_ob.undefined_lib_symbols) and '$(LT_NO_UNDEFINED)' or "",
targ_varname, string.join(gen_base.unique(libs)))
)
# for each install group, write a rule to install its outputs
for itype, i_targets in install_deps:
# perl bindings do their own thing, "swig-pl" target is
# already specified in Makefile.in
if itype == "swig-pl":
continue
outputs = [ ]
for t in i_targets:
if not isinstance(t, gen_base.TargetI18N) \
and not isinstance(t, gen_base.TargetJava):
outputs.append(t.filename)
self.ofile.write('%s: %s\n\n' % (itype, string.join(outputs)))
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))
for area, inst_targets in install_deps:
# perl bindings do their own thing, "install-swig-pl" target is
# already specified in Makefile.in
if area == "swig-pl":
continue
# get the output files for these targets, sorted in dependency order
files = gen_base._sorted_files(self.graph, area)
install_deps = {}
for target in inst_targets:
for target_dep in self.graph.get_sources(gen_base.DT_LINK, target.name,
gen_base.TargetLib):
if target_dep.install and target_dep.install != area:
install_deps['install-%s' % target_dep.install] = None
install_deps = install_deps.keys()
if area == 'apache-mod':
self.ofile.write('install-mods-shared: %s\n' % (string.join(files),))
la_tweaked = { }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -