diff --git a/lutin/__init__.py b/lutin/__init__.py index 58880fb..6830772 100755 --- a/lutin/__init__.py +++ b/lutin/__init__.py @@ -11,6 +11,7 @@ import os import sys import fnmatch # Local import +from . import macro from . import target from . import builder from . import system @@ -148,6 +149,7 @@ def init(): module.import_path(list_of_lutin_files) system.import_path(list_of_lutin_files) target.import_path(list_of_lutin_files) + macro.import_path(list_of_lutin_files) builder.init() is_init = True diff --git a/lutin/macro.py b/lutin/macro.py new file mode 100644 index 0000000..b309b7b --- /dev/null +++ b/lutin/macro.py @@ -0,0 +1,76 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +## +## @author Edouard DUPIN +## +## @copyright 2012, Edouard DUPIN, all right reserved +## +## @license APACHE v2.0 (see license file) +## + +import sys +import os +import inspect +import fnmatch +import datetime +# Local import +from . import debug +from . import tools +from . import env + + +__macro_list=[] +__start_macro_name="Macro_" + +## +## @brief Import all File that start with env.get_build_system_base_name() + __start_macro_name + XXX and register in the list of Target +## @param[in] path_list ([string,...]) List of file that start with env.get_build_system_base_name() in the running worktree (Parse one time ==> faster) +## +def import_path(path_list): + global __macro_list + global_base = env.get_build_system_base_name() + debug.debug("TARGET: 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_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])) + +## +## @brief Load a specific target +## +def load_macro(name): + global __macro_list + debug.debug("load macro: " + name) + if len(__macro_list) == 0: + debug.error("No macro to compile !!!") + debug.debug("list macro: " + str(__macro_list)) + for mod in __macro_list: + if mod[0] == name: + debug.verbose("add to path: '" + os.path.dirname(mod[1]) + "'") + sys.path.append(os.path.dirname(mod[1])) + debug.verbose("import macro : '" + env.get_build_system_base_name() + __start_macro_name + name + "'") + the_macro = __import__(env.get_build_system_base_name() + __start_macro_name + name) + return the_macro + raise KeyError("No entry for : " + name) + +def list_all_macro(): + global __macro_list + tmp_list_name = [] + for mod in __macro_list: + tmp_list_name.append(mod[0]) + return tmp_list_name diff --git a/lutin/module.py b/lutin/module.py index b097e8e..575f86d 100644 --- a/lutin/module.py +++ b/lutin/module.py @@ -75,6 +75,8 @@ class Module: self._name = module_name # Tools list: self._tools = [] + # list of action to do: + self._actions = [] # Dependency list: self._depends = [] # Dependency list (optionnal module): @@ -161,6 +163,14 @@ class Module: def get_name(self): return self._name + ## + ## @brief Get origin path of the module declaration + ## @param[in] self (handle) Class handle + ## @return (string) path of the module + ## + def get_origin_path(self): + return self._origin_path + ## ## @brief Get type of the module ("BINARY", "LIBRARY", ...) ## @param[in] self (handle) Class handle @@ -511,7 +521,10 @@ class Module: return copy.deepcopy(self._sub_heritage_list) # create the package heritage self._local_heritage = heritage.heritage(self, target) - + if len(self._actions) != 0: + debug.warning("execute actions: " + str(len(self._actions))) + for action in self._actions: + action["action"](target, self, action["data"]); if package_name == None \ and ( self._type == 'BINARY' or self._type == 'BINARY_SHARED' \ @@ -602,6 +615,8 @@ class Module: "need_copy":ret_write} if elem_generate["install"] == True: have_only_generate_file = True + # TODO : Do it better, we force the include path in the heritage to permit to have a correct inclusion ... + self._local_heritage.include = target.get_build_path_include(self._name) if have_only_generate_file == True: self._add_path(generate_path) @@ -1264,6 +1279,20 @@ class Module: "install":install_element }); + ## + ## @brief Add action to do for the module + ## @param[in] action (function handle) Function to call to execure action + ## @param[in] data (*) Data to set at the action function + ## @return None + ## + def add_action(self, action, data=None, name=None): + debug.verbose("add action : " + str(name)) + self._actions.append({ + "name":name, + "action":action, + "data":data + }) + ## ## @brief copy image in the module datas ## @param[in] self (handle) Class handle @@ -1328,6 +1357,7 @@ class Module: self._print_list('depends',self._depends) self._print_list('depends_optionnal', self._depends_optionnal) + print(' action count=' + str(self._actions)) for element in self._flags["local"]: value = self._flags["local"][element]