#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0-or-later """ Example linux usage python3 ~/blender-git/blender/build_files/cmake/cmake_netbeans_project.py ~/blender-git/cmake Windows not supported so far """ import sys # until we have arg parsing import project_info if not project_info.init(sys.argv[-1]): sys.exit(1) from project_info import ( SIMPLE_PROJECTFILE, SOURCE_DIR, CMAKE_DIR, PROJECT_DIR, source_list, is_project_file, is_c_header, # is_py, cmake_advanced_info, cmake_compiler_defines, cmake_cache_var, project_name_get, ) import os from os.path import join, dirname, normpath, relpath, exists def create_nb_project_main(): from xml.sax.saxutils import escape files = list(source_list(SOURCE_DIR, filename_check=is_project_file)) files_rel = [relpath(f, start=PROJECT_DIR) for f in files] files_rel.sort() if SIMPLE_PROJECTFILE: pass else: includes, defines = cmake_advanced_info() if (includes, defines) == (None, None): return # for some reason it doesn't give all internal includes includes = list(set(includes) | set(dirname(f) for f in files if is_c_header(f))) includes.sort() if 0: PROJECT_NAME = "Blender" else: # be tricky, get the project name from git if we can! PROJECT_NAME = project_name_get() make_exe = cmake_cache_var("CMAKE_MAKE_PROGRAM") make_exe_basename = os.path.basename(make_exe) # --------------- NetBeans specific. defines = [("%s=%s" % cdef) if cdef[1] else cdef[0] for cdef in defines] defines += [cdef.replace("#define", "").strip() for cdef in cmake_compiler_defines()] def file_list_to_nested(files): # convert paths to hierarchy paths_nested = {} def ensure_path(filepath): filepath_split = filepath.split(os.sep) pn = paths_nested for subdir in filepath_split[:-1]: pn = pn.setdefault(subdir, {}) pn[filepath_split[-1]] = None for path in files: ensure_path(path) return paths_nested PROJECT_DIR_NB = join(PROJECT_DIR, "nbproject") if not exists(PROJECT_DIR_NB): os.mkdir(PROJECT_DIR_NB) # SOURCE_DIR_REL = relpath(SOURCE_DIR, PROJECT_DIR) f = open(join(PROJECT_DIR_NB, "project.xml"), 'w') f.write('\n') f.write('\n') f.write(' org.netbeans.modules.cnd.makeproject\n') f.write(' \n') f.write(' \n') f.write(' %s\n' % PROJECT_NAME) f.write(' c,m\n') f.write(' cpp,cxx,cc,mm\n') f.write(' h,hxx,hh,hpp,inl\n') f.write(' UTF-8\n') f.write(' \n') f.write(' \n') f.write(' %s\n' % SOURCE_DIR) # base_root_rel f.write(' \n') f.write(' \n') f.write(' \n') f.write(' Default\n') f.write(' 0\n') f.write(' \n') f.write(' \n') f.write(' \n') f.write(' false\n') f.write(' \n') f.write(' \n') f.write(' \n') f.write('\n') f.close() f = open(join(PROJECT_DIR_NB, "configurations.xml"), 'w') f.write('\n') f.write('\n') f.write(' \n') f.write(' \n' % SOURCE_DIR) # base_root_rel # write files! files_rel_local = [normpath(relpath(join(CMAKE_DIR, path), SOURCE_DIR)) for path in files_rel] files_rel_hierarchy = file_list_to_nested(files_rel_local) # print(files_rel_hierarchy) def write_df(hdir, ident): dirs = [] files = [] for key, item in sorted(hdir.items()): if item is None: files.append(key) else: dirs.append((key, item)) for key, item in dirs: f.write('%s \n' % (ident, key)) write_df(item, ident + " ") f.write('%s \n' % ident) for key in files: f.write('%s%s\n' % (ident, key)) write_df(files_rel_hierarchy, ident=" ") f.write(' \n') f.write(' \n') # f.write(' ../GNUmakefile\n') f.write(' \n') f.write(' \n') # default, but this dir is in fact not in blender dir so we can ignore it # f.write(' ^(nbproject)$\n') f.write(r' ^(nbproject|__pycache__|.*\.py|.*\.html|.*\.blend)$\n') f.write(' \n') f.write(' %s\n' % SOURCE_DIR) # base_root_rel f.write(' \n') f.write(' Makefile\n') # paths again f.write(' \n') f.write(' \n') f.write(' \n') f.write(' default\n') f.write(' false\n') f.write(' false\n') f.write(' \n') f.write(' \n') f.write(' \n') f.write(' \n') f.write(' \n') f.write(' .\n') if make_exe_basename == "ninja": build_cmd = "ninja" clean_cmd = "ninja -t clean" else: build_cmd = "${MAKE} -f Makefile" clean_cmd = "${MAKE} -f Makefile clean" f.write(' %s\n' % escape(build_cmd)) f.write(' %s\n' % escape(clean_cmd)) f.write(' ./bin/blender\n') del build_cmd, clean_cmd def write_toolinfo(): f.write(' \n') for inc in includes: f.write(' %s\n' % inc) f.write(' \n') f.write(' \n') for cdef in defines: f.write(' %s\n' % escape(cdef)) f.write(' \n') f.write(' \n') write_toolinfo() f.write(' \n') f.write(' \n') write_toolinfo() f.write(' \n') f.write(' \n') f.write(' \n') # finished makefile info f.write(' \n') for path in files_rel_local: is_c = path.endswith(".c") f.write(' \n' % (3 if is_c else 0)) f.write(' \n') f.write(' \n') f.write(' \n') f.write(' \n') f.write(' %s\n' % os.path.join(CMAKE_DIR, "bin/blender")) f.write(' %s\n' % SOURCE_DIR) f.write(' false\n') f.write(' 0\n') f.write(' 0\n') f.write(' \n') f.write(' \n') f.write(' \n') f.write(' \n') f.write(' \n') # todo f.write('\n') f.close() def main(): create_nb_project_main() if __name__ == "__main__": main()