pep8 checker, mostly pedantic style changes but also found an error in mesh_utils...
[blender.git] / build_files / cmake / cmake_qtcreator_project.py
index 5bd1f11477075b2ca673cdd85d084f028df51bfd..601cf865ab44ba1ea4fd87dd6ec980fbb8e32abd 100644 (file)
 """
 Example Win32 usage:
  c:\Python32\python.exe c:\blender_dev\blender\build_files\cmake\cmake_qtcreator_project.py c:\blender_dev\cmake_build
+
 example linux usage
  python .~/blenderSVN/blender/build_files/cmake/cmake_qtcreator_project.py ~/blenderSVN/cmake
 """
 
+import sys
 import os
 from os.path import join, dirname, normpath, abspath, splitext, relpath, exists
 
@@ -40,6 +41,20 @@ base = abspath(base)
 
 SIMPLE_PROJECTFILE = False
 
+# get cmake path
+CMAKE_DIR = sys.argv[-1]
+
+if not os.path.exists(os.path.join(CMAKE_DIR, "CMakeCache.txt")):
+    CMAKE_DIR = os.getcwd()
+if not os.path.exists(os.path.join(CMAKE_DIR, "CMakeCache.txt")):
+    print("CMakeCache.txt not found in %r or %r\n    Pass CMake build dir as an argument, or run from that dir, aborting" % (CMAKE_DIR, os.getcwd()))
+    sys.exit(1)
+
+
+# could be either.
+# PROJECT_DIR = base
+PROJECT_DIR = CMAKE_DIR
+
 
 def source_list(path, filename_check=None):
     for dirpath, dirnames, filenames in os.walk(path):
@@ -69,10 +84,12 @@ def is_py(filename):
     ext = splitext(filename)[1]
     return (ext == ".py")
 
+
 def is_glsl(filename):
     ext = splitext(filename)[1]
     return (ext == ".glsl")
-    
+
+
 def is_c(filename):
     ext = splitext(filename)[1]
     return (ext in (".c", ".cpp", ".cxx", ".m", ".mm", ".rc"))
@@ -96,33 +113,23 @@ def cmake_advanced_info():
     """ Extracr includes and defines from cmake.
     """
 
-    def create_eclipse_project(cmake_dir):
-        import sys
+    def create_eclipse_project(CMAKE_DIR):
         if sys.platform == "win32":
-            cmd = 'cmake %r -G"Eclipse CDT4 - MinGW Makefiles"' % cmake_dir
+            cmd = 'cmake %r -G"Eclipse CDT4 - MinGW Makefiles"' % CMAKE_DIR
         else:
-            cmd = 'cmake %r -G"Eclipse CDT4 - Unix Makefiles"' % cmake_dir
+            cmd = 'cmake %r -G"Eclipse CDT4 - Unix Makefiles"' % CMAKE_DIR
 
         os.system(cmd)
 
     includes = []
     defines = []
 
-    import os
-    import sys
-
-    cmake_dir = sys.argv[-1]
 
-    if not os.path.exists(os.path.join(cmake_dir, "CMakeCache.txt")):
-        cmake_dir = os.getcwd()
-    if not os.path.exists(os.path.join(cmake_dir, "CMakeCache.txt")):
-        print("CMakeCache.txt not found in %r or %r\n    Pass CMake build dir as an argument, or run from that dir, aborting" % (cmake_dir, os.getcwd()))
-        sys.exit(1)
 
-    create_eclipse_project(cmake_dir)
+    create_eclipse_project(CMAKE_DIR)
 
     from xml.dom.minidom import parse
-    tree = parse(os.path.join(cmake_dir, ".cproject"))
+    tree = parse(os.path.join(CMAKE_DIR, ".cproject"))
     '''
     f = open(".cproject_pretty", 'w')
     f.write(tree.toprettyxml(indent="    ", newl=""))
@@ -165,26 +172,61 @@ def cmake_advanced_info():
 
     return includes, defines
 
+
+def cmake_cache_var(var):
+    cache_file = open(os.path.join(CMAKE_DIR, "CMakeCache.txt"))
+    lines = [l_strip for l in cache_file for l_strip in (l.strip(),) if l_strip if not l_strip.startswith("//") if not l_strip.startswith("#")]
+    cache_file.close()
+
+    for l in lines:
+        if l.split(":")[0] == var:
+            return l.split("=", 1)[-1]
+    return None
+
+
+def cmake_compiler_defines():
+    compiler = cmake_cache_var("CMAKE_C_COMPILER")  # could do CXX too
+
+    if compiler is None:
+        print("Couldn't find the compiler, os defines will be omitted...")
+        return
+
+    import tempfile
+    temp_c = tempfile.mkstemp(suffix=".c")[1]
+    temp_def = tempfile.mkstemp(suffix=".def")[1]
+
+    os.system("%s -dM -E %s > %s" % (compiler, temp_c, temp_def))
+
+    temp_def_file = open(temp_def)
+    lines = [l.strip() for l in temp_def_file if l.strip()]
+    temp_def_file.close()
+
+    os.remove(temp_c)
+    os.remove(temp_def)
+
+    return lines
+
+
 def create_qtc_project_main():
     files = list(source_list(base, filename_check=is_project_file))
-    files_rel = [relpath(f, start=base) for f in files]
+    files_rel = [relpath(f, start=PROJECT_DIR) for f in files]
     files_rel.sort()
 
     # --- qtcreator specific, simple format
     if SIMPLE_PROJECTFILE:
         # --- qtcreator specific, simple format
         PROJECT_NAME = "Blender"
-        f = open(join(base, "%s.files" % PROJECT_NAME), 'w')
+        f = open(join(PROJECT_DIR, "%s.files" % PROJECT_NAME), 'w')
         f.write("\n".join(files_rel))
 
-        f = open(join(base, "%s.includes" % PROJECT_NAME), 'w')
+        f = open(join(PROJECT_DIR, "%s.includes" % PROJECT_NAME), 'w')
         f.write("\n".join(sorted(list(set(dirname(f) for f in files_rel if is_c_header(f))))))
 
-        qtc_prj = join(base, "%s.creator" % PROJECT_NAME)
+        qtc_prj = join(PROJECT_DIR, "%s.creator" % PROJECT_NAME)
         f = open(qtc_prj, 'w')
         f.write("[General]\n")
 
-        qtc_cfg = join(base, "%s.config" % PROJECT_NAME)
+        qtc_cfg = join(PROJECT_DIR, "%s.config" % PROJECT_NAME)
         if not exists(qtc_cfg):
             f = open(qtc_cfg, 'w')
             f.write("// ADD PREDEFINED MACROS HERE!\n")
@@ -196,44 +238,49 @@ def create_qtc_project_main():
         includes.sort()
 
         PROJECT_NAME = "Blender"
-        f = open(join(base, "%s.files" % PROJECT_NAME), 'w')
+        FILE_NAME = PROJECT_NAME.lower()
+        f = open(join(PROJECT_DIR, "%s.files" % FILE_NAME), 'w')
         f.write("\n".join(files_rel))
 
-        f = open(join(base, "%s.includes" % PROJECT_NAME), 'w')
+        f = open(join(PROJECT_DIR, "%s.includes" % FILE_NAME), 'w')
         f.write("\n".join(sorted(includes)))
 
-        qtc_prj = join(base, "%s.creator" % PROJECT_NAME)
+        qtc_prj = join(PROJECT_DIR, "%s.creator" % FILE_NAME)
         f = open(qtc_prj, 'w')
         f.write("[General]\n")
 
-        qtc_cfg = join(base, "%s.config" % PROJECT_NAME)
+        qtc_cfg = join(PROJECT_DIR, "%s.config" % FILE_NAME)
         f = open(qtc_cfg, 'w')
         f.write("// ADD PREDEFINED MACROS HERE!\n")
-        f.write("\n".join([("#define %s %s" % item) for item in defines]))
+        defines_final = [("#define %s %s" % item) for item in defines]
+        defines_final += cmake_compiler_defines()  # defines from the compiler
+        f.write("\n".join(defines_final))
 
-    print("Main Blender project file written to: %s" % qtc_prj)
+    print("Blender project file written to: %s" % qtc_prj)
     # --- end
 
+
 def create_qtc_project_python():
     files = list(source_list(base, filename_check=is_py))
-    files_rel = [relpath(f, start=base) for f in files]
+    files_rel = [relpath(f, start=PROJECT_DIR) for f in files]
     files_rel.sort()
 
     # --- qtcreator specific, simple format
     PROJECT_NAME = "Blender_Python"
-    f = open(join(base, "%s.files" % PROJECT_NAME), 'w')
+    FILE_NAME = PROJECT_NAME.lower()
+    f = open(join(PROJECT_DIR, "%s.files" % FILE_NAME), 'w')
     f.write("\n".join(files_rel))
-    
-    qtc_prj = join(base, "%s.creator" % PROJECT_NAME)
+
+    qtc_prj = join(PROJECT_DIR, "%s.creator" % FILE_NAME)
     f = open(qtc_prj, 'w')
     f.write("[General]\n")
-    
-    qtc_cfg = join(base, "%s.config" % PROJECT_NAME)
+
+    qtc_cfg = join(PROJECT_DIR, "%s.config" % FILE_NAME)
     if not exists(qtc_cfg):
         f = open(qtc_cfg, 'w')
         f.write("// ADD PREDEFINED MACROS HERE!\n")
-    
-    print("Blender python project file written to: %s" % qtc_prj)
+
+    print("Python project file written to:  %s" % qtc_prj)
 
 
 def main():