Compare commits

...

29 Commits
0.5.5 ... 0.6.3

Author SHA1 Message Date
93693ed0f0 [DEV] add warning file generation 2015-08-27 21:24:40 +02:00
eeb070e014 [DEV] update the gcov version to use 2015-08-25 23:42:01 +02:00
99927380d6 Update README.rst 2015-08-25 23:37:26 +02:00
8fc81f1caa Update README.rst 2015-08-25 23:36:06 +02:00
5f325c2d7e Update README.rst 2015-08-25 23:31:33 +02:00
f65a5f58ee [DEV] add badge pip version 2015-08-25 23:26:19 +02:00
4020c70fc3 [DEV] add correct gcov generator of result 2015-08-25 21:37:49 +02:00
6cb2ef2bd2 [DEV] crate basic version 0.6.0 2015-08-24 23:41:23 +02:00
aa120cde57 [DEV] add color in help 2015-08-24 21:03:34 +02:00
2604cd93be [DEV] try integrate clang on android 2015-07-10 23:02:17 +02:00
10055dd3c6 [DEV] update version 2015-07-01 23:24:39 +02:00
db0c2a8e11 [DEV] correct some builder interface 2015-06-22 23:16:08 +02:00
2bb4e2d377 [DEV] minor correction 2015-06-21 21:59:25 +02:00
07058eda14 [DEV] android dev is now ok 2015-06-18 23:17:38 +02:00
a4ddf8e81b [DEV] continue re-integration of android 2015-06-19 23:55:18 +02:00
c73a7a0df6 [DEV] add h generator form class 2015-06-18 23:17:38 +02:00
7e41e6f393 [DEV] rework the build of java file for android 2015-06-18 21:06:06 +02:00
2e2143ebcf [DEBUG] remove dependency of pil 2015-06-15 21:54:22 +02:00
780979e0f0 [DEV] correct some interface 2015-06-12 21:35:28 +02:00
9034d303e5 [DEBUG] correct the inclusion of many element 2015-06-12 10:14:50 +02:00
912171b33d [DEV] new release 2015-06-07 08:41:31 +02:00
18b37ba5d0 [DEV] correct autocomplesion 2015-06-07 08:23:53 +02:00
3111d3899f [DEV] rework arbo of the ewol interface for android ==> do a better clean 2015-05-20 22:51:18 +02:00
8d92551ec8 [DEV] add a basic interface for shell 2015-05-20 21:08:21 +02:00
78edf4851a [DEV] Add install interface and .dmg creator for MacOSX 2015-05-19 22:23:52 +02:00
2b7baf2581 [DEV] correct packege error in ios 2015-05-12 23:33:58 +02:00
fcdcbca02a [DEV] update to the 8.3 iOs framework 2015-05-11 23:33:28 +02:00
d521b496da [DEV] create new version 2015-05-11 23:56:32 +02:00
8aa3de57a6 [DEBUG] correct force and color interface 2015-05-11 23:54:02 +02:00
49 changed files with 1770 additions and 1328 deletions

View File

@@ -1 +1,2 @@
include README.rst include README.rst
include bash-autocompletion/lutin

View File

@@ -3,6 +3,9 @@ Lutin
`lutin` is a generic builder and package maker is a FREE software tool. `lutin` is a generic builder and package maker is a FREE software tool.
.. image:: https://badge.fury.io/py/lutin.png
:target: https://pypi.python.org/pypi/lutin
Instructions Instructions
------------ ------------

View File

@@ -61,7 +61,7 @@ _lutin()
return 0 return 0
;; ;;
--target) --target)
local names=`lutin.py --list-target` local names=`lutin --list-target`
COMPREPLY=( $(compgen -W "${names}" -- ${cur}) ) COMPREPLY=( $(compgen -W "${names}" -- ${cur}) )
return 0 return 0
;; ;;
@@ -82,9 +82,9 @@ _lutin()
COMPREPLY=( $(compgen -W "${optshorts}" -- ${cur}) ) COMPREPLY=( $(compgen -W "${optshorts}" -- ${cur}) )
return 0 return 0
fi fi
listmodule=`lutin.py --list-module` listmodule=`lutin --list-module`
COMPREPLY=( $(compgen -W "${listmodule}" -- ${cur}) ) COMPREPLY=( $(compgen -W "${listmodule}" -- ${cur}) )
return 0 return 0
} }
complete -F _lutin lutin.py complete -F _lutin lutin

View File

@@ -1,6 +1,6 @@
to install autocompletion for lutin : to install autocompletion for lutin :
sudo cp bash-autocompletion/lutin.py /etc/bash_completion.d sudo cp bash-autocompletion/lutin /etc/bash_completion.d
==> and restart bash ... ==> and restart bash ...

View File

@@ -15,6 +15,7 @@ import lutin.arg as arguments
import lutin.host as host import lutin.host as host
import lutin.module as module import lutin.module as module
import lutin.target as target import lutin.target as target
import lutin.env as env
import lutin.multiprocess as multiprocess import lutin.multiprocess as multiprocess
myArgs = arguments.LutinArg() myArgs = arguments.LutinArg()
@@ -26,10 +27,12 @@ myArgs.add(arguments.ArgDefine("f", "force", desc="Force the rebuild without che
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("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_section("properties", "keep in the sequency of the cible") myArgs.add_section("properties", "keep in the sequency of the cible")
myArgs.add(arguments.ArgDefine("t", "target", haveParam=True, desc="Select a target (by default the platform is the computer that compile this) To know list : 'lutin.py --list-target'")) myArgs.add(arguments.ArgDefine("t", "target", haveParam=True, desc="Select a target (by default the platform is the computer that compile this) To know list : 'lutin.py --list-target'"))
myArgs.add(arguments.ArgDefine("c", "compilator", list=[["clang",""],["gcc",""]], desc="Compile with clang or Gcc mode (by default gcc will be used)")) myArgs.add(arguments.ArgDefine("c", "compilator", list=[["clang",""],["gcc",""]], desc="Compile with clang or Gcc mode (by default gcc will be used)"))
myArgs.add(arguments.ArgDefine("", "compilator-version", haveParam=True, desc="with travis we need to specify the name of the version if we want to compile with gcc 4.9 ==> --compilator-version=4.9"))
myArgs.add(arguments.ArgDefine("m", "mode", list=[["debug",""],["release",""]], desc="Compile in release or debug mode (default release)")) myArgs.add(arguments.ArgDefine("m", "mode", list=[["debug",""],["release",""]], desc="Compile in release or debug mode (default release)"))
myArgs.add(arguments.ArgDefine("a", "arch", list=[["auto","Automatic choice"],["arm","Arm processer"],["x86","Generic PC : AMD/Intel"],["ppc","Power PC"]], desc="Architecture to compile")) myArgs.add(arguments.ArgDefine("a", "arch", list=[["auto","Automatic choice"],["arm","Arm processer"],["x86","Generic PC : AMD/Intel"],["ppc","Power PC"]], desc="Architecture to compile"))
myArgs.add(arguments.ArgDefine("b", "bus", list=[["auto","Automatic choice"],["32","32 bits"],["64","64 bits"]], desc="Adressing size (Bus size)")) myArgs.add(arguments.ArgDefine("b", "bus", list=[["auto","Automatic choice"],["32","32 bits"],["64","64 bits"]], desc="Adressing size (Bus size)"))
@@ -46,18 +49,21 @@ localArgument = myArgs.parse()
display the help of this makefile display the help of this makefile
""" """
def usage(): def usage():
color = debug.get_color_set()
# generic argument displayed : # generic argument displayed :
myArgs.display() myArgs.display()
print(" All target can finish with '?clean' '?dump' ... ?action") print(" All target can finish with '?clean' '?dump' '?gcov' ... ?action")
print(" all") print(" " + color['green'] + "all" + color['default'])
print(" build all (only for the current selected board) (bynary and packages)") print(" build all (only for the current selected board) (bynary and packages)")
print(" clean") print(" " + color['green'] + "clean" + color['default'])
print(" clean all (same as previous)") print(" clean all (same as previous)")
print(" dump") print(" " + color['green'] + "dump" + color['default'])
print(" Dump all the module dependency and properties") print(" Dump all the module dependency and properties")
print(" " + color['green'] + "gcov" + color['default'])
print(" Parse all the code of the library with the gcov resolution")
listOfAllModule = module.list_all_module_with_desc() listOfAllModule = module.list_all_module_with_desc()
for mod in listOfAllModule: for mod in listOfAllModule:
print(" " + mod[0]) print(" " + color['green'] + mod[0] + color['default'])
if mod[1] != "": if mod[1] != "":
print(" " + mod[1]) print(" " + mod[1])
print(" ex: " + sys.argv[0] + " all --target=Android all -t Windows -m debug all") print(" ex: " + sys.argv[0] + " all --target=Android all -t Windows -m debug all")
@@ -65,12 +71,12 @@ def usage():
# 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):
if argument.get_option_nName() == "help": if argument.get_option_name() == "help":
#display help #display help
if active==False: if active==False:
usage() usage()
return True return True
if argument.get_option_nName() == "list-module": if argument.get_option_name() == "list-module":
if active==False: if active==False:
listOfModule = module.list_all_module() listOfModule = module.list_all_module()
retValue = "" retValue = ""
@@ -81,7 +87,7 @@ def parseGenericArg(argument, active):
print(retValue) print(retValue)
exit(0) exit(0)
return True return True
if argument.get_option_nName() == "list-target": if argument.get_option_name() == "list-target":
if active==False: if active==False:
listOfTarget = target.list_all_target() listOfTarget = target.list_all_target()
retValue = "" retValue = ""
@@ -92,29 +98,33 @@ def parseGenericArg(argument, active):
print(retValue) print(retValue)
exit(0) exit(0)
return True return True
elif argument.get_option_nName()=="jobs": elif argument.get_option_name()=="jobs":
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_nName() == "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_nName() == "color": elif argument.get_option_name() == "color":
if active==True: if active==True:
debug.enable_color() debug.enable_color()
return True return True
elif argument.get_option_nName() == "force": elif argument.get_option_name() == "force":
if active==True: if active==True:
lutinEnv.set_force_mode(True) env.set_force_mode(True)
return True return True
elif argument.get_option_nName() == "pretty": elif argument.get_option_name() == "pretty":
if active==True: if active==True:
lutinEnv.set_print_pretty_mode(True) env.set_print_pretty_mode(True)
return True return True
elif argument.get_option_nName() == "force-strip": elif argument.get_option_name() == "force-strip":
if active==True: if active==True:
lutinEnv.set_force_strip_mode(True) env.set_force_strip_mode(True)
return True
elif argument.get_option_name() == "warning":
if active==True:
env.set_warning_mode(True)
return True return True
return False return False
@@ -138,7 +148,8 @@ config = {
"arch":"auto", "arch":"auto",
"generate-package":True, "generate-package":True,
"simulation":False, "simulation":False,
"gcov":False "gcov":False,
"compilator-version":""
} }
# load the default target : # load the default target :
my_target = None my_target = None
@@ -147,23 +158,25 @@ actionDone=False
for argument in localArgument: for argument in localArgument:
if parseGenericArg(argument, False) == True: if parseGenericArg(argument, False) == True:
continue continue
elif argument.get_option_nName() == "package": elif argument.get_option_name() == "compilator-version":
config["compilator-version"] = argument.get_arg()
elif argument.get_option_name() == "package":
config["generate-package"]=False config["generate-package"]=False
elif argument.get_option_nName() == "simulation": elif argument.get_option_name() == "simulation":
config["simulation"]=True config["simulation"]=True
elif argument.get_option_nName() == "gcov": elif argument.get_option_name() == "gcov":
config["gcov"]=True config["gcov"]=True
elif argument.get_option_nName() == "bus": elif argument.get_option_name() == "bus":
config["bus-size"]=argument.get_arg() config["bus-size"]=argument.get_arg()
elif argument.get_option_nName() == "arch": elif argument.get_option_name() == "arch":
config["arch"]=argument.get_arg() config["arch"]=argument.get_arg()
elif argument.get_option_nName() == "compilator": elif argument.get_option_name() == "compilator":
if config["compilator"] != argument.get_arg(): if config["compilator"] != argument.get_arg():
debug.debug("change compilator ==> " + argument.get_arg()) debug.debug("change compilator ==> " + argument.get_arg())
config["compilator"] = argument.get_arg() config["compilator"] = argument.get_arg()
#remove previous target #remove previous target
my_target = None my_target = None
elif argument.get_option_nName() == "target": elif argument.get_option_name() == "target":
# No check input ==> this will be verify automaticly chen the target will be loaded # No check input ==> this will be verify automaticly chen the target will be loaded
if targetName != argument.get_arg(): if targetName != argument.get_arg():
targetName = argument.get_arg() targetName = argument.get_arg()
@@ -176,18 +189,19 @@ for argument in localArgument:
"arch":"auto", "arch":"auto",
"generate-package":True, "generate-package":True,
"simulation":False, "simulation":False,
"gcov":False "gcov":False,
"compilator-version":""
} }
#remove previous target #remove previous target
my_target = None my_target = None
elif argument.get_option_nName() == "mode": elif argument.get_option_name() == "mode":
if config["mode"] != argument.get_arg(): if config["mode"] != argument.get_arg():
config["mode"] = argument.get_arg() config["mode"] = argument.get_arg()
debug.debug("change mode ==> " + config["mode"]) debug.debug("change mode ==> " + config["mode"])
#remove previous target #remove previous target
my_target = None my_target = None
else: else:
if argument.get_option_nName() != "": if argument.get_option_name() != "":
debug.warning("Can not understand argument : '" + argument.get_option_nName() + "'") debug.warning("Can not understand argument : '" + argument.get_option_nName() + "'")
usage() usage()
else: else:

View File

@@ -12,22 +12,22 @@ from . import debug
class ArgElement: class ArgElement:
def __init__(self, option, value=""): def __init__(self, option, value=""):
self.m_option = option; self.option = option;
self.m_arg = value; self.arg = value;
def get_option_nName(self): def get_option_name(self):
return self.m_option return self.option
def get_arg(self): def get_arg(self):
return self.m_arg return self.arg
def display(self): def display(self):
if len(self.m_arg)==0: if len(self.arg)==0:
debug.info("option : " + self.m_option) debug.info("option : " + self.option)
elif len(self.m_option)==0: elif len(self.option)==0:
debug.info("element : " + self.m_arg) debug.info("element : " + self.arg)
else: else:
debug.info("option : " + self.m_option + ":" + self.m_arg) debug.info("option : " + self.option + ":" + self.arg)
class ArgDefine: class ArgDefine:
@@ -37,61 +37,62 @@ class ArgDefine:
list=[], # ["val", "description"] list=[], # ["val", "description"]
desc="", desc="",
haveParam=False): haveParam=False):
self.m_optionSmall = smallOption; self.option_small = smallOption;
self.m_optionBig = bigOption; self.option_big = bigOption;
self.m_list = list; self.list = list;
if len(self.m_list)!=0: if len(self.list)!=0:
self.m_haveParam = True self.have_param = True
else: else:
if True==haveParam: if True==haveParam:
self.m_haveParam = True self.have_param = True
else: else:
self.m_haveParam = False self.have_param = False
self.m_description = desc; self.description = desc;
def get_option_small(self): def get_option_small(self):
return self.m_optionSmall return self.option_small
def get_option_big(self): def get_option_big(self):
return self.m_optionBig return self.option_big
def need_parameters(self): def need_parameters(self):
return self.m_haveParam return self.have_param
def get_porperties(self): def get_porperties(self):
return "" return ""
def check_availlable(self, argument): def check_availlable(self, argument):
if len(self.m_list)==0: if len(self.list)==0:
return True return True
for element,desc in self.m_list: for element,desc in self.list:
if element == argument: if element == argument:
return True return True
return False return False
def display(self): def display(self):
if self.m_optionSmall != "" and self.m_optionBig != "": color = debug.get_color_set()
print(" -" + self.m_optionSmall + " / --" + self.m_optionBig) if self.option_small != "" and self.option_big != "":
elif self.m_optionSmall != "": print(" " + color['red'] + "-" + self.option_small + "" + color['default'] + " / " + color['red'] + "--" + self.option_big + color['default'])
print(" -" + self.m_optionSmall) elif self.option_small != "":
elif self.m_optionBig != "": print(" " + color['red'] + "-" + self.option_small + color['default'])
print(" --" + self.m_optionBig) elif self.option_big != "":
print(" " + color['red'] + "--" + self.option_big + color['default'])
else: else:
print(" ???? ==> internal error ...") print(" ???? ==> internal error ...")
if self.m_description != "": if self.description != "":
print(" " + self.m_description) print(" " + self.description)
if len(self.m_list)!=0: if len(self.list)!=0:
hasDescriptiveElement=False hasDescriptiveElement=False
for val,desc in self.m_list: for val,desc in self.list:
if desc!="": if desc!="":
hasDescriptiveElement=True hasDescriptiveElement=True
break; break;
if hasDescriptiveElement==True: if hasDescriptiveElement==True:
for val,desc in self.m_list: for val,desc in self.list:
print(" " + val + " : " + desc) print(" " + val + " : " + desc)
else: else:
tmpElementPrint = "" tmpElementPrint = ""
for val,desc in self.m_list: for val,desc in self.list:
if len(tmpElementPrint)!=0: if len(tmpElementPrint)!=0:
tmpElementPrint += " / " tmpElementPrint += " / "
tmpElementPrint += val tmpElementPrint += val
@@ -105,8 +106,8 @@ class ArgSection:
def __init__(self, def __init__(self,
sectionName="", sectionName="",
desc=""): desc=""):
self.m_section = sectionName; self.section = sectionName;
self.m_description = desc; self.description = desc;
def get_option_small(self): def get_option_small(self):
return "" return ""
@@ -115,10 +116,12 @@ class ArgSection:
return "" return ""
def get_porperties(self): def get_porperties(self):
return " [" + self.m_section + "]" color = debug.get_color_set()
return " [" + color['blue'] + self.section + color['default'] + "]"
def display(self): def display(self):
print(" [" + self.m_section + "] : " + self.m_description) color = debug.get_color_set()
print(" [" + color['blue'] + self.section + color['default'] + "] : " + self.description)
def parse(self, argList, currentID): def parse(self, argList, currentID):
return currentID; return currentID;
@@ -126,13 +129,13 @@ class ArgSection:
class LutinArg: class LutinArg:
def __init__(self): def __init__(self):
self.m_listProperties = [] self.listProperties = []
def add(self, argument): def add(self, argument):
self.m_listProperties.append(argument) #ArgDefine(smallOption, bigOption, haveParameter, parameterList, description)); self.listProperties.append(argument) #ArgDefine(smallOption, bigOption, haveParameter, parameterList, description));
def add_section(self, sectionName, sectionDesc): def add_section(self, sectionName, sectionDesc):
self.m_listProperties.append(ArgSection(sectionName, sectionDesc)) self.listProperties.append(ArgSection(sectionName, sectionDesc))
def parse(self): def parse(self):
listArgument = [] # composed of list element listArgument = [] # composed of list element
@@ -155,7 +158,7 @@ class LutinArg:
argumentFound=False; argumentFound=False;
if option[:2]=="--": if option[:2]=="--":
# big argument # big argument
for prop in self.m_listProperties: for prop in self.listProperties:
if prop.get_option_big()=="": if prop.get_option_big()=="":
continue continue
if prop.get_option_big() == option[2:]: if prop.get_option_big() == option[2:]:
@@ -197,7 +200,7 @@ class LutinArg:
debug.error("UNKNOW argument : '" + argument + "'") debug.error("UNKNOW argument : '" + argument + "'")
elif option[:1]=="-": elif option[:1]=="-":
# small argument # small argument
for prop in self.m_listProperties: for prop in self.listProperties:
if prop.get_option_small()=="": if prop.get_option_small()=="":
continue continue
if prop.get_option_small() == option[1:1+len(prop.get_option_small())]: if prop.get_option_small() == option[1:1+len(prop.get_option_small())]:
@@ -251,8 +254,8 @@ class LutinArg:
def display(self): def display(self):
print("usage:") print("usage:")
listOfPropertiesArg = ""; listOfPropertiesArg = "";
for element in self.m_listProperties : for element in self.listProperties :
listOfPropertiesArg += element.get_porperties() listOfPropertiesArg += element.get_porperties()
print(" " + sys.argv[0] + listOfPropertiesArg + " ...") print(" " + sys.argv[0] + listOfPropertiesArg + " ...")
for element in self.m_listProperties : for element in self.listProperties :
element.display() element.display()

View File

@@ -1,34 +0,0 @@
##
## Java builder
##
from lutin import multiprocess
from lutin import tools
from lutin import debug
from lutin import depend
##
## Initialize the builder, if needed ... to get dependency between builder (for example)
##
def init():
pass
##
## Get the current builder type.
## Return the type of builder
##
def get_type():
return "compiler"
##
## @brief Get builder input file type
## @return List of extention supported
##
def get_input_type():
return ["java"]
##
## @brief Get builder output file type
## @return List of extention supported
##
def get_output_type():
return ["class"]

View File

@@ -139,3 +139,21 @@ def print_compilator(myString):
debugLock.acquire() debugLock.acquire()
print(myString) print(myString)
debugLock.release() debugLock.release()
def get_color_set() :
global color_default
global color_red
global color_green
global color_yellow
global color_blue
global color_purple
global color_cyan
return {
"default": color_default,
"red": color_red,
"green": color_green,
"yellow": color_yellow,
"blue": color_blue,
"purple": color_purple,
"cyan": color_cyan,
}

View File

@@ -12,87 +12,122 @@ from . import debug
forceMode=False force_mode=False
def set_force_mode(val): def set_force_mode(val):
global forceMode global force_mode
if val==1: if val==1:
forceMode = 1 force_mode = 1
else: else:
forceMode = 0 force_mode = 0
def get_force_mode(): def get_force_mode():
global forceMode global force_mode
return forceMode return force_mode
printPrettyMode=False print_pretty_mode=False
def set_print_pretty_mode(val): def set_print_pretty_mode(val):
global printPrettyMode global print_pretty_mode
if val == True: if val == True:
printPrettyMode = True print_pretty_mode = True
else: else:
printPrettyMode = False print_pretty_mode = False
def get_print_pretty_mode(): def get_print_pretty_mode():
global printPrettyMode global print_pretty_mode
return printPrettyMode return print_pretty_mode
def print_pretty(myString, force=False): store_warning=False
global printPrettyMode def set_warning_mode(val):
if printPrettyMode == True \ global store_warning
if val == True:
store_warning = True
else:
store_warning = False
def get_warning_mode():
global store_warning
return store_warning
def end_with(name, list):
for appl in list:
#debug.info("pppppppp : " + str([name[-len(appl):], appl]))
if name[-len(appl):] == appl:
return True
return False
def print_pretty(my_string, force=False):
global print_pretty_mode
if print_pretty_mode == True \
or force == True: or force == True:
if myString[len(myString)-1]==' ' : if my_string[len(my_string)-1] == ' ':
tmpcmdLine = myString[:len(myString)-1] tmpcmdLine = my_string[:len(my_string)-1]
else : else:
tmpcmdLine = myString tmpcmdLine = my_string
cmdApplication = tmpcmdLine.split(' ')[0]
tmpcmdLine = tmpcmdLine.replace(' ', '\n\t') tmpcmdLine = tmpcmdLine.replace(' ', '\n\t')
tmpcmdLine = tmpcmdLine.replace('\n\t\n\t', '\n\t') tmpcmdLine = tmpcmdLine.replace('\n\t\n\t', '\n\t')
tmpcmdLine = tmpcmdLine.replace('\n\t\n\t', '\n\t') tmpcmdLine = tmpcmdLine.replace('\n\t\n\t', '\n\t')
tmpcmdLine = tmpcmdLine.replace('\n\t\n\t', '\n\t') tmpcmdLine = tmpcmdLine.replace('\n\t\n\t', '\n\t')
baseElementList = ["-o", baseElementList = []
"-D", if end_with(cmdApplication, ["javac"]) == True:
"-I", baseElementList = [
"-L", "-d",
"g++", "-D",
"gcc", "-classpath",
"clang", "-sourcepath"
"clang++", ]
"ar", elif end_with(cmdApplication, ["jar"]) == True:
"ld", baseElementList = [
"ranlib", "cf",
"-framework", "-C"
"-isysroot", ]
"-arch", elif end_with(cmdApplication, ["aapt"]) == True:
"-keystore", baseElementList = [
"-sigalg", "-M",
"-digestalg", "-F",
"<", "-I",
"<<", "-S",
">", "-J"
">>"] ]
elif end_with(cmdApplication, ["g++", "gcc", "clang", "clang++", "ar", "ld", "ranlib"]) == True:
baseElementList = [
"-o",
"-D",
"-I",
"-L",
"-framework",
"-isysroot",
"-arch",
"-keystore",
"-sigalg",
"-digestalg",
"-target",
"-gcc-toolchain"]
for element in baseElementList: for element in baseElementList:
tmpcmdLine = tmpcmdLine.replace(element+'\n\t', element+' ') tmpcmdLine = tmpcmdLine.replace(element+'\n\t', element+' ')
baseElementList = ["g++", "gcc", "clang", "clang++", "ar", "ld", "ranlib"] for element in ["<", "<<", ">", ">>"]:
for element in baseElementList: tmpcmdLine = tmpcmdLine.replace(element+'\n\t', element+' ')
tmpcmdLine = tmpcmdLine.replace('/'+element+' ', '/'+element+'\n\t')
tmpcmdLine = tmpcmdLine.replace('\n\t', ' \\\n\t') tmpcmdLine = tmpcmdLine.replace('\n\t', ' \\\n\t')
return tmpcmdLine return tmpcmdLine
else: else:
return myString return my_string
forceStripMode=False force_strip_mode=False
def set_force_strip_mode(val): def set_force_strip_mode(val):
global forceStripMode global force_strip_mode
if val==True: if val == True:
forceStripMode = True force_strip_mode = True
else: else:
forceStripMode = False force_strip_mode = False
def get_force_strip_mode(): def get_force_strip_mode():
global forceStripMode global force_strip_mode
return forceStripMode return force_strip_mode

View File

@@ -29,9 +29,9 @@ class HeritageList:
self.flags={} self.flags={}
# sources list: # sources list:
self.src=[] self.src=[]
self.path=[] self.path={}
self.listHeritage=[] self.list_heritage=[]
if heritage != None: if heritage != None:
self.add_heritage(heritage) self.add_heritage(heritage)
@@ -39,58 +39,58 @@ class HeritageList:
if type(heritage) == type(None) \ if type(heritage) == type(None) \
or heritage.name == "": or heritage.name == "":
return return
for element in self.listHeritage: for element in self.list_heritage:
if element.name == heritage.name: if element.name == heritage.name:
return return
self.listHeritage.append(heritage) self.list_heritage.append(heritage)
self.regenerate_tree() self.regenerate_tree()
def add_heritage_list(self, heritage_list): def add_heritage_list(self, heritage_list):
if type(heritage_list) == type(None): if type(heritage_list) == type(None):
return return
for herit in heritage_list.listHeritage: for herit in heritage_list.list_heritage:
find = False find = False
for element in self.listHeritage: for element in self.list_heritage:
if element.name == herit.name: if element.name == herit.name:
find = True find = True
if find == False: if find == False:
self.listHeritage.append(herit) self.list_heritage.append(herit)
self.regenerate_tree() self.regenerate_tree()
def regenerate_tree(self): def regenerate_tree(self):
self.flags={} self.flags={}
# sources list: # sources list:
self.src=[] self.src=[]
self.path=[] self.path={}
# reorder heritage list : # reorder heritage list :
listHeritage = self.listHeritage listHeritage = self.list_heritage
self.listHeritage = [] self.list_heritage = []
# first step : add all lib with no dependency: # first step : add all lib with no dependency:
for herit in listHeritage: for herit in listHeritage:
if len(herit.depends) == 0: if len(herit.depends) == 0:
self.listHeritage.append(herit) self.list_heritage.append(herit)
listHeritage.remove(herit) listHeritage.remove(herit)
while len(listHeritage) > 0: while len(listHeritage) > 0:
currentHeritageSize = len(listHeritage) currentHeritageSize = len(listHeritage)
debug.verbose("list heritage = " + str([[x.name, x.depends] for x in listHeritage])) debug.verbose("list heritage = " + str([[x.name, x.depends] for x in listHeritage]))
# Add element only when all dependence are resolved # Add element only when all dependence are resolved
for herit in listHeritage: for herit in listHeritage:
listDependsName = [y.name for y in self.listHeritage] listDependsName = [y.name for y in self.list_heritage]
if all(x in listDependsName for x in herit.depends) == True: if all(x in listDependsName for x in herit.depends) == True:
listHeritage.remove(herit) listHeritage.remove(herit)
self.listHeritage.append(herit) self.list_heritage.append(herit)
if currentHeritageSize == len(listHeritage): if currentHeritageSize == len(listHeritage):
debug.warning("Not resolve dependency between the library ==> can be a cyclic dependency !!!") debug.warning("Not resolve dependency between the library ==> can be a cyclic dependency !!!")
for herit in listHeritage: for herit in listHeritage:
self.listHeritage.append(herit) self.list_heritage.append(herit)
listHeritage = [] listHeritage = []
debug.warning("new heritage list:") debug.warning("new heritage list:")
for element in self.listHeritage: for element in self.list_heritage:
debug.warning(" " + element.name + " " + str(element.depends)) debug.warning(" " + element.name + " " + str(element.depends))
debug.verbose("new heritage list:") debug.verbose("new heritage list:")
for element in self.listHeritage: for element in self.list_heritage:
debug.verbose(" " + element.name + " " + str(element.depends)) debug.verbose(" " + element.name + " " + str(element.depends))
for element in reversed(self.listHeritage): for element in reversed(self.list_heritage):
for flags in element.flags: for flags in element.flags:
if flags in ["c-version", "c++-version"]: if flags in ["c-version", "c++-version"]:
continue continue
@@ -99,7 +99,12 @@ class HeritageList:
self.flags[flags] = value self.flags[flags] = value
else: else:
append_to_list(self.flags[flags], value) append_to_list(self.flags[flags], value)
append_to_list(self.path, element.path) for ppp in element.path:
value = element.path[ppp]
if ppp not in self.path:
self.path[ppp] = value
else:
append_to_list(self.path[ppp], value)
append_to_list(self.src, element.src) append_to_list(self.src, element.src)
if "c-version" in element.flags: if "c-version" in element.flags:
ver = element.flags["c-version"] ver = element.flags["c-version"]
@@ -124,7 +129,7 @@ class heritage:
self.flags={} self.flags={}
# sources list: # sources list:
self.src=[] self.src=[]
self.path=[] self.path={}
# update is set at true when data are newly created ==> force upper element to update # update is set at true when data are newly created ==> force upper element to update
self.hasBeenUpdated=False self.hasBeenUpdated=False
@@ -143,6 +148,8 @@ class heritage:
append_to_list(self.path, list) append_to_list(self.path, list)
def add_sources(self, list): def add_sources(self, list):
if type(list) == type(None):
debug.error("try add element none in a list ...")
append_to_list(self.src, list) append_to_list(self.src, list)
def need_update(self, list): def need_update(self, list):

View File

@@ -47,31 +47,17 @@ class Module:
# Documentation list: # Documentation list:
self.documentation = None self.documentation = None
# export PATH # export PATH
self.path = {"export":[], self.path = {"export":{},
"local":[] "local":{}
} }
self.flags = {"export":{}, self.flags = {"export":{},
"local":{} "local":{}
} }
""" self.extention_order_build = ["java", "javah"] # all is not set here is done in the provided order ...
self.export_flags_ld = []
self.export_flags_cc = []
self.export_flags_xx = []
self.export_flags_m = []
self.export_flags_mm = []
# list of all flags:
self.flags_ld = []
self.flags_cc = []
self.flags_xx = []
self.flags_m = []
self.flags_mm = []
self.flags_s = []
self.flags_ar = []
"""
# sources list: # sources list:
self.src = [] self.src = []
# copy files and folders: # copy files and folders:
self.imageToCopy = [] self.image_to_copy = []
self.files = [] self.files = []
self.folders = [] self.folders = []
self.isbuild = False self.isbuild = False
@@ -102,7 +88,6 @@ class Module:
"VERSION_CODE" : "", "VERSION_CODE" : "",
"NAME" : set("no-name"), # name of the application "NAME" : set("no-name"), # name of the application
"ANDROID_MANIFEST" : "", # By default generate the manifest "ANDROID_MANIFEST" : "", # By default generate the manifest
"ANDROID_JAVA_FILES" : ["DEFAULT"], # when user want to create his own services and activities
"ANDROID_RESOURCES" : [], "ANDROID_RESOURCES" : [],
"ANDROID_APPL_TYPE" : "APPL", # the other mode is "WALLPAPER" ... and later "WIDGET" "ANDROID_APPL_TYPE" : "APPL", # the other mode is "WALLPAPER" ... and later "WIDGET"
"ANDROID_WALLPAPER_PROPERTIES" : [], # To create properties of the wallpaper (no use of EWOL display) "ANDROID_WALLPAPER_PROPERTIES" : [], # To create properties of the wallpaper (no use of EWOL display)
@@ -142,7 +127,7 @@ class Module:
## @brief Commands for copying files ## @brief Commands for copying files
## ##
def image_to_staging(self, binary_name, target): def image_to_staging(self, binary_name, target):
for source, destination, sizeX, sizeY in self.imageToCopy: for source, destination, sizeX, sizeY in self.image_to_copy:
extension = source[source.rfind('.'):] extension = source[source.rfind('.'):]
if extension != ".png" \ if extension != ".png" \
and extension != ".jpg" \ and extension != ".jpg" \
@@ -185,6 +170,109 @@ class Module:
debug.debug("Might copy folder : " + source + "==>" + destination) debug.debug("Might copy folder : " + source + "==>" + destination)
tools.copy_anything_target(target, self.origin_folder + "/" + source, destination) tools.copy_anything_target(target, self.origin_folder + "/" + source, destination)
def gcov(self, target, generate_output=False):
if self.type == 'PREBUILD':
debug.error("Can not generate gcov on prebuid system ... : '" + self.name + "'");
return
# remove uncompilable elements:
list_file = tools.filter_extention(self.src, self.extention_order_build, True)
global_list_file = ""
for file in list_file:
debug.verbose(" gcov : " + self.name + " <== " + file);
file_dst = target.get_full_name_destination(self.name, self.origin_folder, file, "o")
global_list_file += file_dst + " "
cmd = "gcov"
# specify the version of gcov we need to use
if target.config["compilator-version"] != "":
cmd += "-" + target.config["compilator-version"] + " "
cmd += " --branch-counts --preserve-paths "
if generate_output == False:
cmd += "--no-output "
cmd += global_list_file
debug.extreme_verbose(" " + cmd);
ret = multiprocess.run_command_direct(cmd)
# parsing ret :
debug.extreme_verbose("result: " + str(ret));
ret = ret.split('\n');
debug.verbose("*** Gcov result parsing ...");
useful_list = []
remove_next = False
last_file = ""
executed_lines = 0
executable_lines = 0
for elem in ret:
if remove_next == True:
remove_next = False
continue;
if elem[:10] == "Creating '" \
or elem[:10] == "Removing '":
remove_next = True
continue
if elem[:6] == "File '" \
and self.origin_folder != elem[6:len(self.origin_folder)+6]:
remove_next = True
continue
if elem[:6] == "File '":
last_file = elem[6+len(self.origin_folder)+1:-1]
continue
start_with = "Lines executed:"
if elem[:len(start_with)] != start_with:
debug.warning(" gcov ret : " + str(elem));
debug.warning(" ==> does not start with : " + start_with);
debug.warning(" Parsing error");
continue
out = elem[len(start_with):].split("% of ")
if len(out) != 2:
debug.warning(" gcov ret : " + str(elem));
debug.warning(" Parsing error of '% of '");
continue
pourcent = float(out[0])
total_line_count = int(out[1])
total_executed_line = int(float(total_line_count)*pourcent/100.0)
useful_list.append([last_file, pourcent, total_executed_line, total_line_count])
executed_lines += total_executed_line
executable_lines += total_line_count
last_file = ""
ret = useful_list[:-1]
#for elem in ret:
# debug.info(" " + str(elem));
for elem in ret:
if elem[1]<10.0:
debug.info(" % " + str(elem[1]) + "\r\t\t" + str(elem[0]));
elif elem[1]<100.0:
debug.info(" % " + str(elem[1]) + "\r\t\t" + str(elem[0]));
else:
debug.info(" % " + str(elem[1]) + "\r\t\t" + str(elem[0]));
pourcent = 100.0*float(executed_lines)/float(executable_lines)
# generate json file:
json_file_name = target.get_build_folder(self.name) + "/" + self.name + "_coverage.json"
debug.debug("generate json file : " + json_file_name)
tmp_file = open(json_file_name, 'w')
tmp_file.write('{\n')
tmp_file.write(' "lib-name":"' + self.name + '",\n')
#tmp_file.write(' "coverage":"' + str(pourcent) + '",\n')
tmp_file.write(' "executed":"' + str(executed_lines) + '",\n')
tmp_file.write(' "executable":"' + str(executable_lines) + '",\n')
tmp_file.write(' "list":[\n')
val = 0
for elem in ret:
if val == 0 :
tmp_file.write(' {\n')
else:
tmp_file.write(' }, {\n')
val += 1
tmp_file.write(' "file":"' + elem[0] + '",\n')
#tmp_file.write(' "coverage":' + str(elem[1]) + ',\n')
tmp_file.write(' "executed":' + str(elem[2]) + ',\n')
tmp_file.write(' "executable":' + str(elem[3]) + '\n')
tmp_file.write(' }\n')
tmp_file.write(' ]\n')
tmp_file.write('}\n')
tmp_file.flush()
tmp_file.close()
# print debug:
debug.print_element("coverage", self.name, ":", str(pourcent) + "% " + str(executed_lines) + "/" + str(executable_lines))
# 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
@@ -203,13 +291,12 @@ class Module:
else : else :
# TODO : Set it better ... # TODO : Set it better ...
None None
# build dependency before # build dependency before
list_sub_file_needed_to_build = [] list_sub_file_needed_to_build = []
self.sub_heritage_list = heritage.HeritageList() self.sub_heritage_list = heritage.HeritageList()
# optionnal dependency : # optionnal dependency :
for dep, option, export in self.depends_optionnal: for dep, option, export in self.depends_optionnal:
inherit_list, isBuilt = target.build_optionnal(dep, package_name) inherit_list, isBuilt = target.build(dep, package_name, True)
if isBuilt == True: if isBuilt == True:
self.local_heritage.add_depends(dep); self.local_heritage.add_depends(dep);
# TODO : Add optionnal Flags ... # TODO : Add optionnal Flags ...
@@ -221,55 +308,109 @@ class Module:
# add at the heritage list : # add at the heritage list :
self.sub_heritage_list.add_heritage_list(inherit_list) self.sub_heritage_list.add_heritage_list(inherit_list)
for dep in self.depends: for dep in self.depends:
inherit_list = target.build(dep, package_name) debug.debug("module: '" + str(self.name) + "' request: '" + dep + "'")
inherit_list = target.build(dep, package_name, False)
# add at the heritage list : # add at the heritage list :
self.sub_heritage_list.add_heritage_list(inherit_list) self.sub_heritage_list.add_heritage_list(inherit_list)
# do sub library action for automatic generating ...
if self.type in target.action_on_state:
for lvl in range(0,100):
for level, action_name, action in target.action_on_state[self.type]:
if level == lvl:
debug.debug("level=" + str(level) + " Do Action : " + action_name)
elem = action(target, self, package_name);
# build local sources if self.type != 'PREBUILD':
for file in self.src: # build local sources in a specific order :
#debug.info(" " + self.name + " <== " + file); for extention_local in self.extention_order_build:
fileExt = file.split(".")[-1] list_file = tools.filter_extention(self.src, [extention_local])
try: for file in list_file:
tmp_builder = builder.get_builder(fileExt); #debug.info(" " + self.name + " <== " + file);
resFile = tmp_builder.compile(file, fileExt = file.split(".")[-1]
package_name, try:
target, tmp_builder = builder.get_builder(fileExt);
self.sub_heritage_list, res_file = tmp_builder.compile(file,
flags = self.flags, package_name,
path = self.path, target,
name = self.name, self.sub_heritage_list,
basic_folder = self.origin_folder) flags = self.flags,
list_sub_file_needed_to_build.append(resFile) path = self.path,
except ValueError: name = self.name,
debug.warning(" UN-SUPPORTED file format: '" + self.origin_folder + "/" + file + "'") basic_folder = self.origin_folder)
if res_file["action"] == "add":
# when multiprocess availlable, we need to synchronize here ... list_sub_file_needed_to_build.append(res_file["file"])
multiprocess.pool_synchrosize() elif res_file["action"] == "path":
self.add_path(res_file["path"], type='c')
else:
debug.error("an not do action for : " + str(res_file))
except ValueError:
debug.warning(" UN-SUPPORTED file format: '" + self.origin_folder + "/" + file + "'")
# now build the other :
list_file = tools.filter_extention(self.src, self.extention_order_build, invert=True)
for file in list_file:
#debug.info(" " + self.name + " <== " + file);
fileExt = file.split(".")[-1]
try:
tmp_builder = builder.get_builder(fileExt);
res_file = tmp_builder.compile(file,
package_name,
target,
self.sub_heritage_list,
flags = self.flags,
path = self.path,
name = self.name,
basic_folder = self.origin_folder)
if res_file["action"] == "add":
list_sub_file_needed_to_build.append(res_file["file"])
elif res_file["action"] == "path":
self.add_path(res_file["path"], type='c')
else:
debug.error("an not do action for : " + str(res_file))
except ValueError:
debug.warning(" UN-SUPPORTED file format: '" + self.origin_folder + "/" + file + "'")
# when multiprocess availlable, we need to synchronize here ...
multiprocess.pool_synchrosize()
# generate end point: # generate end point:
if self.type=='PREBUILD': if self.type=='PREBUILD':
debug.print_element("Prebuild", self.name, "==>", "find") debug.print_element("Prebuild", self.name, "==>", "find")
self.local_heritage.add_sources(self.src)
elif self.type=='LIBRARY': elif self.type=='LIBRARY':
try: try:
tmp_builder = builder.get_builder_with_output("a"); tmp_builder = builder.get_builder_with_output("a");
resFile = tmp_builder.link(list_sub_file_needed_to_build, list_file = tools.filter_extention(list_sub_file_needed_to_build, tmp_builder.get_input_type())
package_name, if len(list_file) > 0:
target, res_file = tmp_builder.link(list_file,
self.sub_heritage_list, package_name,
name = self.name, target,
basic_folder = self.origin_folder) self.sub_heritage_list,
self.local_heritage.add_sources(resFile) name = self.name,
basic_folder = self.origin_folder)
self.local_heritage.add_sources(res_file)
except ValueError: except ValueError:
debug.error(" UN-SUPPORTED link format: '.a'") debug.error(" UN-SUPPORTED link format: '.a'")
try:
tmp_builder = builder.get_builder_with_output("jar");
list_file = tools.filter_extention(list_sub_file_needed_to_build, tmp_builder.get_input_type())
if len(list_file) > 0:
res_file = tmp_builder.link(list_file,
package_name,
target,
self.sub_heritage_list,
name = self.name,
basic_folder = self.origin_folder)
self.local_heritage.add_sources(res_file)
except ValueError:
debug.error(" UN-SUPPORTED link format: '.jar'")
elif self.type=='BINARY': elif self.type=='BINARY':
try: try:
tmp_builder = builder.get_builder_with_output("bin"); tmp_builder = builder.get_builder_with_output("bin");
resFile = tmp_builder.link(list_sub_file_needed_to_build, res_file = tmp_builder.link(list_sub_file_needed_to_build,
package_name, package_name,
target, target,
self.sub_heritage_list, self.sub_heritage_list,
name = self.name, name = self.name,
basic_folder = self.origin_folder) basic_folder = self.origin_folder)
except ValueError: except ValueError:
debug.error(" UN-SUPPORTED link format: '.bin'") debug.error(" UN-SUPPORTED link format: '.bin'")
# generate tree for this special binary # generate tree for this special binary
@@ -278,26 +419,41 @@ class Module:
target.copy_to_staging(self.name) target.copy_to_staging(self.name)
elif self.type=="PACKAGE": elif self.type=="PACKAGE":
if target.name=="Android": if target.name=="Android":
# special case for android wrapper : # special case for android wrapper:
try: try:
tmp_builder = builder.get_builder_with_output("so"); tmp_builder = builder.get_builder_with_output("so");
resFile = tmp_builder.link(list_sub_file_needed_to_build, list_file = tools.filter_extention(list_sub_file_needed_to_build, tmp_builder.get_input_type())
package_name, res_file = tmp_builder.link(list_file,
target, package_name,
self.sub_heritage_list, target,
name = "libewol", self.sub_heritage_list,
basic_folder = self.origin_folder) name = "lib" + self.name,
basic_folder = self.origin_folder)
self.local_heritage.add_sources(res_file)
except ValueError: except ValueError:
debug.error(" UN-SUPPORTED link format: '.so'") debug.error(" UN-SUPPORTED link format: '.so'")
try:
tmp_builder = builder.get_builder_with_output("jar");
list_file = tools.filter_extention(list_sub_file_needed_to_build, tmp_builder.get_input_type())
if len(list_file) > 0:
res_file = tmp_builder.link(list_file,
package_name,
target,
self.sub_heritage_list,
name = self.name,
basic_folder = self.origin_folder)
self.local_heritage.add_sources(res_file)
except ValueError:
debug.error(" UN-SUPPORTED link format: '.jar'")
else: else:
try: try:
tmp_builder = builder.get_builder_with_output("bin"); tmp_builder = builder.get_builder_with_output("bin");
resFile = tmp_builder.link(list_sub_file_needed_to_build, res_file = tmp_builder.link(list_sub_file_needed_to_build,
package_name, package_name,
target, target,
self.sub_heritage_list, self.sub_heritage_list,
name = self.name, name = self.name,
basic_folder = self.origin_folder) basic_folder = self.origin_folder)
except ValueError: except ValueError:
debug.error(" UN-SUPPORTED link format: 'binary'") debug.error(" UN-SUPPORTED link format: 'binary'")
target.clean_module_tree() target.clean_module_tree()
@@ -306,7 +462,11 @@ class Module:
target.copy_to_staging(self.name) target.copy_to_staging(self.name)
if target.endGeneratePackage==True: if target.endGeneratePackage==True:
# generate the package with his properties ... # generate the package with his properties ...
target.make_package(self.name, self.package_prop, self.origin_folder + "/..") if target.name=="Android":
self.sub_heritage_list.add_heritage(self.local_heritage)
target.make_package(self.name, self.package_prop, self.origin_folder + "/..", self.sub_heritage_list)
else:
target.make_package(self.name, self.package_prop, self.origin_folder + "/..")
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)
@@ -317,7 +477,7 @@ class Module:
# call here to build the module # call here to build the module
def build_tree(self, target, package_name): def build_tree(self, target, package_name):
# ckeck if not previously build # ckeck if not previously build
if target.is_module_buildTree(self.name)==True: if target.is_module_build_tree(self.name)==True:
return return
debug.verbose("build tree of " + self.name) debug.verbose("build tree of " + self.name)
# add all the elements (first added only one keep ==> permit to everload sublib element) # add all the elements (first added only one keep ==> permit to everload sublib element)
@@ -359,14 +519,14 @@ class Module:
if True==order: if True==order:
listout.sort() listout.sort()
def append_to_internalList2(self, listout, module, list, order=False): def append_to_internal_list2(self, listout, module, list, order=False):
# add list in the Map # add list in the Map
if module not in listout: if module not in listout:
listout[module] = [] listout[module] = []
# add elements... # add elements...
self.append_to_internalList(listout[module], list, order) self.append_to_internal_list(listout[module], list, order)
def append_to_internalList(self, listout, list, order=False): def append_to_internal_list(self, listout, list, order=False):
if type(list) == type(str()): if type(list) == type(str()):
self.append_and_check(listout, list, order) self.append_and_check(listout, list, order)
else: else:
@@ -375,23 +535,23 @@ class Module:
self.append_and_check(listout, elem, order) self.append_and_check(listout, elem, order)
def add_module_depend(self, list): def add_module_depend(self, list):
self.append_to_internalList(self.depends, list, True) self.append_to_internal_list(self.depends, list, True)
def add_optionnal_module_depend(self, module_name, compilation_flags=["", ""], export=False): def add_optionnal_module_depend(self, module_name, compilation_flags=["", ""], export=False):
self.append_and_check(self.depends_optionnal, [module_name, compilation_flags, export], True) self.append_and_check(self.depends_optionnal, [module_name, compilation_flags, export], True)
def add_export_path(self, list): def add_export_path(self, list, type='c'):
self.append_to_internalList(self.path["export"], list) self.append_to_internal_list2(self.path["export"], type, list)
def add_path(self, list): def add_path(self, list, type='c'):
self.append_to_internalList(self.path["local"], list) self.append_to_internal_list2(self.path["local"], type, list)
def add_export_flag(self, type, list): def add_export_flag(self, type, list):
self.append_to_internalList2(self.flags["export"], type, list) self.append_to_internal_list2(self.flags["export"], type, list)
# add the link flag at the module # add the link flag at the module
def compile_flags(self, type, list): def compile_flags(self, type, list):
self.append_to_internalList2(self.flags["local"], type, list) self.append_to_internal_list2(self.flags["local"], type, list)
def compile_version_XX(self, version, same_as_api=True, gnu=False): def compile_version_XX(self, version, same_as_api=True, gnu=False):
cpp_version_list = [1999, 2003, 2011, 2014] cpp_version_list = [1999, 2003, 2011, 2014]
@@ -424,10 +584,10 @@ class Module:
debug.warning("Can not propagate the gnu extention of the C vesion for API"); debug.warning("Can not propagate the gnu extention of the C vesion for API");
def add_src_file(self, list): def add_src_file(self, list):
self.append_to_internalList(self.src, list, True) self.append_to_internal_list(self.src, list, True)
def copy_image(self, source, destination='', sizeX=-1, sizeY=-1): def copy_image(self, source, destination='', sizeX=-1, sizeY=-1):
self.imageToCopy.append([source, destination, sizeX, sizeY]) self.image_to_copy.append([source, destination, sizeX, sizeY])
def copy_file(self, source, destination=''): def copy_file(self, source, destination=''):
self.files.append([source, destination]) self.files.append([source, destination])
@@ -452,17 +612,25 @@ class Module:
self.print_list('depends',self.depends) self.print_list('depends',self.depends)
self.print_list('depends_optionnal', self.depends_optionnal) self.print_list('depends_optionnal', self.depends_optionnal)
for element,value in self.flags["local"]: for element in self.flags["local"]:
value = self.flags["local"][element]
self.print_list('flags ' + element, value) self.print_list('flags ' + element, value)
for element,value in self.flags["export"]: for element in self.flags["export"]:
value = self.flags["export"][element]
self.print_list('flags export ' + element, value) self.print_list('flags export ' + element, value)
self.print_list('src',self.src) self.print_list('src',self.src)
self.print_list('files',self.files) self.print_list('files',self.files)
self.print_list('folders',self.folders) self.print_list('folders',self.folders)
self.print_list('export path',self.path["export"]) for element in self.path["local"]:
self.print_list('local path',self.path["local"]) value = self.path["local"][element]
self.print_list('local path ' + element, value)
for element in self.path["export"]:
value = self.path["export"][element]
self.print_list('export path ' + element, value)
def pkg_set(self, variable, value): def pkg_set(self, variable, value):
if "COMPAGNY_TYPE" == variable: if "COMPAGNY_TYPE" == variable:
@@ -539,8 +707,10 @@ class Module:
debug.error("not know pkg element : '" + variable + "'") debug.error("not know pkg element : '" + variable + "'")
def pkg_add(self, variable, value): def pkg_add(self, variable, value):
# TODO : Check values... if variable in self.package_prop:
self.package_prop[variable].append(value) self.package_prop[variable].append(value)
else:
self.package_prop[variable] = [value]
def ext_project_add_module(self, target, projectMng, added_module = []): def ext_project_add_module(self, target, projectMng, added_module = []):
if self.name in added_module: if self.name in added_module:
@@ -564,21 +734,21 @@ class Module:
moduleList=[] moduleList=[]
__startModuleName="lutin_" __start_module_name="lutin_"
def import_path(path): def import_path(path):
global moduleList global moduleList
matches = [] matches = []
debug.debug('MODULE: Start find sub File : "%s"' %path) debug.debug('MODULE: Start find sub File : "%s"' %path)
for root, dirnames, filenames in os.walk(path): for root, dirnames, filenames in os.walk(path):
tmpList = fnmatch.filter(filenames, __startModuleName + "*.py") tmpList = fnmatch.filter(filenames, __start_module_name + "*.py")
# Import the module : # Import the module :
for filename in tmpList: for filename in tmpList:
debug.debug('Module: Find a file : "%s"' %os.path.join(root, filename)) debug.debug('Module: Find a file : "%s"' %os.path.join(root, filename))
#matches.append(os.path.join(root, filename)) #matches.append(os.path.join(root, filename))
sys.path.append(os.path.dirname(os.path.join(root, filename)) ) sys.path.append(os.path.dirname(os.path.join(root, filename)) )
moduleName = filename.replace('.py', '') moduleName = filename.replace('.py', '')
moduleName = moduleName.replace(__startModuleName, '') moduleName = moduleName.replace(__start_module_name, '')
debug.debug("MODULE: Integrate module: '" + moduleName + "' from '" + os.path.join(root, filename) + "'") debug.debug("MODULE: Integrate module: '" + moduleName + "' from '" + os.path.join(root, filename) + "'")
moduleList.append([moduleName,os.path.join(root, filename)]) moduleList.append([moduleName,os.path.join(root, filename)])
@@ -594,8 +764,8 @@ def load_module(target, name):
for mod in moduleList: for mod in moduleList:
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 : '" + __startModuleName + name + "'") debug.verbose("import module : '" + __start_module_name + name + "'")
theModule = __import__(__startModuleName + name) theModule = __import__(__start_module_name + name)
#try: #try:
tmpElement = theModule.create(target) tmpElement = theModule.create(target)
#except: #except:

View File

@@ -42,30 +42,58 @@ isinit = False # the thread are initialized
errorOccured = False # a thread have an error errorOccured = False # a thread have an error
processorAvaillable = 1 # number of CPU core availlable processorAvaillable = 1 # number of CPU core availlable
def store_command(cmdLine, file): def store_command(cmd_line, file):
# write cmd line only after to prevent errors ... # write cmd line only after to prevent errors ...
if file != "" \ if file != "" \
and file != None: or file != None:
# Create directory: return;
tools.create_directory_of_file(file) debug.verbose("create cmd file: " + file)
# Store the command Line: # Create directory:
file2 = open(file, "w") tools.create_directory_of_file(file)
file2.write(cmdLine) # Store the command Line:
file2.flush() file2 = open(file, "w")
file2.close() file2.write(cmd_line)
file2.flush()
file2.close()
def store_warning(file, output, err):
# write warning line only after to prevent errors ...
if file == "" \
or file == None:
return;
if env.get_warning_mode() == False:
debug.verbose("remove warning file: " + file)
# remove file if exist...
tools.remove_file(file);
return;
debug.verbose("create warning file: " + file)
# Create directory:
tools.create_directory_of_file(file)
# Store the command Line:
file2 = open(file, "w")
file2.write("===== output =====\n")
file2.write(output)
file2.write("\n\n")
file2.write("===== error =====\n")
file2.write(err)
file2.write("\n\n")
file2.flush()
file2.close()
## ##
## @brief Execute the command and ruturn generate data ## @brief Execute the command and ruturn generate data
## ##
def run_command_direct(cmdLine): def run_command_direct(cmd_line):
# prepare command line: # prepare command line:
args = shlex.split(cmdLine) args = shlex.split(cmd_line)
debug.verbose("cmd = " + str(args)) debug.verbose("cmd = " + str(args))
try: try:
# create the subprocess # create the subprocess
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
debug.error("subprocess.CalledProcessError : " + str(args)) debug.error("subprocess.CalledProcessError : " + str(args))
except:
debug.error("Exception on : " + str(args))
# launch the subprocess: # launch the subprocess:
output, err = p.communicate() output, err = p.communicate()
if sys.version_info >= (3, 0): if sys.version_info >= (3, 0):
@@ -80,29 +108,33 @@ def run_command_direct(cmdLine):
return False return False
def run_command(cmdLine, storeCmdLine="", buildId=-1, file=""): def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_file=""):
global errorOccured global errorOccured
global exitFlag global exitFlag
global currentIdExecution global currentIdExecution
# prepare command line: # prepare command line:
args = shlex.split(cmdLine) args = shlex.split(cmd_line)
debug.verbose("cmd = " + str(args)) debug.verbose("cmd = " + str(args))
try: try:
# create the subprocess # create the subprocess
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
debug.error("subprocess.CalledProcessError : TODO ...") debug.error("subprocess.CalledProcessError : TODO ...")
except:
debug.error("Exception on : " + str(args))
# launch the subprocess: # launch the subprocess:
output, err = p.communicate() output, err = p.communicate()
if sys.version_info >= (3, 0): if sys.version_info >= (3, 0):
output = output.decode("utf-8") output = output.decode("utf-8")
err = err.decode("utf-8") err = err.decode("utf-8")
# store error if needed:
store_warning(store_output_file, output, err)
# Check error : # Check error :
if p.returncode == 0: if p.returncode == 0:
debug.debug(env.print_pretty(cmdLine)) debug.debug(env.print_pretty(cmd_line))
queueLock.acquire() queueLock.acquire()
# TODO : Print the output all the time .... ==> to show warnings ... # TODO : Print the output all the time .... ==> to show warnings ...
if buildId >= 0 and (output != "" or err != ""): if build_id >= 0 and (output != "" or err != ""):
debug.warning("output in subprocess compiling: '" + file + "'") debug.warning("output in subprocess compiling: '" + file + "'")
if output != "": if output != "":
debug.print_compilator(output) debug.print_compilator(output)
@@ -113,8 +145,8 @@ def run_command(cmdLine, storeCmdLine="", buildId=-1, file=""):
errorOccured = True errorOccured = True
exitFlag = True exitFlag = True
# if No ID : Not in a multiprocess mode ==> just stop here # if No ID : Not in a multiprocess mode ==> just stop here
if buildId < 0: if build_id < 0:
debug.debug(env.print_pretty(cmdLine), force=True) debug.debug(env.print_pretty(cmd_line), force=True)
debug.print_compilator(output) debug.print_compilator(output)
debug.print_compilator(err) debug.print_compilator(err)
if p.returncode == 2: if p.returncode == 2:
@@ -125,12 +157,12 @@ def run_command(cmdLine, storeCmdLine="", buildId=-1, file=""):
# in multiprocess interface # in multiprocess interface
queueLock.acquire() queueLock.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"] >= buildId: if errorExecution["id"] >= build_id:
# nothing to do ... # nothing to do ...
queueLock.release() queueLock.release()
return; return;
errorExecution["id"] = buildId errorExecution["id"] = build_id
errorExecution["cmd"] = cmdLine errorExecution["cmd"] = cmd_line
errorExecution["return"] = p.returncode errorExecution["return"] = p.returncode
errorExecution["err"] = err, errorExecution["err"] = err,
errorExecution["out"] = output, errorExecution["out"] = output,
@@ -139,14 +171,14 @@ def run_command(cmdLine, storeCmdLine="", buildId=-1, file=""):
return return
debug.verbose("done 3") debug.verbose("done 3")
# write cmd line only after to prevent errors ... # write cmd line only after to prevent errors ...
store_command(cmdLine, storeCmdLine) store_command(cmd_line, store_cmd_line)
class myThread(threading.Thread): class myThread(threading.Thread):
def __init__(self, threadID, lock, queue): def __init__(self, threadID, lock, queue):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.threadID = threadID self.thread_id = threadID
self.name = "Thread " + str(threadID) self.name = "Thread " + str(threadID)
self.queue = queue self.queue = queue
self.lock = lock self.lock = lock
@@ -168,8 +200,8 @@ class myThread(threading.Thread):
comment = data[2] comment = data[2]
cmdLine = data[1] cmdLine = data[1]
cmdStoreFile = data[3] cmdStoreFile = data[3]
debug.print_element( "[" + str(data[4]) + "][" + str(self.threadID) + "] " + comment[0], comment[1], comment[2], comment[3]) debug.print_element( "[" + str(data[4]) + "][" + str(self.thread_id) + "] " + comment[0], comment[1], comment[2], comment[3])
run_command(cmdLine, cmdStoreFile, buildId=data[4], file=comment[3]) run_command(cmdLine, cmdStoreFile, build_id=data[4], file=comment[3], store_output_file=data[5])
else: else:
debug.warning("unknow request command : " + data[0]) debug.warning("unknow request command : " + data[0])
else: else:
@@ -224,18 +256,18 @@ def un_init():
def run_in_pool(cmdLine, comment, storeCmdLine=""): def run_in_pool(cmd_line, comment, store_cmd_line="", store_output_file=""):
global currentIdExecution global currentIdExecution
if processorAvaillable <= 1: if processorAvaillable <= 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(cmdLine, storeCmdLine, file=comment[3]) run_command(cmd_line, store_cmd_line, file=comment[3], store_output_file=store_output_file)
return return
# multithreaded mode # multithreaded mode
init() init()
# Fill the queue # Fill the queue
queueLock.acquire() queueLock.acquire()
debug.verbose("add : in pool cmdLine") debug.verbose("add : in pool cmdLine")
workQueue.put(["cmdLine", cmdLine, comment, storeCmdLine, currentIdExecution]) workQueue.put(["cmdLine", cmd_line, comment, store_cmd_line, currentIdExecution, store_output_file])
currentIdExecution +=1; currentIdExecution +=1;
queueLock.release() queueLock.release()

View File

@@ -30,6 +30,8 @@ class System:
self.export_flags_ld_shared=[] self.export_flags_ld_shared=[]
self.export_libs_ld=[] self.export_libs_ld=[]
self.export_libs_ld_shared=[] self.export_libs_ld_shared=[]
self.export_src=[]
self.action_on_state={}
def append_and_check(self, listout, newElement, order): def append_and_check(self, listout, newElement, order):
for element in listout: for element in listout:
@@ -62,6 +64,14 @@ class System:
def add_export_flag_MM(self, list): def add_export_flag_MM(self, list):
self.append_to_internalList(self.export_flags_mm, list) self.append_to_internalList(self.export_flags_mm, list)
def add_export_SRC(self, list):
self.append_to_internalList(self.export_src, list)
def add_action(self, name_of_state="PACKAGE", level=5, name="no-name", action=None):
if name_of_state not in self.action_on_state:
self.action_on_state[name_of_state] = [[level, name, action]]
else:
self.action_on_state[name_of_state].append([level, name, action])
@@ -74,7 +84,12 @@ def createModuleFromSystem(target, dict):
myModule.add_export_flag('c++', dict["system"].export_flags_xx) myModule.add_export_flag('c++', dict["system"].export_flags_xx)
myModule.add_export_flag('m', dict["system"].export_flags_m) myModule.add_export_flag('m', dict["system"].export_flags_m)
myModule.add_export_flag('mm', dict["system"].export_flags_mm) myModule.add_export_flag('mm', dict["system"].export_flags_mm)
# add the currrent module at the myModule.add_src_file(dict["system"].export_src)
for elem in dict["system"].action_on_state:
level, name, action = dict["system"].action_on_state[elem]
target.add_action(elem, level, name, action)
return myModule return myModule
@@ -83,7 +98,7 @@ def createModuleFromSystem(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={} systemList={}
__startSystemName="lutinSystem_" __start_system_name="lutinSystem_"
def import_path(path): def import_path(path):
@@ -91,13 +106,13 @@ def import_path(path):
matches = [] matches = []
debug.debug('Start find sub File : "%s"' %path) debug.debug('Start find sub File : "%s"' %path)
for root, dirnames, filenames in os.walk(path): for root, dirnames, filenames in os.walk(path):
tmpList = fnmatch.filter(filenames, __startSystemName + "*.py") tmpList = fnmatch.filter(filenames, __start_system_name + "*.py")
# Import the module : # Import the module :
for filename in tmpList: for filename in tmpList:
debug.verbose(' Find a file : "%s"' %os.path.join(root, filename)) debug.verbose(' Find a file : "%s"' %os.path.join(root, filename))
sys.path.append(os.path.dirname(os.path.join(root, filename)) ) sys.path.append(os.path.dirname(os.path.join(root, filename)) )
systemName = filename.replace('.py', '') systemName = filename.replace('.py', '')
systemName = systemName.replace(__startSystemName, '') systemName = systemName.replace(__start_system_name, '')
targetType, systemName = systemName.split('_') targetType, systemName = systemName.split('_')
debug.debug("integrate system: '" + targetType + "':'" + systemName + "' from '" + os.path.join(root, filename) + "'") debug.debug("integrate system: '" + targetType + "':'" + systemName + "' from '" + os.path.join(root, filename) + "'")
if targetType in systemList: if targetType in systemList:
@@ -114,6 +129,7 @@ def import_path(path):
"loaded":False, "loaded":False,
"exist":False, "exist":False,
"module":None}] "module":None}]
debug.debug("list system=" + str(systemList))
def display(): def display():
global systemList global systemList
@@ -123,8 +139,9 @@ def display():
debug.info(" '" + data["name"] +"' in " + data["path"]) debug.info(" '" + data["name"] +"' in " + data["path"])
def exist(lib_name, target_name) : def exist(lib_name, target_name, target) :
global systemList global systemList
debug.verbose("exist= " + lib_name + " in " + target_name)
if target_name not in systemList: if target_name not in systemList:
return False return False
for data in systemList[target_name]: for data in systemList[target_name]:
@@ -134,10 +151,11 @@ def exist(lib_name, target_name) :
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__(__startSystemName + target_name + "_" + data["name"]) theSystem = __import__(__start_system_name + target_name + "_" + data["name"])
#create the system module #create the system module
try: try:
data["system"] = theSystem.System() debug.info("call : " + data["name"])
data["system"] = theSystem.System(target)
data["exist"] = data["system"].valid data["exist"] = data["system"].valid
except: except:
debug.debug("Not find: '" + data["name"] + "'") debug.debug("Not find: '" + data["name"] + "'")

View File

@@ -26,9 +26,9 @@ class Target:
self.config = config self.config = config
#processor type selection (auto/arm/ppc/x86) #processor type selection (auto/arm/ppc/x86)
self.selectArch = config["arch"]; # TODO : Remove THIS ... self.select_arch = config["arch"]; # TODO : Remove THIS ...
#bus size selection (auto/32/64) #bus size selection (auto/32/64)
self.selectBus = config["bus-size"]; # TODO : Remove THIS ... self.select_bus = config["bus-size"]; # TODO : Remove THIS ...
if config["bus-size"] == "auto": if config["bus-size"] == "auto":
debug.error("system error ==> must generate the default 'bus-size' config") debug.error("system error ==> must generate the default 'bus-size' config")
@@ -44,7 +44,7 @@ class Target:
# todo : remove this : # todo : remove this :
self.sumulator = config["simulation"] self.sumulator = config["simulation"]
self.name=name self.name=name
self.endGeneratePackage = config["generate-package"] self.end_generate_package = config["generate-package"]
debug.info("================================="); debug.info("=================================");
debug.info("== Target='" + self.name + "' " + config["bus-size"] + " bits for arch '" + config["arch"] + "'"); debug.info("== Target='" + self.name + "' " + config["bus-size"] + " bits for arch '" + config["arch"] + "'");
debug.info("================================="); debug.info("=================================");
@@ -56,8 +56,8 @@ class Target:
############################################################################### ###############################################################################
self.global_include_cc=[] self.global_include_cc=[]
self.global_flags_cc=['-D__TARGET_OS__'+self.name, self.global_flags_cc=['-D__TARGET_OS__'+self.name,
'-D__TARGET_ARCH__'+self.selectArch, '-D__TARGET_ARCH__'+self.select_arch,
'-D__TARGET_ADDR__'+self.selectBus + 'BITS', '-D__TARGET_ADDR__'+self.select_bus + 'BITS',
'-D_REENTRANT'] '-D_REENTRANT']
self.global_flags_xx=[] self.global_flags_xx=[]
@@ -74,7 +74,8 @@ class Target:
self.global_sysroot="" self.global_sysroot=""
self.suffix_cmdLine='.cmd' self.suffix_cmd_line='.cmd'
self.suffix_warning='.warning'
self.suffix_dependence='.d' self.suffix_dependence='.d'
self.suffix_obj='.o' self.suffix_obj='.o'
self.suffix_lib_static='.a' self.suffix_lib_static='.a'
@@ -82,6 +83,7 @@ class Target:
self.suffix_binary='' self.suffix_binary=''
self.suffix_package='.deb' self.suffix_package='.deb'
self.folder_generate_code="/generate_header"
self.folder_arch="/" + self.name self.folder_arch="/" + self.name
if "debug" == self.config["mode"]: if "debug" == self.config["mode"]:
@@ -104,14 +106,16 @@ class Target:
self.folder_lib="/usr/lib" self.folder_lib="/usr/lib"
self.folder_data="/usr/share" self.folder_data="/usr/share"
self.folder_doc="/usr/share/doc" self.folder_doc="/usr/share/doc"
self.buildDone=[] self.build_done=[]
self.buildTreeDone=[] self.build_tree_done=[]
self.moduleList=[] self.module_list=[]
# output staging files list : # output staging files list :
self.listFinalFile=[] self.list_final_file=[]
self.sysroot="" self.sysroot=""
self.action_on_state={}
def update_folder_tree(self): def update_folder_tree(self):
self.folder_out="/out/" + self.name + "_" + self.config["arch"] + "_" + self.config["bus-size"] + "/" + self.config["mode"] self.folder_out="/out/" + self.name + "_" + self.config["arch"] + "_" + self.config["bus-size"] + "/" + self.config["mode"]
self.folder_final="/final/" + self.config["compilator"] self.folder_final="/final/" + self.config["compilator"]
@@ -137,18 +141,24 @@ class Target:
def set_cross_base(self, cross=""): def set_cross_base(self, cross=""):
self.cross = cross self.cross = cross
debug.debug("== Target='" + self.cross + "'"); debug.debug("== Target='" + self.cross + "'");
self.java = "javac"
self.javah = "javah"
self.jar = "jar"
self.ar = self.cross + "ar" self.ar = self.cross + "ar"
self.ranlib = self.cross + "ranlib" self.ranlib = self.cross + "ranlib"
if self.config["compilator"] == "clang": if self.config["compilator"] == "clang":
self.cc = self.cross + "clang" self.cc = self.cross + "clang"
self.xx = self.cross + "clang++" self.xx = self.cross + "clang++"
#self.ar=self.cross + "llvm-ar" self.ar=self.cross + "llvm-ar"
#self.ranlib="ls" self.ranlib=""
else: else:
self.cc = self.cross + "gcc" self.cc = self.cross + "gcc"
self.xx = self.cross + "g++" self.xx = self.cross + "g++"
#self.ar=self.cross + "ar" #self.ar=self.cross + "ar"
#self.ranlib=self.cross + "ranlib" #self.ranlib=self.cross + "ranlib"
if self.config["compilator-version"] != "":
self.cc = self.cc + "-" + self.config["compilator-version"]
self.xx = self.xx + "-" + self.config["compilator-version"]
#get g++ compilation version : #get g++ compilation version :
ret = multiprocess.run_command_direct(self.xx + " -dumpversion"); ret = multiprocess.run_command_direct(self.xx + " -dumpversion");
@@ -167,24 +177,24 @@ class Target:
return self.config["mode"] return self.config["mode"]
def add_image_staging(self, inputFile, outputFile, sizeX, sizeY, cmdFile=None): def add_image_staging(self, inputFile, outputFile, sizeX, sizeY, cmdFile=None):
for source, dst, x, y, cmdFile2 in self.listFinalFile: for source, dst, x, y, cmdFile2 in self.list_final_file:
if dst == outputFile : if dst == outputFile :
debug.verbose("already added : " + outputFile) debug.verbose("already added : " + outputFile)
return return
debug.verbose("add file : '" + inputFile + "' ==> '" + outputFile + "'") debug.verbose("add file : '" + inputFile + "' ==> '" + outputFile + "'")
self.listFinalFile.append([inputFile,outputFile, sizeX, sizeY, cmdFile]) self.list_final_file.append([inputFile,outputFile, sizeX, sizeY, cmdFile])
def add_file_staging(self, inputFile, outputFile, cmdFile=None): def add_file_staging(self, inputFile, outputFile, cmdFile=None):
for source, dst, x, y, cmdFile2 in self.listFinalFile: for source, dst, x, y, cmdFile2 in self.list_final_file:
if dst == outputFile : if dst == outputFile :
debug.verbose("already added : " + outputFile) debug.verbose("already added : " + outputFile)
return return
debug.verbose("add file : '" + inputFile + "' ==> '" + outputFile + "'"); debug.verbose("add file : '" + inputFile + "' ==> '" + outputFile + "'");
self.listFinalFile.append([inputFile, outputFile, -1, -1, cmdFile]) self.list_final_file.append([inputFile, outputFile, -1, -1, cmdFile])
def copy_to_staging(self, binaryName): def copy_to_staging(self, binaryName):
baseFolder = self.get_staging_folder_data(binaryName) baseFolder = self.get_staging_folder_data(binaryName)
for source, dst, x, y, cmdFile in self.listFinalFile: for source, dst, x, y, cmdFile in self.list_final_file:
if cmdFile != None \ if cmdFile != None \
and cmdFile != "": and cmdFile != "":
debug.verbose("cmd file " + cmdFile) debug.verbose("cmd file " + cmdFile)
@@ -197,8 +207,8 @@ class Target:
def clean_module_tree(self): def clean_module_tree(self):
self.buildTreeDone = [] self.build_tree_done = []
self.listFinalFile = [] self.list_final_file = []
# TODO : Remove this hack ... ==> really bad ... but usefull # TODO : Remove this hack ... ==> really bad ... but usefull
@@ -206,13 +216,41 @@ class Target:
self.folder_ewol = folder self.folder_ewol = folder
def file_generate_object(self,binaryName,moduleName,basePath,file): def get_full_name_source(self, basePath, file):
list=[] if file[0] == '/':
list.append(basePath + "/" + file) if tools.os.path.isfile(file):
list.append(self.get_build_folder(moduleName) + "/" + file + self.suffix_obj) return file
list.append(self.get_build_folder(moduleName) + "/" + file + self.suffix_dependence) return basePath + "/" + file
list.append(self.get_build_folder(moduleName) + "/" + file + self.suffix_cmdLine)
return list def get_full_name_cmd(self, moduleName, basePath, file):
if file[0] == '/':
if tools.os.path.isfile(file):
return file + self.suffix_cmd_line
return self.get_build_folder(moduleName) + "/" + file + self.suffix_cmd_line
def get_full_name_warning(self, moduleName, basePath, file):
return self.get_build_folder(moduleName) + "/" + file + self.suffix_warning;
def get_full_name_destination(self, moduleName, basePath, file, suffix, remove_suffix=False):
# special patch for java file:
if file[-4:] == "java":
for elem in ["org/", "com/"]:
pos = file.find(elem);
if pos > 0:
file = file[pos:]
if remove_suffix == True:
file = file[:file.rfind(".")] + '.'
else:
file += "."
if len(suffix) >= 1:
suffix = suffix[0]
else:
suffix = ""
return self.get_build_folder(moduleName) + "/" + file + suffix
def get_full_dependency(self, moduleName, basePath, file):
return self.get_build_folder(moduleName) + "/" + file + self.suffix_dependence
""" """
return a list of 3 elements : return a list of 3 elements :
0 : sources files (can be a list) 0 : sources files (can be a list)
@@ -225,19 +263,28 @@ class Target:
list.append(file) list.append(file)
list.append(self.get_staging_folder(binaryName) + "/" + self.folder_bin + "/" + moduleName + self.suffix_binary) list.append(self.get_staging_folder(binaryName) + "/" + self.folder_bin + "/" + moduleName + self.suffix_binary)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_dependence) list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_dependence)
list.append(self.get_build_folder(binaryName) + "/" + self.folder_bin + "/" + moduleName + self.suffix_cmdLine) list.append(self.get_build_folder(binaryName) + "/" + self.folder_bin + "/" + moduleName + self.suffix_binary + self.suffix_cmd_line)
list.append(self.get_build_folder(binaryName) + "/" + self.folder_bin + "/" + moduleName + self.suffix_binary + self.suffix_warning)
elif (type=="lib-shared"): elif (type=="lib-shared"):
list.append(file) list.append(file)
list.append(self.get_staging_folder(binaryName) + "/" + self.folder_lib + "/" + moduleName + self.suffix_lib_dynamic) list.append(self.get_staging_folder(binaryName) + "/" + self.folder_lib + "/" + moduleName + self.suffix_lib_dynamic)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_dependence) list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_dependence)
list.append(self.get_build_folder(binaryName) + "/" + self.folder_lib + "/" + moduleName + self.suffix_cmdLine) list.append(self.get_build_folder(binaryName) + "/" + self.folder_lib + "/" + moduleName + self.suffix_lib_dynamic + self.suffix_cmd_line)
list.append(self.get_build_folder(binaryName) + "/" + self.folder_lib + "/" + moduleName + self.suffix_lib_dynamic + self.suffix_warning)
elif (type=="lib-static"): elif (type=="lib-static"):
list.append(file) list.append(file)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_lib_static) list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_lib_static)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_dependence) list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_dependence)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_cmdLine) list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_lib_static + self.suffix_cmd_line)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_lib_static + self.suffix_warning)
elif (type=="jar"):
list.append(file)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + ".jar")
list.append(self.get_build_folder(moduleName) + "/" + moduleName + ".jar" + self.suffix_dependence)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + ".jar" + self.suffix_cmd_line)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + ".jar" + self.suffix_warning)
elif (type=="image"): elif (type=="image"):
list.append(self.get_build_folder(binaryName) + "/data/" + file + self.suffix_cmdLine) list.append(self.get_build_folder(binaryName) + "/data/" + file + self.suffix_cmd_line)
else: else:
debug.error("unknow type : " + type) debug.error("unknow type : " + type)
return list return list
@@ -258,68 +305,70 @@ class Target:
return tools.get_run_folder() + self.folder_out + self.folder_doc + "/" + moduleName return tools.get_run_folder() + self.folder_out + self.folder_doc + "/" + moduleName
def is_module_build(self, my_module): def is_module_build(self, my_module):
for mod in self.buildDone: for mod in self.build_done:
if mod == my_module: if mod == my_module:
return True return True
self.buildDone.append(my_module) self.build_done.append(my_module)
return False return False
def is_module_buildTree(self, my_module): def is_module_build_tree(self, my_module):
for mod in self.buildTreeDone: for mod in self.build_tree_done:
if mod == my_module: if mod == my_module:
return True return True
self.buildTreeDone.append(my_module) self.build_tree_done.append(my_module)
return False return False
def add_module(self, newModule): def add_module(self, newModule):
debug.debug("Add nodule for Taget : " + newModule.name) debug.debug("Add nodule for Taget : " + newModule.name)
self.moduleList.append(newModule) self.module_list.append(newModule)
def get_module(self, name):
for mod in self.build_done:
if mod.name == name:
return mod
debug.error("the module '" + str(name) + "'does not exist/already build")
return None
# return inherit packages ... # return inherit packages ...
""" """
def build(self, name, packagesName): def build(self, name, packagesName):
for module in self.moduleList: for module in self.module_list:
if module.name == name: if module.name == name:
return module.build(self, packagesName) return module.build(self, packagesName)
debug.error("request to build an un-existant module name : '" + name + "'") debug.error("request to build an un-existant module name : '" + name + "'")
""" """
def build_tree(self, name, packagesName): def build_tree(self, name, packagesName):
for mod in self.moduleList: for mod in self.module_list:
if mod.name == name: if mod.name == name:
mod.build_tree(self, packagesName) mod.build_tree(self, packagesName)
return return
debug.error("request to build tree on un-existant module name : '" + name + "'") debug.error("request to build tree on un-existant module name : '" + name + "'")
def clean(self, name): def clean(self, name):
for mod in self.moduleList: for mod in self.module_list:
if mod.name == name: if mod.name == name:
mod.clean(self) mod.clean(self)
return return
debug.error("request to clean an un-existant module name : '" + name + "'") debug.error("request to clean an un-existant module name : '" + name + "'")
def load_if_needed(self, name, optionnal=False): def load_if_needed(self, name, optionnal=False):
for elem in self.moduleList: for elem in self.module_list:
if elem.name == name: if elem.name == name:
return True return True
if optionnal == False: # 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:
exist = module.exist(self, name)
if exist == True:
module.load_module(self, name) module.load_module(self, name)
return True return True;
else: else:
# TODO : Check internal module and system module ... return False;
# need to import the module (or the system module ...)
exist = system.exist(name, self.name)
if exist == True:
system.load(self, name, self.name)
return True;
# try to find in the local Modules:
exist = module.exist(self, name)
if exist == True:
module.load_module(self, name)
return True;
else:
return False;
def load_all(self): def load_all(self):
listOfAllTheModule = module.list_all_module() listOfAllTheModule = module.list_all_module()
@@ -327,34 +376,25 @@ class Target:
self.load_if_needed(modName) self.load_if_needed(modName)
def project_add_module(self, name, projectMng, addedModule): def project_add_module(self, name, projectMng, addedModule):
for mod in self.moduleList: for mod in self.module_list:
if mod.name == name: if mod.name == name:
mod.ext_project_add_module(self, projectMng, addedModule) mod.ext_project_add_module(self, projectMng, addedModule)
return return
def build_optionnal(self, moduleName, packagesName=None): def build(self, name, packagesName=None, optionnal=False):
present = self.load_if_needed(moduleName, optionnal=True) if name == "gcov":
if present == False: debug.info("gcov all")
return [heritage.HeritageList(), False] debug.error("must set the gcov parsig on a specific library or binary ==> not supported now for all")
# clean requested
for mod in self.moduleList:
if mod.name == moduleName:
debug.debug("build module '" + moduleName + "'")
return [mod.build(self, None), True]
debug.warning("not know module name : '" + moduleName + "' to '" + "build" + "' it")
return [heritage.HeritageList(), False]
def build(self, name, packagesName=None):
if name == "dump": if name == "dump":
debug.info("dump all") debug.info("dump all")
self.load_all() self.load_all()
for mod in self.moduleList: for mod in self.module_list:
mod.display(self) mod.display(self)
return return
if name == "all": if name == "all":
debug.info("build all") debug.info("build all")
self.load_all() self.load_all()
for mod in self.moduleList: for mod in self.module_list:
if self.name=="Android": if self.name=="Android":
if mod.type == "PACKAGE": if mod.type == "PACKAGE":
mod.build(self, None) mod.build(self, None)
@@ -365,17 +405,21 @@ class Target:
elif name == "clean": elif name == "clean":
debug.info("clean all") debug.info("clean all")
self.load_all() self.load_all()
for mod in self.moduleList: for mod in self.module_list:
mod.clean(self) mod.clean(self)
else: else:
# get the action an the module .... # get the action an the module ....
gettedElement = name.split("?") gettedElement = name.split("?")
moduleName = gettedElement[0] moduleName = gettedElement[0]
if len(gettedElement)>=3:
sub_action_name = gettedElement[2]
else:
sub_action_name = ""
if len(gettedElement)>=2: if len(gettedElement)>=2:
actionName = gettedElement[1] actionName = gettedElement[1]
else : else :
actionName = "build" actionName = "build"
debug.verbose("requested : " + moduleName + "-" + actionName) debug.verbose("requested : " + moduleName + "?" + actionName)
if actionName == "install": if actionName == "install":
self.build(moduleName + "?build") self.build(moduleName + "?build")
self.install_package(moduleName) self.install_package(moduleName)
@@ -384,9 +428,12 @@ class Target:
elif actionName == "log": elif actionName == "log":
self.Log(moduleName) self.Log(moduleName)
else: else:
self.load_if_needed(moduleName) present = self.load_if_needed(moduleName, optionnal=optionnal)
if present == False \
and optionnal == True:
return [heritage.HeritageList(), False]
# clean requested # clean requested
for mod in self.moduleList: for mod in self.module_list:
if mod.name == moduleName: if mod.name == moduleName:
if actionName == "dump": if actionName == "dump":
debug.info("dump module '" + moduleName + "'") debug.info("dump module '" + moduleName + "'")
@@ -394,11 +441,27 @@ class Target:
elif actionName == "clean": elif actionName == "clean":
debug.info("clean module '" + moduleName + "'") debug.info("clean module '" + moduleName + "'")
return mod.clean(self) return mod.clean(self)
elif actionName == "gcov":
debug.debug("gcov on module '" + moduleName + "'")
if sub_action_name == "output":
return mod.gcov(self, generate_output=True)
return mod.gcov(self, generate_output=False)
elif actionName == "build": elif actionName == "build":
debug.debug("build module '" + moduleName + "'") debug.debug("build module '" + moduleName + "'")
if optionnal == True:
return [mod.build(self, None), True]
return mod.build(self, None) return mod.build(self, None)
if optionnal == True:
return [heritage.HeritageList(), False]
debug.error("not know module name : '" + moduleName + "' to '" + actionName + "' it") debug.error("not know module name : '" + moduleName + "' to '" + actionName + "' it")
def add_action(self, name_of_state="PACKAGE", level=5, name="no-name", action=None):
debug.verbose("add action : " + name)
if name_of_state not in self.action_on_state:
self.action_on_state[name_of_state] = [[level, name, action]]
else:
self.action_on_state[name_of_state].append([level, name, action])
targetList=[] targetList=[]
__startTargetName="lutinTarget_" __startTargetName="lutinTarget_"

View File

@@ -1,747 +0,0 @@
#!/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 target
from lutin import tools
from lutin import image
from lutin import multiprocess
from lutin import host
import os
import sys
class Target(target.Target):
def __init__(self, config):
#processor type selection (auto/arm/ppc/x86)
if config["arch"] == "auto":
config["arch"] = "arm"
#bus size selection (auto/32/64)
if config["bus-size"] == "auto":
config["bus-size"] = "32"
arch = ""#"ARMv7"
target.Target.__init__(self, "Android", config, arch)
self.folder_ndk = os.getenv('PROJECT_NDK', "AUTO")
self.folder_sdk = os.getenv('PROJECT_SDK', "AUTO")
# auto search NDK
if self.folder_ndk == "AUTO":
for folder in os.listdir("."):
if os.path.isdir(folder)==True:
if folder=="android":
self.folder_ndk = folder + "/ndk"
if self.folder_ndk == "AUTO":
self.folder_ndk = tools.get_run_folder() + "/../android/ndk"
# auto search SDK
if self.folder_sdk == "AUTO":
for folder in os.listdir("."):
if os.path.isdir(folder)==True:
if folder=="android":
self.folder_sdk = folder + "/sdk"
if self.folder_sdk == "AUTO":
self.folder_sdk = tools.get_run_folder() + "/../android/sdk"
if not os.path.isdir(self.folder_ndk):
debug.error("NDK path not set !!! set env : PROJECT_NDK on the NDK path")
if not os.path.isdir(self.folder_sdk):
debug.error("SDK path not set !!! set env : PROJECT_SDK on the SDK path")
tmpOsVal = "64"
gccVersion = "4.9"
if host.BUS_SIZE==64:
tmpOsVal = "_64"
if self.config["compilator"] == "clang":
self.set_cross_base(self.folder_ndk + "/toolchains/llvm-3.3/prebuilt/linux-x86_64/bin/")
else:
baseFolderArm = self.folder_ndk + "/toolchains/arm-linux-androideabi-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/"
baseFolderMips = self.folder_ndk + "/toolchains/mipsel-linux-android-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/"
baseFolderX86 = self.folder_ndk + "/toolchains/x86-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/"
self.set_cross_base(baseFolderArm + "arm-linux-androideabi-")
if not os.path.isdir(baseFolderArm):
debug.error("Gcc Arm path does not exist !!!")
if not os.path.isdir(baseFolderMips):
debug.info("Gcc Mips path does not exist !!!")
if not os.path.isdir(baseFolderX86):
debug.info("Gcc x86 path does not exist !!!")
arch = "ARMv7"
# for gcc :
# for clang :
self.folder_bin="/mustNotCreateBinary"
self.folder_lib="/data/lib/armeabi"
self.folder_data="/data/assets"
self.folder_doc="/doc"
self.suffix_package='.pkg'
# board id at 14 is for android 4.0 and more ...
self.boardId = 14
if arch == "ARMv5" or arch == "ARMv7":
self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm/usr/include/")
elif arch == "mips":
self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-mips/usr/include/")
elif arch == "x86":
self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-x86/usr/include/")
if True:
if self.config["compilator"] == "clang":
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/include/")
if arch == "ARMv5":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/armeabi/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
elif arch == "ARMv7":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/armeabi-v7a/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
elif arch == "mips":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/mips/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
elif arch == "x86":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/x86/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
else:
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/include/")
if arch == "ARMv5":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "thumb/libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a")
elif arch == "ARMv7":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi-v7a/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "thumb/libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a")
elif arch == "mips":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/mips/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "libsupc++.a")
elif arch == "x86":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/x86/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "libsupc++.a")
else :
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/system/include/")
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/stlport/stlport/")
self.global_flags_ld.append(self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm/usr/lib/libstdc++.a")
self.global_sysroot = "--sysroot=" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm"
self.global_flags_cc.append("-D__ARM_ARCH_5__")
self.global_flags_cc.append("-D__ARM_ARCH_5T__")
self.global_flags_cc.append("-D__ARM_ARCH_5E__")
self.global_flags_cc.append("-D__ARM_ARCH_5TE__")
if self.arch == "ARM":
# -----------------------
# -- arm V5 :
# -----------------------
self.global_flags_cc.append("-march=armv5te")
self.global_flags_cc.append("-msoft-float")
else:
# -----------------------
# -- arm V7 (Neon) :
# -----------------------
self.global_flags_cc.append("-mfpu=neon")
self.global_flags_cc.append("-mfloat-abi=softfp")
self.global_flags_ld.append("-mfpu=neon")
self.global_flags_ld.append("-mfloat-abi=softfp")
self.global_flags_cc.append("-D__ARM_ARCH_7__")
self.global_flags_cc.append("-D__ARM_NEON__")
# the -mthumb must be set for all the android produc, some ot the not work coretly without this one ... (all android code is generated with this flags)
self.global_flags_cc.append("-mthumb")
# -----------------------
# -- Common flags :
# -----------------------
self.global_flags_cc.append("-fpic")
self.global_flags_cc.append("-ffunction-sections")
self.global_flags_cc.append("-funwind-tables")
self.global_flags_cc.append("-fstack-protector")
self.global_flags_cc.append("-Wno-psabi")
self.global_flags_cc.append("-mtune=xscale")
self.global_flags_cc.append("-fexceptions")
##self.global_flags_cc.append("-fno-exceptions")
self.global_flags_cc.append("-fomit-frame-pointer")
self.global_flags_cc.append("-fno-strict-aliasing")
self.global_flags_xx.append("-frtti")
self.global_flags_xx.append("-Wa,--noexecstack")
def check_right_package(self, pkgProperties, value):
for val in pkgProperties["RIGHT"]:
if value == val:
return True
return False
def get_staging_folder_data(self, binaryName):
return self.get_staging_folder(binaryName) + self.folder_data
def make_package(self, pkgName, pkgProperties, basePkgPath):
# http://alp.developpez.com/tutoriels/debian/creer-paquet/
debug.debug("------------------------------------------------------------------------")
debug.info("Generate package '" + pkgName + "'")
debug.debug("------------------------------------------------------------------------")
pkgNameApplicationName = pkgName
if self.config["mode"] == "debug":
pkgNameApplicationName += "debug"
# FINAL_FOLDER_JAVA_PROJECT
self.folder_javaProject= self.get_staging_folder(pkgName) \
+ "/src/" \
+ pkgProperties["COMPAGNY_TYPE"] \
+ "/" + pkgProperties["COMPAGNY_NAME2"] \
+ "/" + pkgNameApplicationName + "/"
#FINAL_FILE_ABSTRACTION
self.file_finalAbstraction = self.folder_javaProject + "/" + pkgNameApplicationName + ".java"
compleatePackageName = pkgProperties["COMPAGNY_TYPE"]+"."+pkgProperties["COMPAGNY_NAME2"]+"." + pkgNameApplicationName
if "ADMOD_ID" in pkgProperties:
pkgProperties["RIGHT"].append("INTERNET")
pkgProperties["RIGHT"].append("ACCESS_NETWORK_STATE")
debug.print_element("pkg", "absractionFile", "<==", "dynamic file")
# Create folder :
tools.create_directory_of_file(self.file_finalAbstraction)
# Create file :
tmpFile = open(self.file_finalAbstraction, 'w')
if pkgProperties["ANDROID_APPL_TYPE"]=="APPL":
tmpFile.write( "/**\n")
tmpFile.write( " * @author Edouard DUPIN, Kevin BILLONNEAU\n")
tmpFile.write( " * @copyright 2011, Edouard DUPIN, all right reserved\n")
tmpFile.write( " * @license APACHE v2.0 (see license file)\n")
tmpFile.write( " * @note This file is autogenerate ==> see documantation to generate your own\n")
tmpFile.write( " */\n")
tmpFile.write( "package "+ compleatePackageName + ";\n")
tmpFile.write( "import org.ewol.EwolActivity;\n")
if "ADMOD_ID" in pkgProperties:
tmpFile.write( "import com.google.android.gms.ads.AdRequest;\n")
tmpFile.write( "import com.google.android.gms.ads.AdSize;\n")
tmpFile.write( "import com.google.android.gms.ads.AdView;\n")
tmpFile.write( "import android.widget.LinearLayout;\n")
tmpFile.write( "import android.widget.Button;\n")
tmpFile.write( "public class " + pkgNameApplicationName + " extends EwolActivity {\n")
if "ADMOD_ID" in pkgProperties:
tmpFile.write( " /** The view to show the ad. */\n")
tmpFile.write( " private AdView adView;\n")
tmpFile.write( " private LinearLayout mLayout = null;\n")
tmpFile.write( " public void onCreate(android.os.Bundle savedInstanceState) {\n")
tmpFile.write( " super.onCreate(savedInstanceState);\n")
tmpFile.write( " initApkPath(\"" + pkgProperties["COMPAGNY_TYPE"]+"\", \""+pkgProperties["COMPAGNY_NAME2"]+"\", \"" + pkgNameApplicationName + "\");\n")
if "ADMOD_ID" in pkgProperties:
tmpFile.write( " mLayout = new LinearLayout(this);\n")
tmpFile.write( " mLayout.setOrientation(android.widget.LinearLayout.VERTICAL);\n")
tmpFile.write( " LinearLayout.LayoutParams paramsWindows = new LinearLayout.LayoutParams(\n")
tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT,\n")
tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT);\n")
tmpFile.write( " \n")
tmpFile.write( " setContentView(mLayout, paramsWindows);\n")
tmpFile.write( " \n")
tmpFile.write( " LinearLayout.LayoutParams paramsAdds = new LinearLayout.LayoutParams(\n")
tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT,\n")
tmpFile.write( " LinearLayout.LayoutParams.WRAP_CONTENT);\n")
tmpFile.write( " paramsAdds.weight = 0;\n")
tmpFile.write( " \n")
tmpFile.write( " LinearLayout.LayoutParams paramsGLView = new LinearLayout.LayoutParams(\n")
tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT,\n")
tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT);\n")
tmpFile.write( " paramsGLView.weight = 1;\n")
tmpFile.write( " paramsGLView.height = 0;\n")
tmpFile.write( " \n")
tmpFile.write( " mLayout.setGravity(android.view.Gravity.TOP);\n")
tmpFile.write( " \n")
tmpFile.write( " // Create an adds.\n")
tmpFile.write( " adView = new AdView(this);\n")
tmpFile.write( " adView.setAdSize(AdSize.SMART_BANNER);\n")
tmpFile.write( " adView.setAdUnitId(\"" + pkgProperties["ADMOD_ID"] + "\");\n")
tmpFile.write( " \n")
tmpFile.write( " // Create an ad request. Check logcat output for the hashed device ID to get test ads on a physical device.\n")
tmpFile.write( " AdRequest adRequest = new AdRequest.Builder()\n")
tmpFile.write( " .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)\n")
tmpFile.write( " .build();\n")
tmpFile.write( " \n")
tmpFile.write( " // Add the AdView to the view hierarchy. The view will have no size until the ad is loaded.\n")
if "ADMOD_POSITION" in pkgProperties.keys() \
and pkgProperties["ADMOD_POSITION"] == "top":
tmpFile.write( " mLayout.addView(adView, paramsAdds);\n")
tmpFile.write( " mLayout.addView(mGLView, paramsGLView);\n")
else:
tmpFile.write( " mLayout.addView(mGLView, paramsGLView);\n")
tmpFile.write( " mLayout.addView(adView, paramsAdds);\n")
tmpFile.write( " \n")
tmpFile.write( " // Start loading the ad in the background.\n")
tmpFile.write( " adView.loadAd(adRequest);\n")
tmpFile.write( " }\n")
if "ADMOD_ID" in pkgProperties:
tmpFile.write( " @Override protected void onResume() {\n")
tmpFile.write( " super.onResume();\n")
tmpFile.write( " if (adView != null) {\n")
tmpFile.write( " adView.resume();\n")
tmpFile.write( " }\n")
tmpFile.write( " }\n")
tmpFile.write( " @Override protected void onPause() {\n")
tmpFile.write( " if (adView != null) {\n")
tmpFile.write( " adView.pause();\n")
tmpFile.write( " }\n")
tmpFile.write( " super.onPause();\n")
tmpFile.write( " }\n")
tmpFile.write( " @Override protected void onDestroy() {\n")
tmpFile.write( " // Destroy the AdView.\n")
tmpFile.write( " if (adView != null) {\n")
tmpFile.write( " adView.destroy();\n")
tmpFile.write( " }\n")
tmpFile.write( " super.onDestroy();\n")
tmpFile.write( " }\n")
tmpFile.write( "}\n")
else :
# wallpaper mode ...
tmpFile.write( "/**\n")
tmpFile.write( " * @author Edouard DUPIN, Kevin BILLONNEAU\n")
tmpFile.write( " * @copyright 2011, Edouard DUPIN, all right reserved\n")
tmpFile.write( " * @license APACHE v2.0 (see license file)\n")
tmpFile.write( " * @note This file is autogenerate ==> see documantation to generate your own\n")
tmpFile.write( " */\n")
tmpFile.write( "package "+ compleatePackageName + ";\n")
tmpFile.write( "import org.ewol.EwolWallpaper;\n")
tmpFile.write( "public class " + pkgNameApplicationName + " extends EwolWallpaper {\n")
tmpFile.write( " public static final String SHARED_PREFS_NAME = \"" + pkgNameApplicationName + "settings\";\n")
tmpFile.write( " public Engine onCreateEngine() {\n")
tmpFile.write( " Engine tmpEngine = super.onCreateEngine();\n")
tmpFile.write( " initApkPath(\"" + pkgProperties["COMPAGNY_TYPE"]+"\", \""+pkgProperties["COMPAGNY_NAME2"]+"\", \"" + pkgNameApplicationName + "\");\n")
tmpFile.write( " return tmpEngine;\n")
tmpFile.write( " }\n")
tmpFile.write( "}\n")
tmpFile.flush()
tmpFile.close()
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/res/drawable/icon.png");
if "ICON" in pkgProperties.keys() \
and pkgProperties["ICON"] != "":
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/res/drawable/icon.png", 256, 256)
else:
# to be sure that we have all time a resource ...
tmpFile = open(self.get_staging_folder(pkgName) + "/res/drawable/plop.txt", 'w')
tmpFile.write('plop\n')
tmpFile.flush()
tmpFile.close()
if pkgProperties["ANDROID_MANIFEST"]!="":
debug.print_element("pkg", "AndroidManifest.xml", "<==", pkgProperties["ANDROID_MANIFEST"])
tools.copy_file(pkgProperties["ANDROID_MANIFEST"], self.get_staging_folder(pkgName) + "/AndroidManifest.xml", force=True)
else:
if "VERSION_CODE" not in pkgProperties:
pkgProperties["VERSION_CODE"] = "1"
debug.print_element("pkg", "AndroidManifest.xml", "<==", "package configurations")
tmpFile = open(self.get_staging_folder(pkgName) + "/AndroidManifest.xml", 'w')
tmpFile.write( '<?xml version="1.0" encoding="utf-8"?>\n')
tmpFile.write( '<!-- Manifest is autoGenerated with Ewol ... do not patch it-->\n')
tmpFile.write( '<manifest xmlns:android="http://schemas.android.com/apk/res/android" \n')
tmpFile.write( ' package="' + compleatePackageName + '" \n')
tmpFile.write( ' android:versionCode="'+pkgProperties["VERSION_CODE"]+'" \n')
tmpFile.write( ' android:versionName="'+pkgProperties["VERSION"]+'"> \n')
tmpFile.write( ' <uses-feature android:glEsVersion="0x00020000" android:required="true" />\n')
tmpFile.write( ' <uses-sdk android:minSdkVersion="' + str(self.boardId) + '" \n')
tmpFile.write( ' android:targetSdkVersion="' + str(self.boardId) + '" /> \n')
if pkgProperties["ANDROID_APPL_TYPE"]=="APPL":
tmpFile.write( ' <application android:label="' + pkgNameApplicationName + '" \n')
if "ICON" in pkgProperties.keys():
tmpFile.write( ' android:icon="@drawable/icon" \n')
if self.config["mode"] == "debug":
tmpFile.write( ' android:debuggable="true" \n')
tmpFile.write( ' >\n')
if "ADMOD_ID" in pkgProperties:
tmpFile.write( ' <meta-data android:name="com.google.android.gms.version" \n')
tmpFile.write( ' android:value="@integer/google_play_services_version"/>\n')
tmpFile.write( ' <activity android:name=".' + pkgNameApplicationName + '" \n')
tmpFile.write( ' android:label="' + pkgProperties['NAME'])
if self.config["mode"] == "debug":
tmpFile.write("-debug")
tmpFile.write( '"\n')
if "ICON" in pkgProperties.keys():
tmpFile.write( ' android:icon="@drawable/icon" \n')
tmpFile.write( ' android:hardwareAccelerated="true" \n')
tmpFile.write( ' android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> \n')
tmpFile.write( ' <intent-filter> \n')
tmpFile.write( ' <action android:name="android.intent.action.MAIN" /> \n')
tmpFile.write( ' <category android:name="android.intent.category.LAUNCHER" /> \n')
tmpFile.write( ' </intent-filter> \n')
tmpFile.write( ' </activity> \n')
if "ADMOD_ID" in pkgProperties:
tmpFile.write( ' <activity android:name="com.google.android.gms.ads.AdActivity"\n')
tmpFile.write( ' android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>\n')
tmpFile.write( ' </application>\n')
else:
tmpFile.write( ' <application android:label="' + pkgNameApplicationName + '" \n')
tmpFile.write( ' android:permission="android.permission.BIND_WALLPAPER" \n')
if "ICON" in pkgProperties.keys():
tmpFile.write( ' android:icon="@drawable/icon"\n')
tmpFile.write( ' >\n')
tmpFile.write( ' <service android:name=".' + pkgNameApplicationName + '" \n')
tmpFile.write( ' android:label="' + pkgProperties['NAME'])
if self.config["mode"] == "debug":
tmpFile.write("-debug")
tmpFile.write( '"\n')
if "ICON" in pkgProperties.keys():
tmpFile.write( ' android:icon="@drawable/icon"\n')
tmpFile.write( ' >\n')
tmpFile.write( ' <intent-filter>\n')
tmpFile.write( ' <action android:name="android.service.wallpaper.WallpaperService" />\n')
tmpFile.write( ' </intent-filter>\n')
tmpFile.write( ' <meta-data android:name="android.service.wallpaper"\n')
tmpFile.write( ' android:resource="@xml/' + pkgNameApplicationName + '_resource" />\n')
tmpFile.write( ' </service>\n')
if len(pkgProperties["ANDROID_WALLPAPER_PROPERTIES"])!=0:
tmpFile.write( ' <activity android:label="Setting"\n')
tmpFile.write( ' android:name=".' + pkgNameApplicationName + 'Settings"\n')
tmpFile.write( ' android:theme="@android:style/Theme.Light.WallpaperSettings"\n')
tmpFile.write( ' android:exported="true"\n')
if "ICON" in pkgProperties.keys():
tmpFile.write( ' android:icon="@drawable/icon"\n')
tmpFile.write( ' >\n')
tmpFile.write( ' </activity>\n')
tmpFile.write( ' </application>\n')
# write package autorisations :
if True==self.check_right_package(pkgProperties, "WRITE_EXTERNAL_STORAGE"):
tmpFile.write( ' <permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> \n')
if True==self.check_right_package(pkgProperties, "CAMERA"):
tmpFile.write( ' <permission android:name="android.permission.CAMERA" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.CAMERA" /> \n')
if True==self.check_right_package(pkgProperties, "INTERNET"):
tmpFile.write( ' <permission android:name="android.permission.INTERNET" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.INTERNET" /> \n')
if True==self.check_right_package(pkgProperties, "ACCESS_NETWORK_STATE"):
tmpFile.write( ' <permission android:name="android.permission.ACCESS_NETWORK_STATE" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> \n')
if True==self.check_right_package(pkgProperties, "MODIFY_AUDIO_SETTINGS"):
tmpFile.write( ' <permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> \n')
if True==self.check_right_package(pkgProperties, "READ_CALENDAR"):
tmpFile.write( ' <permission android:name="android.permission.READ_CALENDAR" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.READ_CALENDAR" /> \n')
if True==self.check_right_package(pkgProperties, "READ_CONTACTS"):
tmpFile.write( ' <permission android:name="android.permission.READ_CONTACTS" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.READ_CONTACTS" /> \n')
if True==self.check_right_package(pkgProperties, "READ_FRAME_BUFFER"):
tmpFile.write( ' <permission android:name="android.permission.READ_FRAME_BUFFER" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> \n')
if True==self.check_right_package(pkgProperties, "READ_PROFILE"):
tmpFile.write( ' <permission android:name="android.permission.READ_PROFILE" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.READ_PROFILE" /> \n')
if True==self.check_right_package(pkgProperties, "RECORD_AUDIO"):
tmpFile.write( ' <permission android:name="android.permission.RECORD_AUDIO" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.RECORD_AUDIO" /> \n')
if True==self.check_right_package(pkgProperties, "SET_ORIENTATION"):
tmpFile.write( ' <permission android:name="android.permission.SET_ORIENTATION" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.SET_ORIENTATION" /> \n')
if True==self.check_right_package(pkgProperties, "VIBRATE"):
tmpFile.write( ' <permission android:name="android.permission.VIBRATE" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.VIBRATE" /> \n')
if True==self.check_right_package(pkgProperties, "ACCESS_COARSE_LOCATION"):
tmpFile.write( ' <permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> \n')
if True==self.check_right_package(pkgProperties, "ACCESS_FINE_LOCATION"):
tmpFile.write( ' <permission android:name="android.permission.ACCESS_FINE_LOCATION" /> \n')
tmpFile.write( ' <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> \n')
tmpFile.write( '</manifest>\n\n')
tmpFile.flush()
tmpFile.close()
# end generating android manifest
if pkgProperties["ANDROID_APPL_TYPE"]!="APPL":
#create the Wallpaper sub files : (main element for the application
debug.print_element("pkg", pkgNameApplicationName + "_resource.xml", "<==", "package configurations")
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_resource.xml")
tmpFile = open(self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_resource.xml", 'w')
tmpFile.write( "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
tmpFile.write( "<wallpaper xmlns:android=\"http://schemas.android.com/apk/res/android\"\n")
if len(pkgProperties["ANDROID_WALLPAPER_PROPERTIES"])!=0:
tmpFile.write( " android:settingsActivity=\""+compleatePackageName + "."+ pkgNameApplicationName + "Settings\"\n")
if "ICON" in pkgProperties.keys():
tmpFile.write( " android:thumbnail=\"@drawable/icon\"\n")
tmpFile.write( " />\n")
tmpFile.flush()
tmpFile.close()
# create wallpaper setting if needed (class and config file)
if len(pkgProperties["ANDROID_WALLPAPER_PROPERTIES"])!=0:
tools.create_directory_of_file(self.folder_javaProject + pkgNameApplicationName + "Settings.java")
debug.print_element("pkg", self.folder_javaProject + pkgNameApplicationName + "Settings.java", "<==", "package configurations")
tmpFile = open(self.folder_javaProject + pkgNameApplicationName + "Settings.java", 'w');
tmpFile.write( "package " + compleatePackageName + ";\n")
tmpFile.write( "\n")
tmpFile.write( "import " + compleatePackageName + ".R;\n")
tmpFile.write( "\n")
tmpFile.write( "import android.content.SharedPreferences;\n")
tmpFile.write( "import android.os.Bundle;\n")
tmpFile.write( "import android.preference.PreferenceActivity;\n")
tmpFile.write( "\n")
tmpFile.write( "public class " + pkgNameApplicationName + "Settings extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener\n")
tmpFile.write( "{\n")
tmpFile.write( " @Override protected void onCreate(Bundle icicle) {\n")
tmpFile.write( " super.onCreate(icicle);\n")
tmpFile.write( " getPreferenceManager().setSharedPreferencesName("+ pkgNameApplicationName + ".SHARED_PREFS_NAME);\n")
tmpFile.write( " addPreferencesFromResource(R.xml."+ pkgNameApplicationName + "_settings);\n")
tmpFile.write( " getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);\n")
tmpFile.write( " }\n")
tmpFile.write( " @Override protected void onResume() {\n")
tmpFile.write( " super.onResume();\n")
tmpFile.write( " }\n")
tmpFile.write( " @Override protected void onDestroy() {\n")
tmpFile.write( " getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);\n")
tmpFile.write( " super.onDestroy();\n")
tmpFile.write( " }\n")
tmpFile.write( " public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { }\n")
tmpFile.write( "}\n")
tmpFile.flush()
tmpFile.close()
debug.print_element("pkg", self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_settings.xml", "<==", "package configurations")
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_settings.xml")
tmpFile = open(self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_settings.xml", 'w');
tmpFile.write( "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
tmpFile.write( "<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n")
tmpFile.write( " android:title=\"Settings\"\n")
tmpFile.write( " android:key=\"" + pkgNameApplicationName + "_settings\">\n")
WALL_haveArray = False
for WALL_type, WALL_key, WALL_title, WALL_summary, WALL_other in pkgProperties["ANDROID_WALLPAPER_PROPERTIES"]:
debug.info("find : '" + WALL_type + "'");
if WALL_type == "list":
debug.info(" create : LIST");
tmpFile.write( " <ListPreference android:key=\"" + pkgNameApplicationName + "_" + WALL_key + "\"\n")
tmpFile.write( " android:title=\"" + WALL_title + "\"\n")
tmpFile.write( " android:summary=\"" + WALL_summary + "\"\n")
tmpFile.write( " android:entries=\"@array/" + pkgNameApplicationName + "_" + WALL_key + "_names\"\n")
tmpFile.write( " android:entryValues=\"@array/" + pkgNameApplicationName + "_" + WALL_key + "_prefix\"/>\n")
WALL_haveArray=True
elif WALL_type == "bool":
debug.info(" create : CHECKBOX");
tmpFile.write( " <CheckBoxPreference android:key=\"" + pkgNameApplicationName + "_" + WALL_key + "\"\n")
tmpFile.write( " android:title=\"" + WALL_title + "\"\n")
tmpFile.write( " android:summary=\"" + WALL_summary + "\"\n")
tmpFile.write( " android:summaryOn=\"" + WALL_other[0] + "\"\n")
tmpFile.write( " android:summaryOff=\"" + WALL_other[1] + "\"/>\n")
tmpFile.write( "</PreferenceScreen>\n")
tmpFile.flush()
tmpFile.close()
if WALL_haveArray==True:
for WALL_type, WALL_key, WALL_title, WALL_summary, WALL_other in pkgProperties["ANDROID_WALLPAPER_PROPERTIES"]:
if WALL_type == "list":
debug.print_element("pkg", self.get_staging_folder(pkgName) + "/res/values/" + WALL_key + ".xml", "<==", "package configurations")
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/res/values/" + WALL_key + ".xml")
tmpFile = open(self.get_staging_folder(pkgName) + "/res/values/" + WALL_key + ".xml", 'w');
tmpFile.write( "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
tmpFile.write( "<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n")
tmpFile.write( " <string-array name=\"" + pkgNameApplicationName + "_" + WALL_key + "_names\">\n")
for WALL_subKey, WALL_display in WALL_other:
tmpFile.write( " <item>" + WALL_display + "</item>\n")
tmpFile.write( " </string-array>\n")
tmpFile.write( " <string-array name=\"" + pkgNameApplicationName + "_" + WALL_key + "_prefix\">\n")
for WALL_subKey, WALL_display in WALL_other:
tmpFile.write( " <item>" + WALL_subKey + "</item>\n")
tmpFile.write( " </string-array>\n")
tmpFile.write( "</resources>\n")
tmpFile.flush()
tmpFile.close()
#add properties on wallpaper :
# myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["list", key, title, summary, [["key","value display"],["key2","value display 2"]])
# myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["list", "testpattern", "Select test pattern", "Choose which test pattern to display", [["key","value display"],["key2","value display 2"]]])
# myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", key, title, summary, ["enable string", "disable String"])
# myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", "movement", "Motion", "Apply movement to test pattern", ["Moving test pattern", "Still test pattern"]
#copy needed resources :
for res_source, res_dest in pkgProperties["ANDROID_RESOURCES"]:
if res_source == "":
continue
tools.copy_file(res_source , self.get_staging_folder(pkgName) + "/res/" + res_dest + "/" + os.path.basename(res_source), force=True)
# Doc :
# http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/
debug.print_element("pkg", "R.java", "<==", "Resources files")
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/src/noFile")
androidToolPath = self.folder_sdk + "/build-tools/"
# find android tool version
dirnames = tools.get_list_sub_folder(androidToolPath)
if len(dirnames) != 1:
debug.error("an error occured when getting the tools for android")
androidToolPath += dirnames[0] + "/"
adModResouceFolder = ""
if "ADMOD_ID" in pkgProperties:
adModResouceFolder = " -S " + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/res/ "
cmdLine = androidToolPath + "aapt p -f " \
+ "-M " + self.get_staging_folder(pkgName) + "/AndroidManifest.xml " \
+ "-F " + self.get_staging_folder(pkgName) + "/resources.res " \
+ "-I " + self.folder_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar "\
+ "-S " + self.get_staging_folder(pkgName) + "/res/ " \
+ adModResouceFolder \
+ "-J " + self.get_staging_folder(pkgName) + "/src/ "
multiprocess.run_command(cmdLine)
#aapt package -f -M ${manifest.file} -F ${packaged.resource.file} -I ${path.to.android-jar.library}
# -S ${android-resource-directory} [-m -J ${folder.to.output.the.R.java}]
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/build/classes/noFile")
debug.print_element("pkg", "*.class", "<==", "*.java")
# more information with : -Xlint
# + self.file_finalAbstraction + " "\ # this generate ex: out/Android/debug/staging/tethys/src/com/edouarddupin/tethys/edn.java
#generate android java files:
filesString=""
for element in pkgProperties["ANDROID_JAVA_FILES"]:
if element=="DEFAULT":
filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolAudioTask.java "
filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolCallback.java "
filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolConstants.java "
filesString += self.folder_ewol + "/sources/android/src/org/ewol/Ewol.java "
filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolRendererGL.java "
filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolSurfaceViewGL.java "
filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolActivity.java "
filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolWallpaper.java "
else:
filesString += element + " "
if "ADMOD_ID" in pkgProperties:
filesString += self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/src/android/UnusedStub.java "
if len(pkgProperties["ANDROID_WALLPAPER_PROPERTIES"])!=0:
filesString += self.folder_javaProject + pkgNameApplicationName + "Settings.java "
adModJarFile = ""
if "ADMOD_ID" in pkgProperties:
adModJarFile = ":" + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar"
cmdLine = "javac " \
+ "-d " + self.get_staging_folder(pkgName) + "/build/classes " \
+ "-classpath " + self.folder_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar" \
+ adModJarFile + " " \
+ filesString \
+ self.file_finalAbstraction + " " \
+ self.get_staging_folder(pkgName) + "/src/R.java "
multiprocess.run_command(cmdLine)
debug.print_element("pkg", ".dex", "<==", "*.class")
cmdLine = androidToolPath + "dx " \
+ "--dex --no-strict " \
+ "--output=" + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + ".dex " \
+ self.get_staging_folder(pkgName) + "/build/classes/ "
if "ADMOD_ID" in pkgProperties:
cmdLine += self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar "
multiprocess.run_command(cmdLine)
debug.print_element("pkg", ".apk", "<==", ".dex, assets, .so, res")
#builderDebug="-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y "
builderDebug=""
# note : set -u not signed application...
#+ ":" + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar "
cmdLine = "java -Xmx128M " \
+ " -classpath " + self.folder_sdk + "/tools/lib/sdklib.jar " \
+ builderDebug \
+ " com.android.sdklib.build.ApkBuilderMain " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \
+ " -u " \
+ " -z " + self.get_staging_folder(pkgName) + "/resources.res " \
+ " -f " + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + ".dex " \
+ " -rf " + self.get_staging_folder(pkgName) + "/data "
multiprocess.run_command(cmdLine)
# doc :
# http://developer.android.com/tools/publishing/app-signing.html
# Create a key for signing your application:
# keytool -genkeypair -v -keystore AndroidKey.jks -storepass Pass__AndroidDebugKey -alias alias__AndroidDebugKey -keypass PassKey__AndroidDebugKey -keyalg RSA -validity 36500
if self.config["mode"] == "debug":
debug.print_element("pkg", ".apk(signed debug)", "<==", ".apk (not signed)")
# verbose mode :
#debugOption = "-verbose -certs "
debugOption = ""
cmdLine = "jarsigner " \
+ debugOption \
+ "-keystore " + tools.get_current_path(__file__) + "/AndroidDebugKey.jks " \
+ " -sigalg SHA1withRSA -digestalg SHA1 " \
+ " -storepass Pass__AndroidDebugKey " \
+ " -keypass PassKey__AndroidDebugKey " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \
+ " alias__AndroidDebugKey"
multiprocess.run_command(cmdLine)
tmpFile = open("tmpPass.boo", 'w')
tmpFile.write("\n")
tmpFile.flush()
tmpFile.close()
else:
print("On release mode we need the file : and key an pasword to sign the application ...")
debug.print_element("pkg", ".apk(signed debug)", "<==", ".apk (not signed)")
cmdLine = "jarsigner " \
+ " -keystore " + basePkgPath + "/AndroidKey.jks " \
+ " -sigalg SHA1withRSA -digestalg SHA1 " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \
+ " " + pkgNameApplicationName
multiprocess.run_command(cmdLine)
cmdLine = "jarsigner " \
+ " -verify -verbose -certs " \
+ " -sigalg SHA1withRSA -digestalg SHA1 " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk "
multiprocess.run_command(cmdLine)
debug.print_element("pkg", ".apk(aligned)", "<==", ".apk (not aligned)")
tools.remove_file(self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk")
# verbose mode : -v
cmdLine = androidToolPath + "zipalign 4 " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \
+ self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk "
multiprocess.run_command(cmdLine)
# copy file in the final stage :
tools.copy_file(self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk",
self.get_final_folder() + "/" + pkgNameApplicationName + ".apk",
force=True)
def install_package(self, pkgName):
debug.debug("------------------------------------------------------------------------")
debug.info("Install package '" + pkgName + "'")
debug.debug("------------------------------------------------------------------------")
pkgNameApplicationName = pkgName
if self.config["mode"] == "debug":
pkgNameApplicationName += "debug"
cmdLine = self.folder_sdk + "/platform-tools/adb install -r " \
+ self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk "
multiprocess.run_command(cmdLine)
def un_install_package(self, pkgName):
debug.debug("------------------------------------------------------------------------")
debug.info("Un-Install package '" + pkgName + "'")
debug.debug("------------------------------------------------------------------------")
pkgNameApplicationName = pkgName
if self.config["mode"] == "debug":
pkgNameApplicationName += "debug"
cmdLine = self.folder_sdk + "/platform-tools/adb uninstall " + pkgNameApplicationName
Rmultiprocess.unCommand(cmdLine)
def Log(self, pkgName):
debug.debug("------------------------------------------------------------------------")
debug.info("logcat of android board")
debug.debug("------------------------------------------------------------------------")
debug.info("cmd: " + self.folder_sdk + "/platform-tools/adb shell logcat ")
cmdLine = self.folder_sdk + "/platform-tools/adb shell logcat "
multiprocess.run_command(cmdLine)

View File

@@ -144,3 +144,37 @@ def copy_anything_target(target, src, dst):
newDst += "/" newDst += "/"
debug.verbose("Might copy : '" + root+"/"+cycleFile + "' ==> '" + newDst+cycleFile + "'" ) debug.verbose("Might copy : '" + root+"/"+cycleFile + "' ==> '" + newDst+cycleFile + "'" )
target.add_file_staging(root+"/"+cycleFile, newDst+cycleFile) target.add_file_staging(root+"/"+cycleFile, newDst+cycleFile)
def filter_extention(list_files, extentions, invert=False):
out = []
for file in list_files:
in_list = False
for ext in extentions:
if file[-len(ext):] == ext:
in_list = True
if in_list == True \
and invert == False:
out.append(file)
elif in_list == False \
and invert == True:
out.append(file)
return out
def move_if_needed(src, dst):
if not os.path.isfile(src):
debug.error("request move if needed, but file does not exist: '" + str(src) + "' to '" + str(dst) + "'")
return
src_data = file_read_data(src)
if os.path.isfile(dst):
# file exist ==> must check ...
dst_data = file_read_data(dst)
if src_data == dst_data:
# nothing to do ...
return
file_write_data(dst, src_data)
remove_file(src)

View File

@@ -41,7 +41,7 @@ def get_output_type():
## @brief Commands for running gcc to link an executable. ## @brief Commands for running gcc to link an executable.
## ##
def link(file, binary, target, depancy, name, basic_folder): def link(file, binary, target, depancy, name, basic_folder):
file_src, file_dst, file_depend, file_cmd = target.generate_file(binary, name, basic_folder, file, "bin") file_src, file_dst, file_depend, file_cmd, file_warning = target.generate_file(binary, name, basic_folder, file, "bin")
#create comdLine : #create comdLine :
cmd = [ cmd = [
target.xx target.xx
@@ -90,7 +90,7 @@ def link(file, binary, target, depancy, name, basic_folder):
tools.create_directory_of_file(file_dst) tools.create_directory_of_file(file_dst)
debug.print_element("Executable", name, "==>", file_dst) debug.print_element("Executable", name, "==>", file_dst)
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine, store_output_file=file_warning)
if target.config["mode"] == "release"\ if target.config["mode"] == "release"\
or env.get_force_strip_mode() == True: or env.get_force_strip_mode() == True:
# get the file size of the non strip file # get the file size of the non strip file
@@ -99,7 +99,7 @@ def link(file, binary, target, depancy, name, basic_folder):
cmdLineStrip=tools.list_to_str([ cmdLineStrip=tools.list_to_str([
target.strip, target.strip,
file_dst]) file_dst])
multiprocess.run_command(cmdLineStrip) multiprocess.run_command(cmdLineStrip, store_output_file=file_warning)
# get the stip size of the binary # get the stip size of the binary
stripSize = tools.file_size(file_dst) stripSize = tools.file_size(file_dst)
debug.debug("file reduce size : " + str(originSize/1024) + "ko ==> " + str(stripSize/1024) + "ko") debug.debug("file reduce size : " + str(originSize/1024) + "ko ==> " + str(stripSize/1024) + "ko")

View File

@@ -41,7 +41,11 @@ def get_output_type():
## @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.
## ##
def compile(file, binary, target, depancy, flags, path, name, basic_folder): def compile(file, binary, target, depancy, flags, path, name, basic_folder):
file_src, file_dst, file_depend, file_cmd = target.file_generate_object(binary, name, basic_folder,file) file_src = target.get_full_name_source(basic_folder, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file)
file_warning = target.get_full_name_warning(name, basic_folder, file)
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [
@@ -50,16 +54,13 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
target.arch, target.arch,
target.sysroot, target.sysroot,
target.global_include_cc] target.global_include_cc]
for view in ["export", "local"]:
try:
cmd.append(tools.add_prefix("-I", path[view]["c"]))
except:
pass
try: try:
cmd.append(tools.add_prefix("-I", path["export"])) cmd.append(tools.add_prefix("-I", depancy.path["c"]))
except:
pass
try:
cmd.append(tools.add_prefix("-I", path["local"]))
except:
pass
try:
cmd.append(tools.add_prefix("-I", depancy.path))
except: except:
pass pass
try: try:
@@ -74,14 +75,11 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
cmd.append(depancy.flags["c"]) cmd.append(depancy.flags["c"])
except: except:
pass pass
try: for view in ["local", "export"]:
cmd.append(flags["local"]["c"]) try:
except: cmd.append(flags[view]["c"])
pass except:
try: pass
cmd.append(flags["export"]["c"])
except:
pass
cmd.append("-c") cmd.append("-c")
cmd.append("-MMD") cmd.append("-MMD")
cmd.append("-MP") cmd.append("-MP")
@@ -90,12 +88,12 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
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_build(file_dst, file_src, file_depend, file_cmd, cmdLine) == False: if depend.need_re_build(file_dst, file_src, file_depend, file_cmd, cmdLine) == False:
return file_dst return {"action":"add", "file":file_dst}
tools.create_directory_of_file(file_dst) tools.create_directory_of_file(file_dst)
comment = ["c", name, "<==", file] comment = ["c", name, "<==", file]
# process element # process element
multiprocess.run_in_pool(cmdLine, comment, file_cmd) multiprocess.run_in_pool(cmdLine, comment, file_cmd, store_output_file=file_warning)
return file_dst return {"action":"add", "file":file_dst}
def get_version_compilation_flags(flags, dependency_flags): def get_version_compilation_flags(flags, dependency_flags):

View File

@@ -40,8 +40,11 @@ def get_output_type():
## @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.
## ##
def compile(file, binary, target, depancy, flags, path, name, basic_folder): def compile(file, binary, target, depancy, flags, path, name, basic_folder):
file_src, file_dst, file_depend, file_cmd = target.file_generate_object(binary, name, basic_folder, file) file_src = target.get_full_name_source(basic_folder, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file)
file_warning = target.get_full_name_warning(name, basic_folder, file)
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [
target.xx, target.xx,
@@ -50,18 +53,17 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
target.sysroot, target.sysroot,
target.global_include_cc target.global_include_cc
] ]
try: for view in ["export", "local"]:
cmd.append(tools.add_prefix("-I",path["export"])) for type in ["c", "c++"]:
except: try:
pass cmd.append(tools.add_prefix("-I",path[view][type]))
try: except:
cmd.append(tools.add_prefix("-I",path["local"])) pass
except: for type in ["c", "c++"]:
pass try:
try: cmd.append(tools.add_prefix("-I",depancy.path[type]))
cmd.append(tools.add_prefix("-I",depancy.path)) except:
except: pass
pass
try: try:
cmd.append(get_version_compilation_flags(flags, depancy.flags)) cmd.append(get_version_compilation_flags(flags, depancy.flags))
except: except:
@@ -74,43 +76,29 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
cmd.append(target.global_flags_xx) cmd.append(target.global_flags_xx)
except: except:
pass pass
try: for type in ["c", "c++"]:
cmd.append(depancy.flags["c"]) try:
except: cmd.append(depancy.flags[type])
pass except:
try: pass
cmd.append(depancy.flags["c++"]) for view in ["local", "export"]:
except: for type in ["c", "c++"]:
pass try:
try: cmd.append(flags[view][type])
cmd.append(flags["local"]["c"]) except:
except: pass
pass
try:
cmd.append(flags["local"]["c++"])
except:
pass
try:
cmd.append(flags["export"]["c"])
except:
pass
try:
cmd.append(flags["export"]["c++"])
except:
pass
cmd.append(["-c", "-MMD", "-MP"]) cmd.append(["-c", "-MMD", "-MP"])
cmd.append(file_src) cmd.append(file_src)
# 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 depend.need_re_build(file_dst, file_src, file_depend, file_cmd, cmdLine) == False: if depend.need_re_build(file_dst, file_src, file_depend, file_cmd, cmdLine) == False:
return file_dst return {"action":"add", "file":file_dst}
tools.create_directory_of_file(file_dst) tools.create_directory_of_file(file_dst)
comment = ["c++", name, "<==", file] comment = ["c++", name, "<==", file]
#process element #process element
multiprocess.run_in_pool(cmdLine, comment, file_cmd) multiprocess.run_in_pool(cmdLine, comment, file_cmd, store_output_file=file_warning)
return file_dst return {"action":"add", "file":file_dst}
def get_version_compilation_flags(flags, dependency_flags): def get_version_compilation_flags(flags, dependency_flags):
try: try:

View File

@@ -0,0 +1,73 @@
##
## Dynamic library builder
##
from lutin import multiprocess
from lutin import tools
from lutin import debug
from lutin import depend
from lutin import env
import os
##
## Initialize the builder, if needed ... to get dependency between builder (for example)
##
def init():
pass
##
## Get the current builder type.
## Return the type of builder
##
def get_type():
return "linker"
##
## @brief Get builder input file type
## @return List of extention supported
##
def get_input_type():
return ["class"]
##
## @brief Get builder output file type
## @return List of extention supported
##
def get_output_type():
return ["jar"]
##
## @brief Commands for running gcc to link a shared library.
##
def link(file, binary, target, depancy, name, basic_folder):
file_src, file_dst, file_depend, file_cmd, file_warning = target.generate_file(binary, name, basic_folder, file, "jar")
#create command Line
cmd = [
target.jar,
"cf", file_dst,
]
for file in file_src:
path = ""
for elem in ["org/", "com/"]:
pos = file.find(elem);
if pos > 0:
path = file[:pos]
file = file[pos:]
cmd.append("-C")
cmd.append(path)
cmd.append(file)
cmdLine=tools.list_to_str(cmd)
"""
# check the dependency for this file :
if depend.need_re_package(file_dst, file_src, True, file_cmd, cmdLine) == False:
return tmpList[1]
"""
tools.create_directory_of_file(file_dst)
debug.print_element("jar", name, "==>", file_dst)
multiprocess.run_command(cmdLine, store_output_file=file_warning)
# write cmd line only after to prevent errors ...
multiprocess.store_command(cmdLine, file_cmd)
#debug.print_element("SharedLib", self.name, "==>", tmpList[1])
return file_dst

View File

@@ -0,0 +1,93 @@
##
## Java builder
##
from lutin import multiprocess
from lutin import tools
from lutin import debug
from lutin import depend
##
## Initialize the builder, if needed ... to get dependency between builder (for example)
##
def init():
pass
##
## Get the current builder type.
## Return the type of builder
##
def get_type():
return "compiler"
##
## @brief Get builder input file type
## @return List of extention supported
##
def get_input_type():
return ["java"]
##
## @brief Get builder output file type
## @return List of extention supported
##
def get_output_type():
return ["class"]
##
## @brief Commands for running gcc to compile a C++ file in object file.
##
def compile(file, binary, target, depancy, flags, path, name, basic_folder):
file_src = target.get_full_name_source(basic_folder, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type(), remove_suffix=True)
file_depend = target.get_full_dependency(name, basic_folder, file)
file_warning = target.get_full_name_warning(name, basic_folder, file)
# create the command line befor requesting start:
cmd = [
target.java,
"-d", target.get_build_folder(name)
]
# add source dependency:
list_sources_path = []
for view in ["export", "local"]:
try:
list = path[view]["java"]
for elem in list:
list_sources_path.append(elem)
except:
pass
if len(list_sources_path) > 0:
cmd.append("-sourcepath")
out = ""
for elem in list_sources_path:
if len(out) > 0:
out += ":"
out += elem
cmd.append(out)
class_extern = []
upper_jar = tools.filter_extention(depancy.src, ["jar"])
#debug.warning("ploppppp = " + str(upper_jar))
for elem in upper_jar:
class_extern.append(elem)
if len(class_extern) > 0:
cmd.append("-classpath")
out = ""
for elem in class_extern:
if len(out) > 0:
out += ":"
out += elem
cmd.append(out)
cmd.append(file_src)
# Create cmd line
cmdLine=tools.list_to_str(cmd)
# check the dependency for this file :
if depend.need_re_build(file_dst, file_src, file_depend, file_cmd, cmdLine) == False:
return {"action":"add", "file":file_dst}
tools.create_directory_of_file(file_dst)
comment = ["java", name, "<==", file]
#process element
multiprocess.run_in_pool(cmdLine, comment, file_cmd, store_output_file=file_warning)
return {"action":"add", "file":file_dst}

View File

@@ -0,0 +1,72 @@
##
## Java builder
##
from lutin import multiprocess
from lutin import tools
from lutin import debug
from lutin import depend
##
## Initialize the builder, if needed ... to get dependency between builder (for example)
##
def init():
pass
##
## Get the current builder type.
## Return the type of builder
##
def get_type():
return "compiler"
##
## @brief Get builder input file type
## @return List of extention supported
##
def get_input_type():
return ["javah"]
##
## @brief Get builder output file type
## @return List of extention supported
##
def get_output_type():
return ["h"]
##
## @brief Commands for running gcc to compile a C++ file in object file.
##
def compile(file, binary, target, depancy, flags, path, name, basic_folder):
# file_src = target.get_full_name_source(basic_folder, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file)
# file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file)
file_warning = target.get_full_name_warning(name, basic_folder, file)
# create the command line befor requesting start:
cmd = [
target.javah,
"-d", target.get_build_folder(name) + target.folder_generate_code
]
if debug.get_level() >= 5:
cmd.append("-verbose")
cmd.append("-classpath")
cmd.append(target.get_build_folder(name))
class_to_build = file[:-6]
cmd.append(class_to_build)
# Create cmd line
cmdLine=tools.list_to_str(cmd)
file_dst = target.get_build_folder(name) + "/tmp_header/" + class_to_build.replace(".", "_") + ".h"
# check the dependency for this file :
#if depend.need_re_build(file_dst, file_src, file_depend, file_cmd, cmdLine) == False:
# return file_dst
#tools.create_directory_of_file(file_dst)
comment = ["javah", class_to_build.replace(".", "_") + ".h", "<==", class_to_build]
#process element
multiprocess.run_in_pool(cmdLine, comment, file_cmd, store_output_file=file_warning)
debug.verbose("file= " + file_dst)
#return file_dst
return {"action":"path", "path":target.get_build_folder(name) + target.folder_generate_code}

View File

@@ -26,7 +26,7 @@ def get_type():
## @return List of extention supported ## @return List of extention supported
## ##
def get_input_type(): def get_input_type():
return ["o"] return ["o", "a"]
## ##
## @brief Get builder output file type ## @brief Get builder output file type
@@ -39,7 +39,7 @@ def get_output_type():
## @brief Commands for running gcc to link a shared library. ## @brief Commands for running gcc to link a shared library.
## ##
def link(file, binary, target, depancy, name, basic_folder): def link(file, binary, target, depancy, name, basic_folder):
file_src, file_dst, file_depend, file_cmd = target.generate_file(binary, name, basic_folder, file, "lib-shared") file_src, file_dst, file_depend, file_cmd, file_warning = target.generate_file(binary, name, basic_folder, file, "lib-shared")
#create command Line #create command Line
cmd = [ cmd = [
target.xx, target.xx,
@@ -59,7 +59,8 @@ def link(file, binary, target, depancy, name, basic_folder):
except: except:
pass pass
try: try:
cmd.append(depancy.src) # keep only compilated files ...
cmd.append(tools.filter_extention(depancy.src, get_input_type()))
except: except:
pass pass
try: try:
@@ -81,7 +82,7 @@ def link(file, binary, target, depancy, name, basic_folder):
return tmpList[1] return tmpList[1]
tools.create_directory_of_file(file_dst) tools.create_directory_of_file(file_dst)
debug.print_element("SharedLib", name, "==>", file_dst) debug.print_element("SharedLib", name, "==>", file_dst)
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine, store_output_file=file_warning)
# strip the output file: # strip the output file:
if target.config["mode"] == "release" \ if target.config["mode"] == "release" \
or env.get_force_strip_mode() == True: or env.get_force_strip_mode() == True:
@@ -91,10 +92,11 @@ def link(file, binary, target, depancy, name, basic_folder):
cmdLineStrip=tools.list_to_str([ cmdLineStrip=tools.list_to_str([
target.strip, target.strip,
file_dst]) file_dst])
multiprocess.run_command(cmdLineStrip) multiprocess.run_command(cmdLineStrip, store_output_file=file_warning)
# get the stip size of the binary # get the stip size of the binary
stripSize = tools.file_size(file_dst) stripSize = tools.file_size(file_dst)
debug.debug("file reduce size : " + str(originSize/1024) + "ko ==> " + str(stripSize/1024) + "ko") debug.debug("file reduce size : " + str(originSize/1024) + "ko ==> " + str(stripSize/1024) + "ko")
# write cmd line only after to prevent errors ... # write cmd line only after to prevent errors ...
multiprocess.store_command(cmdLine, file_cmd) multiprocess.store_command(cmdLine, file_cmd)
#debug.print_element("SharedLib", self.name, "==>", tmpList[1]) #debug.print_element("SharedLib", self.name, "==>", tmpList[1])
return file_dst

View File

@@ -26,7 +26,7 @@ def get_type():
## @return List of extention supported ## @return List of extention supported
## ##
def get_input_type(): def get_input_type():
return ["o"] return ["o", "a"]
## ##
## @brief Get builder output file type ## @brief Get builder output file type
@@ -39,7 +39,7 @@ def get_output_type():
## @brief Commands for running ar. ## @brief Commands for running ar.
## ##
def link(file, binary, target, depancy, name, basic_folder): def link(file, binary, target, depancy, name, basic_folder):
file_src, file_dst, file_depend, file_cmd = target.generate_file(binary, name, basic_folder, file, "lib-static") file_src, file_dst, file_depend, file_cmd, file_warning = target.generate_file(binary, name, basic_folder, file, "lib-static")
#$(Q)$(TARGET_AR) $(TARGET_GLOBAL_ARFLAGS) $(PRIVATE_ARFLAGS) $@ $(PRIVATE_ALL_OBJECTS) #$(Q)$(TARGET_AR) $(TARGET_GLOBAL_ARFLAGS) $(PRIVATE_ARFLAGS) $@ $(PRIVATE_ALL_OBJECTS)
cmd = [ cmd = [
target.ar target.ar
@@ -70,13 +70,13 @@ def link(file, binary, target, depancy, name, basic_folder):
# explicitly remove the destination to prevent error ... # explicitly remove the destination to prevent error ...
if os.path.exists(file_dst) and os.path.isfile(file_dst): if os.path.exists(file_dst) and os.path.isfile(file_dst):
os.remove(file_dst) os.remove(file_dst)
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine, store_output_file=file_warning)
#$(Q)$(TARGET_RANLIB) $@ #$(Q)$(TARGET_RANLIB) $@
if target.ranlib != "": if target.ranlib != "":
cmdLineRanLib=tools.list_to_str([ cmdLineRanLib=tools.list_to_str([
target.ranlib, target.ranlib,
file_dst ]) file_dst ])
multiprocess.run_command(cmdLineRanLib) multiprocess.run_command(cmdLineRanLib, store_output_file=file_warning)
# write cmd line only after to prevent errors ... # write cmd line only after to prevent errors ...
multiprocess.store_command(cmdLine, file_cmd) multiprocess.store_command(cmdLine, file_cmd)
return file_dst return file_dst

View File

@@ -42,7 +42,11 @@ def get_output_type():
## @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.
## ##
def compile(file, binary, target, depancy, flags, path, name, basic_folder): def compile(file, binary, target, depancy, flags, path, name, basic_folder):
file_src, file_dst, file_depend, file_cmd = target.file_generate_object(binary, name, basic_folder, file) file_src = target.get_full_name_source(basic_folder, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file)
file_warning = target.get_full_name_warning(name, basic_folder, file)
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [
target.cc, target.cc,
@@ -50,18 +54,17 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
target.arch, target.arch,
target.sysroot, target.sysroot,
target.global_include_cc] target.global_include_cc]
try: for view in ["export", "local"]:
cmd.append(tools.add_prefix("-I",path["export"])) for type in ["c", "m"]:
except: try:
pass cmd.append(tools.add_prefix("-I",path[view][type]))
try: except:
cmd.append(tools.add_prefix("-I",path["local"])) pass
except: for type in ["c", "m"]:
pass try:
try: cmd.append(tools.add_prefix("-I",depancy.path[type]))
cmd.append(tools.add_prefix("-I",depancy.path)) except:
except: pass
pass
try: try:
cmd.append(local_ref_on_builder_c.get_version_compilation_flags(flags, depancy.flags)) cmd.append(local_ref_on_builder_c.get_version_compilation_flags(flags, depancy.flags))
except: except:
@@ -74,30 +77,17 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
cmd.append(target.global_flags_m) cmd.append(target.global_flags_m)
except: except:
pass pass
try: for type in ["c", "m"]:
cmd.append(depancy.flags["c"]) try:
except: cmd.append(depancy.flags[type])
pass except:
try: pass
cmd.append(depancy.flags["m"]) for view in ["local", "export"]:
except: for type in ["c", "m"]:
pass try:
try: cmd.append(flags[view][type])
cmd.append(flags["local"]["c"]) except:
except: pass
pass
try:
cmd.append(flags["local"]["m"])
except:
pass
try:
cmd.append(flags["export"]["c"])
except:
pass
try:
cmd.append(flags["export"]["m"])
except:
pass
cmd.append("-c -MMD -MP") cmd.append("-c -MMD -MP")
cmd.append("-x objective-c") cmd.append("-x objective-c")
cmd.append(file_src) cmd.append(file_src)
@@ -105,10 +95,10 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
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 False==depend.need_re_build(file_dst, file_src, file_depend, file_cmd, cmdLine):
return 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]
#process element #process element
multiprocess.run_in_pool(cmdLine, comment, file_cmd) multiprocess.run_in_pool(cmdLine, comment, file_cmd, store_output_file=file_warning)
return file_dst return {"action":"add", "file":file_dst}

View File

@@ -42,7 +42,11 @@ def get_output_type():
## @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.
## ##
def compile(file, binary, target, depancy, flags, path, name, basic_folder): def compile(file, binary, target, depancy, flags, path, name, basic_folder):
file_src, file_dst, file_depend, file_cmd = target.file_generate_object(binary, name, basic_folder, file) file_src = target.get_full_name_source(basic_folder, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file)
file_warning = target.get_full_name_warning(name, basic_folder, file)
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [
target.xx, target.xx,
@@ -50,18 +54,17 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
target.arch, target.arch,
target.sysroot, target.sysroot,
target.global_include_cc] target.global_include_cc]
try: for view in ["export", "local"]:
cmd.append(tools.add_prefix("-I",path["export"])) for type in ["c", "c++", "m", "mm"]:
except: try:
pass cmd.append(tools.add_prefix("-I",path[view][type]))
try: except:
cmd.append(tools.add_prefix("-I",path["local"])) pass
except: for type in ["c", "c++", "m", "mm"]:
pass try:
try: cmd.append(tools.add_prefix("-I",depancy.path[type]))
cmd.append(tools.add_prefix("-I",depancy.path)) except:
except: pass
pass
try: try:
cmd.append(local_ref_on_builder_cpp.get_version_compilation_flags(flags, depancy.flags)) cmd.append(local_ref_on_builder_cpp.get_version_compilation_flags(flags, depancy.flags))
except: except:
@@ -74,42 +77,17 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
cmd.append(target.global_flags_mm) cmd.append(target.global_flags_mm)
except: except:
pass pass
try: for type in ["c", "c++", "m", "mm"]:
cmd.append(depancy.flags["c"]) try:
except: cmd.append(depancy.flags[type])
pass except:
try: pass
cmd.append(depancy.flags["c++"]) for view in ["export", "local"]:
except: for type in ["c", "c++", "m", "mm"]:
pass try:
try: cmd.append(flags[view][type])
cmd.append(depancy.flags["mm"]) except:
except: pass
pass
try:
cmd.append(flags["local"]["c"])
except:
pass
try:
cmd.append(flags["local"]["c++"])
except:
pass
try:
cmd.append(flags["local"]["mm"])
except:
pass
try:
cmd.append(flags["export"]["c"])
except:
pass
try:
cmd.append(flags["export"]["c++"])
except:
pass
try:
cmd.append(flags["export"]["mm"])
except:
pass
cmd.append("-c -MMD -MP") cmd.append("-c -MMD -MP")
cmd.append("-x objective-c++") cmd.append("-x objective-c++")
cmd.append(file_src) cmd.append(file_src)
@@ -117,9 +95,9 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
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 False==depend.need_re_build(file_dst, file_src, file_depend, file_cmd, cmdLine):
return 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]
#process element #process element
multiprocess.run_in_pool(cmdLine, comment, file_cmd) multiprocess.run_in_pool(cmdLine, comment, file_cmd, store_output_file=file_warning)
return file_dst return {"action":"add", "file":file_dst}

View File

View File

@@ -0,0 +1,115 @@
#!/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="ADMOD: Android SDK ad-mod interface (auto-create interface for admod)\n"
# todo : Check if present ...
self.valid = True
# todo : create a searcher of the presence of the library:
self.add_export_SRC(target.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar")
self.add_action("PACKAGE", 10, "admod-auto-wrapper", tool_generate_main_java_class)
##################################################################
##
## Android specific section
##
##################################################################
def tool_generate_main_java_class(target, module, package_name):
if "ADMOD_ID" not in module.package_prop:
debug.warning("Missing parameter ADMOD_ID wen you resuested dependency of ADMOD")
return
module.package_prop["RIGHT"].append("INTERNET")
module.package_prop["RIGHT"].append("ACCESS_NETWORK_STATE")
module.pkg_add("GENERATE_SECTION__IMPORT", [
"import com.google.android.gms.ads.AdRequest;",
"import com.google.android.gms.ads.AdSize;",
"import com.google.android.gms.ads.AdView;",
"import android.widget.LinearLayout;",
"import android.widget.Button;"
])
module.pkg_add("GENERATE_SECTION__DECLARE", [
"/** The view to show the ad. */",
"private AdView adView;",
"private LinearLayout mLayout = null;"
])
list_create = [
"mLayout = new LinearLayout(this);"
"mLayout.setOrientation(android.widget.LinearLayout.VERTICAL);",
"LinearLayout.LayoutParams paramsWindows = new LinearLayout.LayoutParams(",
" LinearLayout.LayoutParams.FILL_PARENT,",
" LinearLayout.LayoutParams.FILL_PARENT);",
"",
"setContentView(mLayout, paramsWindows);",
"",
"LinearLayout.LayoutParams paramsAdds = new LinearLayout.LayoutParams(",
" LinearLayout.LayoutParams.FILL_PARENT,",
" LinearLayout.LayoutParams.WRAP_CONTENT);",
"paramsAdds.weight = 0;",
"",
"LinearLayout.LayoutParams paramsGLView = new LinearLayout.LayoutParams(",
" LinearLayout.LayoutParams.FILL_PARENT,",
" LinearLayout.LayoutParams.FILL_PARENT);",
"paramsGLView.weight = 1;",
"paramsGLView.height = 0;",
"",
"mLayout.setGravity(android.view.Gravity.TOP);",
"",
"// Create an adds.",
"adView = new AdView(this);",
"adView.setAdSize(AdSize.SMART_BANNER);",
"adView.setAdUnitId(\"" + module.package_prop["ADMOD_ID"] + "\");",
"",
"// Create an ad request. Check logcat output for the hashed device ID to get test ads on a physical device.",
"AdRequest adRequest = new AdRequest.Builder()",
" .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)",
" .build();",
"",
"// Add the AdView to the view hierarchy. The view will have no size until the ad is loaded."]
if "ADMOD_POSITION" in module.package_prop \
and module.package_prop["ADMOD_POSITION"] == "top":
list_create.append("mLayout.addView(adView, paramsAdds);")
list_create.append("mLayout.addView(mGLView, paramsGLView);")
else:
list_create.append("mLayout.addView(mGLView, paramsGLView);")
list_create.append("mLayout.addView(adView, paramsAdds);")
list_create.append("")
list_create.append("// Start loading the ad in the background.")
list_create.append("adView.loadAd(adRequest);")
module.pkg_add("GENERATE_SECTION__ON_CREATE", list_create)
module.pkg_add("GENERATE_SECTION__ON_RESUME", [
"if (adView != null) {",
" adView.resume();",
"}"
])
module.pkg_add("GENERATE_SECTION__ON_PAUSE", [
"if (adView != null) {",
" adView.pause();",
"}"
])
module.pkg_add("GENERATE_SECTION__ON_DESTROY", [
"// Destroy the AdView.",
"if (adView != null) {",
" adView.destroy();",
"}"
])

View File

@@ -0,0 +1,28 @@
#!/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="SDK: Android SDK basic interface java\n"
# TODO : Check if the android sdk android.jar is present ...
self.valid = True
# todo : create a searcher of the presence of the library:
self.add_export_SRC(target.folder_sdk + "/platforms/android-" + str(target.boardId) + "/android.jar")
self.add_export_flag_LD("-ldl")
self.add_export_flag_LD("-llog")
self.add_export_flag_LD("-landroid")

View File

@@ -13,7 +13,7 @@ from lutin import tools
import os import os
class System(system.System): class System(system.System):
def __init__(self): def __init__(self, target):
system.System.__init__(self) system.System.__init__(self)
# create some HELP: # create some HELP:
self.help="CoreAudio : Ios interface for audio (all time present, just system interface)" self.help="CoreAudio : Ios interface for audio (all time present, just system interface)"

View File

@@ -13,7 +13,7 @@ from lutin import tools
import os import os
class System(system.System): class System(system.System):
def __init__(self): def __init__(self, target):
system.System.__init__(self) system.System.__init__(self)
# create some HELP: # create some HELP:
self.help="ALSA : Advanced Linux Sound Architecture\n Can be install with the package:\n - libasound2-dev" self.help="ALSA : Advanced Linux Sound Architecture\n Can be install with the package:\n - libasound2-dev"

View File

@@ -13,7 +13,7 @@ from lutin import tools
import os import os
class System(system.System): class System(system.System):
def __init__(self): def __init__(self, target):
system.System.__init__(self) system.System.__init__(self)
# create some HELP: # create some HELP:
self.help="BOOST : Boost interface (need when we have not all c++ feature\n Can be install with the package:\n - libboost-all-dev" self.help="BOOST : Boost interface (need when we have not all c++ feature\n Can be install with the package:\n - libboost-all-dev"

View File

@@ -13,7 +13,7 @@ from lutin import tools
import os import os
class System(system.System): class System(system.System):
def __init__(self): def __init__(self, target):
system.System.__init__(self) system.System.__init__(self)
# create some HELP: # create some HELP:
self.help="JACK : Jack Low-Latency Audio Server\n Can be install with the package:\n - libjack-jackd2-dev (new)\n - libjack-dev (old)" self.help="JACK : Jack Low-Latency Audio Server\n Can be install with the package:\n - libjack-jackd2-dev (new)\n - libjack-dev (old)"

View File

@@ -13,7 +13,7 @@ from lutin import tools
import os import os
class System(system.System): class System(system.System):
def __init__(self): def __init__(self, target):
system.System.__init__(self) system.System.__init__(self)
# create some HELP: # create some HELP:
self.help="OSS : Linux Open Sound System\n Can be install with the package:\n - ... TODO ..." self.help="OSS : Linux Open Sound System\n Can be install with the package:\n - ... TODO ..."

View File

@@ -13,7 +13,7 @@ from lutin import tools
import os import os
class System(system.System): class System(system.System):
def __init__(self): def __init__(self, target):
system.System.__init__(self) system.System.__init__(self)
# create some HELP: # create some HELP:
self.help="PULSE : The Linux PulseAudio\n Can be install with the package:\n - libpulse-dev" self.help="PULSE : The Linux PulseAudio\n Can be install with the package:\n - libpulse-dev"

View File

@@ -13,7 +13,7 @@ from lutin import tools
import os import os
class System(system.System): class System(system.System):
def __init__(self): def __init__(self, target):
system.System.__init__(self) system.System.__init__(self)
# create some HELP: # create some HELP:
self.help="Z : z library \n Can be install with the package:\n - zlib1g-dev" self.help="Z : z library \n Can be install with the package:\n - zlib1g-dev"

View File

@@ -13,7 +13,7 @@ from lutin import tools
import os import os
class System(system.System): class System(system.System):
def __init__(self): def __init__(self, target):
system.System.__init__(self) system.System.__init__(self)
# create some HELP: # create some HELP:
self.help="CoreAudio : MacOs interface for audio (all time present, just system interface)" self.help="CoreAudio : MacOs interface for audio (all time present, just system interface)"

View File

@@ -13,7 +13,7 @@ from lutin import tools
import os import os
class System(system.System): class System(system.System):
def __init__(self): def __init__(self, target):
system.System.__init__(self) system.System.__init__(self)
# create some HELP: # create some HELP:
self.help="DirectSound : Direct sound API for windows audio interface" self.help="DirectSound : Direct sound API for windows audio interface"

View File

View File

@@ -0,0 +1,446 @@
#!/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 target
from lutin import tools
from lutin import image
from lutin import multiprocess
from lutin import host
import os
import sys
class Target(target.Target):
def __init__(self, config):
#processor type selection (auto/arm/ppc/x86)
if config["arch"] == "auto":
config["arch"] = "arm"
#bus size selection (auto/32/64)
if config["bus-size"] == "auto":
config["bus-size"] = "32"
arch = ""
target.Target.__init__(self, "Android", config, arch)
if config["bus-size"] == "32":
arch="armv7"
else:
arch="arm64"
self.folder_ndk = os.getenv('PROJECT_NDK', "AUTO")
self.folder_sdk = os.getenv('PROJECT_SDK', "AUTO")
# auto search NDK
if self.folder_ndk == "AUTO":
for folder in os.listdir("."):
if os.path.isdir(folder)==True:
if folder=="android":
self.folder_ndk = folder + "/ndk"
if self.folder_ndk == "AUTO":
self.folder_ndk = tools.get_run_folder() + "/../android/ndk"
# auto search SDK
if self.folder_sdk == "AUTO":
for folder in os.listdir("."):
if os.path.isdir(folder)==True:
if folder=="android":
self.folder_sdk = folder + "/sdk"
if self.folder_sdk == "AUTO":
self.folder_sdk = tools.get_run_folder() + "/../android/sdk"
if not os.path.isdir(self.folder_ndk):
debug.error("NDK path not set !!! set env : PROJECT_NDK on the NDK path")
if not os.path.isdir(self.folder_sdk):
debug.error("SDK path not set !!! set env : PROJECT_SDK on the SDK path")
tmpOsVal = "64"
gccVersion = "4.9"
if host.BUS_SIZE==64:
tmpOsVal = "_64"
if self.config["compilator"] == "clang":
self.set_cross_base(self.folder_ndk + "/toolchains/llvm-3.6/prebuilt/linux-x86" + tmpOsVal + "/bin/")
else:
baseFolderArm = self.folder_ndk + "/toolchains/arm-linux-androideabi-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/"
baseFolderMips = self.folder_ndk + "/toolchains/mipsel-linux-android-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/"
baseFolderX86 = self.folder_ndk + "/toolchains/x86-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/"
self.set_cross_base(baseFolderArm + "arm-linux-androideabi-")
if not os.path.isdir(baseFolderArm):
debug.error("Gcc Arm path does not exist !!!")
if not os.path.isdir(baseFolderMips):
debug.info("Gcc Mips path does not exist !!!")
if not os.path.isdir(baseFolderX86):
debug.info("Gcc x86 path does not exist !!!")
self.folder_bin="/mustNotCreateBinary"
self.folder_lib="/data/lib/armeabi"
self.folder_data="/data/assets"
self.folder_doc="/doc"
self.suffix_package='.pkg'
# board id at 14 is for android 4.0 and more ...
self.boardId = 14
self.global_flags_cc.append("-D__ANDROID_BOARD_ID__=" + str(self.boardId))
if arch == "armv5" or arch == "armv7":
self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm/usr/include/")
elif arch == "mips":
self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-mips/usr/include/")
elif arch == "x86":
self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-x86/usr/include/")
if True:
if self.config["compilator"] == "clang":
if self.boardId < 21:
debug.error("Clang work only with the board wersion >= 21 : android 5.x.x")
self.global_flags_cc.append("-D__STDCPP_LLVM__")
# llvm-libc++ : BSD | MIT
self.global_include_cc.append("-gcc-toolchain " + self.folder_ndk +"/sources/android/support/include")
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/android/support/include")
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/include/")
if arch == "armv5":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/armeabi/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
elif arch == "armv7":
# The only one tested ... ==> but we have link error ...
self.global_flags_cc.append("-target armv7-none-linux-androideabi")
self.global_flags_cc.append("-march=armv7-a")
self.global_flags_cc.append("-mfpu=vfpv3-d16")
self.global_flags_cc.append("-mhard-float")
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/"
self.global_flags_ld.append( stdCppBasePath + "thumb/libc++_static.a")
self.global_flags_ld.append("-target armv7-none-linux-androideabi")
self.global_flags_ld.append("-Wl,--fix-cortex-a8")
self.global_flags_ld.append("-Wl,--no-warn-mismatch")
self.global_flags_ld.append("-lm_hard")
elif arch == "mips":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/mips/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
elif arch == "x86":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/x86/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
else:
self.global_flags_cc.append("-D__STDCPP_GNU__")
# GPL v3 (+ exception link for gcc compilator)
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/include/")
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/android/support/include/")
if arch == "armv5":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "thumb/libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a")
elif arch == "armv7":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi-v7a/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "thumb/libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a")
elif arch == "mips":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/mips/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "libsupc++.a")
elif arch == "x86":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/x86/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "libsupc++.a")
else :
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/system/include/")
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/stlport/stlport/")
self.global_flags_ld.append(self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm/usr/lib/libstdc++.a")
self.global_sysroot = "--sysroot=" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm"
self.global_flags_cc.append("-D__ARM_ARCH_5__")
self.global_flags_cc.append("-D__ARM_ARCH_5T__")
self.global_flags_cc.append("-D__ARM_ARCH_5E__")
self.global_flags_cc.append("-D__ARM_ARCH_5TE__")
if self.config["compilator"] != "clang":
if self.arch == "armv5":
# -----------------------
# -- arm V5 :
# -----------------------
self.global_flags_cc.append("-march=armv5te")
self.global_flags_cc.append("-msoft-float")
else:
# -----------------------
# -- arm V7 (Neon) :
# -----------------------
self.global_flags_cc.append("-mfpu=neon")
self.global_flags_cc.append("-mfloat-abi=softfp")
self.global_flags_ld.append("-mfpu=neon")
self.global_flags_ld.append("-mfloat-abi=softfp")
self.global_flags_cc.append("-D__ARM_ARCH_7__")
self.global_flags_cc.append("-D__ARM_NEON__")
# the -mthumb must be set for all the android produc, some ot the not work coretly without this one ... (all android code is generated with this flags)
self.global_flags_cc.append("-mthumb")
# -----------------------
# -- Common flags :
# -----------------------
self.global_flags_cc.append("-fpic")
if self.config["compilator"] != "clang":
self.global_flags_cc.append("-ffunction-sections")
self.global_flags_cc.append("-funwind-tables")
self.global_flags_cc.append("-fstack-protector")
self.global_flags_cc.append("-Wno-psabi")
self.global_flags_cc.append("-mtune=xscale")
self.global_flags_cc.append("-fomit-frame-pointer")
self.global_flags_cc.append("-fno-strict-aliasing")
self.global_flags_xx.append("-frtti")
self.global_flags_cc.append("-fexceptions")
self.global_flags_xx.append("-Wa,--noexecstack")
def check_right_package(self, pkgProperties, value):
for val in pkgProperties["RIGHT"]:
if value == val:
return True
return False
def get_staging_folder_data(self, binaryName):
return self.get_staging_folder(binaryName) + self.folder_data
def make_package(self, pkgName, pkgProperties, basePkgPath, heritage):
# http://alp.developpez.com/tutoriels/debian/creer-paquet/
debug.debug("------------------------------------------------------------------------")
debug.info("Generate package '" + pkgName + "'")
debug.debug("------------------------------------------------------------------------")
pkgNameApplicationName = pkgName
if self.config["mode"] == "debug":
pkgNameApplicationName += "debug"
# FINAL_FOLDER_JAVA_PROJECT
self.folder_javaProject= self.get_staging_folder(pkgName) \
+ "/src/" \
+ pkgProperties["COMPAGNY_TYPE"] \
+ "/" + pkgProperties["COMPAGNY_NAME2"] \
+ "/" + pkgNameApplicationName + "/"
#FINAL_FILE_ABSTRACTION
self.file_finalAbstraction = self.folder_javaProject + "/" + pkgNameApplicationName + ".java"
compleatePackageName = pkgProperties["COMPAGNY_TYPE"]+"."+pkgProperties["COMPAGNY_NAME2"]+"." + pkgNameApplicationName
if "ADMOD_ID" in pkgProperties:
pkgProperties["RIGHT"].append("INTERNET")
pkgProperties["RIGHT"].append("ACCESS_NETWORK_STATE")
debug.print_element("pkg", "absractionFile", "<==", "dynamic file")
# Create folder :
tools.create_directory_of_file(self.file_finalAbstraction)
# Create file :
# java ==> done by ewol wrapper ... (and compiled in the normal compilation system ==> must be find in the dependency list of jar ...
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/res/drawable/icon.png");
if "ICON" in pkgProperties.keys() \
and pkgProperties["ICON"] != "":
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/res/drawable/icon.png", 256, 256)
else:
# to be sure that we have all time a resource ...
tmpFile = open(self.get_staging_folder(pkgName) + "/res/drawable/plop.txt", 'w')
tmpFile.write('plop\n')
tmpFile.flush()
tmpFile.close()
if pkgProperties["ANDROID_MANIFEST"]!="":
debug.print_element("pkg", "AndroidManifest.xml", "<==", pkgProperties["ANDROID_MANIFEST"])
tools.copy_file(pkgProperties["ANDROID_MANIFEST"], self.get_staging_folder(pkgName) + "/AndroidManifest.xml", force=True)
else:
debug.error("missing parameter 'ANDROID_MANIFEST' in the properties ... ")
#add properties on wallpaper :
# myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["list", key, title, summary, [["key","value display"],["key2","value display 2"]])
# myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["list", "testpattern", "Select test pattern", "Choose which test pattern to display", [["key","value display"],["key2","value display 2"]]])
# myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", key, title, summary, ["enable string", "disable String"])
# myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", "movement", "Motion", "Apply movement to test pattern", ["Moving test pattern", "Still test pattern"]
#copy needed resources :
for res_source, res_dest in pkgProperties["ANDROID_RESOURCES"]:
if res_source == "":
continue
tools.copy_file(res_source , self.get_staging_folder(pkgName) + "/res/" + res_dest + "/" + os.path.basename(res_source), force=True)
# Doc :
# http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/
debug.print_element("pkg", "R.java", "<==", "Resources files")
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/src/noFile")
androidToolPath = self.folder_sdk + "/build-tools/"
# find android tool version
dirnames = tools.get_list_sub_folder(androidToolPath)
if len(dirnames) != 1:
debug.error("an error occured when getting the tools for android")
androidToolPath += dirnames[0] + "/"
# this is to create resource file for android ... (we did not use aset in jar with ewol ...
adModResouceFolder = ""
if "ADMOD_ID" in pkgProperties:
adModResouceFolder = " -S " + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/res/ "
cmdLine = androidToolPath + "aapt p -f " \
+ "-M " + self.get_staging_folder(pkgName) + "/AndroidManifest.xml " \
+ "-F " + self.get_staging_folder(pkgName) + "/resources.res " \
+ "-I " + self.folder_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar "\
+ "-S " + self.get_staging_folder(pkgName) + "/res/ " \
+ adModResouceFolder \
+ "-J " + self.get_staging_folder(pkgName) + "/src/ "
multiprocess.run_command(cmdLine)
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/build/classes/noFile")
debug.print_element("pkg", "*.class", "<==", "*.java")
#generate android java files:
filesString=""
"""
old :
if "ADMOD_ID" in pkgProperties:
# TODO : check this I do not think it is really usefull ... ==> write for IDE only ...
filesString += self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/src/android/UnusedStub.java "
if len(pkgProperties["ANDROID_WALLPAPER_PROPERTIES"])!=0:
filesString += self.folder_javaProject + pkgNameApplicationName + "Settings.java "
adModJarFile = ""
if "ADMOD_ID" in pkgProperties:
adModJarFile = ":" + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar"
cmdLine = "javac " \
+ "-d " + self.get_staging_folder(pkgName) + "/build/classes " \
+ "-classpath " + self.folder_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar" \
+ adModJarFile + " " \
+ filesString \
+ self.file_finalAbstraction + " " \
+ self.get_staging_folder(pkgName) + "/src/R.java "
multiprocess.run_command(cmdLine)
"""
debug.verbose("heritage .so=" + str(tools.filter_extention(heritage.src, ["so"])))
debug.verbose("heritage .jar=" + str(tools.filter_extention(heritage.src, ["jar"])))
class_extern = ""
upper_jar = tools.filter_extention(heritage.src, ["jar"])
#debug.warning("ploppppp = " + str(upper_jar))
for elem in upper_jar:
if len(class_extern) > 0:
class_extern += ":"
class_extern += elem
# create enpoint element :
cmdLine = "javac " \
+ "-d " + self.get_staging_folder(pkgName) + "/build/classes " \
+ "-classpath " + class_extern + " " \
+ self.get_staging_folder(pkgName) + "/src/R.java "
multiprocess.run_command(cmdLine)
debug.print_element("pkg", ".dex", "<==", "*.class")
cmdLine = androidToolPath + "dx " \
+ "--dex --no-strict " \
+ "--output=" + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + ".dex " \
+ self.get_staging_folder(pkgName) + "/build/classes/ "
if "ADMOD_ID" in pkgProperties:
cmdLine += self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar "
# add element to dexification:
for elem in upper_jar:
# remove android sdk:
if elem[-len("android.jar"):] != "android.jar":
cmdLine += elem + " "
multiprocess.run_command(cmdLine)
debug.print_element("pkg", ".apk", "<==", ".dex, assets, .so, res")
#builderDebug="-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y "
builderDebug=""
# note : set -u not signed application...
#+ ":" + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar "
cmdLine = "java -Xmx128M " \
+ " -classpath " + self.folder_sdk + "/tools/lib/sdklib.jar " \
+ builderDebug \
+ " com.android.sdklib.build.ApkBuilderMain " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \
+ " -u " \
+ " -z " + self.get_staging_folder(pkgName) + "/resources.res " \
+ " -f " + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + ".dex " \
+ " -rf " + self.get_staging_folder(pkgName) + "/data "
multiprocess.run_command(cmdLine)
# doc :
# http://developer.android.com/tools/publishing/app-signing.html
# Create a key for signing your application:
# keytool -genkeypair -v -keystore AndroidKey.jks -storepass Pass__AndroidDebugKey -alias alias__AndroidDebugKey -keypass PassKey__AndroidDebugKey -keyalg RSA -validity 36500
if self.config["mode"] == "debug":
debug.print_element("pkg", ".apk(signed debug)", "<==", ".apk (not signed)")
# verbose mode :
#debugOption = "-verbose -certs "
debugOption = ""
cmdLine = "jarsigner " \
+ debugOption \
+ "-keystore " + tools.get_current_path(__file__) + "/AndroidDebugKey.jks " \
+ " -sigalg SHA1withRSA -digestalg SHA1 " \
+ " -storepass Pass__AndroidDebugKey " \
+ " -keypass PassKey__AndroidDebugKey " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \
+ " alias__AndroidDebugKey"
multiprocess.run_command(cmdLine)
tmpFile = open("tmpPass.boo", 'w')
tmpFile.write("\n")
tmpFile.flush()
tmpFile.close()
else:
print("On release mode we need the file : and key an pasword to sign the application ...")
debug.print_element("pkg", ".apk(signed debug)", "<==", ".apk (not signed)")
cmdLine = "jarsigner " \
+ " -keystore " + basePkgPath + "/AndroidKey.jks " \
+ " -sigalg SHA1withRSA -digestalg SHA1 " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \
+ " " + pkgNameApplicationName
multiprocess.run_command(cmdLine)
cmdLine = "jarsigner " \
+ " -verify -verbose -certs " \
+ " -sigalg SHA1withRSA -digestalg SHA1 " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk "
multiprocess.run_command(cmdLine)
debug.print_element("pkg", ".apk(aligned)", "<==", ".apk (not aligned)")
tools.remove_file(self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk")
# verbose mode : -v
cmdLine = androidToolPath + "zipalign 4 " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \
+ self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk "
multiprocess.run_command(cmdLine)
# copy file in the final stage :
tools.copy_file(self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk",
self.get_final_folder() + "/" + pkgNameApplicationName + ".apk",
force=True)
def install_package(self, pkgName):
debug.debug("------------------------------------------------------------------------")
debug.info("Install package '" + pkgName + "'")
debug.debug("------------------------------------------------------------------------")
pkgNameApplicationName = pkgName
if self.config["mode"] == "debug":
pkgNameApplicationName += "debug"
cmdLine = self.folder_sdk + "/platform-tools/adb install -r " \
+ self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk "
multiprocess.run_command(cmdLine)
def un_install_package(self, pkgName):
debug.debug("------------------------------------------------------------------------")
debug.info("Un-Install package '" + pkgName + "'")
debug.debug("------------------------------------------------------------------------")
pkgNameApplicationName = pkgName
if self.config["mode"] == "debug":
pkgNameApplicationName += "debug"
cmdLine = self.folder_sdk + "/platform-tools/adb uninstall " + pkgNameApplicationName
Rmultiprocess.run_command(cmdLine)
def Log(self, pkgName):
debug.debug("------------------------------------------------------------------------")
debug.info("logcat of android board")
debug.debug("------------------------------------------------------------------------")
debug.info("cmd: " + self.folder_sdk + "/platform-tools/adb shell logcat ")
cmdLine = self.folder_sdk + "/platform-tools/adb shell logcat "
multiprocess.run_command(cmdLine)

View File

@@ -54,14 +54,15 @@ class Target(target.Target):
self.suffix_binary='' self.suffix_binary=''
self.suffix_package='' self.suffix_package=''
if self.sumulator == True: if self.sumulator == True:
self.sysroot = "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.1.sdk" self.sysroot = "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.3.sdk"
self.global_flags_ld.append("-mios-simulator-version-min=8.0") self.global_flags_ld.append("-mios-simulator-version-min=8.0")
self.global_flags_cc.append("-mios-simulator-version-min=8.0") self.global_flags_cc.append("-mios-simulator-version-min=8.0")
else: else:
self.sysroot = "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk" self.sysroot = "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk"
self.global_flags_ld.append("-miphoneos-version-min=8.0") self.global_flags_ld.append("-miphoneos-version-min=8.0")
self.global_flags_cc.append("-miphoneos-version-min=8.0") self.global_flags_cc.append("-miphoneos-version-min=8.0")
self.global_flags_cc.append("-D__STDCPP_LLVM__")
self.global_flags_ld.append([ self.global_flags_ld.append([
"-Xlinker", "-Xlinker",
"-objc_abi_version", "-objc_abi_version",
@@ -315,7 +316,10 @@ class Target(target.Target):
tmpFile.write("<plist version=\"1.0\">\n") tmpFile.write("<plist version=\"1.0\">\n")
tmpFile.write(" <dict>\n") tmpFile.write(" <dict>\n")
tmpFile.write(" <key>application-identifier</key>\n") tmpFile.write(" <key>application-identifier</key>\n")
tmpFile.write(" <string>" + pkgProperties["APPLE_APPLICATION_IOS_ID"] + "." + pkgProperties["COMPAGNY_TYPE"] + "." + pkgProperties["COMPAGNY_NAME2"] + "." + pkgName + "</string>\n") try:
tmpFile.write(" <string>" + pkgProperties["APPLE_APPLICATION_IOS_ID"] + "." + pkgProperties["COMPAGNY_TYPE"] + "." + pkgProperties["COMPAGNY_NAME2"] + "." + pkgName + "</string>\n")
except:
debug.error("Missing package property : APPLE_APPLICATION_IOS_ID")
tmpFile.write(" <key>get-task-allow</key>\n") tmpFile.write(" <key>get-task-allow</key>\n")
tmpFile.write(" <true/>\n") tmpFile.write(" <true/>\n")
tmpFile.write(" <key>keychain-access-groups</key>\n") tmpFile.write(" <key>keychain-access-groups</key>\n")

View File

@@ -33,6 +33,8 @@ class Target(target.Target):
if host.BUS_SIZE != 32: if host.BUS_SIZE != 32:
self.global_flags_cc.append("-m32") self.global_flags_cc.append("-m32")
self.global_flags_cc.append("-D__STDCPP_GNU__")
def generate_list_separate_coma(self, list): def generate_list_separate_coma(self, list):
result = "" result = ""
fistTime = True fistTime = True

View File

@@ -11,8 +11,10 @@ from lutin import debug
from lutin import target from lutin import target
from lutin import tools from lutin import tools
from lutin import host from lutin import host
from lutin import multiprocess
import os import os
import stat import stat
import shutil
class Target(target.Target): class Target(target.Target):
def __init__(self, config): def __init__(self, config):
@@ -36,6 +38,8 @@ class Target(target.Target):
self.suffix_binary='' self.suffix_binary=''
self.suffix_package='' self.suffix_package=''
self.global_flags_cc.append("-D__STDCPP_LLVM__")
def get_staging_folder(self, binaryName): def get_staging_folder(self, binaryName):
return tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + binaryName + ".app/Contents/" return tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + binaryName + ".app/Contents/"
@@ -82,23 +86,52 @@ class Target(target.Target):
tmpFile.flush() tmpFile.flush()
tmpFile.close() tmpFile.close()
# Must create the tarball of the application # Create a simple interface to localy install the aplication for the shell (a shell command line interface)
#cd $(TARGET_OUT_FINAL)/; tar -cf $(PROJECT_NAME).tar $(PROJECT_NAME).app shell_file_name=self.get_staging_folder(pkgName) + "/shell/" + pkgName
#cd $(TARGET_OUT_FINAL)/; tar -czf $(PROJECT_NAME).tar.gz $(PROJECT_NAME).app # Create the info file
tools.create_directory_of_file(shell_file_name)
tmpFile = open(shell_file_name, 'w')
tmpFile.write("#!/bin/bash\n")
tmpFile.write("# Simply open the real application in the correct way (a link does not work ...)\n")
tmpFile.write("/Applications/" + pkgName + ".app/Contents/MacOS/" + pkgName + " $*\n")
#tmpFile.write("open -n /Applications/edn.app --args -AppCommandLineArg $*\n")
tmpFile.flush()
tmpFile.close()
# Must create the disk image of the application
debug.info("Generate disk image for '" + pkgName + "'")
output_file_name = self.get_final_folder() + "/" + pkgName + ".dmg"
cmd = "hdiutil create -volname "
cmd += pkgName + " -srcfolder "
cmd += tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + pkgName + ".app"
cmd += " -ov -format UDZO "
cmd += output_file_name
tools.create_directory_of_file(output_file_name)
multiprocess.run_command_direct(cmd)
debug.info("disk image: " + output_file_name)
debug.info("You can have an shell interface by executing : ")
debug.info(" sudo cp " + shell_file_name + " /usr/local/bin")
def install_package(self, pkgName): def install_package(self, pkgName):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Install package '" + pkgName + "'") debug.info("Install package '" + pkgName + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.warning(" ==> TODO") debug.info("copy " + tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + pkgName + ".app in /Applications/")
#sudo dpkg -i $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package if os.path.exists("/Applications/" + pkgName + ".app") == True:
shutil.rmtree("/Applications/" + pkgName + ".app")
# copy the application in the basic application folder : /Applications/xxx.app
shutil.copytree(tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + pkgName + ".app", "/Applications/" + pkgName + ".app")
def un_install_package(self, pkgName): def un_install_package(self, pkgName):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Un-Install package '" + pkgName + "'") debug.info("Un-Install package '" + pkgName + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.warning(" ==> TODO") debug.info("remove OLD application /Applications/" + pkgName + ".app")
#sudo dpkg -r $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package # Remove the application in the basic application folder : /Applications/xxx.app
if os.path.exists("/Applications/" + pkgName + ".app") == True:
shutil.rmtree("/Applications/" + pkgName + ".app")

View File

@@ -59,6 +59,7 @@ class Target(target.Target):
self.suffix_lib_dynamic='.dll' self.suffix_lib_dynamic='.dll'
self.suffix_binary='.exe' self.suffix_binary='.exe'
self.suffix_package='' self.suffix_package=''
self.global_flags_cc.append("-D__STDCPP_GNU__")
def get_staging_folder_data(self, binaryName): def get_staging_folder_data(self, binaryName):

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='0.5.4', version='0.6.3',
description='Lutin generic builder', description='Lutin generic builder',
long_description=readme(), long_description=readme(),
url='http://github.com/HeeroYui/lutin', url='http://github.com/HeeroYui/lutin',
@@ -15,10 +15,9 @@ setup(name='lutin',
author_email='yui.heero@gmail.com', author_email='yui.heero@gmail.com',
license='APACHE-2', license='APACHE-2',
packages=['lutin', packages=['lutin',
'lutin/builder', 'lutin/z_builder',
'lutin/system', 'lutin/z_system',
'lutin/target' 'lutin/z_target'],
],
classifiers=[ classifiers=[
'Development Status :: 3 - Alpha', 'Development Status :: 3 - Alpha',
'License :: OSI Approved :: Apache Software License', 'License :: OSI Approved :: Apache Software License',
@@ -27,6 +26,9 @@ setup(name='lutin',
], ],
keywords='builder c++ c android ios macos makefile cmake', keywords='builder c++ c android ios macos makefile cmake',
scripts=['bin/lutin'], scripts=['bin/lutin'],
data_file=[
('/etc/bash_completion.d', ['bash-autocompletion/lutin']),
],
include_package_data = True, include_package_data = True,
zip_safe=False) zip_safe=False)