diff options
Diffstat (limited to 'tools/defcheck.py')
-rwxr-xr-x | tools/defcheck.py | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/tools/defcheck.py b/tools/defcheck.py new file mode 100755 index 0000000..36a0179 --- /dev/null +++ b/tools/defcheck.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python2 + +""" +defcheck.py -- Consistency check for the .def files. +Copyright (C) 2006 Simon Budig <simon@gimp.org> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <https://www.gnu.org/licenses/>. + + +This is a hack to check the consistency of the .def files compared to +the respective libraries. + +Invoke in the top level of the gimp source tree after compiling GIMP. +If srcdir != builddir, run it in the build directory and pass the name +of the source directory on the command-line. + +Needs the tool "nm" to work + +""" + +import sys, commands + +from os import path + +def_files = ( + "libgimpbase/gimpbase.def", + "libgimpcolor/gimpcolor.def", + "libgimpconfig/gimpconfig.def", + "libgimp/gimp.def", + "libgimp/gimpui.def", + "libgimpmath/gimpmath.def", + "libgimpmodule/gimpmodule.def", + "libgimpthumb/gimpthumb.def", + "libgimpwidgets/gimpwidgets.def" +) + +have_errors = 0 + +srcdir = None +if len(sys.argv) > 1: + srcdir = sys.argv[1] + if not path.exists(srcdir): + print "Directory '%s' does not exist" % srcdir + sys.exit (-1) + +for df in def_files: + directory, name = path.split (df) + basename, extension = name.split (".") + libname = path.join(directory, ".libs", "lib" + basename + "-*.so") + + filename = df + if srcdir: + filename = path.join(srcdir, df) + try: + defsymbols = file (filename).read ().split ()[1:] + except IOError, message: + print message + if not srcdir: + print "You should run this script from the toplevel source directory." + sys.exit (-1) + + doublesymbols = [] + for i in range (len (defsymbols)-1, 0, -1): + if defsymbols[i] in defsymbols[:i]: + doublesymbols.append ((defsymbols[i], i+2)) + + unsortindex = -1 + for i in range (len (defsymbols)-1): + if defsymbols[i] > defsymbols[i+1]: + unsortindex = i+1 + break; + + status, nm = commands.getstatusoutput ("nm --defined-only --extern-only " + + libname) + if status != 0: + print "trouble reading %s - has it been compiled?" % libname + continue + + nmsymbols = nm.split()[2::3] + nmsymbols = [s for s in nmsymbols if s[0] != '_'] + + missing_defs = [s for s in nmsymbols if s not in defsymbols] + missing_nms = [s for s in defsymbols if s not in nmsymbols] + + if unsortindex >= 0 or missing_defs or missing_nms or doublesymbols: + print + print "Problem found in", filename + + if missing_defs: + print " the following symbols are in the library," + print " but are not listed in the .def-file:" + for s in missing_defs: + print " +", s + print + + if missing_nms: + print " the following symbols are listed in the .def-file," + print " but are not exported by the library." + for s in missing_nms: + print " -", s + print + + if doublesymbols: + print " the following symbols are listed multiple times in the .def-file," + for s in doublesymbols: + print " : %s (line %d)" % s + print + + if unsortindex >= 0: + print " the .def-file is not properly sorted (line %d)" % (unsortindex + 2) + print + + have_errors = -1 + +sys.exit (have_errors) |