Added shared library versioning.

pull/15/head
Jussi Pakkanen 12 years ago
parent cd9475bfe5
commit 2ae2a896c1
  1. 43
      interpreter.py
  2. 10
      shellgenerator.py
  3. 7
      test cases/27 library versions/builder.txt
  4. 3
      test cases/27 library versions/lib.c

@ -238,6 +238,9 @@ class BuildTarget(InterpreterObject):
else:
self.extra_args[language] = flags
def get_aliaslist(self):
return []
class Executable(BuildTarget):
def __init__(self, name, subdir, sources, environment):
BuildTarget.__init__(self, name, subdir, sources)
@ -258,10 +261,42 @@ class StaticLibrary(BuildTarget):
class SharedLibrary(BuildTarget):
def __init__(self, name, subdir, sources, environment):
BuildTarget.__init__(self, name, subdir, sources)
prefix = environment.get_shared_lib_prefix()
suffix = environment.get_shared_lib_suffix()
self.filename = prefix + self.name + '.' + suffix
self.version = None
self.soversion = None
self.prefix = environment.get_shared_lib_prefix()
self.suffix = environment.get_shared_lib_suffix()
self.methods.update({'set_version' : self.set_version_method,
'set_soversion' : self.set_soversion_method,
})
def get_shbase(self):
return self.prefix + self.name + '.' + self.suffix
def get_filename(self):
fname = self.get_shbase()
if self.version is None:
return fname
else:
return fname + '.' + self.version
def set_version_method(self, args):
v = args[0]
if not isinstance(v, str):
raise InvalidArguments('Shared library version is not a string.')
self.version = v
def set_soversion_method(self, args):
v = args[0]
if not isinstance(v, str):
raise InvalidArguments('Shared library soversion is not a string.')
self.soversion = v
def get_aliaslist(self):
aliases = []
if self.soversion is not None:
aliases.append(self.get_shbase() + '.' + self.soversion)
if self.version is not None:
aliases.append(self.get_shbase())
return aliases
class Test(InterpreterObject):
def __init__(self, name, exe):

@ -192,6 +192,7 @@ echo Run compile.sh before this or bad things will happen.
outdir = libdir
outfile.write('echo Installing "%s".\n' % name)
self.copy_file(outfile, self.get_target_filename(t), outdir)
self.generate_shlib_aliases(t, outdir, outfile)
def generate_tests(self, outfile):
for t in self.build.get_tests():
@ -326,6 +327,14 @@ echo Run compile.sh before this or bad things will happen.
quoted = shell_quote(commands)
outfile.write('\necho Generating pch \\"%s\\".\n' % pch)
outfile.write(' '.join(quoted) + ' || exit\n')
def generate_shlib_aliases(self, target, outdir, outfile):
basename = target.get_filename()
aliases = target.get_aliaslist()
for alias in aliases:
aliasfile = os.path.join(outdir, alias)
cmd = ['ln', '-s', '-f', basename, aliasfile]
outfile.write(' '.join(shell_quote(cmd)) + '|| exit\n')
def generate_target(self, target, outfile):
name = target.get_basename()
@ -340,6 +349,7 @@ echo Run compile.sh before this or bad things will happen.
for src in target.get_sources():
obj_list.append(self.generate_single_compile(target, outfile, src))
self.generate_link(target, outfile, outname, obj_list)
self.generate_shlib_aliases(target, self.get_target_dir(target), outfile)
self.processed_targets[name] = True
if __name__ == '__main__':

@ -0,0 +1,7 @@
project('library versions', 'c')
lib = shared_library('somelib', 'lib.c')
lib.set_version('1.2.3')
lib.set_soversion('0')
lib.install()

@ -0,0 +1,3 @@
int myFunc() {
return 55;
}
Loading…
Cancel
Save