diff --git a/.project b/.project new file mode 100644 index 0000000..45196c0 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + lutin + + + + + + org.python.pydev.PyDevBuilder + + + + + + org.python.pydev.pythonNature + + diff --git a/.pydevproject b/.pydevproject new file mode 100644 index 0000000..2b04565 --- /dev/null +++ b/.pydevproject @@ -0,0 +1,5 @@ + + + Default + python interpreter + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..573b768 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +encoding//lutin/__init__.py=utf-8 +encoding//lutin/builder.py=utf-8 +encoding//lutin/env.py=utf-8 +encoding//lutin/macro.py=utf-8 +encoding//lutin/module.py=utf-8 +encoding//lutin/moduleGLD.py=utf-8 +encoding//lutin/multiprocess.py=utf-8 +encoding//lutin/system.py=utf-8 +encoding//lutin/target.py=utf-8 +encoding//lutin/tools.py=utf-8 +encoding//lutin/z_system/lutinSystem_Linux_cxx.py=utf-8 diff --git a/lutin/__init__.py b/lutin/__init__.py index 3cf691a..b67e94f 100755 --- a/lutin/__init__.py +++ b/lutin/__init__.py @@ -57,13 +57,22 @@ def import_path_local(path, limit_sub_folder, exclude_path = [], base_name = "") if path in exclude_path: debug.debug("find '" + str(path) + "' in exclude_path=" + str(exclude_path)) return [] - # filter elements: + # filter elements for lutin: tmp_list_lutin_file = filter_name_and_file(path, list_files, base_name + "*.py") debug.verbose("lutin files: " + str(path) + " : " + str(tmp_list_lutin_file)) # Import the module: for filename in tmp_list_lutin_file: out.append(os.path.join(path, filename)) debug.extreme_verbose(" Find a file : '" + str(out[-1]) + "'") + + # filter elements for GLD: + tmp_list_gld_file = filter_name_and_file(path, list_files, "GLD_*.json") + debug.verbose("GLD files: " + str(path) + " : " + str(tmp_list_lutin_file)) + # Import the module: + for filename in tmp_list_gld_file: + out.append(os.path.join(path, filename)) + debug.extreme_verbose(" Find a file : '" + str(out[-1]) + "'") + need_parse_sub_folder = True rm_value = -1 # check if we need to parse sub_folder @@ -109,7 +118,6 @@ def init(): global is_init; if is_init == True: return - debug.verbose("Use Make as a make stadard") sys.path.append(tools.get_run_path()) # create the list of basic folder: basic_folder_list = [] diff --git a/lutin/builder.py b/lutin/builder.py index 389f9f2..ba48cf3 100644 --- a/lutin/builder.py +++ b/lutin/builder.py @@ -33,6 +33,7 @@ __start_builder_name="Builder_" ## def import_path(path_list): global builder_list + gld_base = env.get_gld_build_system_base_name() global_base = env.get_build_system_base_name() debug.debug("BUILDER: Init with Files list:") for elem in path_list: @@ -43,19 +44,27 @@ def import_path(path_list): filename = filename[:-3] base_file_name = filename # Remove global base name: - filename = filename[len(global_base):] - # Check if it start with the local patern: - if filename[:len(__start_builder_name)] != __start_builder_name: - debug.extreme_verbose("BUILDER: Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + if filename[:len(gld_base)] == gld_base: + filename = filename[len(gld_base):] + # Check if it start with the local patern: + if filename[:len(__start_builder_name)] != __start_builder_name: + debug.extreme_verbose("BUILDER: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue continue - # Remove local patern - builder_name = filename[len(__start_builder_name):] - debug.verbose("BUILDER: Integrate: '" + builder_name + "' from '" + elem + "'") - the_builder = __import__(base_file_name) - builder_list.append({"name":builder_name, - "element":the_builder - }) - debug.debug('BUILDER: type=' + the_builder.get_type() + " in=" + str(the_builder.get_input_type()) + " out=" + str(the_builder.get_output_type())) + elif filename[:len(global_base)] == global_base: + filename = filename[len(global_base):] + # Check if it start with the local patern: + if filename[:len(__start_builder_name)] != __start_builder_name: + debug.extreme_verbose("BUILDER: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue + # Remove local patern + builder_name = filename[len(__start_builder_name):] + debug.verbose("BUILDER: Integrate: '" + builder_name + "' from '" + elem + "'") + the_builder = __import__(base_file_name) + builder_list.append({"name":builder_name, + "element":the_builder + }) + debug.debug('BUILDER: type=' + the_builder.get_type() + " in=" + str(the_builder.get_input_type()) + " out=" + str(the_builder.get_output_type())) debug.verbose("List of BUILDER: ") for elem in builder_list: debug.verbose(" " + str(elem["name"])) diff --git a/lutin/env.py b/lutin/env.py index 6200cf8..3ca5f7d 100644 --- a/lutin/env.py +++ b/lutin/env.py @@ -86,6 +86,12 @@ def get_build_system_base_name(): global build_system_base_name return build_system_base_name +gld_build_system_base_name = "GLD" + +def get_gld_build_system_base_name(): + global gld_build_system_base_name + return gld_build_system_base_name + print_pretty_mode=False diff --git a/lutin/macro.py b/lutin/macro.py index b56b076..611ea80 100644 --- a/lutin/macro.py +++ b/lutin/macro.py @@ -28,6 +28,7 @@ __start_macro_name="Macro_" ## def import_path(path_list): global __macro_list + gld_base = env.get_gld_build_system_base_name() global_base = env.get_build_system_base_name() debug.debug("TARGET: Init with Files list:") for elem in path_list: @@ -37,15 +38,23 @@ def import_path(path_list): # Remove .py at the end: filename = filename[:-3] # Remove global base name: - filename = filename[len(global_base):] - # Check if it start with the local patern: - if filename[:len(__start_macro_name)] != __start_macro_name: - debug.extreme_verbose("MACRO: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + if filename[:len(gld_base)] == gld_base: + filename = filename[len(gld_base):] + # Check if it start with the local patern: + if filename[:len(__start_macro_name)] != __start_macro_name: + debug.extreme_verbose("MACRO: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue continue - # Remove local patern - target_name = filename[len(__start_macro_name):] - debug.verbose("MACRO: Integrate: '" + target_name + "' from '" + elem + "'") - __macro_list.append([target_name, elem]) + elif filename[:len(global_base)] == global_base: + filename = filename[len(global_base):] + # Check if it start with the local patern: + if filename[:len(__start_macro_name)] != __start_macro_name: + debug.extreme_verbose("MACRO: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue + # Remove local patern + target_name = filename[len(__start_macro_name):] + debug.verbose("MACRO: Integrate: '" + target_name + "' from '" + elem + "'") + __macro_list.append([target_name, elem]) debug.verbose("New list MACRO: ") for elem in __macro_list: debug.verbose(" " + str(elem[0])) diff --git a/lutin/module.py b/lutin/module.py index 379a6b4..16ce53a 100644 --- a/lutin/module.py +++ b/lutin/module.py @@ -13,6 +13,7 @@ import os import copy import inspect import fnmatch +import json # Local import from . import host from . import tools @@ -23,6 +24,10 @@ from . import multiprocess from . import image from . import license from . import env +from . import moduleGLD +from warnings import catch_warnings +from xmlrpc.client import boolean + ## ## @brief Module class represent all system needed for a specific @@ -57,15 +62,7 @@ class Module: self._origin_file = file; self._origin_path = tools.get_current_path(self._origin_file) # type of the module: - if module_type == 'BINARY' \ - or module_type == 'BINARY_SHARED' \ - or module_type == 'BINARY_STAND_ALONE' \ - or module_type == 'LIBRARY' \ - or module_type == 'LIBRARY_DYNAMIC' \ - or module_type == 'LIBRARY_STATIC' \ - or module_type == 'PACKAGE' \ - or module_type == 'PREBUILD' \ - or module_type == 'DATA': + if module_type in moduleGLD.get_module_type_availlable(): self._type=module_type else : debug.error('for module "%s"' %module_name) @@ -962,7 +959,9 @@ class Module: debug.info("remove path : '" + pathbuild + "'") tools.remove_path_and_sub_path(pathbuild) return True - elif self._type=='BINARY' \ + elif self._type == 'BINARY' \ + or self._type == 'BINARY_SHARED' \ + or self._type == 'BINARY_STAND_ALONE' \ or self._type=='PACKAGE': # remove path of the lib ... for this targer pathbuild = target.get_build_path(self._name) @@ -972,7 +971,7 @@ class Module: debug.info("remove path : '" + pathStaging + "'") tools.remove_path_and_sub_path(pathStaging) return True - debug.error("Dit not know the element type ... (impossible case) type=" + self._type) + debug.error("Did not known the element type ... (impossible case) type=" + self._type) return False ## @@ -1004,7 +1003,11 @@ class Module: ## @param[in] header_file ([string,...]) File to add in header if the dependecy if found. ## @return None ## - def add_optionnal_depend(self, module_name, compilation_flags=["", ""], export=False, src_file=[], header_file=[], compilation_flags_not_found=["", ""]): + def add_optionnal_depend(self, module_name, compilation_flags=None, export=False, src_file=[], header_file=[], compilation_flags_not_found=None): + if compilation_flags == None: + compilation_flags = ["", ""] + if compilation_flags_not_found == None: + compilation_flags_not_found = ["", ""] tools.list_append_and_check(self._depends_optionnal, [module_name, compilation_flags, export, src_file, header_file, compilation_flags_not_found], True) ## @@ -1391,37 +1394,40 @@ class Module: ## @return None ## def display(self): - print('-----------------------------------------------') - print(' module : "' + self._name + "'") - print('-----------------------------------------------') - print(' type:"' + str(self._type) + "'") - print(' file:"' + str(self._origin_file) + "'") - print(' path:"' + str(self._origin_path) + "'") + print('-----------------------------------------------'); + print(' module : "' + self._name + "'"); + print('-----------------------------------------------'); + print(' type:"' + str(self._type) + "'"); + print(' file:"' + str(self._origin_file) + "'"); + print(' path:"' + str(self._origin_path) + "'"); + if "LICENSE" in self._package_prop.keys(): + print(' license:"' + str(self._package_prop["LICENSE"]) + "'"); - self._print_list('depends',self._depends) - self._print_list('depends_optionnal', self._depends_optionnal) - print(' action count=' + str(len(self._actions)) + str(self._actions)) + self._print_list('depends',self._depends); + self._print_list('depends_optionnal', self._depends_optionnal); + print(' action count=' + str(len(self._actions)) + str(self._actions)); for element in self._flags["local"]: - value = self._flags["local"][element] - self._print_list('flags "' + str(element) + '"', value) + value = self._flags["local"][element]; + self._print_list('flags "' + str(element) + '"', value); for element in self._flags["export"]: - value = self._flags["export"][element] - self._print_list('flags export "' + str(element) + '"', value) + value = self._flags["export"][element]; + self._print_list('flags export "' + str(element) + '"', value); - self._print_list('src', self._src) - self._print_list('files', self._files) - self._print_list('paths', self._paths) + self._print_list('sources', self._src); + self._print_list('files', self._files); + self._print_list('headers', [ iii['src'] for iii in self._header]); + self._print_list('paths', self._paths); for element in self._path["local"]: - value = self._path["local"][element] - self._print_list('local path "' + str(element) + '" ' + str(len(value)), value) + value = self._path["local"][element]; + self._print_list('local path "' + str(element) + '" ' + str(len(value)), value); for element in self._path["export"]: - value = self._path["export"][element] - self._print_list('export path "' + str(element) + '" ' + str(len(value)), value) + value = self._path["export"][element]; + self._print_list('export path "' + str(element) + '" ' + str(len(value)), value); print('-----------------------------------------------') - return True + return True; def check_rules(self, type, rules): if ( ( type == 'LIBRARY' \ @@ -1688,24 +1694,36 @@ __start_module_name="_" ## def import_path(path_list): global __module_list + gld_base = env.get_gld_build_system_base_name() global_base = env.get_build_system_base_name() debug.debug("MODULE: Init with Files list:") for elem in path_list: sys.path.append(os.path.dirname(elem)) # Get file name: filename = os.path.basename(elem) - # Remove .py at the end: - filename = filename[:-3] # Remove global base name: - filename = filename[len(global_base):] - # Check if it start with the local patern: - if filename[:len(__start_module_name)] != __start_module_name: - debug.extreme_verbose("MODULE: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") - continue - # Remove local patern - module_name = filename[len(__start_module_name):] - debug.verbose("MODULE: Integrate: '" + module_name + "' from '" + elem + "'") - __module_list.append([module_name, elem]) + if filename[:len(gld_base)] == gld_base: + # Remove .json at the end: + filename = filename[len(gld_base):-5] + # Check if it start with the local patern: + if filename[:len(__start_module_name)] != __start_module_name: + debug.extreme_verbose("MODULE: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue + # Remove local patern + module_name = filename[len(__start_module_name):] + debug.verbose("MODULE: Integrate: '" + module_name + "' from '" + elem + "'") + __module_list.append([module_name, elem, False]) + elif filename[:len(global_base)] == global_base: + # Remove .py at the end: + filename = filename[len(global_base):-3] + # Check if it start with the local patern: + if filename[:len(__start_module_name)] != __start_module_name: + debug.extreme_verbose("MODULE: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue + # Remove local patern + module_name = filename[len(__start_module_name):] + debug.verbose("MODULE: Integrate: '" + module_name + "' from '" + elem + "'") + __module_list.append([module_name, elem, True]) debug.verbose("New list module: ") for elem in __module_list: debug.verbose(" " + str(elem[0])) @@ -1733,60 +1751,67 @@ def load_module(target, name): global __module_list for mod in __module_list: if mod[0] == name: - sys.path.append(os.path.dirname(mod[1])) - debug.verbose("import module : '" + env.get_build_system_base_name() + __start_module_name + name + "'") - the_module_file = mod[1] - the_module = __import__(env.get_build_system_base_name() + __start_module_name + name) - # get basic module properties: - property = get_module_option(os.path.dirname(mod[1]), the_module, name) - # configure the module: - if "configure" in dir(the_module): - # create the module: - tmp_element = Module(the_module_file, name, property["type"]) - # overwrite some package default property (if not set by user) - if property["compagny-type"] != None: - tmp_element._pkg_set_if_default("COMPAGNY_TYPE", property["compagny-type"]) - if property["compagny-name"] != None: - tmp_element._pkg_set_if_default("COMPAGNY_NAME", property["compagny-name"]) - if property["maintainer"] != None: - tmp_element._pkg_set_if_default("MAINTAINER", property["maintainer"]) - if property["name"] != None: - tmp_element._pkg_set_if_default("NAME", property["name"]) - if property["description"] != None: - tmp_element._pkg_set_if_default("DESCRIPTION", property["description"]) - if property["license"] != None: - tmp_element._pkg_set_if_default("LICENSE", property["license"]) - if property["version"] != None: - tmp_element._pkg_set_if_default("VERSION", property["version"]) - # call user to configure it: - ret = the_module.configure(target, tmp_element) - if ret == False: - # the user request remove the capabilities of this module for this platform - tmp_element = None + if mod[2]== False: + # read GLD file + the_module = moduleGLD.load_module_from_GLD(target, mod[0], os.path.dirname(mod[1]), mod[1]) + target.add_module(the_module) + return the_module; else: - debug.warning(" no function 'create' in the module : " + mod[0] + " from:'" + mod[1] + "'") - continue - """ - if property["type"] == "": - continue - # configure the module: - if "configure" in dir(the_module): - tmp_element = module.Module(the_module_file, name, property["type"], property) - ret = the_module.configure(target, tmp_element) - if ret == True: - debug.warning("configure done corectly : " + mod[0] + " from:'" + mod[1] + "'") + # Import internal element + sys.path.append(os.path.dirname(mod[1])) + debug.verbose("import module : '" + env.get_build_system_base_name() + __start_module_name + name + "'") + the_module_file = mod[1] + the_module = __import__(env.get_build_system_base_name() + __start_module_name + name) + # get basic module properties: + property = get_module_option(os.path.dirname(mod[1]), the_module, name) + # configure the module: + if "configure" in dir(the_module): + # create the module: + tmp_element = Module(the_module_file, name, property["type"]) + # overwrite some package default property (if not set by user) + if property["compagny-type"] != None: + tmp_element._pkg_set_if_default("COMPAGNY_TYPE", property["compagny-type"]) + if property["compagny-name"] != None: + tmp_element._pkg_set_if_default("COMPAGNY_NAME", property["compagny-name"]) + if property["maintainer"] != None: + tmp_element._pkg_set_if_default("MAINTAINER", property["maintainer"]) + if property["name"] != None: + tmp_element._pkg_set_if_default("NAME", property["name"]) + if property["description"] != None: + tmp_element._pkg_set_if_default("DESCRIPTION", property["description"]) + if property["license"] != None: + tmp_element._pkg_set_if_default("LICENSE", property["license"]) + if property["version"] != None: + tmp_element._pkg_set_if_default("VERSION", property["version"]) + # call user to configure it: + ret = the_module.configure(target, tmp_element) + if ret == False: + # the user request remove the capabilities of this module for this platform + tmp_element = None else: - debug.warning("configure NOT done corectly : " + mod[0] + " from:'" + mod[1] + "'") - else: - debug.warning(" no function 'configure' in the module : " + mod[0] + " from:'" + mod[1] + "'") - continue - """ - # check if create has been done corectly - if tmp_element == None: - debug.debug("Request load module '" + name + "' not define for this platform") - else: - target.add_module(tmp_element) - return tmp_element + debug.warning(" no function 'create' in the module : " + mod[0] + " from:'" + mod[1] + "'") + continue + """ + if property["type"] == "": + continue + # configure the module: + if "configure" in dir(the_module): + tmp_element = module.Module(the_module_file, name, property["type"], property) + ret = the_module.configure(target, tmp_element) + if ret == True: + debug.warning("configure done corectly : " + mod[0] + " from:'" + mod[1] + "'") + else: + debug.warning("configure NOT done corectly : " + mod[0] + " from:'" + mod[1] + "'") + else: + debug.warning(" no function 'configure' in the module : " + mod[0] + " from:'" + mod[1] + "'") + continue + """ + # check if create has been done correctly + if tmp_element == None: + debug.debug("Request load module '" + name + "' not define for this platform") + else: + target.add_module(tmp_element) + return tmp_element ## ## @brief List all module name @@ -1796,7 +1821,8 @@ def list_all_module(): global __module_list tmpListName = [] for mod in __module_list: - tmpListName.append(mod[0]) + if mod[0] not in tmpListName: + tmpListName.append(mod[0]) return tmpListName ## @@ -1804,13 +1830,24 @@ def list_all_module(): ## @return ([...,...]) List of all module option @ref get_module_option() ## def list_all_module_with_desc(): - global __module_list - tmp_list = [] + global __module_list; + tmp_list = []; for mod in __module_list: - sys.path.append(os.path.dirname(mod[1])) - the_module = __import__(env.get_build_system_base_name() + __start_module_name + mod[0]) - tmp_list.append(get_module_option(os.path.dirname(mod[1]), the_module, mod[0])) - return tmp_list + sys.path.append(os.path.dirname(mod[1])); + if mod[2] == False: + try: + data = json.load(open(mod[1],)); + property = moduleGLD.get_module_option_GLD(os.path.dirname(mod[1]), data, mod[0]); + tmp_list.append(property); + except json.decoder.JSONDecodeError as ex: + debug.error("inconsistent file " + str(mod[1]) + " ==> " + str(ex)) + + else: + the_module = __import__(env.get_build_system_base_name() + __start_module_name + mod[0]); + property = get_module_option(os.path.dirname(mod[1]), the_module, mod[0]); + tmp_list.append(property); + return tmp_list; + ## @@ -1830,6 +1867,7 @@ def get_module_option(path, the_module, name): maintainer = None version = None version_id = None + group_id = None list_of_function_in_factory = dir(the_module) @@ -1872,6 +1910,12 @@ def get_module_option(path, the_module, name): if "get_version_id" in list_of_function_in_factory: version_id = the_module.get_version_id() + if compagny_type != None: + group_id = compagny_type; + if compagny_name != None: + group_id += "." + compagny_name + elif compagny_name != None: + group_id = compagny_name; return { "name":name, @@ -1879,8 +1923,10 @@ def get_module_option(path, the_module, name): "type":type, "sub-type":sub_type, "license":license, + "license-file": None, "compagny-type":compagny_type, "compagny-name":compagny_name, + "group-id":group_id, "maintainer":maintainer, "version":version, "version-id":version_id diff --git a/lutin/moduleGLD.py b/lutin/moduleGLD.py new file mode 100644 index 0000000..9038c36 --- /dev/null +++ b/lutin/moduleGLD.py @@ -0,0 +1,557 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +## +## @author Edouard DUPIN +## +## @copyright 2012, Edouard DUPIN, all right reserved +## +## @license MPL v2.0 (see license file) +## + +import sys +import os +import copy +import inspect +import fnmatch +import json +# Local import +from . import host +from . import tools +from realog import debug +from . import heritage +from . import builder +from . import multiprocess +from . import image +from . import module +from . import license +from . import env +from warnings import catch_warnings +from xmlrpc.client import boolean + + +def get_module_type_availlable(): + return [ + 'BINARY', + 'BINARY_SHARED', + 'BINARY_STAND_ALONE', + 'LIBRARY', + 'LIBRARY_DYNAMIC', + 'LIBRARY_STATIC', + 'PACKAGE', + 'PREBUILD', + 'DATA' + ] + + +list_of_property_module=[ + "type", + "sub-type", + "group-id", + "description", + "license", + "license-file", + "author", + "maintainer", + "version", + "version-id", + "extra-flag" + ]; + +list_of_element_ignored=[ + "comment", # just to post a comment in the configuration files + "todo", # just to post a todo in the configuration files + ]; +list_of_element_availlable=[ + "source", + "header", + "path", + "compilation-version", + "dependency", + "copy", + "flag", + "mode", + "platform", + "arch" + ]; + +""" +{ + "type":"LIBRARY", + "group-id":"com.atria-soft", + "description":"Ewol tool kit (base: container)", + "licence":"MPL-2", + "licence-file":"file://LICENCE.txt", + "maintainer":"Edouard DUPIN ", + "author":"file://../authors.txt", + "version":"1.5.3", + "__version":"file://../version.txt", + "extra-flag":"MEDIUM", + "mode": { + "*": { + "platform": { + "*": { + "arch": { + "*": {}, + } + }, + }, + "arch": {} + }, + "release": { + + }, + "debug": { + + + "source": { + "list":[ + { + "source":"xxx/plop.cpp", + "flag":[ + ... + ] + }, + "xxx/Yyy.cpp", + "xxx/YuyTer.cpp" + "xxx/plouf.java" + ] + }, + "header": { + "list": [ + "xxx/Yyy.hpp", + "xxx/YuyTer.hpp" + ] + }, + "path":[ + "." + ], + "compilation-version": { + "language": "c++", + "version": 2017 + }, + "dependency": [ + "c", + "m", + "pthread" + ], + "copy":[ + ... + ]; + "mode": { + "debug": { + + }, + "release": { + + } + }, + "platform": { + "*": { + + }, + "Android": { + "dependency": [ + "SDK" + ] + }, + "MacOs": { + "dependency": [ + "cxx" + ] + }, + "Windows": { + + }, + "Linux": { + "dependency": [ + { + "name": "X11", + "optional": true, + "export": false, + "source": [ + "gale/context/X11/Context.cpp" + ], + "flag": { + "language": "c++", + "value": "-DGALE_BUILD_X11" + }, + "missing-flag": { + "language": "c++", + "value": "-DGALE_DOES_NOT_BUILD_X11" + } + }, + }, + "IOs": { + + }, + "Web": { + + }, + "MacOs|IOs": { + + }, + "comment": "For all element expect IOS and Android", + "!Android&!IOs": { + + }, + } + "arch": { + "X86_32": { + + }, + "X86_64": { + + }, + "ARM-v9": { + + }, + "ARM_64": { + + } + }, +} + +get_compilator +get_mode +get_arch +""" + + +def check_compatible(mode, value, list_to_check, json_path): + if value == "": + debug.debug("the <" + mode + ">: condition '" + str(value) + "' empty element >> " + json_path); + return False; + if value == "*": + return True; + find_a_valid_key = False; + debug.verbose("Depact: " + value); + # fist step ==> split in the | value ==> multiple check cases + for elemOR in value.split("|"): + debug.verbose(" |: " + elemOR); + # check the condition is True: + condition = True; + if elemOR == "" or elemOR == " " or elemOR == "\t": + debug.warning("the <" + mode + ">: condition '" + str(value) + "' is not supported must not have ' ' or '\\t' or empty element >> " + json_path); + return False; + for elemAND in elemOR.split("&"): + debug.verbose(" &: " + elemAND); + if elemAND == "" or elemAND == " " or elemAND == "\t": + debug.warning("the <" + mode + ">: condition '" + str(value) + "' is not supported must not have ' ' or '\\t' or empty element >> " + json_path); + return False; + invert_condition = False; + if elemAND[0] == "!": + debug.verbose(" ==> invert condition"); + invert_condition = True; + elemAND = elemAND[1:] + if elemAND in list_to_check: + debug.verbose(" ==> detect condition OK"); + if invert_condition: + condition = False; + debug.verbose(" FALSE"); + break; + else: + debug.verbose(" TRUE"); + continue; + if invert_condition: + debug.verbose(" TRUE"); + continue; + else: + condition = False; + debug.verbose(" FALSE"); + break; + if condition: + debug.verbose(" Detect OR condition at TRUE !!!!"); + find_a_valid_key = True; + break; + if find_a_valid_key: + return True; + """ + if "|" in value: + debug.warning("in <" + mode + ">: '" + str(value) + " not managed '|' >> " + json_path); + return False; + if "&" in value: + debug.warning("in <" + mode + ">: '" + str(value) + " not managed '&' >> " + json_path); + return False; + if "!" in value: + debug.warning("in <" + mode + ">: '" + str(value) + " not managed '!' >> " + json_path); + return False; + if value in list_to_check or value == "*": + return True; + """ + debug.debug("the <" + mode + ">: '" + str(value) + "' is not compatible with '" + str(list_to_check) + "' >> " + json_path); + return False; + + + +def parse_node_arch(target, path, json_path, my_module, data): + for elem in data.keys(): + if check_compatible("arch", elem, target.get_arch(), json_path): + parse_node_generic(target, path, json_path, my_module, data[elem]); + +def parse_node_mode(target, path, json_path, my_module, data): + for elem in data.keys(): + if check_compatible("mode", elem, target.get_mode(), json_path): + parse_node_generic(target, path, json_path, my_module, data[elem]); + +def parse_node_platform(target, path, json_path, my_module, data): + for elem in data.keys(): + if check_compatible("platform", elem, target.get_type(), json_path): + parse_node_generic(target, path, json_path, my_module, data[elem]); + +def parse_node_generic(target, path, json_path, my_module, data, first = False ): + for elem in data.keys(): + if elem in list_of_property_module: + if first == True: + continue; + else: + debug.error("key: '" + elem + "' is NOT allowed at expect in the root node: " + json_path); + continue; + if elem in list_of_element_ignored: + continue; + if elem not in list_of_element_availlable: + debug.warning("key: '" + elem + "' is unknown: " + json_path); + debug.warning("Available List: " + str(list_of_element_ignored) + " or: " + str(list_of_element_availlable)); + + if "source" in data.keys(): + if type(data["source"]) == list: + my_module.add_src_file(data["source"]); + elif type(data["source"]) == dict: + if "list" in data["source"].keys(): + my_module.add_src_file(data["source"]["list"]); + else: + debug.error("missing 'list' in node 'source:{}'"); + else: + debug.error("Wrong type for node 'source' [] or {}"); + + if "header" in data.keys(): + if type(data["header"]) == list: + my_module.add_header_file(data["header"]); + elif type(data["header"]) == dict: + if "list" in data["header"].keys(): + my_module.add_header_file(data["header"]["list"]); + else: + debug.error("missing 'list' in node 'header:{}'"); + else: + debug.error("Wrong type for node 'headers' [] or {}"); + + if "path" in data.keys(): + if type(data["path"]) == list: + my_module.add_path(data["path"]); + else: + debug.error("Wrong type for node 'path' []"); + + + if "dependency" in data.keys(): + if type(data["dependency"]) == list: + for elem in data["dependency"]: + GLD_add_depend(my_module, elem); + else: + debug.error("Wrong type for node 'dependency' []"); + + if "compilation-version" in data.keys(): + if type(data["compilation-version"]) == list: + for elem in data["compilation-version"]: + GLD_compile_version(my_module, elem); + elif type(data["compilation-version"]) == dict: + GLD_compile_version(my_module, data["compilation-version"]); + else: + debug.error("Wrong type for node 'compilation-version' [] or {}"); + + if "copy" in data.keys(): + if type(data["copy"]) == list: + for elem in data["copy"]: + GLD_copy(my_module, elem); + elif type(data["copy"]) == dict: + GLD_copy(my_module, data["copy"]); + else: + debug.error("Wrong type for node 'dependency' []"); + + if "arch" in data.keys(): + parse_node_arch(target, path, json_path, my_module, data["arch"]); + + if "platform" in data.keys(): + parse_node_platform(target, path, json_path, my_module, data["platform"]); + + if "mode" in data.keys(): + parse_node_mode(target, path, json_path, my_module, data["mode"]); + +def load_module_from_GLD(target, name, path, json_path): + debug.debug("Parse file: "+ json_path + "'"); + try: + data = json.load(open(json_path,)) + except json.decoder.JSONDecodeError as ex: + debug.error("Can not parse the file : "+ json_path + " Detect error as : " + str(ex)); + + property = get_module_option_GLD(path, data, name) + # create the module: + my_module = module.Module(json_path, name, property["type"]) + # debug.warning("plopppp " + json.dumps(property, sort_keys=True, indent=4)) + # overwrite some package default property (if not set by user) + if property["compagny-type"] != None: + my_module._pkg_set_if_default("COMPAGNY_TYPE", property["compagny-type"]) + if property["compagny-name"] != None: + my_module._pkg_set_if_default("COMPAGNY_NAME", property["compagny-name"]) + if property["maintainer"] != None: + my_module._pkg_set_if_default("MAINTAINER", property["maintainer"]) + if property["name"] != None: + my_module._pkg_set_if_default("NAME", property["name"]) + if property["description"] != None: + my_module._pkg_set_if_default("DESCRIPTION", property["description"]) + if property["license"] != None: + my_module._pkg_set_if_default("LICENSE", property["license"]) + if property["version"] != None: + my_module._pkg_set_if_default("VERSION", property["version"]) + # parsing all the file to configure: + parse_node_generic(target, path, json_path, my_module, data, True); + + + return my_module + +def GLD_add_depend(my_module, data): + if type(data) == str: + my_module.add_depend(data); + elif type(data) == dict: + if "name" in data.keys(): + name = data["name"]; + else: + debug.error("Can not have dependency without name ..."); + optional = False; + if "optional" in data.keys(): + if type(data["optional"]) == boolean: + optional = data["optional"]; + else: + debug.error("Can not have dependency 'optional' in an other type than boolean ..."); + export = False; + if "export" in data.keys(): + if type(data["export"]) == boolean: + optional = data["export"]; + else: + debug.error("Can not have dependency 'export' in an other type than boolean ..."); + flags_data = None; + if "flag" in data.keys(): + if "language" in data["flag"].keys() and "value" in data["flag"].keys(): + flags_data = [data["flag"]["language"], data["flag"]["value"]] + else: + debug.error("Can not have dependency 'flag' without value 'language' and 'value' ..."); + missing_flags_data = None; + if "missing-flag" in data.keys(): + if "language" in data["missing-flag"].keys() and "value" in data["missing-flag"].keys(): + missing_flags_data = [data["missing-flag"]["language"], data["missing-flag"]["value"]] + else: + debug.error("Can not have dependency 'missing-flag' without value 'language' and 'value' ..."); + src_file=[] + if "source" in data.keys(): + if type(data["source"]) == list: + src_file = data["source"]; + elif type(data["source"]) == str: + src_file = [ data["source"] ]; + else: + debug.error("Can not have dependency 'source' in an other type than [] or string: '" + str(data["source"]) + "'"); + header_file=[] + if "header" in data.keys(): + if type(data["header"]) == list: + header_file = data["header"]; + elif type(data["header"]) == str: + header_file = [ data["header"] ]; + else: + debug.error("Can not have dependency 'header' in an other type than [] or string: '" + str(data["header"]) + "'"); + + + if optional == False: + my_module.add_depend(name); + my_module.add_header_file(header_file); + my_module.add_src_file(src_file); + # TODO: add flags + else: + my_module.add_optionnal_depend(name, flags_data, export=export, compilation_flags_not_found = missing_flags_data, src_file=src_file, header_file=header_file) + else: + debug.error("dependency only support [ {} or string ]"); + +def GLD_compile_version(my_module, data): + if "language" in data.keys() and "version" in data.keys(): + my_module.compile_version(data["language"], data["version"]) + else: + debug.error("missing 'language' and/or 'version' in node 'compilation-version:{}'"); + +def GLD_copy(my_module, data): + path_src = None; + file_src = None; + path_to = ""; + recursive = False; + if "path" in data.keys(): + path_src = data["path"]; + if "file" in data.keys(): + file_src = data["file"]; + if "to" in data.keys(): + path_to = data["to"]; + if "recursive" in data.keys(): + if type(data["recursive"]) == bool: + recursive = data["recursive"]; + else: + debug.error("recursive is a boolean !!!"); + if path_src == None and file_src == None: + debug.error("copy must at least have 'path' or 'file' !!!"); + if path_src != None: + my_module.copy_path(path_src, path_to); + if file_src != None: + my_module.copy_file(file_src, path_to); + + + +def get_module_option_GLD(path, data, name): + type = None; + if "type" in data.keys(): + type = data["type"]; + # TODO: check it is in a list ... + else: + debug.error(" the node 'type' must be provided in the module: " + name); + sub_type = None + if "sub-type" in data.keys(): + sub_type = data["sub-type"]; + compagny_type = None; + compagny_name = None; + group_id = None; + if "group-id" in data.keys(): + compagny_name = data["group-id"]; + group_id = data["group-id"]; + description = None; + if "description" in data.keys(): + description = data["description"]; + license = None; + if "license" in data.keys(): + license = data["license"]; + license_file = None; + if "license-file" in data.keys(): + license_file = data["license-file"]; + maintainer = None; + if "author" in data.keys(): + maintainer = tools.get_maintainer_from_file_or_direct(path, data["author"]); + version = None; + if "version" in data.keys(): + version = tools.get_version_from_file_or_direct(path, data["version"]); + version_id = None; + if "version-id" in data.keys(): + version_id = data["version-id"]; + + # check type property: + if type not in get_module_type_availlable(): + debug.error("Does not support module type: '" + str(type) + "' not in " + str(get_module_type_availlable()) + " path: " + str(path)); + + list_sub_type = ["TEST", "SAMPLE", "TOOL", None]; + if sub_type not in list_sub_type: + debug.error("Does not support module sub-type: '" + str(sub_type) + "' not in " + str(list_sub_type) + " path: " + str(path)); + + return { + "name":name, + "description":description, + "type":type, + "sub-type":sub_type, + "license":license, + "license-file":license_file, + "compagny-type":compagny_type, + "compagny-name":compagny_name, + "group-id":group_id, + "maintainer":maintainer, + "version":version, + "version-id":version_id + } diff --git a/lutin/system.py b/lutin/system.py index 5056193..47791ab 100644 --- a/lutin/system.py +++ b/lutin/system.py @@ -203,38 +203,45 @@ __start_system_name="System_" ## def import_path(path_list): global __system_list + gld_base = env.get_gld_build_system_base_name() global_base = env.get_build_system_base_name() debug.debug("SYSTEM: Init with Files list:") for elem in path_list: sys.path.append(os.path.dirname(elem)) # Get file name: filename = os.path.basename(elem) - # Remove .py at the end: - filename = filename[:-3] # Remove global base name: - filename = filename[len(global_base):] - # Check if it start with the local patern: - if filename[:len(__start_system_name)] != __start_system_name: - debug.extreme_verbose("SYSTEM: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + if filename[:len(gld_base)] == gld_base: + filename = filename[len(gld_base):-5] + # Check if it start with the local patern: + if filename[:len(__start_system_name)] != __start_system_name: + debug.extreme_verbose("SYSTEM: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue continue - # Remove local patern - system_name = filename[len(__start_system_name):] - system_type, system_name = system_name.split('_') - debug.verbose("SYSTEM: Integrate: '" + system_type + "':'" + system_name + "' from '" + elem + "'") - if system_type in __system_list: - __system_list[system_type].append({"name":system_name, - "path":elem, - "system":None, - "loaded":False, - "exist":False, - "module":None}) - else: - __system_list[system_type] = [{"name":system_name, - "path":elem, - "system":None, - "loaded":False, - "exist":False, - "module":None}] + elif filename[:len(global_base)] == global_base: + filename = filename[len(global_base):-3] + # Check if it start with the local patern: + if filename[:len(__start_system_name)] != __start_system_name: + debug.extreme_verbose("SYSTEM: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue + # Remove local patern + system_name = filename[len(__start_system_name):] + system_type, system_name = system_name.split('_') + debug.verbose("SYSTEM: Integrate: '" + system_type + "':'" + system_name + "' from '" + elem + "'") + if system_type in __system_list: + __system_list[system_type].append({"name":system_name, + "path":elem, + "system":None, + "loaded":False, + "exist":False, + "module":None}) + else: + __system_list[system_type] = [{"name":system_name, + "path":elem, + "system":None, + "loaded":False, + "exist":False, + "module":None}] debug.verbose("New list system: ") for elem in __system_list: debug.verbose(" " + str(elem)) diff --git a/lutin/target.py b/lutin/target.py index 9afbe66..209b1f5 100644 --- a/lutin/target.py +++ b/lutin/target.py @@ -1158,6 +1158,7 @@ __start_target_name="Target_" ## def import_path(path_list): global __target_list + gld_base = env.get_gld_build_system_base_name() global_base = env.get_build_system_base_name() debug.debug("TARGET: Init with Files list:") for elem in path_list: @@ -1167,15 +1168,23 @@ def import_path(path_list): # Remove .py at the end: filename = filename[:-3] # Remove global base name: - filename = filename[len(global_base):] - # Check if it start with the local patern: - if filename[:len(__start_target_name)] != __start_target_name: - debug.extreme_verbose("TARGET: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + if filename[:len(gld_base)] == gld_base: + filename = filename[len(gld_base):] + # Check if it start with the local patern: + if filename[:len(__start_target_name)] != __start_target_name: + debug.extreme_verbose("TARGET: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue continue - # Remove local patern - target_name = filename[len(__start_target_name):] - debug.verbose("TARGET: Integrate: '" + target_name + "' from '" + elem + "'") - __target_list.append([target_name, elem]) + elif filename[:len(global_base)] == global_base: + filename = filename[len(global_base):] + # Check if it start with the local patern: + if filename[:len(__start_target_name)] != __start_target_name: + debug.extreme_verbose("TARGET: NOT-Integrate: '" + filename + "' from '" + elem + "' ==> rejected") + continue + # Remove local patern + target_name = filename[len(__start_target_name):] + debug.verbose("TARGET: Integrate: '" + target_name + "' from '" + elem + "'") + __target_list.append([target_name, elem]) debug.verbose("New list TARGET: ") for elem in __target_list: debug.verbose(" " + str(elem[0])) @@ -1187,7 +1196,7 @@ def load_target(name, config): global __target_list debug.debug("load target: " + name) if len(__target_list) == 0: - debug.error("No target to compile !!!") + debug.error("No target to execute !!!") debug.debug("list target: " + str(__target_list)) for mod in __target_list: if mod[0] == name: diff --git a/lutin/tools.py b/lutin/tools.py index bbaaff8..9502fcc 100644 --- a/lutin/tools.py +++ b/lutin/tools.py @@ -417,6 +417,9 @@ def get_version_from_file_or_direct(path_module, filename_or_version): if type(filename_or_version) == list: return filename_or_version # this use a version file + if filename_or_version[:7] == "file://": + filename_or_version = filename_or_version[7:]; + # this use a version file file_data = file_read_data(os.path.join(path_module, filename_or_version)) if len(file_data) == 0: debug.warning("not enought data in the file version size=0 " + path_module + " / " + filename_or_version) @@ -455,6 +458,8 @@ def get_maintainer_from_file_or_direct(path_module, filename_or_author): if type(filename_or_author) == list: return filename_or_author # this use a version file + if filename_or_author[:7] == "file://": + filename_or_author = filename_or_author[7:]; file_data = file_read_data(os.path.join(path_module, filename_or_author)) if len(file_data) == 0: debug.warning("not enought data in the file author size=0 " + path_module + " / " + filename_or_author)