]> git.lyx.org Git - lyx.git/blobdiff - development/scons/scons_utils.py
declarate zh.po to SCons
[lyx.git] / development / scons / scons_utils.py
index 4af09f7c19422ece33b438f743b414c7e148addc..2baa5eef40d778a40a2b6f343b56a9d607e33316 100644 (file)
@@ -40,12 +40,21 @@ def relativePath(path, base):
     path2 = os.path.normpath(os.path.realpath(base)).split(os.sep)
     if path1[:len(path2)] != path2:
         print "Path %s is not under top source directory" % path
+    if len(path2) == len(path1):
+        return ''
     path3 = os.path.join(*path1[len(path2):]);
     # replace all \ by / such that we get the same comments on Windows and *nix
     path3 = path3.replace('\\', '/')
     return path3
 
 
+def isSubDir(path, base):
+    '''Whether or not path is a subdirectory of base'''
+    path1 = os.path.normpath(os.path.realpath(path)).split(os.sep)
+    path2 = os.path.normpath(os.path.realpath(base)).split(os.sep)
+    return len(path2) <= len(path1) and path1[:len(path2)] == path2
+
+
 def writeToFile(filename, lines, append = False):
     " utility function: write or append lines to filename "
     # create directory if needed
@@ -144,8 +153,9 @@ def env_potfiles(target, source, env):
     potfiles = []
     trans = re.compile('_\(".*"\)', re.M)
     for file in source:
-        if str(file) not in potfiles and trans.search(open(str(file)).read()):
-            potfiles.append(relativePath(str(file), env.subst('$TOP_SRCDIR')))
+        rel_file = relativePath(str(file), env.subst('$TOP_SRCDIR'))
+        if rel_file not in potfiles and trans.search(open(str(file)).read()):
+            potfiles.append(rel_file)
     potfiles.sort()
     print >> target_file, '\n'.join(potfiles)
     target_file.close()
@@ -422,9 +432,26 @@ int main()
     return ret
 
 
+def checkDeclaration(conf, func, headers):
+    ''' check if a function is declared in given headers '''
+    check_decl = '''
+#include <%%s>
+int main()
+{
+#ifndef %s
+    char *p = (char *) %s;
+#endif
+}
+''' % (func, func)
+    conf.Message('Checking for the declaration of function %s... ' % func)
+    ret = True in [conf.TryLink(check_decl % header, '.c') for header in headers]
+    conf.Result(ret)
+    return ret
+
+    
 def createConfigFile(conf, config_file,
     config_pre = '', config_post = '',
-    headers = [], functions = [], types = [], libs = [],
+    headers = [], functions = [], declarations = [], types = [], libs = [],
     custom_tests = [], extra_items = []):
     ''' create a configuration file, with options
         config_file: which file to create
@@ -434,6 +461,8 @@ def createConfigFile(conf, config_file,
             ('file', 'HAVE_FILE', 'c'/'c++')
         functions: functions to check, in the form of a list of
             ('func', 'HAVE_func', 'include lines'/None)
+        declarations: function declarations to check, in the form of a list of
+            ('func', 'HAVE_DECL_func', header_files)
         types: types to check, in the form of a list of
             ('type', 'HAVE_TYPE', 'includelines'/None)
         libs: libraries to check, in the form of a list of
@@ -482,6 +511,14 @@ def createConfigFile(conf, config_file,
         else:
             result[func[1]] = 0
             cont += configString('/* #undef %s */' % func[1], desc = description)
+    for decl in declarations:
+        description = "Define to 1 if you have the declaration of `%s', and to 0 if you don't." % decl[0]
+        if conf.CheckDeclaration(decl[0], decl[2]):
+            result[decl[1]] = 1
+            cont += configString('#define %s 1' % decl[1], desc = description)
+        else:
+            result[decl[1]] = 0
+            cont += configString('/* #undef %s */' % decl[1], desc = description)
     # types
     for t in types:
         description = "Define to 1 if you have the `%s' type." % t[0]