Compare commits

...

19 Commits
1.0.0 ... 1.2.0

Author SHA1 Message Date
e1728a4d8d [DEV] new release 2016-02-23 21:36:56 +01:00
c6ea16d046 [DEV] correct gcov methodologie 2016-02-23 21:34:16 +01:00
b645f087f3 [DEV] support of gcov with french translating 2016-02-22 21:05:06 +01:00
6e69681480 [DEBUG] error when no parameter in run 2016-02-15 21:45:50 +01:00
14114158aa [DEV] add parameter in run 2016-02-10 21:01:57 +01:00
618825ac76 [DEBUG] release need setup.cfg 2016-02-09 23:08:28 +01:00
2a0bdd9e90 [DEV] create new release 1.1.0 2016-02-09 22:39:40 +01:00
3b2c888fad [DEV] add run and multiple action in taget 2016-02-09 22:32:33 +01:00
77358efa48 [DEV] add write of class 2016-02-09 21:55:43 +01:00
f069299a53 [DEV] naming error 2016-01-19 21:56:15 +01:00
c962b4fb9f [DEBUG] copy file when not pillow or coregraphic is install 2016-01-18 23:51:22 +01:00
5d92a27738 [DEBUG] remove some bad log 2016-01-18 21:57:14 +01:00
c35e1d3a24 [DEBUG] Android build in multithread ==> java build is now mono threaded 2016-01-18 21:48:23 +01:00
7c664f156d [DEV] add missing m lib on global platform 2016-01-18 21:18:01 +01:00
198513660e [DEV] Change and test the subfolder force parsing 2016-01-18 21:05:07 +01:00
61db92894a [DEBUG] correct the basic export of XX++ linker when needed 2016-01-15 21:27:54 +01:00
a9dd50575a [DEV] faster search methode of the lutin element, and add configuration file lutinConfig.py 2016-01-15 21:27:54 +01:00
d21217bfc4 [DEV] better remove of libc++ 2016-01-11 21:30:50 +01:00
9b9c65d036 [DEV] set the search in the current worktree before the system worktree
If an element is not present in the worktree we use the generic system worktree
2016-01-08 23:17:12 +01:00
46 changed files with 1197 additions and 459 deletions

View File

@@ -10,6 +10,7 @@
# for path inspection: # for path inspection:
import sys import sys
import os import os
import lutin
import lutin.debug as debug import lutin.debug as debug
import lutin.arg as arguments import lutin.arg as arguments
import lutin.host as host import lutin.host as host
@@ -18,6 +19,8 @@ import lutin.target as target
import lutin.env as env import lutin.env as env
import lutin.multiprocess as multiprocess import lutin.multiprocess as multiprocess
import lutin.tools as tools import lutin.tools as tools
import lutin.host as lutinHost
import lutin.tools as lutinTools
myArgs = arguments.LutinArg() myArgs = arguments.LutinArg()
myArgs.add(arguments.ArgDefine("h", "help", desc="Display this help")) myArgs.add(arguments.ArgDefine("h", "help", desc="Display this help"))
@@ -28,6 +31,7 @@ myArgs.add(arguments.ArgDefine("C", "color", desc="Display makefile output in co
myArgs.add(arguments.ArgDefine("B", "force-build", desc="Force the rebuild without checking the dependency")) myArgs.add(arguments.ArgDefine("B", "force-build", desc="Force the rebuild without checking the dependency"))
myArgs.add(arguments.ArgDefine("P", "pretty", desc="Print the debug has pretty display")) myArgs.add(arguments.ArgDefine("P", "pretty", desc="Print the debug has pretty display"))
myArgs.add(arguments.ArgDefine("j", "jobs", haveParam=True, desc="Specifies the number of jobs (commands) to run simultaneously")) myArgs.add(arguments.ArgDefine("j", "jobs", haveParam=True, desc="Specifies the number of jobs (commands) to run simultaneously"))
myArgs.add(arguments.ArgDefine("d", "depth", haveParam=True, desc="Depth of the search of sub element lutin_*.py (default=" + str(env.get_parse_depth()) + ")"))
myArgs.add(arguments.ArgDefine("s", "force-strip", desc="Force the stripping of the compile elements")) myArgs.add(arguments.ArgDefine("s", "force-strip", desc="Force the stripping of the compile elements"))
myArgs.add(arguments.ArgDefine("w", "warning", desc="Store warning in a file build file")) myArgs.add(arguments.ArgDefine("w", "warning", desc="Store warning in a file build file"))
@@ -150,6 +154,7 @@ def usage(full=False):
# preparse the argument to get the verbose element for debug mode # preparse the argument to get the verbose element for debug mode
def parseGenericArg(argument, active): def parseGenericArg(argument, active):
debug.extreme_verbose("parse arg : " + argument.get_option_name() + " " + argument.get_arg() + " active=" + str(active))
if argument.get_option_name() == "help": if argument.get_option_name() == "help":
if active==False: if active==False:
usage() usage()
@@ -184,13 +189,24 @@ def parseGenericArg(argument, active):
if active==True: if active==True:
multiprocess.set_core_number(int(argument.get_arg())) multiprocess.set_core_number(int(argument.get_arg()))
return True return True
elif argument.get_option_name()=="depth":
if active==True:
env.set_parse_depth(int(argument.get_arg()))
return True
elif argument.get_option_name() == "verbose": elif argument.get_option_name() == "verbose":
if active==True: if active==True:
debug.set_level(int(argument.get_arg())) debug.set_level(int(argument.get_arg()))
return True return True
elif argument.get_option_name() == "color": elif argument.get_option_name() == "color":
if active==True: if active==True:
debug.enable_color() if argument.get_arg() == "" \
or argument.get_arg() == "1" \
or argument.get_arg() == "true" \
or argument.get_arg() == "True" \
or argument.get_arg() == True:
debug.enable_color()
else:
debug.disable_color()
return True return True
elif argument.get_option_name() == "force-build": elif argument.get_option_name() == "force-build":
if active==True: if active==True:
@@ -198,28 +214,85 @@ def parseGenericArg(argument, active):
return True return True
elif argument.get_option_name() == "pretty": elif argument.get_option_name() == "pretty":
if active==True: if active==True:
env.set_print_pretty_mode(True) if argument.get_arg() == "" \
or argument.get_arg() == "1" \
or argument.get_arg() == "true" \
or argument.get_arg() == "True" \
or argument.get_arg() == True:
env.set_print_pretty_mode(True)
else:
env.set_print_pretty_mode(False)
return True return True
elif argument.get_option_name() == "force-strip": elif argument.get_option_name() == "force-strip":
if active==True: if active==True:
env.set_force_strip_mode(True) if argument.get_arg() == "" \
or argument.get_arg() == "1" \
or argument.get_arg() == "true" \
or argument.get_arg() == "True" \
or argument.get_arg() == True:
env.set_force_strip_mode(True)
else:
env.set_force_strip_mode(False)
return True return True
elif argument.get_option_name() == "warning": elif argument.get_option_name() == "warning":
if active==True: if active==True:
env.set_warning_mode(True) if argument.get_arg() == "" \
or argument.get_arg() == "1" \
or argument.get_arg() == "true" \
or argument.get_arg() == "True" \
or argument.get_arg() == True:
env.set_warning_mode(True)
else:
env.set_warning_mode(False)
return True return True
return False return False
# open configuration of lutin:
config_file_name = "lutinConfig.py"
config_file = os.path.join(tools.get_run_path(), config_file_name)
if os.path.isfile(config_file) == True:
sys.path.append(os.path.dirname(config_file))
debug.debug("Find basic configuration file: '" + config_file + "'")
# the file exist, we can open it and get the initial configuration:
configuration_file = __import__(config_file_name[:-3])
if "get_exclude_path" in dir(configuration_file):
data = configuration_file.get_exclude_path()
debug.debug(" get default config 'get_exclude_path' val='" + str(data) + "'")
env.set_exclude_search_path(data)
if "get_parsing_depth" in dir(configuration_file):
data = configuration_file.get_parsing_depth()
debug.debug(" get default config 'get_parsing_depth' val='" + str(data) + "'")
parseGenericArg(arguments.ArgElement("depth", str(data)), True)
if "get_default_jobs" in dir(configuration_file):
data = configuration_file.get_default_jobs()
debug.debug(" get default config 'get_default_jobs' val='" + str(data) + "'")
parseGenericArg(arguments.ArgElement("jobs", str(data)), True)
if "get_default_color" in dir(configuration_file):
data = configuration_file.get_default_color()
debug.debug(" get default config 'get_default_color' val='" + str(data) + "'")
parseGenericArg(arguments.ArgElement("color", str(data)), True)
if "get_default_debug_level" in dir(configuration_file):
data = configuration_file.get_default_debug_level()
debug.debug(" get default config 'get_default_debug_level' val='" + str(data) + "'")
parseGenericArg(arguments.ArgElement("verbose", str(data)), True)
if "get_default_print_pretty" in dir(configuration_file):
data = configuration_file.get_default_print_pretty()
debug.debug(" get default config 'get_default_print_pretty' val='" + str(data) + "'")
parseGenericArg(arguments.ArgElement("pretty", str(data)), True)
# parse default unique argument: # parse default unique argument:
for argument in localArgument: for argument in localArgument:
parseGenericArg(argument, True) parseGenericArg(argument, True)
# initialize the system ...
import lutin lutin.init()
import lutin.host as lutinHost
import lutin.tools as lutinTools
#available target : Linux / MacOs / Windows / Android ... #available target : Linux / MacOs / Windows / Android ...
targetName = host.OS targetName = host.OS

View File

@@ -8,6 +8,7 @@
## ##
import os import os
import sys import sys
import fnmatch
# Local import # Local import
from . import target from . import target
from . import builder from . import builder
@@ -16,32 +17,120 @@ from . import host
from . import tools from . import tools
from . import debug from . import debug
from . import module from . import module
from . import env
is_init = False is_init = False
if is_init == False:
def filter_name_and_file(root, list_files, filter):
# filter elements:
tmp_list = fnmatch.filter(list_files, filter)
out = []
for elem in tmp_list:
if os.path.isfile(os.path.join(root, elem)) == True:
out.append(elem);
return out;
def filter_path(root, list_files):
out = []
for elem in list_files:
if len(elem) == 0 \
or elem[0] == '.':
continue
if os.path.isdir(os.path.join(root, elem)) == True:
out.append(elem);
return out;
def import_path_local(path, limit_sub_folder, exclude_path = [], base_name = ""):
out = []
debug.verbose("lutin files: " + str(path) + " [START]")
if limit_sub_folder == 0:
debug.debug("Subparsing limitation append ...")
return []
try:
list_files = os.listdir(path)
except:
# an error occure, maybe read error ...
debug.warning("error when getting subdirectory of '" + str(path) + "'")
return []
if path in exclude_path:
debug.debug("find '" + str(path) + "' in exclude_path=" + str(exclude_path))
return []
# filter elements:
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]) + "'")
need_parse_sub_folder = True
rm_value = -1
# check if we need to parse sub_folder
if len(tmp_list_lutin_file) != 0:
need_parse_sub_folder = False
# check if the file "lutin_parse_sub.py" is present ==> parse SubFolder (force and add +1 in the resursing
if base_name + "ParseSubFolders.txt" in list_files:
debug.debug("find SubParser ... " + str(base_name + "ParseSubFolders.txt") + " " + path)
need_parse_sub_folder = True
rm_value = 0
if need_parse_sub_folder == True:
list_folders = filter_path(path, list_files)
for folder in list_folders:
tmp_out = import_path_local(os.path.join(path, folder),
limit_sub_folder - rm_value,
exclude_path,
base_name)
# add all the elements:
for elem in tmp_out:
out.append(elem)
return out
def init():
global is_init;
if is_init == True:
return
debug.verbose("Use Make as a make stadard") debug.verbose("Use Make as a make stadard")
sys.path.append(tools.get_run_path()) sys.path.append(tools.get_run_path())
builder.import_path(tools.get_current_path(__file__)) # create the list of basic folder:
module.import_path(tools.get_current_path(__file__)) basic_folder_list = []
system.import_path(tools.get_current_path(__file__)) basic_folder_list.append([tools.get_current_path(__file__), True])
target.import_path(tools.get_current_path(__file__))
debug.debug("missing file lutinBase.py ==> loading subPath...");
# Import all sub path without out and archive # Import all sub path without out and archive
for path in os.listdir("."): for elem_path in os.listdir("."):
if os.path.isdir(path)==True: if os.path.isdir(elem_path) == False:
if path.lower()!="android" \ continue
and path.lower()!="archive" \ if elem_path.lower() == "android" \
and path.lower()!="out" : or elem_path == "out" :
debug.debug("Automatic load path: '" + path + "'") continue
builder.import_path(path) debug.debug("Automatic load path: '" + elem_path + "'")
module.import_path(path) basic_folder_list.append([elem_path, False])
system.import_path(path)
target.import_path(path) # create in a single path the basic list of lutin files (all start with lutin and end with .py)
exclude_path = env.get_exclude_search_path()
limit_sub_folder = env.get_parse_depth()
list_of_lutin_files = []
for elem_path, is_system in basic_folder_list:
if is_system == True:
limit_sub_folder_tmp = 999999
else:
limit_sub_folder_tmp = limit_sub_folder
tmp_out = import_path_local(elem_path,
limit_sub_folder_tmp,
exclude_path,
env.get_build_system_base_name())
# add all the elements:
for elem in tmp_out:
list_of_lutin_files.append(elem)
debug.debug("Files specific lutin: ")
for elem_path in list_of_lutin_files:
debug.debug(" " + elem_path)
# simply import element from the basic list of files (single parse ...)
builder.import_path(list_of_lutin_files)
module.import_path(list_of_lutin_files)
system.import_path(list_of_lutin_files)
target.import_path(list_of_lutin_files)
builder.init() builder.init()
is_init = True is_init = True

View File

@@ -14,6 +14,7 @@ import datetime
# Local import # Local import
from . import debug from . import debug
from . import heritage from . import heritage
from . import env
## ##
## constitution of dictionnary: ## constitution of dictionnary:
@@ -23,26 +24,37 @@ from . import heritage
## - "builder": pointer on the element ## - "builder": pointer on the element
## ##
builder_list=[] builder_list=[]
__start_builder_name="lutinBuilder_" __start_builder_name="Builder_"
def import_path(path): def import_path(path_list):
global builder_list global builder_list
matches = [] global_base = env.get_build_system_base_name()
debug.debug('BUILDER: Start find sub File : "%s"' %path) debug.debug("BUILDER: Init with Files list:")
for root, dirnames, filenames in os.walk(path): for elem in path_list:
tmpList = fnmatch.filter(filenames, __start_builder_name + "*.py") sys.path.append(os.path.dirname(elem))
# Import the module : # Get file name:
for filename in tmpList: filename = os.path.basename(elem)
debug.debug('BUILDER: Find a file : "%s"' %os.path.join(root, filename)) # Remove .py at the end:
#matches.append(os.path.join(root, filename)) filename = filename[:-3]
sys.path.append(os.path.dirname(os.path.join(root, filename)) ) base_file_name = filename
builder_name = filename.replace('.py', '') # Remove global base name:
the_builder = __import__(builder_name) filename = filename[len(global_base):]
builder_list.append({"name":builder_name, # Check if it start with the local patern:
"element":the_builder if filename[:len(__start_builder_name)] != __start_builder_name:
}) debug.extreme_verbose("BUILDER: Integrate: '" + filename + "' from '" + elem + "' ==> rejected")
debug.debug('BUILDER: type=' + the_builder.get_type() + " in=" + str(the_builder.get_input_type()) + " out=" + str(the_builder.get_output_type())) 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"]))
# we must have call all import before ... # we must have call all import before ...
def init(): def init():

View File

@@ -11,8 +11,8 @@ import os
import threading import threading
import re import re
debugLevel=3 debug_level=3
debugColor=False debug_color=False
color_default= "" color_default= ""
color_red = "" color_red = ""
@@ -23,20 +23,20 @@ color_purple = ""
color_cyan = "" color_cyan = ""
debugLock = threading.Lock() debug_lock = threading.Lock()
def set_level(id): def set_level(id):
global debugLevel global debug_level
debugLevel = id debug_level = id
#print "SetDebug level at " + str(debugLevel) #print "SetDebug level at " + str(debug_level)
def get_level(): def get_level():
global debugLevel global debug_level
return debugLevel return debug_level
def enable_color(): def enable_color():
global debugColor global debug_color
debugColor = True debug_color = True
global color_default global color_default
color_default= "\033[00m" color_default= "\033[00m"
global color_red global color_red
@@ -52,81 +52,108 @@ def enable_color():
global color_cyan global color_cyan
color_cyan = "\033[36m" color_cyan = "\033[36m"
def disable_color():
global debug_color
debug_color = True
global color_default
color_default= ""
global color_red
color_red = ""
global color_green
color_green = ""
global color_yellow
color_yellow = ""
global color_blue
color_blue = ""
global color_purple
color_purple = ""
global color_cyan
color_cyan = ""
def extreme_verbose(input, force=False): def extreme_verbose(input, force=False):
global debugLock global debug_lock
global debugLevel global debug_level
if debugLevel >= 6 \ if debug_level >= 6 \
or force == True: or force == True:
debugLock.acquire() debug_lock.acquire()
print(color_blue + input + color_default) print(color_blue + input + color_default)
debugLock.release() debug_lock.release()
def verbose(input, force=False): def verbose(input, force=False):
global debugLock global debug_lock
global debugLevel global debug_level
if debugLevel >= 5 \ if debug_level >= 5 \
or force == True: or force == True:
debugLock.acquire() debug_lock.acquire()
print(color_blue + input + color_default) print(color_blue + input + color_default)
debugLock.release() debug_lock.release()
def debug(input, force=False): def debug(input, force=False):
global debugLock global debug_lock
global debugLevel global debug_level
if debugLevel >= 4 \ if debug_level >= 4 \
or force == True: or force == True:
debugLock.acquire() debug_lock.acquire()
print(color_green + input + color_default) print(color_green + input + color_default)
debugLock.release() debug_lock.release()
def info(input, force=False): def info(input, force=False):
global debugLock global debug_lock
global debugLevel global debug_level
if debugLevel >= 3 \ if debug_level >= 3 \
or force == True: or force == True:
debugLock.acquire() debug_lock.acquire()
print(input + color_default) print(input + color_default)
debugLock.release() debug_lock.release()
def warning(input, force=False): def warning(input, force=False):
global debugLock global debug_lock
global debugLevel global debug_level
if debugLevel >= 2 \ if debug_level >= 2 \
or force == True: or force == True:
debugLock.acquire() debug_lock.acquire()
print(color_purple + "[WARNING] " + input + color_default) print(color_purple + "[WARNING] " + input + color_default)
debugLock.release() debug_lock.release()
def error(input, threadID=-1, force=False, crash=True): def todo(input, force=False):
global debugLock global debug_lock
global debugLevel global debug_level
if debugLevel >= 1 \ if debug_level >= 3 \
or force == True: or force == True:
debugLock.acquire() debug_lock.acquire()
print(color_purple + "[TODO] " + input + color_default)
debug_lock.release()
def error(input, thread_id=-1, force=False, crash=True):
global debug_lock
global debug_level
if debug_level >= 1 \
or force == True:
debug_lock.acquire()
print(color_red + "[ERROR] " + input + color_default) print(color_red + "[ERROR] " + input + color_default)
debugLock.release() debug_lock.release()
if crash==True: if crash == True:
from . import multiprocess from . import multiprocess
multiprocess.error_occured() multiprocess.set_error_occured()
if threadID != -1: if thread_id != -1:
threading.interrupt_main() threading.interrupt_main()
exit(-1) exit(-1)
#os_exit(-1) #os_exit(-1)
#raise "error happend" #raise "error happend"
def print_element(type, lib, dir, name, force=False): def print_element(type, lib, dir, name, force=False):
global debugLock global debug_lock
global debugLevel global debug_level
if debugLevel >= 3 \ if debug_level >= 3 \
or force == True: or force == True:
debugLock.acquire() debug_lock.acquire()
print(color_cyan + type + color_default + " : " + color_yellow + lib + color_default + " " + dir + " " + color_blue + name + color_default) print(color_cyan + type + color_default + " : " + color_yellow + lib + color_default + " " + dir + " " + color_blue + name + color_default)
debugLock.release() debug_lock.release()
def print_compilator(myString): def print_compilator(myString):
global debugColor global debug_color
global debugLock global debug_lock
if debugColor == True: if debug_color == True:
myString = myString.replace('\\n', '\n') myString = myString.replace('\\n', '\n')
myString = myString.replace('\\t', '\t') myString = myString.replace('\\t', '\t')
myString = myString.replace('error:', color_red+'error:'+color_default) myString = myString.replace('error:', color_red+'error:'+color_default)
@@ -136,9 +163,9 @@ def print_compilator(myString):
myString = myString.replace('-COLORIN-', color_yellow) myString = myString.replace('-COLORIN-', color_yellow)
myString = myString.replace('-COLOROUT-', color_default) myString = myString.replace('-COLOROUT-', color_default)
debugLock.acquire() debug_lock.acquire()
print(myString) print(myString)
debugLock.release() debug_lock.release()
def get_color_set() : def get_color_set() :
global color_default global color_default

View File

@@ -25,6 +25,40 @@ def get_force_mode():
global force_mode global force_mode
return force_mode return force_mode
parse_depth = 9999999
def set_parse_depth(val):
global parse_depth
parse_depth = val
debug.debug("Set depth search element: " + str(parse_depth))
def get_parse_depth():
global parse_depth
return parse_depth
exclude_search_path = []
def set_exclude_search_path(val):
global exclude_search_path
exclude_search_path = val
debug.debug("Set depth search element: " + str(exclude_search_path))
def get_exclude_search_path():
global exclude_search_path
return exclude_search_path
build_system_base_name = "lutin"
def set_build_system_base_name(val):
global build_system_base_name
build_system_base_name = val
debug.debug("Set basename: '" + str(build_system_base_name) + "'")
def get_build_system_base_name():
global build_system_base_name
return build_system_base_name
print_pretty_mode=False print_pretty_mode=False
@@ -76,38 +110,42 @@ def print_pretty(my_string, force=False):
baseElementList = [] baseElementList = []
if end_with(cmdApplication, ["javac"]) == True: if end_with(cmdApplication, ["javac"]) == True:
baseElementList = [ baseElementList = [
"-d", "-d",
"-D", "-D",
"-classpath", "-classpath",
"-sourcepath" "-sourcepath"
] ]
elif end_with(cmdApplication, ["jar"]) == True: elif end_with(cmdApplication, ["jar"]) == True:
baseElementList = [ baseElementList = [
"cf", "cf",
"-C" "-C"
] ]
elif end_with(cmdApplication, ["aapt"]) == True: elif end_with(cmdApplication, ["aapt"]) == True:
baseElementList = [ baseElementList = [
"-M", "-M",
"-F", "-F",
"-I", "-I",
"-S", "-S",
"-J" "-J"
] ]
elif end_with(cmdApplication, ["g++", "gcc", "clang", "clang++", "ar", "ld", "ranlib"]) == True: elif end_with(cmdApplication, ["g++", "gcc", "clang", "clang++", "ar", "ld", "ranlib"]) == True:
baseElementList = [ baseElementList = [
"-o", "-o",
"-D", "-D",
"-I", "-I",
"-L", "-L",
"-framework", "-framework",
"-isysroot", "-isysroot",
"-arch", "-arch",
"-keystore", "-keystore",
"-sigalg", "-sigalg",
"-digestalg", "-digestalg",
"-target", "-target",
"-gcc-toolchain"] "-gcc-toolchain",
"-current_version",
"-compatibility_version"
]
for element in baseElementList: for element in baseElementList:
tmpcmdLine = tmpcmdLine.replace(element+'\n\t', element+' ') tmpcmdLine = tmpcmdLine.replace(element+'\n\t', element+' ')
for element in ["<", "<<", ">", ">>"]: for element in ["<", "<<", ">", ">>"]:

View File

@@ -97,13 +97,30 @@ class HeritageList:
debug.verbose(" " + element.name + " " + str(element.depends)) debug.verbose(" " + element.name + " " + str(element.depends))
for element in reversed(self.list_heritage): for element in reversed(self.list_heritage):
for flags in element.flags: for flags in element.flags:
if flags in ["c-version", "c++-version"]: # get value
continue
value = element.flags[flags] value = element.flags[flags]
if flags not in self.flags: # if it is a list, simply add element on the previous one
self.flags[flags] = value if type(value) == list:
else: if flags not in self.flags:
append_to_list(self.flags[flags], value) self.flags[flags] = value
else:
append_to_list(self.flags[flags], value)
elif type(value) == bool:
if flags not in self.flags:
self.flags[flags] = value
else:
# keep only true, if false ==> bad case ...
if self.flags[flags] == True \
or value == True:
self.flags[flags] = True
elif type(value) == int:
# case of "c-version", "c++-version"
if flags not in self.flags:
self.flags[flags] = value
else:
# keep only true, if false ==> bad case ...
if self.flags[flags] < value:
self.flags[flags] = value
for ppp in element.path: for ppp in element.path:
value = element.path[ppp] value = element.path[ppp]
if ppp not in self.path: if ppp not in self.path:
@@ -113,19 +130,9 @@ class HeritageList:
append_to_list(self.src['src'], element.src['src']) append_to_list(self.src['src'], element.src['src'])
append_to_list(self.src['dynamic'], element.src['dynamic']) append_to_list(self.src['dynamic'], element.src['dynamic'])
append_to_list(self.src['static'], element.src['static']) append_to_list(self.src['static'], element.src['static'])
if "c-version" in element.flags:
ver = element.flags["c-version"] def __repr__(self):
if "c-version" in self.flags: return "{HeritageList:" + str(self.list_heritage) + "}"
if self.flags["c-version"] > ver:
ver = self.flags["c-version"]
self.flags["c-version"] = ver
if "c++-version" in element.flags:
ver = element.flags["c++-version"]
if "c++-version" in self.flags:
if self.flags["c++-version"] > ver:
ver = self.flags["c++-version"]
self.flags["c++-version"] = ver
class heritage: class heritage:
def __init__(self, module, target): def __init__(self, module, target):
@@ -219,5 +226,8 @@ class heritage:
if self.flags["c++-version"] > ver: if self.flags["c++-version"] > ver:
ver = self.flags["c++-version"] ver = self.flags["c++-version"]
self.flags["c++-version"] = ver self.flags["c++-version"] = ver
def __repr__(self):
return "{Heritage:" + str(self.name) + " ... }"

View File

@@ -35,10 +35,13 @@ def get_pow_2_multiple(size):
# check if time change # check if time change
# check if command line change # check if command line change
def resize(src_file, dest_file, x, y, cmd_file=None): def resize(src_file, dest_file, x, y, cmd_file=None):
if enable_resize_image == False:
return
if os.path.exists(src_file) == False: if os.path.exists(src_file) == False:
debug.error("Request a resize an image that does not existed : '" + src_file + "'") debug.error("Request a resize an image that does not existed : '" + src_file + "'")
return
if enable_resize_image == False:
debug.warning("Can not resize image missing pillow or CoreGraphics : '" + src_file + "' (just copy)")
tools.copy_file(src_file, dest_file)
return
cmd_line = "resize Image : " + src_file + " ==> " + dest_file + " newSize=(" + str(x) + "x" + str(y) + ")" cmd_line = "resize Image : " + src_file + " ==> " + dest_file + " newSize=(" + str(x) + "x" + str(y) + ")"
if depend.need_re_build(dest_file, src_file, file_cmd=cmd_file , cmd_line=cmd_line) == False: if depend.need_re_build(dest_file, src_file, file_cmd=cmd_file , cmd_line=cmd_line) == False:
return return

View File

@@ -20,6 +20,7 @@ from . import builder
from . import multiprocess from . import multiprocess
from . import image from . import image
from . import license from . import license
from . import env
class Module: class Module:
@@ -41,6 +42,8 @@ class Module:
self.type='LIBRARY' self.type='LIBRARY'
# Name of the module # Name of the module
self.name=module_name self.name=module_name
# Tools list:
self.tools = []
# Dependency list: # Dependency list:
self.depends = [] self.depends = []
# Dependency list (optionnal module): # Dependency list (optionnal module):
@@ -123,6 +126,9 @@ class Module:
} }
self.sub_heritage_list = None self.sub_heritage_list = None
def __repr__(self):
return "{lutin.Module:" + str(self.name) + "}"
def get_type(self): def get_type(self):
return self.type return self.type
## ##
@@ -230,12 +236,38 @@ class Module:
if self.type == 'PREBUILD': if self.type == 'PREBUILD':
debug.error("Can not generate gcov on prebuid system ... : '" + self.name + "'"); debug.error("Can not generate gcov on prebuid system ... : '" + self.name + "'");
return return
# list of path that can apear in the output data :
gcov_path_file = []
gcov_path_file.append(target.get_build_path_include(self.name)) # for include (that is installed)
gcov_path_file.append(" " + target.get_build_path_include(self.name))
gcov_path_file.append(self.origin_path) # for sources.
gcov_path_file.append(" " + self.origin_path)
# squash header and src...
full_list_file = []
for elem in self.header:
debug.extreme_verbose("plop H : " +str(elem['src']))
full_list_file.append([self.name, elem['src']])
for elem in self.src:
debug.extreme_verbose("plop S : " +str(elem))
full_list_file.append([self.name, elem])
for mod_name in self.tools:
tool_module = load_module(target, mod_name)
if tool_module == None:
continue
for elem in tool_module.header:
debug.extreme_verbose("plop HH: " + ":" + str(elem['src']))
full_list_file.append([tool_module.name, elem['src']])
for elem in tool_module.src:
debug.extreme_verbose("plop SS: " + tool_module.name + ":" + str(elem))
full_list_file.append([tool_module.name, elem])
debug.extreme_verbose("plop F : " +str(self.extention_order_build))
# remove uncompilable elements: # remove uncompilable elements:
list_file = tools.filter_extention(self.src, self.extention_order_build, True) # TODO: list_file = tools.filter_extention(full_list_file, self.extention_order_build, True)
list_file = full_list_file;
global_list_file = "" global_list_file = ""
for file in list_file: for file in list_file:
debug.verbose(" gcov : " + self.name + " <== " + file); debug.verbose(" gcov : " + self.name + " <== " + str(file));
file_dst = target.get_full_name_destination(self.name, self.origin_path, file, "o") file_dst = target.get_full_name_destination(file[0], self.origin_path, file[1], "o")
global_list_file += file_dst + " " global_list_file += file_dst + " "
cmd = "gcov" cmd = "gcov"
# specify the version of gcov we need to use # specify the version of gcov we need to use
@@ -257,39 +289,78 @@ class Module:
executed_lines = 0 executed_lines = 0
executable_lines = 0 executable_lines = 0
for elem in ret: for elem in ret:
debug.debug("line: " + elem)
if remove_next == True: if remove_next == True:
remove_next = False remove_next = False
debug.debug("--------------------------")
continue; continue;
if elem[:10] == "Creating '" \ if elem[:10] == "Creating '" \
or elem[:10] == "Removing '": or elem[:10] == "Removing '" \
or elem[:14] == "Suppression de" \
or elem[:11] == "Création de":
remove_next = True remove_next = True
continue continue
if elem[:6] == "File '" \ if elem[:6] in ["File '", "File «"] \
and self.origin_path != elem[6:len(self.origin_path)+6]: or elem[:7] in ["File ' ", "File « "]:
remove_next = True path_finder = False
for path_base_finder in gcov_path_file:
if path_base_finder == elem[6:len(path_base_finder)+6]:
path_finder = True
last_file = elem[6+len(path_base_finder)+1:-1]
while last_file[-1] == " ":
last_file = last_file[:-1]
if path_finder == False:
remove_next = True
debug.verbose(" REMOVE: '" + str(elem[6:len(self.origin_path)+1]) + "' not in " + str(gcov_path_file))
continue
continue continue
if elem[:6] == "File '": if elem[:7] == "Aucune ":
last_file = elem[6+len(self.origin_path)+1:-1] debug.verbose(" Nothing to execute");
continue continue
start_with = "Lines executed:" start_with = ["Lines executed:", "Lignes exécutées:"]
if elem[:len(start_with)] != start_with: find = False
for line_base in start_with:
if elem[:len(line_base)] == line_base:
find = True
elem = elem[len(line_base)+1:]
break;
if find == False:
debug.warning(" gcov ret : " + str(elem)); debug.warning(" gcov ret : " + str(elem));
debug.warning(" ==> does not start with : " + start_with); debug.warning(" ==> does not start with : " + str(start_with));
debug.warning(" Parsing error"); debug.warning(" Parsing error");
continue continue
out = elem[len(start_with):].split("% of ") out = elem.split("% of ")
if len(out) != 2: if len(out) != 2:
debug.warning(" gcov ret : " + str(elem)); out = elem.split("% de ")
debug.warning(" Parsing error of '% of '"); if len(out) != 2:
continue debug.warning(" gcov ret : " + str(elem));
debug.warning(" Parsing error of '% of '");
continue
debug.verbose("property : " + str(out))
pourcent = float(out[0]) pourcent = float(out[0])
total_line_count = int(out[1]) total_line_count = int(out[1])
total_executed_line = int(float(total_line_count)*pourcent/100.0) total_executed_line = int(float(total_line_count)*pourcent/100.0)
# check if in source or header:
in_source_file = False
debug.verbose(" ??> Check: " + str(last_file))
for elem_header in self.header:
debug.verbose(" ==> Check: " + str(elem_header['src']))
if elem_header['src'] == last_file:
in_source_file = True
for elem_src in self.src:
debug.verbose(" ==> Check: " + str(elem_src))
if elem_src == last_file:
in_source_file = True
if in_source_file == False:
debug.verbose(" ==> Remove not in source: " + str(out))
continue
useful_list.append([last_file, pourcent, total_executed_line, total_line_count]) useful_list.append([last_file, pourcent, total_executed_line, total_line_count])
executed_lines += total_executed_line executed_lines += total_executed_line
executable_lines += total_line_count executable_lines += total_line_count
last_file = "" last_file = ""
debug.debug("--------------------------")
ret = useful_list[:-1] ret = useful_list[:-1]
debug.verbose("plopppp " + str(useful_list))
#for elem in ret: #for elem in ret:
# debug.info(" " + str(elem)); # debug.info(" " + str(elem));
for elem in ret: for elem in ret:
@@ -299,7 +370,10 @@ class Module:
debug.info(" % " + str(elem[1]) + "\r\t\t" + str(elem[0])); debug.info(" % " + str(elem[1]) + "\r\t\t" + str(elem[0]));
else: else:
debug.info(" % " + str(elem[1]) + "\r\t\t" + str(elem[0])); debug.info(" % " + str(elem[1]) + "\r\t\t" + str(elem[0]));
pourcent = 100.0*float(executed_lines)/float(executable_lines) try:
pourcent = 100.0*float(executed_lines)/float(executable_lines)
except ZeroDivisionError:
pourcent = 0.0
# generate json file: # generate json file:
json_file_name = target.get_build_path(self.name) + "/" + self.name + "_coverage.json" json_file_name = target.get_build_path(self.name) + "/" + self.name + "_coverage.json"
debug.debug("generate json file : " + json_file_name) debug.debug("generate json file : " + json_file_name)
@@ -327,11 +401,12 @@ class Module:
tmp_file.close() tmp_file.close()
# print debug: # print debug:
debug.print_element("coverage", self.name, ":", str(pourcent) + "% " + str(executed_lines) + "/" + str(executable_lines)) debug.print_element("coverage", self.name, ":", str(pourcent) + "% " + str(executed_lines) + "/" + str(executable_lines))
return True
# call here to build the module # call here to build the module
def build(self, target, package_name): def build(self, target, package_name):
# ckeck if not previously build # ckeck if not previously build
if target.is_module_build(self.name)==True: if target.is_module_build(self.name) == True:
if self.sub_heritage_list == None: if self.sub_heritage_list == None:
self.local_heritage = heritage.heritage(self, target) self.local_heritage = heritage.heritage(self, target)
return self.sub_heritage_list return self.sub_heritage_list
@@ -416,6 +491,9 @@ class Module:
fileExt = file.split(".")[-1] fileExt = file.split(".")[-1]
try: try:
tmp_builder = builder.get_builder(fileExt); tmp_builder = builder.get_builder(fileExt);
multithreading = tmp_builder.get_support_multithreading()
if multithreading == False:
multiprocess.pool_synchrosize()
res_file = tmp_builder.compile(file, res_file = tmp_builder.compile(file,
package_name, package_name,
target, target,
@@ -425,6 +503,8 @@ class Module:
name = self.name, name = self.name,
basic_path = self.origin_path, basic_path = self.origin_path,
module_src = self.src) module_src = self.src)
if multithreading == False:
multiprocess.pool_synchrosize()
if res_file["action"] == "add": if res_file["action"] == "add":
list_sub_file_needed_to_build.append(res_file["file"]) list_sub_file_needed_to_build.append(res_file["file"])
elif res_file["action"] == "path": elif res_file["action"] == "path":
@@ -439,7 +519,10 @@ class Module:
#debug.info(" " + self.name + " <== " + file); #debug.info(" " + self.name + " <== " + file);
fileExt = file.split(".")[-1] fileExt = file.split(".")[-1]
try: try:
tmp_builder = builder.get_builder(fileExt); tmp_builder = builder.get_builder(fileExt)
multithreading = tmp_builder.get_support_multithreading()
if multithreading == False:
multiprocess.pool_synchrosize()
res_file = tmp_builder.compile(file, res_file = tmp_builder.compile(file,
package_name, package_name,
target, target,
@@ -449,6 +532,8 @@ class Module:
name = self.name, name = self.name,
basic_path = self.origin_path, basic_path = self.origin_path,
module_src = self.src) module_src = self.src)
if multithreading == False:
multiprocess.pool_synchrosize()
if res_file["action"] == "add": if res_file["action"] == "add":
list_sub_file_needed_to_build.append(res_file["file"]) list_sub_file_needed_to_build.append(res_file["file"])
elif res_file["action"] == "path": elif res_file["action"] == "path":
@@ -698,6 +783,9 @@ class Module:
else: else:
debug.error("Dit not know the element type ... (impossible case) type=" + self.type) debug.error("Dit not know the element type ... (impossible case) type=" + self.type)
def add_tools(self, list):
tools.list_append_to(self.tools, list, True)
def add_module_depend(self, list): def add_module_depend(self, list):
tools.list_append_to(self.depends, list, True) tools.list_append_to(self.depends, list, True)
@@ -711,6 +799,7 @@ class Module:
tools.list_append_to_2(self.flags["export"], type, list) tools.list_append_to_2(self.flags["export"], type, list)
# add the link flag at the module # add the link flag at the module
# TODO : Rename this in add_flag
def compile_flags(self, type, list): def compile_flags(self, type, list):
tools.list_append_to_2(self.flags["local"], type, list) tools.list_append_to_2(self.flags["local"], type, list)
@@ -925,29 +1014,32 @@ class Module:
self.ext_project_add_module(target, projectMng) self.ext_project_add_module(target, projectMng)
projectMng.generate_project_file() projectMng.generate_project_file()
module_list=[] module_list=[]
__start_module_name="lutin_" __start_module_name="_"
def import_path(path): def import_path(path_list):
global module_list global module_list
matches = [] global_base = env.get_build_system_base_name()
debug.debug('MODULE: Start find sub File : "%s"' %path) debug.debug("MODULE: Init with Files list:")
for root, dirnames, filenames in os.walk(path): for elem in path_list:
tmpList = fnmatch.filter(filenames, __start_module_name + "*.py") sys.path.append(os.path.dirname(elem))
# Import the module : # Get file name:
for filename in tmpList: filename = os.path.basename(elem)
debug.debug('Module: Find a file : "%s"' %os.path.join(root, filename)) # Remove .py at the end:
#matches.append(os.path.join(root, filename)) filename = filename[:-3]
sys.path.append(os.path.dirname(os.path.join(root, filename)) ) # Remove global base name:
module_name = filename.replace('.py', '') filename = filename[len(global_base):]
module_name = module_name.replace(__start_module_name, '') # Check if it start with the local patern:
debug.debug("MODULE: Integrate module: '" + module_name + "' from '" + os.path.join(root, filename) + "'") if filename[:len(__start_module_name)] != __start_module_name:
module_list.append([module_name, os.path.join(root, filename)]) 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])
debug.verbose("New list module: ") debug.verbose("New list module: ")
for mod in module_list: for elem in module_list:
debug.verbose(" " + str(mod[0])) debug.verbose(" " + str(elem[0]))
def exist(target, name): def exist(target, name):
global module_list global module_list
@@ -961,9 +1053,9 @@ def load_module(target, name):
for mod in module_list: for mod in module_list:
if mod[0] == name: if mod[0] == name:
sys.path.append(os.path.dirname(mod[1])) sys.path.append(os.path.dirname(mod[1]))
debug.verbose("import module : '" + __start_module_name + name + "'") debug.verbose("import module : '" + env.get_build_system_base_name() + __start_module_name + name + "'")
the_module_file = mod[1] the_module_file = mod[1]
the_module = __import__(__start_module_name + name) the_module = __import__(env.get_build_system_base_name() + __start_module_name + name)
# get basic module properties: # get basic module properties:
property = get_module_option(the_module, name) property = get_module_option(the_module, name)
# configure the module: # configure the module:
@@ -1008,6 +1100,7 @@ def load_module(target, name):
debug.debug("Request load module '" + name + "' not define for this platform") debug.debug("Request load module '" + name + "' not define for this platform")
else: else:
target.add_module(tmp_element) target.add_module(tmp_element)
return tmp_element
def list_all_module(): def list_all_module():
global module_list global module_list
@@ -1021,7 +1114,7 @@ def list_all_module_with_desc():
tmpList = [] tmpList = []
for mod in module_list: for mod in module_list:
sys.path.append(os.path.dirname(mod[1])) sys.path.append(os.path.dirname(mod[1]))
the_module = __import__("lutin_" + mod[0]) the_module = __import__(env.get_build_system_base_name() + __start_module_name + mod[0])
tmpList.append(get_module_option(the_module, mod[0])) tmpList.append(get_module_option(the_module, mod[0]))
return tmpList return tmpList
@@ -1035,22 +1128,25 @@ def get_module_option(the_module, name):
compagny_name = None compagny_name = None
maintainer = None maintainer = None
version = None version = None
version_id = None
if "get_type" in dir(the_module): list_of_function_in_factory = dir(the_module)
if "get_type" in list_of_function_in_factory:
type = the_module.get_type() type = the_module.get_type()
else: else:
debug.debug(" function get_type() must be provided in the module: " + name) debug.debug(" function get_type() must be provided in the module: " + name)
if "get_sub_type" in dir(the_module): if "get_sub_type" in list_of_function_in_factory:
sub_type = the_module.get_sub_type() sub_type = the_module.get_sub_type()
if "get_desc" in dir(the_module): if "get_desc" in list_of_function_in_factory:
description = the_module.get_desc() description = the_module.get_desc()
if "get_licence" in dir(the_module): if "get_licence" in list_of_function_in_factory:
license = the_module.get_licence() license = the_module.get_licence()
if "get_compagny_type" in dir(the_module): if "get_compagny_type" in list_of_function_in_factory:
compagny_type = the_module.get_compagny_type() compagny_type = the_module.get_compagny_type()
# com : Commercial # com : Commercial
# net : Network?? # net : Network??
@@ -1064,15 +1160,18 @@ def get_module_option(the_module, name):
if compagny_type not in compagny_type_list: if compagny_type not in compagny_type_list:
debug.warning("[" + name + "] type of the company not normal: " + compagny_type + " not in " + str(compagny_type_list)) debug.warning("[" + name + "] type of the company not normal: " + compagny_type + " not in " + str(compagny_type_list))
if "get_compagny_name" in dir(the_module): if "get_compagny_name" in list_of_function_in_factory:
compagny_name = the_module.get_compagny_name() compagny_name = the_module.get_compagny_name()
if "get_maintainer" in dir(the_module): if "get_maintainer" in list_of_function_in_factory:
maintainer = the_module.get_maintainer() maintainer = the_module.get_maintainer()
if "get_version" in dir(the_module): if "get_version" in list_of_function_in_factory:
version = the_module.get_version() version = the_module.get_version()
if "get_version_id" in list_of_function_in_factory:
version_id = the_module.get_version_id()
return { return {
"name":name, "name":name,
"description":description, "description":description,
@@ -1082,7 +1181,8 @@ def get_module_option(the_module, name):
"compagny-type":compagny_type, "compagny-type":compagny_type,
"compagny-name":compagny_name, "compagny-name":compagny_name,
"maintainer":maintainer, "maintainer":maintainer,
"version":version "version":version,
"version-id":version_id
} }

View File

@@ -24,13 +24,13 @@ from . import tools
from . import env from . import env
from . import depend from . import depend
queueLock = threading.Lock() queue_lock = threading.Lock()
workQueue = queue.Queue() work_queue = queue.Queue()
currentThreadWorking = 0 current_thread_working = 0
threads = [] threads = []
# To know the first error arrive in the pool ==> to display all the time the same error file when multiple compilation # To know the first error arrive in the pool ==> to display all the time the same error file when multiple compilation
currentIdExecution = 0 current_id_execution = 0
errorExecution = { error_execution = {
"id":-1, "id":-1,
"cmd":"", "cmd":"",
"return":0, "return":0,
@@ -38,10 +38,26 @@ errorExecution = {
"out":"", "out":"",
} }
exitFlag = False # resuest stop of the thread exit_flag = False # resuest stop of the thread
isinit = False # the thread are initialized is_init = False # the thread are initialized
errorOccured = False # a thread have an error error_occured = False # a thread have an error
processorAvaillable = 1 # number of CPU core availlable processor_availlable = 1 # number of CPU core availlable
##
## @brief Execute the command with no get of output
##
def run_command_no_lock_out(cmd_line):
# prepare command line:
args = shlex.split(cmd_line)
debug.info("cmd = " + str(args))
try:
# create the subprocess
p = subprocess.Popen(args)
except subprocess.CalledProcessError as e:
debug.error("subprocess.CalledProcessError : " + str(args))
except:
debug.error("Exception on : " + str(args))
# launch the subprocess:
p.communicate()
## ##
## @brief Execute the command and ruturn generate data ## @brief Execute the command and ruturn generate data
@@ -72,9 +88,10 @@ def run_command_direct(cmd_line):
def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_file="", depend_data=None): def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_file="", depend_data=None):
global errorOccured global error_occured
global exitFlag global exit_flag
global currentIdExecution global current_id_execution
global error_execution
# prepare command line: # prepare command line:
args = shlex.split(cmd_line) args = shlex.split(cmd_line)
debug.verbose("cmd = " + str(args)) debug.verbose("cmd = " + str(args))
@@ -95,7 +112,7 @@ def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_
# Check error : # Check error :
if p.returncode == 0: if p.returncode == 0:
debug.debug(env.print_pretty(cmd_line)) debug.debug(env.print_pretty(cmd_line))
queueLock.acquire() queue_lock.acquire()
if depend_data != None: if depend_data != None:
depend.create_dependency_file(depend_data['file'], depend_data['data']) depend.create_dependency_file(depend_data['file'], depend_data['data'])
# TODO : Print the output all the time .... ==> to show warnings ... # TODO : Print the output all the time .... ==> to show warnings ...
@@ -105,10 +122,10 @@ def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_
debug.print_compilator(output) debug.print_compilator(output)
if err != "": if err != "":
debug.print_compilator(err) debug.print_compilator(err)
queueLock.release() queue_lock.release()
else: else:
errorOccured = True error_occured = True
exitFlag = True exit_flag = True
# if No ID : Not in a multiprocess mode ==> just stop here # if No ID : Not in a multiprocess mode ==> just stop here
if build_id < 0: if build_id < 0:
debug.debug(env.print_pretty(cmd_line), force=True) debug.debug(env.print_pretty(cmd_line), force=True)
@@ -120,18 +137,18 @@ def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_
debug.error("can not compile file ... ret : " + str(p.returncode)) debug.error("can not compile file ... ret : " + str(p.returncode))
else: else:
# in multiprocess interface # in multiprocess interface
queueLock.acquire() queue_lock.acquire()
# if an other write an error before, check if the current process is started before ==> then is the first error # if an other write an error before, check if the current process is started before ==> then is the first error
if errorExecution["id"] >= build_id: if error_execution["id"] >= build_id:
# nothing to do ... # nothing to do ...
queueLock.release() queue_lock.release()
return; return;
errorExecution["id"] = build_id error_execution["id"] = build_id
errorExecution["cmd"] = cmd_line error_execution["cmd"] = cmd_line
errorExecution["return"] = p.returncode error_execution["return"] = p.returncode
errorExecution["err"] = err, error_execution["err"] = err,
errorExecution["out"] = output, error_execution["out"] = output,
queueLock.release() queue_lock.release()
# not write the command file... # not write the command file...
return return
debug.verbose("done 3") debug.verbose("done 3")
@@ -141,38 +158,46 @@ def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_
class myThread(threading.Thread): class myThread(threading.Thread):
def __init__(self, threadID, lock, queue): def __init__(self, thread_id, lock, queue):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.thread_id = threadID self.thread_id = thread_id
self.name = "Thread " + str(threadID) self.name = "Thread " + str(thread_id)
self.queue = queue self.queue = queue
self.lock = lock self.lock = lock
def run(self): def run(self):
debug.verbose("Starting " + self.name) debug.verbose("Starting " + self.name)
global exitFlag global exit_flag
global currentThreadWorking global current_thread_working
workingSet = False working_set = False
while exitFlag == False: while exit_flag == False:
self.lock.acquire() self.lock.acquire()
if not self.queue.empty(): if not self.queue.empty():
if workingSet==False: if working_set == False:
currentThreadWorking += 1 current_thread_working += 1
workingSet = True working_set = True
data = self.queue.get() data = self.queue.get()
self.lock.release() self.lock.release()
debug.verbose(self.name + " processing '" + data[0] + "'") debug.verbose(self.name + " processing '" + data[0] + "'")
if data[0]=="cmdLine": if data[0]=="cmd_line":
comment = data[2] comment = data[2]
cmdLine = data[1] cmd_line = data[1]
cmdStoreFile = data[3] cmd_store_file = data[3]
debug.print_element( "[" + str(data[4]) + "][" + str(self.thread_id) + "] " + comment[0], comment[1], comment[2], comment[3]) debug.print_element("[" + str(data[4]) + "][" + str(self.thread_id) + "] " + comment[0],
run_command(cmdLine, cmdStoreFile, build_id=data[4], file=comment[3], store_output_file=data[5], depend_data=data[6]) comment[1],
comment[2],
comment[3])
run_command(cmd_line,
cmd_store_file,
build_id=data[4],
file=comment[3],
store_output_file=data[5],
depend_data=data[6])
else: else:
debug.warning("unknow request command : " + data[0]) debug.warning("unknow request command : " + data[0])
else: else:
if workingSet==True: if working_set==True:
currentThreadWorking -= 1 current_thread_working -= 1
workingSet=False working_set=False
# no element to parse, just wait ... # no element to parse, just wait ...
self.lock.release() self.lock.release()
time.sleep(0.2) time.sleep(0.2)
@@ -180,39 +205,41 @@ class myThread(threading.Thread):
debug.verbose("Exiting " + self.name) debug.verbose("Exiting " + self.name)
def error_occured(): def set_error_occured():
global exitFlag global exit_flag
exitFlag = True exit_flag = True
def set_core_number(numberOfcore): def set_core_number(number_of_core):
global processorAvaillable global processor_availlable
processorAvaillable = numberOfcore processor_availlable = number_of_core
debug.debug(" set number of core for multi process compilation : " + str(processorAvaillable)) debug.debug(" set number of core for multi process compilation : " + str(processor_availlable))
# nothing else to do # nothing else to do
def init(): def init():
global exitFlag global error_occured
global isinit global exit_flag
if isinit==False: global is_init
isinit=True if is_init == False:
is_init = True
error_occured = False
global threads global threads
global queueLock global queue_lock
global workQueue global work_queue
# Create all the new threads # Create all the new threads
threadID = 0 thread_id = 0
while threadID < processorAvaillable: while thread_id < processor_availlable:
thread = myThread(threadID, queueLock, workQueue) thread = myThread(thread_id, queue_lock, work_queue)
thread.start() thread.start()
threads.append(thread) threads.append(thread)
threadID += 1 thread_id += 1
def un_init(): def un_init():
global exitFlag global exit_flag
# Notify threads it's time to exit # Notify threads it's time to exit
exitFlag = True exit_flag = True
if processorAvaillable > 1: if processor_availlable > 1:
# Wait for all threads to complete # Wait for all threads to complete
for tmp in threads: for tmp in threads:
debug.verbose("join thread ...") debug.verbose("join thread ...")
@@ -222,53 +249,53 @@ def un_init():
def run_in_pool(cmd_line, comment, store_cmd_line="", store_output_file="", depend_data=None): def run_in_pool(cmd_line, comment, store_cmd_line="", store_output_file="", depend_data=None):
global currentIdExecution global current_id_execution
if processorAvaillable <= 1: if processor_availlable <= 1:
debug.print_element(comment[0], comment[1], comment[2], comment[3]) debug.print_element(comment[0], comment[1], comment[2], comment[3])
run_command(cmd_line, store_cmd_line, file=comment[3], store_output_file=store_output_file, depend_data=depend_data) run_command(cmd_line, store_cmd_line, file=comment[3], store_output_file=store_output_file, depend_data=depend_data)
return return
# multithreaded mode # multithreaded mode
init() init()
# Fill the queue # Fill the queue
queueLock.acquire() queue_lock.acquire()
debug.verbose("add : in pool cmdLine") debug.verbose("add : in pool cmd_line")
workQueue.put(["cmdLine", cmd_line, comment, store_cmd_line, currentIdExecution, store_output_file, depend_data]) work_queue.put(["cmd_line", cmd_line, comment, store_cmd_line, current_id_execution, store_output_file, depend_data])
currentIdExecution +=1; current_id_execution +=1;
queueLock.release() queue_lock.release()
def pool_synchrosize(): def pool_synchrosize():
global errorOccured global error_occured
global errorExecution global error_execution
if processorAvaillable <= 1: if processor_availlable <= 1:
#in this case : nothing to synchronise #in this case : nothing to synchronise
return return
debug.verbose("wait queue process ended\n") debug.verbose("wait queue process ended\n")
# Wait for queue to empty # Wait for queue to empty
while not workQueue.empty() \ while not work_queue.empty() \
and False==errorOccured: and error_occured == False:
time.sleep(0.2) time.sleep(0.2)
pass pass
# Wait all thread have ended their current process # Wait all thread have ended their current process
while currentThreadWorking != 0 \ while current_thread_working != 0 \
and False==errorOccured: and error_occured == False:
time.sleep(0.2) time.sleep(0.2)
pass pass
if False==errorOccured: if error_occured == False:
debug.verbose("queue is empty") debug.verbose("queue is empty")
else: else:
un_init() un_init()
debug.debug("Thread return with error ... ==> stop all the pool") debug.debug("Thread return with error ... ==> stop all the pool")
if errorExecution["id"] == -1: if error_execution["id"] == -1:
debug.error("Pool error occured ... (No return information on Pool)") debug.error("Pool error occured ... (No return information on Pool)")
return return
debug.error("Error in an pool element : [" + str(errorExecution["id"]) + "]", crash=False) debug.error("Error in an pool element : [" + str(error_execution["id"]) + "]", crash=False)
debug.debug(env.print_pretty(errorExecution["cmd"]), force=True) debug.debug(env.print_pretty(error_execution["cmd"]), force=True)
debug.print_compilator(str(errorExecution["out"][0])) debug.print_compilator(str(error_execution["out"][0]))
debug.print_compilator(str(errorExecution["err"][0])) debug.print_compilator(str(error_execution["err"][0]))
if errorExecution["return"] == 2: if error_execution["return"] == 2:
debug.error("can not compile file ... [keyboard interrrupt]") debug.error("can not compile file ... [keyboard interrrupt]")
else: else:
debug.error("can not compile file ... return value : " + str(errorExecution["return"])) debug.error("can not compile file ... return value : " + str(error_execution["return"]))

View File

@@ -16,6 +16,7 @@ import datetime
from . import debug from . import debug
from . import module from . import module
from . import tools from . import tools
from . import env
class System: class System:
def __init__(self): def __init__(self):
@@ -46,6 +47,8 @@ class System:
else: else:
self.action_on_state[name_of_state].append([level, name, action]) self.action_on_state[name_of_state].append([level, name, action])
def __repr__(self):
return "{lutin.System}"
@@ -73,64 +76,73 @@ def create_module_from_system(target, dict):
# Dictionnaire of Target name # Dictionnaire of Target name
# inside table of ["Name of the lib", "path of the lib", boolean loaded, module loaded] # inside table of ["Name of the lib", "path of the lib", boolean loaded, module loaded]
systemList={} system_list={}
__start_system_name="lutinSystem_" __start_system_name="System_"
def import_path(path_list):
global system_list
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")
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))
for val in system_list[elem]:
debug.verbose(" " + str(val["name"]))
def import_path(path):
global targetList
matches = []
debug.debug('Start find sub File : "%s"' %path)
for root, dirnames, filenames in os.walk(path):
tmpList = fnmatch.filter(filenames, __start_system_name + "*.py")
# Import the module :
for filename in tmpList:
debug.verbose(' Find a file : "%s"' %os.path.join(root, filename))
sys.path.append(os.path.dirname(os.path.join(root, filename)) )
systemName = filename.replace('.py', '')
systemName = systemName.replace(__start_system_name, '')
targetType, systemName = systemName.split('_')
debug.debug("integrate system: '" + targetType + "':'" + systemName + "' from '" + os.path.join(root, filename) + "'")
if targetType in systemList:
systemList[targetType].append({"name":systemName,
"path":os.path.join(root, filename),
"system":None,
"loaded":False,
"exist":False,
"module":None})
else:
systemList[targetType] = [{"name":systemName,
"path":os.path.join(root, filename),
"system":None,
"loaded":False,
"exist":False,
"module":None}]
debug.debug("list system=" + str(systemList))
def display(): def display():
global systemList global system_list
for elementName in systemList: for elementName in system_list:
debug.info("integrate system: '" + elementName +"'") debug.info("SYSTEM: Integrate system: '" + elementName +"'")
for data in systemList[elementName]: for data in system_list[elementName]:
debug.info(" '" + data["name"] +"' in " + data["path"]) debug.info("SYSTEM: '" + data["name"] +"' in " + data["path"])
def exist(lib_name, target_name, target) : def exist(lib_name, target_name, target) :
global systemList global system_list
debug.verbose("exist= " + lib_name + " in " + target_name) debug.verbose("exist= " + lib_name + " in " + target_name)
if target_name not in systemList: if target_name not in system_list:
return False return False
for data in systemList[target_name]: for data in system_list[target_name]:
if data["name"] == lib_name: if data["name"] == lib_name:
# we find it in the List ==> need to check if it is present in the system : # we find it in the List ==> need to check if it is present in the system :
if data["loaded"] == False: if data["loaded"] == False:
debug.verbose("add to path: '" + os.path.dirname(data["path"]) + "'") debug.verbose("add to path: '" + os.path.dirname(data["path"]) + "'")
sys.path.append(os.path.dirname(data["path"])) sys.path.append(os.path.dirname(data["path"]))
debug.verbose("import system : '" + data["name"] + "'") debug.verbose("import system : '" + data["name"] + "'")
theSystem = __import__(__start_system_name + target_name + "_" + data["name"]) theSystem = __import__(env.get_build_system_base_name() + __start_system_name + target_name + "_" + data["name"])
#create the system module #create the system module
try: try:
debug.info("call : " + data["name"]) debug.verbose("SYSTEM: request: " + data["name"])
data["system"] = theSystem.System(target) data["system"] = theSystem.System(target)
data["exist"] = data["system"].valid data["exist"] = data["system"].valid
except: except:
@@ -139,10 +151,10 @@ def exist(lib_name, target_name, target) :
return False return False
def load(target, lib_name, target_name): def load(target, lib_name, target_name):
global systemList global system_list
if target_name not in systemList: if target_name not in system_list:
debug.error("you must call this function after checking of the system exist() !1!") debug.error("you must call this function after checking of the system exist() !1!")
for data in systemList[target_name]: for data in system_list[target_name]:
if data["name"] == lib_name: if data["name"] == lib_name:
if data["exist"] == False: if data["exist"] == False:
debug.error("you must call this function after checking of the system exist() !2!") debug.error("you must call this function after checking of the system exist() !2!")

View File

@@ -19,6 +19,7 @@ from . import tools
from . import module from . import module
from . import system from . import system
from . import multiprocess from . import multiprocess
from . import env
class Target: class Target:
def __init__(self, name, config, arch): def __init__(self, name, config, arch):
@@ -120,8 +121,8 @@ class Target:
"-ftest-coverage" "-ftest-coverage"
]) ])
self.add_flag("link", [ self.add_flag("link", [
"-fprofile-arcs", "-lgcov",
"-ftest-coverage" "--coverage"
]) ])
self.update_path_tree() self.update_path_tree()
@@ -154,6 +155,9 @@ class Target:
# special case for IOS (example) no build dynamicly ... # special case for IOS (example) no build dynamicly ...
self.support_dynamic_link = True self.support_dynamic_link = True
def __repr__(self):
return "{lutin.Target}"
def add_flag(self, type, list): def add_flag(self, type, list):
tools.list_append_to_2(self.global_flags, type, list) tools.list_append_to_2(self.global_flags, type, list)
@@ -216,6 +220,16 @@ class Target:
self.strip = self.cross + "strip" self.strip = self.cross + "strip"
self.dlltool = self.cross + "dlltool" self.dlltool = self.cross + "dlltool"
self.update_path_tree() self.update_path_tree()
#some static libraries that is sometime needed when not use stdlib ...
ret = multiprocess.run_command_direct(self.xx + " -print-file-name=libgcc.a");
if ret == False:
debug.error("Can not get the g++/clang++ libgcc.a ...")
self.stdlib_name_libgcc = ret;
ret = multiprocess.run_command_direct(self.xx + " -print-file-name=libsupc++.a");
if ret == False:
debug.error("Can not get the g++/clang++ libsupc++.a ...")
self.stdlib_name_libsupc = ret;
def get_build_mode(self): def get_build_mode(self):
return self.config["mode"] return self.config["mode"]
@@ -422,19 +436,18 @@ class Target:
for elem in self.module_list: for elem in self.module_list:
if elem.name == name: if elem.name == name:
return True return True
# TODO : Check internal module and system module ...
# need to import the module (or the system module ...)
exist = system.exist(name, self.name, self)
if exist == True:
system.load(self, name, self.name)
return True;
# try to find in the local Modules: # try to find in the local Modules:
exist = module.exist(self, name) exist = module.exist(self, name)
if exist == True: if exist == True:
module.load_module(self, name) module.load_module(self, name)
return True; return True;
else: # need to import the module (or the system module ...)
return False; exist = system.exist(name, self.name, self)
if exist == True:
system.load(self, name, self.name)
return True;
# we did not find the module ...
return False;
def load_all(self): def load_all(self):
listOfAllTheModule = module.list_all_module() listOfAllTheModule = module.list_all_module()
@@ -450,7 +463,7 @@ class Target:
def build(self, name, packagesName=None, optionnal=False): def build(self, name, packagesName=None, optionnal=False):
if name == "gcov": if name == "gcov":
debug.info("gcov all") debug.info("gcov all")
debug.error("must set the gcov parsig on a specific library or binary ==> not supported now for all") debug.error("must set the gcov parsing on a specific library or binary ==> not supported now for all")
if name == "dump": if name == "dump":
debug.info("dump all") debug.info("dump all")
self.load_all() self.load_all()
@@ -478,49 +491,103 @@ class Target:
name2 = name.replace("@", "?") name2 = name.replace("@", "?")
gettedElement = name2.split("?") gettedElement = name2.split("?")
module_name = gettedElement[0] module_name = gettedElement[0]
if len(gettedElement)>=3: action_list = gettedElement[1:]
sub_action_name = gettedElement[2] if len(action_list) == 0:
else: action_list = ["build"]
sub_action_name = "" debug.verbose("requested : " + module_name + " ? actions:" + str(action_list))
if len(gettedElement)>=2: for action_name in action_list:
actionName = gettedElement[1] debug.verbose("requested : " + module_name + "?" + action_name + " [START]")
else : ret = None;
actionName = "build" if action_name == "install":
debug.verbose("requested : " + module_name + "?" + actionName) try:
if actionName == "install": self.install_package(module_name)
self.build(module_name + "?build") except AttributeError:
self.install_package(module_name) debug.error("target have no 'install_package' instruction")
elif actionName == "uninstall": elif action_name == "uninstall":
self.un_install_package(module_name) try:
elif actionName == "log": self.un_install_package(module_name)
self.Log(module_name) except AttributeError:
else: debug.error("target have no 'un_install_package' instruction")
present = self.load_if_needed(module_name, optionnal=optionnal) elif action_name[:3] == "run":
if present == False \ if len(action_name) > 3:
and optionnal == True: # we have option:
return [heritage.HeritageList(), False] action_name2 = action_name.replace("\:", "1234COLUMN4321")
# clean requested option_list = action_name2.split(":")
for mod in self.module_list: if len(option_list) == 0:
if mod.name == module_name: debug.warning("action 'run' wrong options options ... : '" + action_name + "' might be separate with ':'")
if actionName == "dump": option_list = []
debug.info("dump module '" + module_name + "'") else:
return mod.display(self) option_list_tmp = option_list[1:]
elif actionName == "clean": option_list = []
debug.info("clean module '" + module_name + "'") for elem in option_list_tmp:
return mod.clean(self) option_list.append(elem.replace("1234COLUMN4321", ":"))
elif actionName == "gcov": else:
debug.debug("gcov on module '" + module_name + "'") option_list = []
if sub_action_name == "output": #try:
return mod.gcov(self, generate_output=True) self.run(module_name, option_list)
return mod.gcov(self, generate_output=False) #except AttributeError:
elif actionName == "build": # debug.error("target have no 'run' instruction")
debug.debug("build module '" + module_name + "'") elif action_name == "log":
if optionnal == True: try:
return [mod.build(self, None), True] self.show_log(module_name)
return mod.build(self, None) except AttributeError:
if optionnal == True: debug.error("target have no 'show_log' instruction")
return [heritage.HeritageList(), False] else:
debug.error("not know module name : '" + module_name + "' to '" + actionName + "' it") present = self.load_if_needed(module_name, optionnal=optionnal)
if present == False \
and optionnal == True:
ret = [heritage.HeritageList(), False]
else:
# clean requested
for mod in self.module_list:
if mod.name == module_name:
if action_name[:4] == "dump":
debug.info("dump module '" + module_name + "'")
if len(action_name) > 4:
debug.warning("action 'dump' does not support options ... : '" + action_name + "'")
ret = mod.display(self)
break
elif action_name[:5] == "clean":
debug.info("clean module '" + module_name + "'")
if len(action_name) > 5:
debug.warning("action 'clean' does not support options ... : '" + action_name + "'")
ret = mod.clean(self)
break
elif action_name[:4] == "gcov":
debug.debug("gcov on module '" + module_name + "'")
if len(action_name) > 4:
# we have option:
option_list = action_name.split(":")
if len(option_list) == 0:
debug.warning("action 'gcov' wrong options options ... : '" + action_name + "' might be separate with ':'")
option_list = []
else:
option_list = option_list[1:]
else:
option_list = []
if "output" in option_list:
ret = mod.gcov(self, generate_output=True)
else:
ret = mod.gcov(self, generate_output=False)
break
elif action_name[:5] == "build":
if len(action_name) > 5:
debug.warning("action 'build' does not support options ... : '" + action_name + "'")
debug.debug("build module '" + module_name + "'")
if optionnal == True:
ret = [mod.build(self, None), True]
else:
ret = mod.build(self, None)
break
if optionnal == True \
and ret == None:
ret = [heritage.HeritageList(), False]
break
if ret == None:
debug.error("not know module name : '" + module_name + "' to '" + action_name + "' it")
debug.verbose("requested : " + module_name + "?" + action_name + " [STOP]")
if len(action_list) == 1:
return ret
def add_action(self, name_of_state="PACKAGE", level=5, name="no-name", action=None): def add_action(self, name_of_state="PACKAGE", level=5, name="no-name", action=None):
debug.verbose("add action : " + name) debug.verbose("add action : " + name)
@@ -737,25 +804,32 @@ class Target:
target_list=[] target_list=[]
__start_target_name="lutinTarget_" __start_target_name="Target_"
def import_path(path): def import_path(path_list):
global target_list global target_list
matches = [] global_base = env.get_build_system_base_name()
debug.debug('TARGET: Start find sub File : "%s"' %path) debug.debug("TARGET: Init with Files list:")
for root, dirnames, filenames in os.walk(path): for elem in path_list:
tmpList = fnmatch.filter(filenames, __start_target_name + "*.py") sys.path.append(os.path.dirname(elem))
# Import the module : # Get file name:
for filename in tmpList: filename = os.path.basename(elem)
debug.debug('TARGET: Find a file : "%s"' %os.path.join(root, filename)) # Remove .py at the end:
#matches.append(os.path.join(root, filename)) filename = filename[:-3]
sys.path.append(os.path.dirname(os.path.join(root, filename)) ) # Remove global base name:
targetName = filename.replace('.py', '') filename = filename[len(global_base):]
targetName = targetName.replace(__start_target_name, '') # Check if it start with the local patern:
debug.debug("TARGET: integrate module: '" + targetName + "' from '" + os.path.join(root, filename) + "'") if filename[:len(__start_target_name)] != __start_target_name:
target_list.append([targetName,os.path.join(root, filename)]) 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]))
def load_target(name, config): def load_target(name, config):
global target_list global target_list
@@ -767,8 +841,8 @@ def load_target(name, config):
if mod[0] == name: if mod[0] == name:
debug.verbose("add to path: '" + os.path.dirname(mod[1]) + "'") debug.verbose("add to path: '" + os.path.dirname(mod[1]) + "'")
sys.path.append(os.path.dirname(mod[1])) sys.path.append(os.path.dirname(mod[1]))
debug.verbose("import target : '" + __start_target_name + name + "'") debug.verbose("import target : '" + env.get_build_system_base_name() + __start_target_name + name + "'")
theTarget = __import__(__start_target_name + name) theTarget = __import__(env.get_build_system_base_name() + __start_target_name + name)
#create the target #create the target
tmpTarget = theTarget.Target(config) tmpTarget = theTarget.Target(config)
return tmpTarget return tmpTarget
@@ -786,7 +860,7 @@ def list_all_target_with_desc():
tmpList = [] tmpList = []
for mod in target_list: for mod in target_list:
sys.path.append(os.path.dirname(mod[1])) sys.path.append(os.path.dirname(mod[1]))
theTarget = __import__(__start_target_name + mod[0]) theTarget = __import__(env.get_build_system_base_name() + __start_target_name + mod[0])
try: try:
tmpdesc = theTarget.get_desc() tmpdesc = theTarget.get_desc()
tmpList.append([mod[0], tmpdesc]) tmpList.append([mod[0], tmpdesc])

View File

@@ -323,6 +323,10 @@ def list_append_to(out_list, in_list, order=False):
debug.warning("can not add in list other than {list/dict/str} : " + str(type(in_list))) debug.warning("can not add in list other than {list/dict/str} : " + str(type(in_list)))
def list_append_to_2(listout, module, list, order=False): def list_append_to_2(listout, module, list, order=False):
# sepcial cse of bool
if type(list) == bool:
listout[module] = list
return
# add list in the Map # add list in the Map
if module not in listout: if module not in listout:
listout[module] = [] listout[module] = []

View File

@@ -36,6 +36,13 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["", "exe", "bin"] return ["", "exe", "bin"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return False
## ##
## @brief Commands for running gcc to link an executable. ## @brief Commands for running gcc to link an executable.
@@ -62,9 +69,14 @@ def link(file, binary, target, depancy, flags, name, basic_path, static = False)
if lib_name not in depancy.src['dynamic']: if lib_name not in depancy.src['dynamic']:
list_static.append(elem) list_static.append(elem)
#create comand line: #create comand line:
cmd = [ cmd = []
target.xx # a specific case to not depend on the libstdc++ automaticly added by the G++ or clang++ compilator ==> then need to compile with GCC or CLANG if use libcxx from llvm or other ...
] if "need-libstdc++" in depancy.flags \
and depancy.flags["need-libstdc++"] == True:
cmd.append(target.xx)
else:
cmd.append(target.cc)
try: try:
cmd.append(target.arch) cmd.append(target.arch)
except: except:
@@ -114,9 +126,21 @@ def link(file, binary, target, depancy, flags, name, basic_path, static = False)
except: except:
pass pass
try: try:
cmd.append(target.global_flags_ld) cmd.append(target.global_flags["link"])
except: except:
pass pass
for view in ["local", "export"]:
if view not in flags:
continue
for type in ["link-lib"]:
if type in flags[view]:
cmd.append([("-l" + sss).replace("-l/", "/") for sss in flags[view][type] ])
for type in ["link-lib"]:
if type in depancy.flags:
cmd.append([("-l" + sss).replace("-l/", "/") for sss in depancy.flags[type] ])
for type in ["link-lib"]:
if type in target.global_flags:
cmd.append([("-l" + sss).replace("-l/", "/") for sss in target.global_flags[type] ])
cmd_line = tools.list_to_str(cmd) cmd_line = tools.list_to_str(cmd)
# check the dependency for this file : # check the dependency for this file :
if depend.need_re_package(file_dst, file_src, True, file_cmd=file_cmd, cmd_line=cmd_line) == False \ if depend.need_re_package(file_dst, file_src, True, file_cmd=file_cmd, cmd_line=cmd_line) == False \

View File

@@ -37,6 +37,14 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["o"] return ["o"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return True
## ##
## @brief Commands for running gcc to compile a C file in object file. ## @brief Commands for running gcc to compile a C file in object file.
## ##

View File

@@ -36,6 +36,14 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["o"] return ["o"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return True
def remove_element(data, to_remove): def remove_element(data, to_remove):
out = [] out = []
for elem in data: for elem in data:

View File

@@ -35,6 +35,14 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["jar"] return ["jar"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return False
## ##
## @brief Commands for running gcc to link a shared library. ## @brief Commands for running gcc to link a shared library.
## ##

View File

@@ -33,6 +33,14 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["class"] return ["class"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return False
def create_dependency_files(target, src, heritage_src, basic_path): def create_dependency_files(target, src, heritage_src, basic_path):
depend = [] depend = []
for elem in src: for elem in src:

View File

@@ -33,6 +33,14 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["h"] return ["h"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return False
def create_dependency_files(target, src, heritage_src, basic_path): def create_dependency_files(target, src, heritage_src, basic_path):
depend = [] depend = []
for elem in src: for elem in src:

View File

@@ -35,6 +35,14 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["so", "dynlib", "dll"] return ["so", "dynlib", "dll"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return False
## ##
## @brief Commands for running gcc to link a shared library. ## @brief Commands for running gcc to link a shared library.
## ##
@@ -59,10 +67,15 @@ def link(file, binary, target, depancy, flags, name, basic_path, static=False):
if lib_name not in depancy.src['dynamic']: if lib_name not in depancy.src['dynamic']:
list_static.append(elem) list_static.append(elem)
#create command Line #create command Line
cmd = [ cmd = []
target.xx, # a specific case to not depend on the libstdc++ automaticly added by the G++ or clang++ compilator ==> then need to compile with GCC or CLANG if use libcxx from llvm or other ...
"-o", file_dst if "need-libstdc++" in depancy.flags \
] and depancy.flags["need-libstdc++"] == True:
cmd.append(target.xx)
else:
cmd.append(target.cc)
cmd.append(["-o", file_dst])
try: try:
cmd.append(target.global_sysroot) cmd.append(target.global_sysroot)
except: except:
@@ -76,11 +89,20 @@ def link(file, binary, target, depancy, flags, name, basic_path, static=False):
cmd.append(file_src) cmd.append(file_src)
except: except:
pass pass
try: for view in ["local", "export"]:
# keep only compilated files ... if view not in flags:
continue
for type in ["link", "link-dynamic"]:
if type in flags[view]:
cmd.append(flags[view][type])
for type in ["link", "link-dynamic"]:
if type in depancy.flags:
cmd.append(depancy.flags[type])
for type in ["link", "link-dynamic"]:
if type in target.global_flags:
cmd.append(target.global_flags[type])
if 'src' in depancy.src:
cmd.append(tools.filter_extention(depancy.src['src'], get_input_type())) cmd.append(tools.filter_extention(depancy.src['src'], get_input_type()))
except:
pass
try: try:
cmd.append(list_static) cmd.append(list_static)
except: except:
@@ -97,22 +119,18 @@ def link(file, binary, target, depancy, flags, name, basic_path, static=False):
cmd.append("-Wl,-R$ORIGIN/../lib/") cmd.append("-Wl,-R$ORIGIN/../lib/")
except: except:
pass pass
try: for view in ["local", "export"]:
cmd.append(flags["local"]["link"]) if view not in flags:
except: continue
pass for type in ["link-lib"]:
try: if type in flags[view]:
cmd.append(flags["export"]["link"]) cmd.append([("-l" + sss).replace("-l/", "/") for sss in flags[view][type] ])
except: for type in ["link-lib"]:
pass if type in depancy.flags:
try: cmd.append([("-l" + sss).replace("-l/", "/") for sss in depancy.flags[type] ])
cmd.append(depancy.flags["link"]) for type in ["link-lib"]:
except: if type in target.global_flags:
pass cmd.append([("-l" + sss).replace("-l/", "/") for sss in target.global_flags[type] ])
try:
cmd.append(target.global_flags["link"])
except:
pass
cmdLine=tools.list_to_str(cmd) cmdLine=tools.list_to_str(cmd)
# check the dependency for this file : # check the dependency for this file :
if depend.need_re_package(file_dst, file_src, True, file_cmd, cmdLine) == False \ if depend.need_re_package(file_dst, file_src, True, file_cmd, cmdLine) == False \

View File

@@ -35,6 +35,14 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["a"] return ["a"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return False
## ##
## @brief Commands for running ar. ## @brief Commands for running ar.
## ##

View File

@@ -38,6 +38,14 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["o"] return ["o"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return True
## ##
## @brief Commands for running gcc to compile a m file in object file. ## @brief Commands for running gcc to compile a m file in object file.
## ##
@@ -94,7 +102,7 @@ def compile(file, binary, target, depancy, flags, path, name, basic_path, module
# Create cmd line # Create cmd line
cmdLine=tools.list_to_str(cmd) cmdLine=tools.list_to_str(cmd)
# check the dependency for this file : # check the dependency for this file :
if False==depend.need_re_build(file_dst, file_src, file_depend, file_cmd, cmdLine): if depend.need_re_build(file_dst, file_src, file_depend, file_cmd, cmdLine) == False:
return {"action":"add", "file":file_dst} return {"action":"add", "file":file_dst}
tools.create_directory_of_file(file_dst) tools.create_directory_of_file(file_dst)
comment = ["m", name, "<==", file] comment = ["m", name, "<==", file]

View File

@@ -38,6 +38,14 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["o"] return ["o"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return True
## ##
## @brief Commands for running gcc to compile a m++ file in object file. ## @brief Commands for running gcc to compile a m++ file in object file.
## ##

View File

@@ -31,3 +31,11 @@ def get_input_type():
## ##
def get_output_type(): def get_output_type():
return ["o"] return ["o"]
##
## @brief Get builder support multi-threading or not
## @return True Multithreading supported
## @return False Multithreading NOT supported
##
def get_support_multithreading():
return True

View File

@@ -23,8 +23,8 @@ class System(system.System):
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_sources(jar_file_path) self.add_export_sources(jar_file_path)
self.add_export_flag("link", "-ldl") self.add_export_flag("link-lib", "dl")
self.add_export_flag("link", "-llog") self.add_export_flag("link-lib", "log")
self.add_export_flag("link", "-landroid") self.add_export_flag("link-lib", "android")

View File

@@ -0,0 +1,25 @@
#!/usr/bin/python
##
## @author Edouard DUPIN
##
## @copyright 2012, Edouard DUPIN, all right reserved
##
## @license APACHE v2.0 (see license file)
##
from lutin import debug
from lutin import system
from lutin import tools
import os
class System(system.System):
def __init__(self, target):
system.System.__init__(self)
# create some HELP:
self.help="M : m library \n base of std libs (availlagle in GNU C lib and bionic"
# No check ==> on the basic std libs:
self.valid = True
# todo : create a searcher of the presence of the library:
self.add_export_flag("link-lib", "m")

View File

@@ -19,7 +19,8 @@ class System(system.System):
self.help = "CXX: Generic C++ library" self.help = "CXX: Generic C++ library"
self.valid = True self.valid = True
# no check needed ==> just add this: # no check needed ==> just add this:
self.add_export_flag("c++","-D__STDCPP_LLVM__") self.add_export_flag("c++", "-D__STDCPP_LLVM__")
self.add_export_flag("c++-remove","-nostdlib") self.add_export_flag("c++-remove", "-nostdlib")
self.add_export_flag("need-libstdc++", True)

View File

@@ -0,0 +1,25 @@
#!/usr/bin/python
##
## @author Edouard DUPIN
##
## @copyright 2012, Edouard DUPIN, all right reserved
##
## @license APACHE v2.0 (see license file)
##
from lutin import debug
from lutin import system
from lutin import tools
import os
class System(system.System):
def __init__(self, target):
system.System.__init__(self)
# create some HELP:
self.help="M : m library \n base of std libs (availlagle in GNU C lib and bionic"
# No check ==> on the basic std libs:
self.valid = True
# todo : create a searcher of the presence of the library:
self.add_export_flag("link-lib", "m")

View File

@@ -24,6 +24,6 @@ class System(system.System):
return; return;
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_flag("link", "-lasound") self.add_export_flag("link-lib", "asound")

View File

@@ -23,10 +23,10 @@ class System(system.System):
return; return;
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_flag("link", [ self.add_export_flag("link-lib", [
"-lboost_system", "boost_system",
"-lboost_thread", "boost_thread",
"-lboost_chrono" "boost_chrono"
]) ])

View File

@@ -19,7 +19,8 @@ class System(system.System):
self.help = "CXX: Generic C++ library" self.help = "CXX: Generic C++ library"
self.valid = True self.valid = True
# no check needed ==> just add this: # no check needed ==> just add this:
self.add_export_flag("c++","-D__STDCPP_GNU__") self.add_export_flag("c++", "-D__STDCPP_GNU__")
self.add_export_flag("c++-remove","-nostdlib") self.add_export_flag("c++-remove", "-nostdlib")
self.add_export_flag("need-libstdc++", True)

View File

@@ -23,6 +23,6 @@ class System(system.System):
return; return;
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_flag("link", "-ljack") self.add_export_flag("link-lib", "jack")

View File

@@ -0,0 +1,25 @@
#!/usr/bin/python
##
## @author Edouard DUPIN
##
## @copyright 2012, Edouard DUPIN, all right reserved
##
## @license APACHE v2.0 (see license file)
##
from lutin import debug
from lutin import system
from lutin import tools
import os
class System(system.System):
def __init__(self, target):
system.System.__init__(self)
# create some HELP:
self.help="M : m library \n base of std libs (availlagle in GNU C lib and bionic"
# No check ==> on the basic std libs:
self.valid = True
# todo : create a searcher of the presence of the library:
self.add_export_flag("link-lib", "m")

View File

@@ -24,7 +24,7 @@ class System(system.System):
return; return;
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_flag("link", "-ljack") self.add_export_flag("link-lib", "oss")
""" """

View File

@@ -23,6 +23,6 @@ class System(system.System):
return; return;
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_flag("link", ["-lpulse-simple", "-lpulse"]) self.add_export_flag("link-lib", ["pulse-simple", "pulse"])

View File

@@ -23,6 +23,6 @@ class System(system.System):
return; return;
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_flag("link", "-lz") self.add_export_flag("link-lib", "z")

View File

@@ -21,5 +21,6 @@ class System(system.System):
# no check needed ==> just add this: # no check needed ==> just add this:
self.add_export_flag("c++","-D__STDCPP_LLVM__") self.add_export_flag("c++","-D__STDCPP_LLVM__")
self.add_export_flag("c++-remove","-nostdlib") self.add_export_flag("c++-remove","-nostdlib")
self.add_export_flag("need-libstdc++", True)

View File

@@ -0,0 +1,25 @@
#!/usr/bin/python
##
## @author Edouard DUPIN
##
## @copyright 2012, Edouard DUPIN, all right reserved
##
## @license APACHE v2.0 (see license file)
##
from lutin import debug
from lutin import system
from lutin import tools
import os
class System(system.System):
def __init__(self, target):
system.System.__init__(self)
# create some HELP:
self.help="M : m library \n base of std libs (availlagle in GNU C lib and bionic"
# No check ==> on the basic std libs:
self.valid = True
# todo : create a searcher of the presence of the library:
self.add_export_flag("link-lib", "m")

View File

@@ -27,5 +27,6 @@ class System(system.System):
"-static-libstdc++", "-static-libstdc++",
"-static" "-static"
]) ])
self.add_export_flag("need-libstdc++", True)

View File

@@ -23,10 +23,10 @@ class System(system.System):
return; return;
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_flag("link",[ self.add_export_flag("link-lib",[
"-ldsound", "dsound",
"-lwinmm", "winmm",
"-lole32" "ole32"
]) ])

View File

@@ -0,0 +1,25 @@
#!/usr/bin/python
##
## @author Edouard DUPIN
##
## @copyright 2012, Edouard DUPIN, all right reserved
##
## @license APACHE v2.0 (see license file)
##
from lutin import debug
from lutin import system
from lutin import tools
import os
class System(system.System):
def __init__(self, target):
system.System.__init__(self)
# create some HELP:
self.help="M : m library \n base of std libs (availlagle in GNU C lib and bionic"
# No check ==> on the basic std libs:
self.valid = True
# todo : create a searcher of the presence of the library:
self.add_export_flag("link-lib", "m")

View File

@@ -28,7 +28,6 @@ class Target(target.Target):
self.type_arch = "" self.type_arch = ""
target.Target.__init__(self, "Android", config, self.type_arch) target.Target.__init__(self, "Android", config, self.type_arch)
debug.warning("plop " + str(self.ar))
if config["bus-size"] == "32": if config["bus-size"] == "32":
self.type_arch="armv7" self.type_arch="armv7"
else: else:
@@ -277,7 +276,7 @@ class Target(target.Target):
pkg_name_application_name = pkg_name pkg_name_application_name = pkg_name
if self.config["mode"] == "debug": if self.config["mode"] == "debug":
pkg_name_application_name += "debug" pkg_name_application_name += "debug"
debug.info("ploppppp: " + str(pkg_properties)) #debug.info("ploppppp: " + str(pkg_properties))
# FINAL_path_JAVA_PROJECT # FINAL_path_JAVA_PROJECT
self.path_java_project = os.path.join(target_outpath, self.path_java_project = os.path.join(target_outpath,
"src") "src")
@@ -513,7 +512,7 @@ class Target(target.Target):
cmdLine = self.path_sdk + "/platform-tools/adb uninstall " + pkg_name_application_name cmdLine = self.path_sdk + "/platform-tools/adb uninstall " + pkg_name_application_name
Rmultiprocess.run_command(cmdLine) Rmultiprocess.run_command(cmdLine)
def Log(self, pkg_name): def show_log(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("logcat of android board") debug.info("logcat of android board")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")

View File

@@ -74,8 +74,8 @@ class Target(target.Target):
"-fobjc-link-runtime" "-fobjc-link-runtime"
]) ])
self.add_flag("m", ["-fobjc-arc") self.add_flag("m", ["-fobjc-arc"])
#self.add_flag("m", ["-fmodules") #self.add_flag("m", ["-fmodules"])
self.pkg_path_data = "share" self.pkg_path_data = "share"
self.pkg_path_bin = "" self.pkg_path_bin = ""

View File

@@ -73,7 +73,7 @@ class Target(target.Target):
""" """
def make_package_binary(self, pkg_name, pkg_properties, base_pkg_path, heritage_list, static): def make_package_binary(self, pkg_name, pkg_properties, base_pkg_path, heritage_list, static):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Generate generic '" + pkg_name + "' v" + tools.version_to_string(pkg_properties["VERSION"])) debug.info("-- Generate generic '" + pkg_name + "' v" + tools.version_to_string(pkg_properties["VERSION"]))
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
#output path #output path
target_outpath = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app") target_outpath = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app")
@@ -100,7 +100,7 @@ class Target(target.Target):
def install_package(self, pkg_name): def install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Install package '" + pkg_name + "'") debug.info("-- Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
# this is temporary ... Will call: # this is temporary ... Will call:
if False: if False:
@@ -123,7 +123,7 @@ class Target(target.Target):
def un_install_package(self, pkg_name): def un_install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Un-Install package '" + pkg_name + "'") debug.info("-- Un-Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
# this is temporary ... Will call: # this is temporary ... Will call:
if False: if False:
@@ -137,5 +137,17 @@ class Target(target.Target):
# remove executable link version: # remove executable link version:
tools.remove_file(target_bin_link) tools.remove_file(target_bin_link)
def run(self, pkg_name, option_list):
debug.debug("------------------------------------------------------------------------")
debug.info("-- Run package '" + pkg_name + "' + option: " + str(option_list))
debug.debug("------------------------------------------------------------------------")
appl_path = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app", "bin", pkg_name)
cmd = appl_path + " "
for elem in option_list:
cmd += elem + " "
multiprocess.run_command_no_lock_out(cmd)
debug.debug("------------------------------------------------------------------------")
debug.info("-- Run package '" + pkg_name + "' Finished")
debug.debug("------------------------------------------------------------------------")

View File

@@ -136,7 +136,7 @@ class Target(target.Target):
if os.path.exists("/Applications/" + pkg_name + ".app") == True: if os.path.exists("/Applications/" + pkg_name + ".app") == True:
shutil.rmtree("/Applications/" + pkg_name + ".app") shutil.rmtree("/Applications/" + pkg_name + ".app")
# copy the application in the basic application path : /Applications/xxx.app # copy the application in the basic application path : /Applications/xxx.app
shutil.copytree(tools.get_run_path() + self.path_out + self.path_staging + "/" + pkg_name + ".app", "/Applications/" + pkg_name + ".app") shutil.copytree(os.path.join(tools.get_run_path(),self.path_out,self.path_staging,pkg_name + ".app"), os.path.join("/Applications", pkg_name + ".app"))
def un_install_package(self, pkg_name): def un_install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
@@ -146,6 +146,21 @@ class Target(target.Target):
# Remove the application in the basic application path : /Applications/xxx.app # Remove the application in the basic application path : /Applications/xxx.app
if os.path.exists("/Applications/" + pkg_name + ".app") == True: if os.path.exists("/Applications/" + pkg_name + ".app") == True:
shutil.rmtree("/Applications/" + pkg_name + ".app") shutil.rmtree("/Applications/" + pkg_name + ".app")
def run(self, pkg_name, option_list):
debug.debug("------------------------------------------------------------------------")
debug.info("-- Run package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------")
appl_path = os.path.join(tools.get_run_path(),self.path_out,self.path_staging,pkg_name + ".app", "bin", pkg_name)
cmd = appl_path + " "
for elem in option_list:
cmd += elem + " "
multiprocess.run_command_no_lock_out(cmd)
debug.debug("------------------------------------------------------------------------")
debug.info("-- Run package '" + pkg_name + "' Finished")
debug.debug("------------------------------------------------------------------------")

0
setup.cfg Normal file
View File

View File

@@ -7,7 +7,7 @@ def readme():
# https://pypi.python.org/pypi?%3Aaction=list_classifiers # https://pypi.python.org/pypi?%3Aaction=list_classifiers
setup(name='lutin', setup(name='lutin',
version='1.0.0', version='1.2.0',
description='Lutin generic builder (might replace makefile, CMake ...)', description='Lutin generic builder (might replace makefile, CMake ...)',
long_description=readme(), long_description=readme(),
url='http://github.com/HeeroYui/lutin', url='http://github.com/HeeroYui/lutin',