Compare commits

..

28 Commits
0.6.4 ... 0.7.4

Author SHA1 Message Date
62ac51e78b [TAG] creata a new version 2015-10-20 23:39:12 +02:00
ce407605c9 [DEBUG] Compile again on MacOs and IOs 2015-10-20 23:33:53 +02:00
8336411ec2 [DEBUG] corect help 2015-10-19 21:56:11 +02:00
fd58b31c26 [DEBUG] correct windows minGW version 2015-10-16 23:36:10 +02:00
fa1b618896 [DEBUG] MacOs dynamic variable 2015-10-16 22:10:24 +02:00
2dcbbe9639 [DEV] Remove completion for linux ... 2015-10-15 21:24:20 +02:00
242a086ba1 [DEV] add missing license file 2015-10-15 08:33:38 +02:00
14fcfc1d54 [DEV] Update lutin API (try stabilize) 2015-10-14 21:39:43 +02:00
4b091e964a [DEV] end simplify create package 2015-10-07 21:58:28 +02:00
64a6e47b37 [DEV] update package building (start generization) 2015-10-06 21:34:32 +02:00
f0fe760836 [DEV] update android build 2015-10-03 12:32:51 +02:00
7d48e91b9b [DEV] remove unneeded file in shared folder 2015-10-01 21:04:22 +02:00
1ac0ecd5c5 [DEV] update methodologie of copy data 2015-09-30 21:05:57 +02:00
54fddc82b5 [DEV] Add C++ 17 and better support for Android platform 2015-09-24 21:48:32 +02:00
663188773d [DEV] integrate new methode for IOs and MacOs 2015-09-24 21:16:00 +02:00
773a644ba1 [DEBUG] internal error 2015-09-18 21:19:33 +02:00
f1d6ad6ce8 [DEV] reintegrate Android interfac package builder (bug on DATA) 2015-09-17 22:07:20 +02:00
dc921d651b [DEV] compile java file only when needed and change basic version of sdk (15, 14 has been removed) 2015-09-16 23:51:23 +02:00
06481abcbf [DEV] set work compilation again on windows 2015-09-16 16:58:01 +02:00
6ac4cc45fa [DEV] set it back (integration android) 2015-09-15 22:01:19 +02:00
979e71c101 [DEV] correct copy headers 2015-09-14 23:24:05 +02:00
a070f64716 [DEV] continue integration of the isolated build methodologie 2015-09-14 23:21:29 +02:00
21af5be1a3 [DEV] start compile in shered object mode 2015-09-13 23:28:01 +02:00
0afb15c5b3 [DEV] generic package generation on Linux is back 2015-09-11 22:26:32 +02:00
7e5d8db361 [DEV] add list of element package (no package generated) 2015-09-10 21:50:26 +02:00
a9f8ab7ea2 [DEV] rework the entire build directory (no package generated) 2015-09-10 21:32:50 +02:00
22965f5a57 [DEV] review methodologie of build 2015-09-09 21:53:22 +02:00
10c0f98cef [DEV] try to create generic package 2015-09-08 22:19:18 +02:00
35 changed files with 2799 additions and 1154 deletions

View File

@@ -34,11 +34,19 @@ Installation
Requirements: ``Python >= 2.7`` and ``pip`` Requirements: ``Python >= 2.7`` and ``pip``
Just run:: Just run:
pip install lutin pip install lutin
On mac-os you may install pip before: Install pip on debian/ubuntu:
sudo apt-get install pip
Install pip on ARCH-linux:
sudo pacman -S pip
Install pip on MacOs:
sudo easy_install pip sudo easy_install pip

110
bin/lutin
View File

@@ -17,14 +17,16 @@ import lutin.module as module
import lutin.target as target import lutin.target as target
import lutin.env as env import lutin.env as env
import lutin.multiprocess as multiprocess import lutin.multiprocess as multiprocess
import lutin.tools as tools
myArgs = arguments.LutinArg() myArgs = arguments.LutinArg()
myArgs.add(arguments.ArgDefine("h", "help", desc="display this help")) myArgs.add(arguments.ArgDefine("h", "help", desc="Display this help"))
myArgs.add(arguments.ArgDefine("H", "HELP", desc="Display this help (with all compleate information)"))
myArgs.add_section("option", "Can be set one time in all case") myArgs.add_section("option", "Can be set one time in all case")
myArgs.add(arguments.ArgDefine("v", "verbose", list=[["0","None"],["1","error"],["2","warning"],["3","info"],["4","debug"],["5","verbose"],["6","extreme_verbose"]], desc="display makefile debug level (verbose) default =2")) myArgs.add(arguments.ArgDefine("v", "verbose", list=[["0","None"],["1","error"],["2","warning"],["3","info"],["4","debug"],["5","verbose"],["6","extreme_verbose"]], desc="display makefile debug level (verbose) default =2"))
myArgs.add(arguments.ArgDefine("C", "color", desc="display makefile output in color")) myArgs.add(arguments.ArgDefine("C", "color", desc="Display makefile output in color"))
myArgs.add(arguments.ArgDefine("f", "force", desc="Force the rebuild without checking the dependency")) myArgs.add(arguments.ArgDefine("B", "force-build", desc="Force the rebuild without checking the dependency"))
myArgs.add(arguments.ArgDefine("P", "pretty", desc="print the debug has pretty display")) myArgs.add(arguments.ArgDefine("P", "pretty", desc="Print the debug has pretty display"))
myArgs.add(arguments.ArgDefine("j", "jobs", haveParam=True, desc="Specifies the number of jobs (commands) to run simultaneously")) myArgs.add(arguments.ArgDefine("j", "jobs", haveParam=True, desc="Specifies the number of jobs (commands) to run simultaneously"))
myArgs.add(arguments.ArgDefine("s", "force-strip", desc="Force the stripping of the compile elements")) myArgs.add(arguments.ArgDefine("s", "force-strip", desc="Force the stripping of the compile elements"))
myArgs.add(arguments.ArgDefine("w", "warning", desc="Store warning in a file build file")) myArgs.add(arguments.ArgDefine("w", "warning", desc="Store warning in a file build file"))
@@ -32,15 +34,15 @@ myArgs.add(arguments.ArgDefine("w", "warning", desc="Store warning in a file bui
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("", "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)"))
myArgs.add(arguments.ArgDefine("p", "package", desc="Disable the package generation (usefull when just compile for test on linux ...)")) myArgs.add(arguments.ArgDefine("p", "package", desc="Disable the package generation (usefull when just compile for test on linux ...)"))
myArgs.add(arguments.ArgDefine("g", "gcov", desc="Enable code coverage intrusion in code")) myArgs.add(arguments.ArgDefine("g", "gcov", desc="Enable code coverage intrusion in code"))
myArgs.add(arguments.ArgDefine("", "simulation", desc="simulater mode (availlable only for IOS)")) myArgs.add(arguments.ArgDefine("", "simulation", desc="Simulater mode (availlable only for IOS)"))
myArgs.add(arguments.ArgDefine("", "list-target", desc="list all availlables targets ==> for auto completion")) myArgs.add(arguments.ArgDefine("", "list-target", desc="List all availlables targets ==> for auto completion"))
myArgs.add(arguments.ArgDefine("", "list-module", desc="list all availlables module ==> for auto completion")) myArgs.add(arguments.ArgDefine("", "list-module", desc="List all availlables module ==> for auto completion"))
myArgs.add_section("cible", "generate in order set") myArgs.add_section("cible", "generate in order set")
localArgument = myArgs.parse() localArgument = myArgs.parse()
@@ -48,11 +50,11 @@ localArgument = myArgs.parse()
""" """
display the help of this makefile display the help of this makefile
""" """
def usage(): def usage(full=False):
color = debug.get_color_set() color = debug.get_color_set()
# generic argument displayed : # generic argument displayed :
myArgs.display() myArgs.display()
print(" All target can finish with '?clean' '?dump' '?gcov' ... ?action") print(" All target can finish with '?clean' '?dump' '?gcov' ... ?action (@ can replace ?)" )
print(" " + color['green'] + "all" + color['default']) 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(" " + color['green'] + "clean" + color['default']) print(" " + color['green'] + "clean" + color['default'])
@@ -63,19 +65,99 @@ def usage():
print(" Parse all the code of the library with the gcov resolution") 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(" " + color['green'] + mod[0] + color['default']) data_print = " "
if mod[1] != "": if full == False:
print(" " + mod[1]) if mod["type"] != None \
and mod["type"][:6] == "BINARY":
data_print += color['blue']
if mod["sub-type"] == "":
data_print += "* "
elif mod["sub-type"] == "TEST":
data_print += "T "
elif mod["sub-type"] == "TOOLS":
data_print += "U "
elif mod["sub-type"] == "SAMPLE":
data_print += "S "
else:
data_print += " "
elif mod["type"] != None \
and mod["type"] == "PACKAGE":
data_print += color['red'] + "# "
elif mod["type"] != None \
and mod["type"][:7] == "LIBRARY":
data_print += color['yellow'] + " "
else:
data_print += color['default'] + " "
else:
data_print += color['green']
data_print += mod["name"] + color['default']
if full == False:
data_print += "\r\t\t\t\t\t\t\t"
if mod["license"] != None \
and mod["license"] != "":
data_print += color['yellow'] + " [" + mod["license"] + "]" + color['default']
if mod["version"] != None \
and mod["version"] != []:
version_ID = tools.version_to_string(mod["version"])
data_print += color['blue'] + " (" + version_ID + ")" + color['default']
"""
if mod["compagny-type"] != "" \
and mod["compagny-name"] != "":
data_print += color['purple'] + " " + mod["compagny-type"] + "/" + mod["compagny-name"] + color['default']
elif mod["compagny-name"] != "":
data_print += color['purple'] + " " + mod["compagny-name"] + color['default']
"""
print(data_print)
if mod["description"] != "":
print(" " + mod["description"])
if full == True:
if mod["type"] != None \
and mod["type"] != "":
print(" Type: " + mod["type"])
if mod["sub-type"] != None \
and mod["sub-type"] != "":
print(" Sub-Type: " + mod["sub-type"])
if mod["version"] != None \
and mod["version"] != []:
version_ID = ""
for id in mod["version"]:
if len(version_ID) != 0:
if type(id) == str:
version_ID+="-"
else:
version_ID+="."
version_ID += str(id)
print(" version: " + color['blue'] + version_ID + color['default'])
if mod["compagny-type"] != None \
and mod["compagny-name"] != None \
and mod["compagny-type"] != "" \
and mod["compagny-name"] != "":
print(" compagny: " + color['purple'] + mod["compagny-type"] + "/" + mod["compagny-name"] + color['default'])
elif mod["compagny-name"] != None \
and mod["compagny-name"] != "":
print(" compagny: " + color['purple'] + mod["compagny-name"] + color['default'])
if mod["license"] != None \
and mod["license"] != "":
print(" license: " + color['yellow'] + mod["license"] + color['default'])
if mod["maintainer"] != None \
and mod["maintainer"] != []:
print(" maintainers:")
for elem in mod["maintainer"]:
print(" " + str(elem))
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")
exit(0) exit(0)
# 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_name() == "help": if argument.get_option_name() == "help":
#display help
if active==False: if active==False:
usage() usage()
return True return True
if argument.get_option_name() == "HELP":
if active==False:
usage(True)
return True
if argument.get_option_name() == "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()

59
doc/010_basic_concept.bb Normal file
View File

@@ -0,0 +1,59 @@
=?= [center]Basic concept[/center] =?=
___________________________________________
Lutin is a compleate builder system. It is designed to answers all the application problems.
The library and the distribution problem are partially manage (no real use-case)
==Technologie==
Lutin is designed in Python 2.X or 3.X to answers at the multiplatform problesm. On Linux or MacOs, it is really easy to compile with Makefile, cmake, but on Windows it is an other problem.
The first version of Lutin has been designed in Makefile, but we need to wait 20 minutes before the first build. In Pytho it is fast as Linux.
Lutin is not based over an other builder, but request compilation itself.
==Features==
Lutin is designed to:
:** support many hardware platform (X86/X64/ARM...);
:** support many operation system (windows, Ios, Android ...);
:** support complex worktree and depedency;
:** build only when needed;
:** create platform specific packages (application bundle);
:**
==global overview==
Every build system is based on multiple concept depending of their own designed.
For lutin we can différentiate 4 basics concepts:
:** Mudule: Interface to create a part of an application, that contain binary, scipt, datas ...
:** Target: methode to creata an application or a library (may be internal: medium level)
:** Builder: Methode to transform element in other, for example: compile a cpp in object file, or object files in binary.
:** System: Many OS manage basic element contain in the OS, This part permit to find generic module availlable in the system.
===Module===
When you use lutin, you migth first create a module, This is the basis of the framework. It permit to describe your "module", all it contain, and the deendency.
We can separate a module in some part:
:** Binary:
:: A binary is an end point element.
:: It can be transform in a complete standalone bundle, or in an part instalable.
:** Library:
:: This represent an element that is used by other application
:** Package:
:: To Be Define.
===Target===
===Builder===
===System===

153
doc/020_Compile_a_module.bb Normal file
View File

@@ -0,0 +1,153 @@
=?= [center]Basic concept[/center] =?=
___________________________________________
Lutin permit simply to compile applications and library.
To simply understand the use, we will use a simple library:
[code style=bash]
git clone http://github.con/atria-soft/etk.git
[/code]
etk is a basic library that have drive the lutin project.
== compile a module ==
It is really simple:
[code style=bash]
lutin yourModuleName
#example:
lutin etk
[/code]
== Option working ==
Lutin have a complex option methodologie. We can consider 3 part of the option:
:** Global option
:** target option
:** modules
== Generic options ==
=== Display help ===
Availlable everywhere ...
[code style=bash]
lutin -h
lutin --help
[/code]
You can see in this help that it take a litle time to react.
The first time you run lutin, it parse all the file in your sub-directory.
But the system keep the data in cash, then the next time it is faster.
At the end of the help you an see an help about the etk librery with the associated help.
=== Build in color ===
[code style=bash]
lutin -C
lutin --color
[/code]
=== Display build line in pretty print mode ===
when an error apear, the gcc or clang compile line can be really unreadable:
[code]
g++ -o /home/heero/dev/plop/out/Linux_x86_64/release/build/gcc/etk/obj/etk/Color.cpp.o -I/home/heero/dev/plop/etk -std=c++11 -D__CPP_VERSION__=2011 -D__TARGET_OS__Linux -D__TARGET_ARCH__x86 -D__TARGET_ADDR__64BITS -D_REENTRANT -DNDEBUG -O3 -fpic -D__STDCPP_GNU__ -Wall -Wsign-compare -Wreturn-type -Wno-write-strings -Woverloaded-virtual -Wnon-virtual-dtor -Wno-unused-variable -DMODE_RELEASE -c -MMD -MP /home/heero/dev/plop/etk/etk/Color.cpp
[/code]
whith this option you can transform this not obvious line in a readable line:
[code style=bash]
lutin -P
lutin --pretty
[/code]
result:
[code]
g++ \
-o /home/XXX/dev/out/Linux_x86_64/release/build/gcc/etk/obj/etk/Color.cpp.o \
-I/home/XXX/dev/etk \
-std=c++11 \
-D__CPP_VERSION__=2011 \
-D__TARGET_OS__Linux \
-D__TARGET_ARCH__x86 \
-D__TARGET_ADDR__64BITS \
-D_REENTRANT \
-DNDEBUG \
-O3 \
-fpic \
-D__STDCPP_GNU__ \
-Wall \
-Wsign-compare \
-Wreturn-type \
-Wno-write-strings \
-Woverloaded-virtual \
-Wnon-virtual-dtor \
-Wno-unused-variable \
-DMODE_RELEASE \
-c \
-MMD \
-MP \
/home/XXX/dev/etk/etk/Color.cpp
[/code]
=== lutin log ===
Lutin have an internal log system. To enable or disable it just select your debug level with the option:
[code style=bash]
lutin -v4
lutin --verbose 4
[/code]
The level availlables are:
:** 0: None
:** 1: error
:** 2: warning (default)
:** 3: info
:** 4: debug
:** 5: verbose
:** 6: extreme_verbose
=== select the number of CPU core used ===
By default lutin manage only 1 CPU core (faster to debug) but for speed requirement you can use use multiple core:
[code style=bash]
#for 5 core
lutin -j5
lutin --jobs 5
[/code]
=== Force rebuild all ===
Sometime it is needed to rebuild all the program, just do :
[code style=bash]
lutin -B
lutin --force-build
[/code]
=== Force rebuild all ===
Force strip of output binary (remove symboles)
[code style=bash]
lutin -s
lutin --force-strip
[/code]
-w / --warning
Store warning in a file build file

View File

100
doc/index.bb Normal file
View File

@@ -0,0 +1,100 @@
=?= [center]Lutin Build system[/center] =?=
___________________________________________
===What is Lutin, and how can I use it?===
Lutin is an application/library builder, it is designed to concurence CMake, Makefile, Ant, graddle ...
Lutin is deveopped in Python 2.x and 3.x to permit many user to play with it.
Python permit to Lutin to be used in many environement in a fast way.
Lutin support can compile every thing you want, just add a builder that you need (not in the common way). Basicly Lutin support languages:
:** C (ainsi/89/99) ==> .o;
:** C++ (98/99/03/11/14/...) ==> .o;
:** .S (assembleur) ==> .o;
:** .java ==> .class;
:** .class ==> jar;
:** .o ==> .a;
:** .o ==> .so;
:** .o/.a ==> binary.
Some packege can be generate for some platform:
:** debian package;
:** windows application zip;
:** MacOs application .app;
:** iOs package;
:** Android Package .apk.
Compilation is availlable for:
:** gcc/g++;
:** clang/clang++.
Manage [b]workspace build[/b] (in oposition of CMake/make/...)
=== Install: ===
Requirements: ``Python >= 2.7`` and ``pip``
==== Install lutin: ===
Just run:
[code style=bash]
pip install lutin
[/code]
==== Install pip ====
Install pip on debian/ubuntu:
[code style=bash]
sudo apt-get install pip
[/code]
Install pip on ARCH-linux:
[code style=bash]
sudo pacman -S pip
[/code]
Install pip on MacOs:
[code style=bash]
sudo easy_install pip
[/code]
==== Install from sources ====
[code style=bash]
git clone http://github.com/HeeroYui/lutin.git
cd lutin
sudo ./setup.py install
[/code]
=== License (APACHE v2.0) ===
Copyright lutin Edouard DUPIN
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
=== History: ===
I work with some builder, Every one have theire own adventages, and their problems.
The main point I see, is that the polimorphisme of the worktree is really hard.
The second point is the generation on different platforms is hard too.
Some other problem example:
:** Makefile is too slow on windows mingw;
:** Cmake does not create end point package;
:** none is really simple to write.
Then I create a simple interface that manage all I need. and written in python to permit to be faster on every platform.
[tutorial[000_Build | Tutorials]]

View File

@@ -21,7 +21,7 @@ is_init = False
if is_init == False: if is_init == False:
debug.verbose("Use Make as a make stadard") debug.verbose("Use Make as a make stadard")
sys.path.append(tools.get_run_folder()) sys.path.append(tools.get_run_path())
builder.import_path(tools.get_current_path(__file__)) builder.import_path(tools.get_current_path(__file__))
module.import_path(tools.get_current_path(__file__)) module.import_path(tools.get_current_path(__file__))
system.import_path(tools.get_current_path(__file__)) system.import_path(tools.get_current_path(__file__))
@@ -29,16 +29,16 @@ if is_init == False:
debug.debug("missing file lutinBase.py ==> loading subPath..."); debug.debug("missing file lutinBase.py ==> loading subPath...");
# Import all sub path without out and archive # Import all sub path without out and archive
for folder in os.listdir("."): for path in os.listdir("."):
if os.path.isdir(folder)==True: if os.path.isdir(path)==True:
if folder.lower()!="android" \ if path.lower()!="android" \
and folder.lower()!="archive" \ and path.lower()!="archive" \
and folder.lower()!="out" : and path.lower()!="out" :
debug.debug("Automatic load path: '" + folder + "'") debug.debug("Automatic load path: '" + path + "'")
builder.import_path(folder) builder.import_path(path)
module.import_path(folder) module.import_path(path)
system.import_path(folder) system.import_path(path)
target.import_path(folder) target.import_path(path)
builder.init() builder.init()

View File

@@ -46,7 +46,7 @@ def enable_color():
global color_yellow global color_yellow
color_yellow = "\033[33m" color_yellow = "\033[33m"
global color_blue global color_blue
color_blue = "\033[34m" color_blue = "\033[01;34m"
global color_purple global color_purple
color_purple = "\033[35m" color_purple = "\033[35m"
global color_cyan global color_cyan

View File

@@ -11,12 +11,49 @@ import os
from . import debug from . import debug
from . import env from . import env
def need_re_build(dst, src, dependFile=None, file_cmd="", cmdLine=""): def _create_directory_of_file(file):
debug.extreme_verbose("Resuest check of dependency of :") path = os.path.dirname(file)
try:
os.stat(path)
except:
os.makedirs(path)
def _file_write_data(path, data):
file = open(path, "w")
file.write(data)
file.close()
def _file_size(path):
if not os.path.isfile(path):
return 0
statinfo = os.stat(path)
return statinfo.st_size
def _file_read_data(path, binary=False):
if not os.path.isfile(path):
return ""
if binary == True:
file = open(path, "rb")
else:
file = open(path, "r")
data_file = file.read()
file.close()
return data_file
def create_dependency_file(depend_file, list_files):
data = ""
for elem in list_files:
data += elem + "\n"
_create_directory_of_file(depend_file)
_file_write_data(depend_file, data)
def need_re_build(dst, src, depend_file=None, file_cmd="", cmd_line="", force_identical=False):
debug.extreme_verbose("Request check of dependency of :")
debug.extreme_verbose(" dst='" + str(dst) + "'") debug.extreme_verbose(" dst='" + str(dst) + "'")
debug.extreme_verbose(" str='" + str(src) + "'") debug.extreme_verbose(" src='" + str(src) + "'")
debug.extreme_verbose(" dept='" + str(dependFile) + "'") debug.extreme_verbose(" dept='" + str(depend_file) + "'")
debug.extreme_verbose(" cmd='" + str(file_cmd) + "'") debug.extreme_verbose(" cmd='" + str(file_cmd) + "'")
debug.extreme_verbose(" force_identical='" + str(force_identical) + "'")
# if force mode selected ==> just force rebuild ... # if force mode selected ==> just force rebuild ...
if env.get_force_mode(): if env.get_force_mode():
debug.extreme_verbose(" ==> must rebuild (force mode)") debug.extreme_verbose(" ==> must rebuild (force mode)")
@@ -28,21 +65,23 @@ def need_re_build(dst, src, dependFile=None, file_cmd="", cmdLine=""):
and os.path.exists(dst) == False: and os.path.exists(dst) == False:
debug.extreme_verbose(" ==> must rebuild (dst does not exist)") debug.extreme_verbose(" ==> must rebuild (dst does not exist)")
return True return True
if dst != "" \ if src != "" \
and dst != None \ and src != None \
and os.path.exists(src) == False: and os.path.exists(src) == False:
debug.warning(" ==> unexistant file :'" + src + "'") debug.warning(" ==> unexistant file :'" + src + "'")
return True return True
# chek the basic date if the 2 files # Check the basic date if the 2 files
if dst != "" \ if dst != "" \
and dst != None \ and dst != None \
and src != "" \
and src != None \
and os.path.getmtime(src) > os.path.getmtime(dst): and os.path.getmtime(src) > os.path.getmtime(dst):
debug.extreme_verbose(" ==> must rebuild (source time greater)") debug.extreme_verbose(" ==> must rebuild (source time greater)")
return True return True
if dependFile != "" \ if depend_file != "" \
and dependFile != None \ and depend_file != None \
and os.path.exists(dependFile) == False: and os.path.exists(depend_file) == False:
debug.extreme_verbose(" ==> must rebuild (no depending file)") debug.extreme_verbose(" ==> must rebuild (no depending file)")
return True return True
@@ -51,69 +90,95 @@ def need_re_build(dst, src, dependFile=None, file_cmd="", cmdLine=""):
if os.path.exists(file_cmd) == False: if os.path.exists(file_cmd) == False:
debug.extreme_verbose(" ==> must rebuild (no commandLine file)") debug.extreme_verbose(" ==> must rebuild (no commandLine file)")
return True return True
# check if the 2 cmdline are similar : # check if the 2 cmd_line are similar :
file2 = open(file_cmd, "r") file2 = open(file_cmd, "r")
firstAndUniqueLine = file2.read() first_and_unique_line = file2.read()
if firstAndUniqueLine != cmdLine: if first_and_unique_line != cmd_line:
debug.extreme_verbose(" ==> must rebuild (cmdLines are not identical)") debug.extreme_verbose(" ==> must rebuild (cmd_lines are not identical)")
debug.extreme_verbose(" ==> '" + cmdLine + "'") debug.extreme_verbose(" ==> '" + cmd_line + "'")
debug.extreme_verbose(" ==> '" + firstAndUniqueLine + "'") debug.extreme_verbose(" ==> '" + first_and_unique_line + "'")
file2.close() file2.close()
return True return True
# the cmdfile is correct ... # the cmdfile is correct ...
file2.close() file2.close()
if dependFile != "" \ if depend_file != "" \
and dependFile != None: and depend_file != None:
debug.extreme_verbose(" start parsing dependency file : '" + dependFile + "'") debug.extreme_verbose(" start parsing dependency file : '" + depend_file + "'")
file = open(dependFile, "r") file = open(depend_file, "r")
for curLine in file.readlines(): for cur_line in file.readlines():
# normal file : end with : ": \\n" # normal file : end with : ": \\n"
curLine = curLine[:len(curLine)-1] cur_line = cur_line[:len(cur_line)-1]
# removing last \ ... # removing last \ ...
if curLine[len(curLine)-1:] == '\\' : if cur_line[len(cur_line)-1:] == '\\' :
curLine = curLine[:len(curLine)-1] cur_line = cur_line[:len(cur_line)-1]
# remove white space : # remove white space :
#debug.verbose(" Line (read) : '" + curLine + "'"); #debug.verbose(" Line (read) : '" + cur_line + "'");
curLine = curLine.strip() cur_line = cur_line.strip()
#debug.verbose(" Line (strip) : '" + curLine + "'"); #debug.verbose(" Line (strip) : '" + cur_line + "'");
testFile="" test_file=""
if curLine[len(curLine)-1:] == ':': if cur_line[len(cur_line)-1:] == ':':
debug.extreme_verbose(" Line (no check (already done) : '" + curLine + "'"); debug.extreme_verbose(" Line (no check (already done) : '" + cur_line + "'");
elif len(curLine) == 0 \ elif len(cur_line) == 0 \
or curLine == '\\': or cur_line == '\\':
debug.extreme_verbose(" Line (Not parsed) : '" + curLine + "'"); debug.extreme_verbose(" Line (Not parsed) : '" + cur_line + "'");
else: else:
testFile = curLine test_file = cur_line
debug.extreme_verbose(" Line (might check) : '" + testFile + "'"); debug.extreme_verbose(" Line (might check) : '" + test_file + "'");
# really check files: # really check files:
if testFile!="": if test_file != "":
debug.extreme_verbose(" ==> test"); debug.extreme_verbose(" ==> test");
if False==os.path.exists(testFile): if False==os.path.exists(test_file):
debug.extreme_verbose(" ==> must rebuild (a dependency file does not exist)") debug.extreme_verbose(" ==> must rebuild (a dependency file does not exist)")
file.close() file.close()
return True return True
if os.path.getmtime(testFile) > os.path.getmtime(dst): if os.path.getmtime(test_file) > os.path.getmtime(dst):
debug.extreme_verbose(" ==> must rebuild (a dependency file time is newer)") debug.extreme_verbose(" ==> must rebuild (a dependency file time is newer)")
file.close() file.close()
return True return True
# close the current file : # close the current file :
file.close() file.close()
# check the 2 files are identical:
if force_identical == True:
# check if the 2 cmd_line are similar :
size_src = _file_size(src)
size_dst = _file_size(dst)
if size_src != size_dst:
debug.extreme_verbose(" Force Rewrite not the same size size_src=" + str(size_src) + " != size_dest=" + str(size_dst))
return True
data_src = _file_read_data(src, binary=True)
data_dst = _file_read_data(dst, binary=True)
if data_src != data_dst:
debug.extreme_verbose(" Force Rewrite not the same data")
return True
debug.extreme_verbose(" ==> Not rebuild (all dependency is OK)") debug.extreme_verbose(" ==> Not rebuild (all dependency is OK)")
return False return False
def need_re_package(dst, srcList, mustHaveSrc, file_cmd="", cmdLine=""): def need_re_package(dst, src_list, must_have_src, file_cmd="", cmd_line=""):
debug.extreme_verbose("Resuest check of dependency of :") debug.extreme_verbose("Request check of dependency of :")
debug.extreme_verbose(" dst='" + dst + "'") debug.extreme_verbose(" dst='" + str(dst) + "'")
debug.extreme_verbose(" src()=") compleate_list = []
for src in srcList: debug.extreme_verbose(" src:")
debug.verbose(" '" + src + "'") if type(src_list) == str:
compleate_list.append(src_list)
debug.extreme_verbose(" '" + src_list + "'")
elif type(src_list) == list:
for src in src_list:
compleate_list.append(src)
debug.extreme_verbose(" '" + str(src) + "'")
elif type(src_list) == dict:
for key in src_list:
debug.extreme_verbose(" '" + str(key) + "'")
for src in src_list[key]:
compleate_list.append(src)
debug.extreme_verbose(" '" + str(src) + "'")
if mustHaveSrc==False and len(srcList)==0: if must_have_src == False \
and len(compleate_list) == 0:
return False return False
# if force mode selected ==> just force rebuild ... # if force mode selected ==> just force rebuild ...
@@ -122,14 +187,14 @@ def need_re_package(dst, srcList, mustHaveSrc, file_cmd="", cmdLine=""):
return True return True
# check if the destination existed: # check if the destination existed:
if False==os.path.exists(dst): if os.path.exists(dst) == False:
debug.extreme_verbose(" ==> must re-package (dst does not exist)") debug.extreme_verbose(" ==> must re-package (dst does not exist)")
return True return True
# chek the basic date if the 2 files # chek the basic date if the 2 files
if len(srcList)==0: if len(compleate_list) == 0:
debug.extreme_verbose(" ==> must re-package (no source ???)") debug.extreme_verbose(" ==> must re-package (no source ???)")
return True return True
for src in srcList: for src in compleate_list:
if os.path.getmtime(src) > os.path.getmtime(dst): if os.path.getmtime(src) > os.path.getmtime(dst):
debug.extreme_verbose(" ==> must re-package (source time greater) : '" + src + "'") debug.extreme_verbose(" ==> must re-package (source time greater) : '" + src + "'")
return True return True
@@ -138,13 +203,13 @@ def need_re_package(dst, srcList, mustHaveSrc, file_cmd="", cmdLine=""):
if False==os.path.exists(file_cmd): if False==os.path.exists(file_cmd):
debug.extreme_verbose(" ==> must rebuild (no commandLine file)") debug.extreme_verbose(" ==> must rebuild (no commandLine file)")
return True return True
# check if the 2 cmdline are similar : # check if the 2 cmd_line are similar :
file2 = open(file_cmd, "r") file2 = open(file_cmd, "r")
firstAndUniqueLine = file2.read() first_and_unique_line = file2.read()
if firstAndUniqueLine != cmdLine: if first_and_unique_line != cmd_line:
debug.extreme_verbose(" ==> must rebuild (cmdLines are not identical)") debug.extreme_verbose(" ==> must rebuild (cmd_lines are not identical)")
debug.extreme_verbose(" ==> '" + cmdLine + "'") debug.extreme_verbose(" ==> '" + cmd_line + "'")
debug.extreme_verbose(" ==> '" + firstAndUniqueLine + "'") debug.extreme_verbose(" ==> '" + first_and_unique_line + "'")
file2.close() file2.close()
return True return True
# the cmdfile is correct ... # the cmdfile is correct ...

View File

@@ -12,26 +12,28 @@ import copy
from . import debug from . import debug
def append_to_list(listout, list): def append_to_list(list_out, elem):
if type(list) == type(str()): if type(elem) == str:
if list not in listout: if elem not in list_out:
listout.append(list) list_out.append(elem)
else: else:
# mulyiple imput in the list ... # mulyiple imput in the list ...
for elem in list: for element in elem:
if elem not in listout: if element not in list_out:
listout.append(elem) list_out.append(element)
class HeritageList: class HeritageList:
def __init__(self, heritage = None): def __init__(self, heritage = None):
self.flags={} self.flags = {}
# sources list: # sources list:
self.src=[] self.src = { 'src':[],
self.path={} 'dynamic':[],
'static':[]
self.list_heritage=[] }
self.path = {}
self.list_heritage = []
if heritage != None: if heritage != None:
self.add_heritage(heritage) self.add_heritage(heritage)
@@ -58,10 +60,13 @@ class HeritageList:
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 = { 'src':[],
self.path={} 'dynamic':[],
'static':[]
}
self.path = {}
# reorder heritage list : # reorder heritage list :
listHeritage = self.list_heritage listHeritage = self.list_heritage
self.list_heritage = [] self.list_heritage = []
@@ -105,7 +110,9 @@ class HeritageList:
self.path[ppp] = value self.path[ppp] = value
else: else:
append_to_list(self.path[ppp], value) append_to_list(self.path[ppp], value)
append_to_list(self.src, element.src) append_to_list(self.src['src'], element.src['src'])
append_to_list(self.src['dynamic'], element.src['dynamic'])
append_to_list(self.src['static'], element.src['static'])
if "c-version" in element.flags: if "c-version" in element.flags:
ver = element.flags["c-version"] ver = element.flags["c-version"]
if "c-version" in self.flags: if "c-version" in self.flags:
@@ -121,15 +128,19 @@ class HeritageList:
class heritage: class heritage:
def __init__(self, module): def __init__(self, module, target):
self.name="" self.name = ""
self.depends=[] self.depends = []
## Remove all variable to prevent error of multiple definition ## Remove all variable to prevent error of multiple definition
# all the parameter that the upper classe need when build # all the parameter that the upper classe need when build
self.flags={} self.flags = {}
# sources list: # sources list:
self.src=[] self.src = { 'src':[],
self.path={} 'dynamic':[],
'static':[]
}
self.path = {}
self.include = ""
# 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
@@ -140,17 +151,44 @@ class heritage:
# keep reference because the flags can change in time # keep reference because the flags can change in time
self.flags = module.flags["export"] self.flags = module.flags["export"]
self.path = module.path["export"] self.path = module.path["export"]
# if the user install some header ==> they will ba autoamaticaly exported ...
if target != None:
if len(module.header) > 0:
self.include = target.get_build_path_include(module.name)
def add_depends(self, depend): def add_depends(self, elements):
self.depends.append(depend) self.depends.append(elements)
def add_import_path(self, list): def add_import_path(self, list):
append_to_list(self.path, list) append_to_list(self.path, list)
def add_sources(self, list): def add_sources(self, elements):
if type(list) == type(None): if type(elements) == type(None):
debug.error("try add element none in a list ...") debug.error("try add element none in a list ...")
append_to_list(self.src, list) append_to_list(self.src['src'], elements)
def add_lib_static(self, elements):
if type(elements) == type(None):
debug.error("try add element none in a list ...")
append_to_list(self.src['static'], elements)
def add_lib_dynamic(self, elements):
if type(elements) == type(None):
debug.error("try add element none in a list ...")
append_to_list(self.src['dynamic'], elements)
def add_lib_interpreted(self, type_interpretation, elements):
# TODO : Think at a better methodologie ...
if type(elements) == type(None):
debug.error("try add element none in a list ...")
append_to_list(self.src['src'], elements)
def auto_add_build_header(self):
if self.include != "":
# TODO :Set it better :
if 'c' not in self.path:
self.path['c'] = []
self.path['c'].append(self.include)
def need_update(self, list): def need_update(self, list):
self.hasBeenUpdated=True self.hasBeenUpdated=True

View File

@@ -14,14 +14,14 @@ from . import tools
from . import multiprocess from . import multiprocess
from . import depend from . import depend
enableResizeImage = True enable_resize_image = True
try: try:
if platform.system() == "Darwin": if platform.system() == "Darwin":
import CoreGraphics import CoreGraphics
else: else:
from PIL import Image from PIL import Image
except: except:
enableResizeImage = False enable_resize_image = False
debug.warning("Missing python tools : CoreGraphics (MacOs) or PIL") debug.warning("Missing python tools : CoreGraphics (MacOs) or PIL")
def get_pow_2_multiple(size): def get_pow_2_multiple(size):
@@ -34,31 +34,31 @@ def get_pow_2_multiple(size):
# check if force requested # check if force requested
# check if time change # check if time change
# check if command line change # check if command line change
def resize(srcFile, destFile, x, y, cmd_file=None): def resize(src_file, dest_file, x, y, cmd_file=None):
if enableResizeImage == False: if enable_resize_image == False:
return return
if os.path.exists(srcFile) == False: if os.path.exists(src_file) == False:
debug.error("Request a resize an image that does not existed : '" + srcFile + "'") debug.error("Request a resize an image that does not existed : '" + src_file + "'")
cmd_line = "resize Image : " + srcFile + " ==> " + destFile + " newSize=(" + str(x) + "x" + str(y) + ")" cmd_line = "resize Image : " + src_file + " ==> " + dest_file + " newSize=(" + str(x) + "x" + str(y) + ")"
if False==depend.need_re_build(destFile, srcFile, file_cmd=cmd_file , cmdLine=cmd_line): if depend.need_re_build(dest_file, src_file, file_cmd=cmd_file , cmd_line=cmd_line) == False:
return return
# add cmdLine ... # add cmdLine ...
x = get_pow_2_multiple(x) x = get_pow_2_multiple(x)
extension = destFile[destFile.rfind('.'):] extension = dest_file[dest_file.rfind('.'):]
if platform.system() == "Darwin": if platform.system() == "Darwin":
source_image = CoreGraphics.CGImageImport(CoreGraphics.CGDataProviderCreateWithFilename(srcFile)) source_image = CoreGraphics.CGImageImport(CoreGraphics.CGDataProviderCreateWithFilename(src_file))
source_width = source_image.getWidth() source_width = source_image.getWidth()
source_height = source_image.getHeight() source_height = source_image.getHeight()
if source_width <= x: if source_width <= x:
# for small image just copy: # for small image just copy:
tools.copy_file(srcFile, destFile) tools.copy_file(src_file, dest_file)
else: else:
if y <= 0: if y <= 0:
# keep ratio : # keep ratio :
y = int(float(x) * float(source_height) / float(source_width)) y = int(float(x) * float(source_height) / float(source_width))
y = get_pow_2_multiple(y) y = get_pow_2_multiple(y)
debug.print_element("resize Image (" + str(x) + "x" + str(y) + ")", srcFile, "==>", destFile) debug.print_element("resize Image (" + str(x) + "x" + str(y) + ")", src_file, "==>", dest_file)
debug.debug("Resize image: " + srcFile + " size=(" + str(source_width) + "x" + str(source_height) + ") -> (" + str(x) + "x" + str(y) + ")") debug.debug("Resize image: " + src_file + " size=(" + str(source_width) + "x" + str(source_height) + ") -> (" + str(x) + "x" + str(y) + ")")
source_image_rect = CoreGraphics.CGRectMake(0, 0, source_width, source_height) source_image_rect = CoreGraphics.CGRectMake(0, 0, source_width, source_height)
new_image = source_image.createWithImageInRect(source_image_rect) new_image = source_image.createWithImageInRect(source_image_rect)
colors_space = CoreGraphics.CGColorSpaceCreateDeviceRGB() colors_space = CoreGraphics.CGColorSpaceCreateDeviceRGB()
@@ -67,27 +67,27 @@ def resize(srcFile, destFile, x, y, cmd_file=None):
context.setInterpolationQuality(CoreGraphics.kCGInterpolationHigh) context.setInterpolationQuality(CoreGraphics.kCGInterpolationHigh)
new_image_rect = CoreGraphics.CGRectMake(0, 0, x, y) new_image_rect = CoreGraphics.CGRectMake(0, 0, x, y)
context.drawImage(new_image_rect, new_image) context.drawImage(new_image_rect, new_image)
tools.create_directory_of_file(destFile) tools.create_directory_of_file(dest_file)
if extension == ".jpeg": if extension == ".jpeg":
context.writeToFile(destFile, CoreGraphics.kCGImageFormatJPEG) context.writeToFile(dest_file, CoreGraphics.kCGImageFormatJPEG)
elif extension == ".png": elif extension == ".png":
context.writeToFile(destFile, CoreGraphics.kCGImageFormatPNG) context.writeToFile(dest_file, CoreGraphics.kCGImageFormatPNG)
else: else:
debug.error(" can not manage extention ... : " + destFile) debug.error(" can not manage extention ... : " + dest_file)
else: else:
# open an image file (.bmp,.jpg,.png,.gif) you have in the working folder # open an image file (.bmp,.jpg,.png,.gif) you have in the working path
im1 = Image.open(srcFile) im1 = Image.open(src_file)
if im1.size[0] <= x: if im1.size[0] <= x:
# for small image just copy: # for small image just copy:
tools.copy_file(srcFile, destFile) tools.copy_file(src_file, dest_file)
else: else:
if y <= 0: if y <= 0:
# keep ratio : # keep ratio :
y = int(float(x) * float(im1.size[1]) / float(im1.size[0])) y = int(float(x) * float(im1.size[1]) / float(im1.size[0]))
y = get_pow_2_multiple(y) y = get_pow_2_multiple(y)
debug.print_element("resize Image (" + str(x) + "x" + str(y) + ")", srcFile, "==>", destFile) debug.print_element("resize Image (" + str(x) + "x" + str(y) + ")", src_file, "==>", dest_file)
# use one of these filter options to resize the image # use one of these filter options to resize the image
tmpImage = im1.resize((x, y), Image.ANTIALIAS) tmpImage = im1.resize((x, y), Image.ANTIALIAS)
tools.create_directory_of_file(destFile) tools.create_directory_of_file(dest_file)
tmpImage.save(destFile) tmpImage.save(dest_file)
multiprocess.store_command(cmd_line, cmd_file) tools.store_command(cmd_line, cmd_file)

100
lutin/license.py Normal file
View File

@@ -0,0 +1,100 @@
#!/usr/bin/python
##
## @author Edouard DUPIN
##
## @copyright 2012, Edouard DUPIN, all right reserved
##
## @license APACHE v2.0 (see license file)
##
license_base = {
"APACHE-2": {
"generic":True,
"contaminate-static":False,
"contaminate-dynamic":False,
"redistribute-source":False,
"title":"APACHE v2.0 license",
"licence-file":"licence/apache-2.txt"
},
"GPL-2": {
"generic":True,
"contaminate-static":True,
"contaminate-dynamic":True,
"redistribute-source":True,
"title":"GPL: Gnu Public Licence v2.0",
"licence-file":"licence/GPL-2.txt"
},
"GPL-3": {
"generic":True,
"contaminate-static":True,
"contaminate-dynamic":True,
"redistribute-source":True,
"title":"GPL: GNU General Public License v3.0",
"licence-file":"licence/GPL-3.txt"
},
"LGPL-2": {
"generic":True,
"contaminate-static":False,
"contaminate-dynamic":False,
"redistribute-source":True,
"title":"LGPL: GNU Lesser General Public License v2.0",
"licence-file":"licence/LGPL-2.txt"
},
"LGPL-3": {
"generic":True,
"contaminate-static":True,
"contaminate-dynamic":False,
"redistribute-source":True,
"title":"LGPL: GNU Lesser General Public License v3.0",
"licence-file":"licence/LGPL-3.txt"
},
"MIT": {
"generic":True,
"contaminate-static":False,
"contaminate-dynamic":False,
"redistribute-source":False,
"title":"MIT: Massachusetts Institute of Technology License",
"licence-file":"licence/MIT.txt"
},
"BSD-2": {
"generic":True,
"contaminate-static":False,
"contaminate-dynamic":False,
"redistribute-source":False,
"title":"BSD 2-clauses: Berkeley Software Distribution License",
"licence-file":"licence/BSD-2.txt"
},
"BSD-3": {
"generic":True,
"contaminate-static":False,
"contaminate-dynamic":False,
"redistribute-source":False,
"title":"BSD 3-clauses: Berkeley Software Distribution License",
"licence-file":"licence/BSD-3.txt"
},
"BSD-4": {
"generic":True,
"contaminate-static":False,
"contaminate-dynamic":False,
"redistribute-source":False,
"title":"BSD 4-clauses: Berkeley Software Distribution License",
"licence-file":"licence/BSD-4.txt"
},
"PNG": {
"generic":True,
"contaminate-static":False,
"contaminate-dynamic":False,
"redistribute-source":False,
"title":"PNG License",
"licence-file":"licence/png.txt"
}
}
def get_basic_list():
global license_base
out = []
for name in license_base:
out.append(name)
return out

File diff suppressed because it is too large Load Diff

View File

@@ -22,6 +22,7 @@ import shlex
from . import debug from . import debug
from . import tools from . import tools
from . import env from . import env
from . import depend
queueLock = threading.Lock() queueLock = threading.Lock()
workQueue = queue.Queue() workQueue = queue.Queue()
@@ -70,7 +71,7 @@ def run_command_direct(cmd_line):
return False return False
def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_file=""): def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_file="", depend_data=None):
global errorOccured global errorOccured
global exitFlag global exitFlag
global currentIdExecution global currentIdExecution
@@ -95,6 +96,8 @@ def run_command(cmd_line, store_cmd_line="", build_id=-1, file="", store_output_
if p.returncode == 0: if p.returncode == 0:
debug.debug(env.print_pretty(cmd_line)) debug.debug(env.print_pretty(cmd_line))
queueLock.acquire() queueLock.acquire()
if depend_data != None:
depend.create_dependency_file(depend_data['file'], depend_data['data'])
# TODO : Print the output all the time .... ==> to show warnings ... # TODO : Print the output all the time .... ==> to show warnings ...
if build_id >= 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 + "'")
@@ -163,7 +166,7 @@ class myThread(threading.Thread):
cmdLine = data[1] cmdLine = data[1]
cmdStoreFile = data[3] cmdStoreFile = data[3]
debug.print_element( "[" + str(data[4]) + "][" + str(self.thread_id) + "] " + comment[0], comment[1], comment[2], comment[3]) debug.print_element( "[" + str(data[4]) + "][" + str(self.thread_id) + "] " + comment[0], comment[1], comment[2], comment[3])
run_command(cmdLine, cmdStoreFile, build_id=data[4], file=comment[3], store_output_file=data[5]) run_command(cmdLine, cmdStoreFile, build_id=data[4], file=comment[3], store_output_file=data[5], depend_data=data[6])
else: else:
debug.warning("unknow request command : " + data[0]) debug.warning("unknow request command : " + data[0])
else: else:
@@ -218,18 +221,18 @@ def un_init():
def run_in_pool(cmd_line, comment, store_cmd_line="", store_output_file=""): def run_in_pool(cmd_line, comment, store_cmd_line="", store_output_file="", depend_data=None):
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(cmd_line, store_cmd_line, file=comment[3], store_output_file=store_output_file) run_command(cmd_line, store_cmd_line, file=comment[3], store_output_file=store_output_file, depend_data=depend_data)
return return
# multithreaded mode # multithreaded mode
init() init()
# Fill the queue # Fill the queue
queueLock.acquire() queueLock.acquire()
debug.verbose("add : in pool cmdLine") debug.verbose("add : in pool cmdLine")
workQueue.put(["cmdLine", cmd_line, comment, store_cmd_line, currentIdExecution, store_output_file]) workQueue.put(["cmdLine", cmd_line, comment, store_cmd_line, currentIdExecution, store_output_file, depend_data])
currentIdExecution +=1; currentIdExecution +=1;
queueLock.release() queueLock.release()

View File

@@ -41,7 +41,7 @@ class System:
if True==order: if True==order:
listout.sort() listout.sort()
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:
@@ -50,22 +50,22 @@ class System:
self.append_and_check(listout, elem, order) self.append_and_check(listout, elem, order)
def add_export_flag_LD(self, list): def add_export_flag_LD(self, list):
self.append_to_internalList(self.export_flags_ld, list) self.append_to_internal_list(self.export_flags_ld, list)
def add_export_flag_CC(self, list): def add_export_flag_CC(self, list):
self.append_to_internalList(self.export_flags_cc, list) self.append_to_internal_list(self.export_flags_cc, list)
def add_export_flag_XX(self, list): def add_export_flag_XX(self, list):
self.append_to_internalList(self.export_flags_xx, list) self.append_to_internal_list(self.export_flags_xx, list)
def add_export_flag_M(self, list): def add_export_flag_M(self, list):
self.append_to_internalList(self.export_flags_m, list) self.append_to_internal_list(self.export_flags_m, list)
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_internal_list(self.export_flags_mm, list)
def add_export_SRC(self, list): def add_export_SRC(self, list):
self.append_to_internalList(self.export_src, list) self.append_to_internal_list(self.export_src, list)
def add_action(self, name_of_state="PACKAGE", level=5, name="no-name", action=None): def add_action(self, name_of_state="PACKAGE", level=5, name="no-name", action=None):
if name_of_state not in self.action_on_state: if name_of_state not in self.action_on_state:
@@ -158,7 +158,7 @@ def exist(lib_name, target_name, target) :
data["system"] = theSystem.System(target) data["system"] = theSystem.System(target)
data["exist"] = data["system"].valid data["exist"] = data["system"].valid
except: except:
debug.debug("Not find: '" + data["name"] + "'") debug.warning("Not find: '" + data["name"] + "' ==> get exception")
return data["exist"] return data["exist"]
return False return False

View File

@@ -18,7 +18,6 @@ from . import heritage
from . import tools from . import tools
from . import module from . import module
from . import system from . import system
from . import image
from . import multiprocess from . import multiprocess
class Target: class Target:
@@ -78,13 +77,14 @@ class Target:
self.suffix_warning='.warning' self.suffix_warning='.warning'
self.suffix_dependence='.d' self.suffix_dependence='.d'
self.suffix_obj='.o' self.suffix_obj='.o'
self.prefix_lib='lib'
self.suffix_lib_static='.a' self.suffix_lib_static='.a'
self.suffix_lib_dynamic='.so' self.suffix_lib_dynamic='.so'
self.suffix_binary='' self.suffix_binary=''
self.suffix_package='.deb' self.suffix_package='.deb'
self.folder_generate_code="/generate_header" self.path_generate_code="/generate_header"
self.folder_arch="/" + self.name self.path_arch="/" + self.name
if "debug" == self.config["mode"]: if "debug" == self.config["mode"]:
self.global_flags_cc.append("-g") self.global_flags_cc.append("-g")
@@ -101,11 +101,21 @@ class Target:
self.global_flags_ld.append("-fprofile-arcs") self.global_flags_ld.append("-fprofile-arcs")
self.global_flags_ld.append("-ftest-coverage") self.global_flags_ld.append("-ftest-coverage")
self.update_folder_tree() self.update_path_tree()
self.folder_bin="/usr/bin" """
self.folder_lib="/usr/lib" self.path_bin="usr/bin"
self.folder_data="/usr/share" self.path_lib="usr/lib"
self.folder_doc="/usr/share/doc" self.path_data="usr/share"
self.path_doc="usr/share/doc"
"""
self.path_bin="bin"
self.path_lib="lib"
self.path_data="share"
self.path_doc="doc"
self.path_include="include"
self.path_object="obj"
self.build_done=[] self.build_done=[]
self.build_tree_done=[] self.build_tree_done=[]
self.module_list=[] self.module_list=[]
@@ -116,13 +126,27 @@ class Target:
self.action_on_state={} self.action_on_state={}
def update_folder_tree(self): # set some default package path
self.folder_out="/out/" + self.name + "_" + self.config["arch"] + "_" + self.config["bus-size"] + "/" + self.config["mode"] self.pkg_path_version_file = "version.txt"
self.folder_final="/final/" + self.config["compilator"] self.pkg_path_maintainer_file = "maintainer.txt"
self.folder_staging="/staging/" + self.config["compilator"] self.pkg_path_application_name_file = "appl_name.txt"
self.folder_build="/build/" + self.config["compilator"] self.pkg_path_application_description_file = "appl_description.txt"
self.pkg_path_readme_file = "readme.txt"
self.pkg_path_change_log_file = "changelog.txt"
# special case for IOS (example) no build dynamicly ...
self.support_dynamic_link = True
def update_path_tree(self):
self.path_out = os.path.join("out", self.name + "_" + self.config["arch"] + "_" + self.config["bus-size"], self.config["mode"])
self.path_final = os.path.join("final", self.config["compilator"])
self.path_staging = os.path.join("staging", self.config["compilator"])
self.path_build = os.path.join("build", self.config["compilator"])
def create_number_from_version_string(self, data): def create_number_from_version_string(self, data):
tmp_data = data.split("-")
if len(tmp_data) > 1:
data = tmp_data[0]
list = data.split(".") list = data.split(".")
if len(list) == 1: if len(list) == 1:
list.append("0") list.append("0")
@@ -149,7 +173,7 @@ class Target:
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="" self.ranlib=""
else: else:
self.cc = self.cross + "gcc" self.cc = self.cross + "gcc"
@@ -171,67 +195,31 @@ class Target:
self.nm = self.cross + "nm" self.nm = self.cross + "nm"
self.strip = self.cross + "strip" self.strip = self.cross + "strip"
self.dlltool = self.cross + "dlltool" self.dlltool = self.cross + "dlltool"
self.update_folder_tree() self.update_path_tree()
def get_build_mode(self): def get_build_mode(self):
return self.config["mode"] return self.config["mode"]
def add_image_staging(self, inputFile, outputFile, sizeX, sizeY, cmdFile=None):
for source, dst, x, y, cmdFile2 in self.list_final_file:
if dst == outputFile :
debug.verbose("already added : " + outputFile)
return
debug.verbose("add file : '" + inputFile + "' ==> '" + outputFile + "'")
self.list_final_file.append([inputFile,outputFile, sizeX, sizeY, cmdFile])
def add_file_staging(self, inputFile, outputFile, cmdFile=None):
for source, dst, x, y, cmdFile2 in self.list_final_file:
if dst == outputFile :
debug.verbose("already added : " + outputFile)
return
debug.verbose("add file : '" + inputFile + "' ==> '" + outputFile + "'");
self.list_final_file.append([inputFile, outputFile, -1, -1, cmdFile])
def copy_to_staging(self, binaryName):
baseFolder = self.get_staging_folder_data(binaryName)
for source, dst, x, y, cmdFile in self.list_final_file:
if cmdFile != None \
and cmdFile != "":
debug.verbose("cmd file " + cmdFile)
if x == -1:
debug.verbose("must copy file : '" + source + "' ==> '" + dst + "'");
tools.copy_file(source, baseFolder+"/"+dst, cmdFile)
else:
debug.verbose("resize image : '" + source + "' ==> '" + dst + "' size=(" + str(x) + "," + str(y) + ")");
image.resize(source, baseFolder+"/"+dst, x, y, cmdFile)
def clean_module_tree(self): def clean_module_tree(self):
self.build_tree_done = [] self.build_tree_done = []
self.list_final_file = [] self.list_final_file = []
# TODO : Remove this hack ... ==> really bad ... but usefull
def set_ewol_folder(self, folder):
self.folder_ewol = folder
def get_full_name_source(self, basePath, file): def get_full_name_source(self, basePath, file):
if file[0] == '/': if file[0] == '/':
if tools.os.path.isfile(file): if tools.os.path.isfile(file):
return file return file
return basePath + "/" + file return basePath + "/" + file
def get_full_name_cmd(self, moduleName, basePath, file): def get_full_name_cmd(self, module_name, basePath, file):
if file[0] == '/': if file[0] == '/':
if tools.os.path.isfile(file): if tools.os.path.isfile(file):
return file + self.suffix_cmd_line return file + self.suffix_cmd_line
return self.get_build_folder(moduleName) + "/" + file + self.suffix_cmd_line return self.get_build_path_object(module_name) + "/" + file + self.suffix_cmd_line
def get_full_name_warning(self, moduleName, basePath, file): def get_full_name_warning(self, module_name, basePath, file):
return self.get_build_folder(moduleName) + "/" + file + self.suffix_warning; return self.get_build_path_object(module_name) + "/" + file + self.suffix_warning;
def get_full_name_destination(self, moduleName, basePath, file, suffix, remove_suffix=False): def get_full_name_destination(self, module_name, basePath, file, suffix, remove_suffix=False):
# special patch for java file: # special patch for java file:
if file[-4:] == "java": if file[-4:] == "java":
for elem in ["org/", "com/"]: for elem in ["org/", "com/"]:
@@ -246,10 +234,10 @@ class Target:
suffix = suffix[0] suffix = suffix[0]
else: else:
suffix = "" suffix = ""
return self.get_build_folder(moduleName) + "/" + file + suffix return self.get_build_path_object(module_name) + "/" + file + suffix
def get_full_dependency(self, moduleName, basePath, file): def get_full_dependency(self, module_name, basePath, file):
return self.get_build_folder(moduleName) + "/" + file + self.suffix_dependence return self.get_build_path_object(module_name) + "/" + file + self.suffix_dependence
""" """
return a list of 3 elements : return a list of 3 elements :
@@ -257,52 +245,110 @@ class Target:
1 : destination file 1 : destination file
2 : dependence files module (*.d) 2 : dependence files module (*.d)
""" """
def generate_file(self,binaryName,moduleName,basePath,file,type): # TODO : Remove this it is urgent ...
def generate_file(self,
binary_name,
module_name,
basePath,
file,
type):
#debug.warning("genrate_file(" + str(binary_name) + "," + str(module_name) + "," + str(basePath) + "," + str(file) + "," + str(type) + ")")
list=[] list=[]
if (type=="bin"): if (type=="bin"):
list.append(file) list.append(file)
list.append(self.get_staging_folder(binaryName) + "/" + self.folder_bin + "/" + moduleName + self.suffix_binary) list.append(self.get_build_file_bin(binary_name))
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_dependence) list.append(os.path.join(self.get_build_path(module_name), module_name + self.suffix_dependence))
list.append(self.get_build_folder(binaryName) + "/" + self.folder_bin + "/" + moduleName + self.suffix_binary + self.suffix_cmd_line) list.append(self.get_build_file_bin(binary_name) + self.suffix_cmd_line)
list.append(self.get_build_folder(binaryName) + "/" + self.folder_bin + "/" + moduleName + self.suffix_binary + self.suffix_warning) list.append(self.get_build_file_bin(binary_name) + 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_build_file_dynamic(module_name))
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_dependence) list.append(os.path.join(self.get_build_path(module_name), self.path_lib, module_name + self.suffix_dependence))
list.append(self.get_build_folder(binaryName) + "/" + self.folder_lib + "/" + moduleName + self.suffix_lib_dynamic + self.suffix_cmd_line) list.append(self.get_build_file_dynamic(module_name) + self.suffix_cmd_line)
list.append(self.get_build_folder(binaryName) + "/" + self.folder_lib + "/" + moduleName + self.suffix_lib_dynamic + self.suffix_warning) list.append(self.get_build_file_dynamic(module_name) + 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_file_static(module_name))
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_dependence) list.append(os.path.join(self.get_build_path(module_name), self.path_lib, module_name + self.suffix_dependence))
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_lib_static + self.suffix_cmd_line) list.append(self.get_build_file_static(module_name) + self.suffix_cmd_line)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + self.suffix_lib_static + self.suffix_warning) list.append(self.get_build_file_static(module_name) + self.suffix_warning)
elif (type=="jar"): elif (type=="jar"):
list.append(file) list.append(file)
list.append(self.get_build_folder(moduleName) + "/" + moduleName + ".jar") list.append(os.path.join(self.get_build_path(module_name), module_name + ".jar"))
list.append(self.get_build_folder(moduleName) + "/" + moduleName + ".jar" + self.suffix_dependence) list.append(os.path.join(self.get_build_path(module_name), module_name + ".jar" + self.suffix_dependence))
list.append(self.get_build_folder(moduleName) + "/" + moduleName + ".jar" + self.suffix_cmd_line) list.append(os.path.join(self.get_build_path(module_name), module_name + ".jar" + self.suffix_cmd_line))
list.append(self.get_build_folder(moduleName) + "/" + moduleName + ".jar" + self.suffix_warning) list.append(os.path.join(self.get_build_path(module_name), module_name + ".jar" + self.suffix_warning))
elif (type=="image"): elif (type=="image"):
list.append(self.get_build_folder(binaryName) + "/data/" + file + self.suffix_cmd_line) list.append(os.path.join(self.get_build_path(binary_name), "data", file + self.suffix_cmd_line))
else: else:
debug.error("unknow type : " + type) debug.error("unknow type : " + type)
return list return list
def get_final_folder(self): ##
return tools.get_run_folder() + self.folder_out + self.folder_final ## @brief Get the fianal path ==> contain all the generated packages
## @return The path of the pa
##
def get_final_path(self):
return os.path.join(tools.get_run_path(), self.path_out, self.path_final)
def get_staging_folder(self, binaryName): def get_staging_path(self, binary_name):
return tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + binaryName return os.path.join(tools.get_run_path(), self.path_out, self.path_staging, binary_name)
def get_staging_folder_data(self, binaryName): def get_build_path(self, module_name):
return self.get_staging_folder(binaryName) + self.folder_data + "/" + binaryName #debug.warning("A=" + str(tools.get_run_path()) + " " + str(self.path_out) + " " + str(self.path_build) + " " + str(module_name))
return os.path.join(tools.get_run_path(), self.path_out, self.path_build, module_name)
def get_build_folder(self, moduleName):
return tools.get_run_folder() + self.folder_out + self.folder_build + "/" + moduleName
def get_doc_folder(self, moduleName): def get_build_path_object(self, binary_name):
return tools.get_run_folder() + self.folder_out + self.folder_doc + "/" + moduleName return os.path.join(self.get_build_path(binary_name), self.path_object)
def get_build_path_bin(self, binary_name):
return os.path.join(self.get_build_path(binary_name), self.path_bin)
def get_build_path_lib(self, binary_name):
return os.path.join(self.get_build_path(binary_name), self.path_lib)
def get_build_path_data(self, binary_name):
return os.path.join(self.get_build_path(binary_name), self.path_data, binary_name)
def get_build_path_include(self, binary_name):
return os.path.join(self.get_build_path(binary_name), self.path_include)
def get_build_file_bin(self, binary_name):
return os.path.join(self.get_build_path_bin(binary_name), binary_name + self.suffix_binary)
def get_build_file_static(self, binary_name):
return os.path.join(self.get_build_path_lib(binary_name), self.prefix_lib + binary_name + self.suffix_lib_static)
def get_build_file_dynamic(self, binary_name):
return os.path.join(self.get_build_path_lib(binary_name), self.prefix_lib + binary_name + self.suffix_lib_dynamic)
def get_staging_path_bin(self, package_name):
return os.path.join(self.get_staging_path(package_name), self.path_bin)
def get_staging_path_lib(self, package_name):
return os.path.join(self.get_staging_path(package_name), self.path_lib, package_name)
def get_staging_path_data(self, package_name):
return os.path.join(self.get_staging_path(package_name), self.path_data, package_name)
def get_staging_path_include(self, package_name):
return os.path.join(self.get_staging_path(package_name), self.path_include)
"""
def get_staging_file_bin(self, package_name, binary_name):
return os.path.join(self.get_staging_path_bin(package_name), binary_name + self.suffix_binary)
"""
def get_doc_path(self, module_name):
return os.path.join(tools.get_run_path(), self.path_out, self.path_doc, module_name)
def is_module_build(self, my_module): def is_module_build(self, my_module):
for mod in self.build_done: for mod in self.build_done:
@@ -323,7 +369,7 @@ class Target:
self.module_list.append(newModule) self.module_list.append(newModule)
def get_module(self, name): def get_module(self, name):
for mod in self.build_done: for mod in self.module_list:
if mod.name == name: if mod.name == name:
return mod return mod
debug.error("the module '" + str(name) + "'does not exist/already build") debug.error("the module '" + str(name) + "'does not exist/already build")
@@ -409,8 +455,9 @@ class Target:
mod.clean(self) mod.clean(self)
else: else:
# get the action an the module .... # get the action an the module ....
gettedElement = name.split("?") name2 = name.replace("@", "?")
moduleName = gettedElement[0] gettedElement = name2.split("?")
module_name = gettedElement[0]
if len(gettedElement)>=3: if len(gettedElement)>=3:
sub_action_name = gettedElement[2] sub_action_name = gettedElement[2]
else: else:
@@ -419,41 +466,41 @@ class Target:
actionName = gettedElement[1] actionName = gettedElement[1]
else : else :
actionName = "build" actionName = "build"
debug.verbose("requested : " + moduleName + "?" + actionName) debug.verbose("requested : " + module_name + "?" + actionName)
if actionName == "install": if actionName == "install":
self.build(moduleName + "?build") self.build(module_name + "?build")
self.install_package(moduleName) self.install_package(module_name)
elif actionName == "uninstall": elif actionName == "uninstall":
self.un_install_package(moduleName) self.un_install_package(module_name)
elif actionName == "log": elif actionName == "log":
self.Log(moduleName) self.Log(module_name)
else: else:
present = self.load_if_needed(moduleName, optionnal=optionnal) present = self.load_if_needed(module_name, optionnal=optionnal)
if present == False \ if present == False \
and optionnal == True: and optionnal == True:
return [heritage.HeritageList(), False] return [heritage.HeritageList(), False]
# clean requested # clean requested
for mod in self.module_list: for mod in self.module_list:
if mod.name == moduleName: if mod.name == module_name:
if actionName == "dump": if actionName == "dump":
debug.info("dump module '" + moduleName + "'") debug.info("dump module '" + module_name + "'")
return mod.display(self) return mod.display(self)
elif actionName == "clean": elif actionName == "clean":
debug.info("clean module '" + moduleName + "'") debug.info("clean module '" + module_name + "'")
return mod.clean(self) return mod.clean(self)
elif actionName == "gcov": elif actionName == "gcov":
debug.debug("gcov on module '" + moduleName + "'") debug.debug("gcov on module '" + module_name + "'")
if sub_action_name == "output": if sub_action_name == "output":
return mod.gcov(self, generate_output=True) return mod.gcov(self, generate_output=True)
return mod.gcov(self, generate_output=False) return mod.gcov(self, generate_output=False)
elif actionName == "build": elif actionName == "build":
debug.debug("build module '" + moduleName + "'") debug.debug("build module '" + module_name + "'")
if optionnal == True: if optionnal == True:
return [mod.build(self, None), True] return [mod.build(self, None), True]
return mod.build(self, None) return mod.build(self, None)
if optionnal == True: if optionnal == True:
return [heritage.HeritageList(), False] return [heritage.HeritageList(), False]
debug.error("not know module name : '" + moduleName + "' to '" + actionName + "' it") debug.error("not know module name : '" + module_name + "' to '" + actionName + "' it")
def add_action(self, name_of_state="PACKAGE", level=5, name="no-name", action=None): def add_action(self, name_of_state="PACKAGE", level=5, name="no-name", action=None):
debug.verbose("add action : " + name) debug.verbose("add action : " + name)
@@ -462,13 +509,219 @@ class Target:
else: else:
self.action_on_state[name_of_state].append([level, name, action]) self.action_on_state[name_of_state].append([level, name, action])
##
## @brief Create a package/bundle for the platform.
## @param[in] pkg_name Package Name (generic name)
## @param[in] pkg_properties Property of the package
## @param[in] base_pkg_path Base path of the package
## @param[in] heritage_list List of dependency of the package
## @param[in] static The package is build in static mode
##
def make_package(self, pkg_name, pkg_properties, base_pkg_path, heritage_list):
#The package generated depend of the type of the element:
end_point_module_name = heritage_list.list_heritage[-1].name
module = self.get_module(end_point_module_name)
if module == None:
debug.error("can not create package ... ");
if module.get_type() == 'PREBUILD':
#nothing to do ...
return
if module.get_type() == 'LIBRARY' \
or module.get_type() == 'LIBRARY_DYNAMIC' \
or module.get_type() == 'LIBRARY_STATIC':
debug.info("Can not create package for library");
return
if module.get_type() == 'BINARY' \
or module.get_type() == 'BINARY_STAND_ALONE':
self.make_package_binary(pkg_name, pkg_properties, base_pkg_path, heritage_list, static = True)
if module.get_type() == 'BINARY_SHARED':
self.make_packages_binary(pkg_name, pkg_properties, base_pkg_path, heritage_list, static = False)
if module.get_type() == 'PACKAGE':
debug.info("Can not create package for package");
return
return
targetList=[] ##
## @brief Create a generic tree of the shared data for each platform
## @param[in] path_package Path of the basic install folder of the application
## @param[in] pkg_name Package Name (generic name)
## @param[in] heritage_list List of dependency of the package
## @param[in] static The package is build in static mode
##
def make_package_binary_data(self, path_package, pkg_name, base_pkg_path, heritage_list, static):
target_shared_path = os.path.join(path_package, self.pkg_path_data)
if static == True:
path_package_data = os.path.join(target_shared_path, pkg_name)
else:
path_package_data = target_shared_path
tools.create_directory_of_file(path_package_data)
# prepare list of copy files
copy_list={}
debug.debug("heritage for " + str(pkg_name) + ":")
for heritage in heritage_list.list_heritage:
debug.debug("sub elements: " + str(heritage.name))
path_src = self.get_build_path_data(heritage.name)
debug.verbose(" has directory: " + path_src)
if os.path.isdir(path_src):
if static == True:
debug.debug(" need copy: " + path_src + " to " + path_package_data)
#copy all data:
tools.copy_anything(path_src,
path_package_data,
recursive=True,
force_identical=True,
in_list=copy_list)
else:
debug.debug(" need copy: " + os.path.dirname(path_src) + " to " + path_package_data)
#copy all data:
tools.copy_anything(os.path.dirname(path_src),
path_package_data,
recursive=True,
force_identical=True,
in_list=copy_list)
#real copy files
tools.copy_list(copy_list)
# remove unneded files (NOT folder ...)
tools.clean_directory(target_shared_path, copy_list)
##
## @brief Create a generic tree of the binary folder
## @param[in] path_package Path of the basic install folder of the application
## @param[in] pkg_name Package Name (generic name)
## @param[in] heritage_list List of dependency of the package
## @param[in] static The package is build in static mode
##
def make_package_binary_bin(self, path_package, pkg_name, base_pkg_path, heritage_list, static):
copy_list={}
path_package_bin = os.path.join(path_package, self.pkg_path_bin)
tools.create_directory_of_file(path_package_bin)
path_src = self.get_build_file_bin(pkg_name)
path_dst = os.path.join(path_package_bin, pkg_name + self.suffix_binary)
debug.verbose("path_dst: " + str(path_dst))
tools.copy_file(path_src,
path_dst,
in_list=copy_list)
#real copy files
tools.copy_list(copy_list)
if self.pkg_path_bin != "":
# remove unneded files (NOT folder ...)
tools.clean_directory(path_package_bin, copy_list)
##
## @brief Create a generic tree of the library folder
## @param[in] path_package Path of the basic install folder of the application
## @param[in] pkg_name Package Name (generic name)
## @param[in] heritage_list List of dependency of the package
## @param[in] static The package is build in static mode
##
def make_package_binary_lib(self, path_package, pkg_name, base_pkg_path, heritage_list, static):
copy_list={}
path_package_lib = os.path.join(path_package, self.pkg_path_lib)
if static == False:
#copy all shred libs...
tools.create_directory_of_file(path_package_lib)
debug.verbose("libs for " + str(pkg_name) + ":")
for heritage in heritage_list.list_heritage:
debug.debug("sub elements: " + str(heritage.name))
file_src = self.get_build_file_dynamic(heritage.name)
debug.verbose(" has directory: " + file_src)
if os.path.isfile(file_src):
debug.debug(" need copy: " + file_src + " to " + path_package_lib)
#copy all data:
# TODO : We can have a problem when writing over library files ...
tools.copy_file(file_src,
os.path.join(path_package_lib, os.path.basename(file_src)),
in_list=copy_list)
#real copy files
tools.copy_list(copy_list)
if self.pkg_path_lib != "":
# remove unneded files (NOT folder ...)
tools.clean_directory(path_package_lib, copy_list)
def make_package_generic_files(self, path_package, pkg_properties, pkg_name, base_pkg_path, heritage_list, static):
## Create version file:
tools.file_write_data(os.path.join(path_package, self.pkg_path_version_file),
tools.version_to_string(pkg_properties["VERSION"]),
only_if_new=True)
## Create maintainer file:
tools.file_write_data(os.path.join(path_package, self.pkg_path_maintainer_file),
self.generate_list_separate_coma(pkg_properties["MAINTAINER"]),
only_if_new=True)
## Create appl_name file:
tools.file_write_data(os.path.join(path_package, self.pkg_path_application_name_file),
"en_EN:" + pkg_properties["NAME"],
only_if_new=True)
## Create appl_description file:
tools.file_write_data(os.path.join(path_package, self.pkg_path_application_description_file),
"en_EN:" + pkg_properties["DESCRIPTION"],
only_if_new=True)
## Create Readme file:
readme_file_dest = os.path.join(path_package, self.pkg_path_readme_file)
if os.path.exists(os.path.join(base_pkg_path, "os-Linux/README"))==True:
tools.copy_file(os.path.join(base_pkg_path, "os-Linux/README"), readme_file_dest)
elif os.path.exists(os.path.join(base_pkg_path, "README"))==True:
tools.copy_file(os.path.join(base_pkg_path, "README"), readme_file_dest)
elif os.path.exists(os.path.join(base_pkg_path, "README.md"))==True:
tools.copy_file(os.path.join(base_pkg_path, "README.md"), readme_file_dest)
else:
debug.debug("no file 'README', 'README.md' or 'os-Linux/README' ==> generate an empty one")
tools.file_write_data(readme_file_dest,
"No documentation for " + pkg_name + "\n",
only_if_new=True)
## Create licence file:
"""
# TODO ...
license_file_dest = os.path.join(path_package, self.pkg_path_license, pkg_name + ".txt")
tools.create_directory_of_file(license_file_dest)
if os.path.exists(base_pkg_path + "/license.txt")==True:
tools.copy_file(base_pkg_path + "/license.txt", license_file_dest)
else:
debug.info("no file 'license.txt' ==> generate an empty one")
tmpFile = open(license_file_dest, 'w')
tools.file_write_data(license_file_dest,
"No license define by the developper for " + pkg_name + "\n",
only_if_new=True)
"""
## Create changeLog file:
change_log_file_dest = os.path.join(path_package, self.pkg_path_change_log_file)
if os.path.exists(os.path.join(base_pkg_path, "changelog")) == True:
tools.copy_file(os.path.join(base_pkg_path, "changelog"), change_log_file_dest)
else:
debug.debug("no file 'changelog' ==> generate an empty one")
tools.file_write_data(change_log_file_dest,
"No changelog data " + pkg_name + "\n",
only_if_new=True)
##
## @brief convert a s list of string in a string separated by a ","
## @param[in] list List of element to transform
## @return The requested string
##
def generate_list_separate_coma(self, list):
result = ""
fistTime = True
for elem in list:
if fistTime == True:
fistTime = False
else:
result += ","
result += elem
return result
target_list=[]
__start_target_name="lutinTarget_" __start_target_name="lutinTarget_"
def import_path(path): def import_path(path):
global targetList global target_list
matches = [] matches = []
debug.debug('TARGET: Start find sub File : "%s"' %path) debug.debug('TARGET: Start find sub File : "%s"' %path)
for root, dirnames, filenames in os.walk(path): for root, dirnames, filenames in os.walk(path):
@@ -481,16 +734,16 @@ def import_path(path):
targetName = filename.replace('.py', '') targetName = filename.replace('.py', '')
targetName = targetName.replace(__start_target_name, '') targetName = targetName.replace(__start_target_name, '')
debug.debug("TARGET: integrate module: '" + targetName + "' from '" + os.path.join(root, filename) + "'") debug.debug("TARGET: integrate module: '" + targetName + "' from '" + os.path.join(root, filename) + "'")
targetList.append([targetName,os.path.join(root, filename)]) target_list.append([targetName,os.path.join(root, filename)])
def load_target(name, config): def load_target(name, config):
global targetList global target_list
debug.debug("load target: " + name) debug.debug("load target: " + name)
if len(targetList) == 0: if len(target_list) == 0:
debug.error("No target to compile !!!") debug.error("No target to compile !!!")
debug.debug("list target: " + str(targetList)) debug.debug("list target: " + str(target_list))
for mod in targetList: for mod in target_list:
if mod[0] == name: if mod[0] == name:
debug.verbose("add to path: '" + os.path.dirname(mod[1]) + "'") debug.verbose("add to path: '" + os.path.dirname(mod[1]) + "'")
sys.path.append(os.path.dirname(mod[1])) sys.path.append(os.path.dirname(mod[1]))
@@ -502,16 +755,16 @@ def load_target(name, config):
raise KeyError("No entry for : " + name) raise KeyError("No entry for : " + name)
def list_all_target(): def list_all_target():
global targetList global target_list
tmpListName = [] tmpListName = []
for mod in targetList: for mod in target_list:
tmpListName.append(mod[0]) tmpListName.append(mod[0])
return tmpListName return tmpListName
def list_all_target_with_desc(): def list_all_target_with_desc():
global targetList global target_list
tmpList = [] tmpList = []
for mod in targetList: for mod in target_list:
sys.path.append(os.path.dirname(mod[1])) sys.path.append(os.path.dirname(mod[1]))
theTarget = __import__(__start_target_name + mod[0]) theTarget = __import__(__start_target_name + mod[0])
try: try:

View File

@@ -11,6 +11,7 @@ import os
import shutil import shutil
import errno import errno
import fnmatch import fnmatch
import stat
# Local import # Local import
from . import debug from . import debug
from . import depend from . import depend
@@ -19,7 +20,7 @@ from . import env
""" """
""" """
def get_run_folder(): def get_run_path():
return os.getcwd() return os.getcwd()
""" """
@@ -29,21 +30,21 @@ def get_current_path(file):
return os.path.dirname(os.path.realpath(file)) return os.path.dirname(os.path.realpath(file))
def create_directory_of_file(file): def create_directory_of_file(file):
folder = os.path.dirname(file) path = os.path.dirname(file)
try: try:
os.stat(folder) os.stat(path)
except: except:
os.makedirs(folder) os.makedirs(path)
def get_list_sub_folder(path): def get_list_sub_path(path):
# TODO : os.listdir(path) # TODO : os.listdir(path)
for dirname, dirnames, filenames in os.walk(path): for dirname, dirnames, filenames in os.walk(path):
return dirnames return dirnames
return [] return []
def remove_folder_and_sub_folder(path): def remove_path_and_sub_path(path):
if os.path.isdir(path): if os.path.isdir(path):
debug.verbose("remove folder : '" + path + "'") debug.verbose("remove path : '" + path + "'")
shutil.rmtree(path) shutil.rmtree(path)
def remove_file(path): def remove_file(path):
@@ -67,7 +68,29 @@ def file_read_data(path, binary=False):
file.close() file.close()
return data_file return data_file
def file_write_data(path, data): def version_to_string(version):
version_ID = ""
for id in version:
if len(version_ID) != 0:
if type(id) == str:
version_ID += "-"
else:
version_ID += "."
version_ID += str(id)
return version_ID
##
## @brief Write data in a specific path.
## @param[in] path Path of the data might be written.
## @param[in] data Data To write in the file.
## @param[in] only_if_new (default: False) Write data only if data is different.
##
def file_write_data(path, data, only_if_new=False):
if only_if_new == True:
old_data = file_read_data(path)
if old_data == data:
return
#real write of data:
file = open(path, "w") file = open(path, "w")
file.write(data) file.write(data)
file.close() file.close()
@@ -96,55 +119,114 @@ def add_prefix(prefix,list):
result.append(prefix+elem) result.append(prefix+elem)
return result return result
def copy_file(src, dst, cmd_file=None, force=False): ##
## @brief Copy a specific file in a specific directory
## @param[in] src Input file path
## @param[in] dst Output file path
## @param[in] cmd_file (default None) Path of file to store the command line used
## @param[in] force (default False) Force copy of the file
## @param[in] force_identical (default False) Force file to be identical (read it in binary)
## @param[in,out] in_list (default None) Not real copy: set the request copy in the input list
##
def copy_file(src, dst, cmd_file=None, force=False, force_identical=False, in_list=None):
if os.path.exists(src) == False: if os.path.exists(src) == False:
debug.error("Request a copy a file that does not existed : '" + src + "'") debug.error("Request a copy a file that does not existed : '" + src + "'")
cmd_line = "copy \"" + src + "\" \"" + dst + "\"" cmd_line = "copy \"" + src + "\" \"" + dst + "\""
if force == False \ if force == False \
and depend.need_re_build(dst, src, file_cmd=cmd_file , cmdLine=cmd_line) == False: and depend.need_re_build(dst, src, file_cmd=cmd_file , cmd_line=cmd_line, force_identical=force_identical) == False:
debug.verbose ("no need to copy ...")
if in_list != None:
if dst in in_list:
debug.verbose("replace copy file " + os.path.relpath(src) + " ==> " + os.path.relpath(dst))
else:
debug.verbose("append copy file " + os.path.relpath(src) + " ==> " + os.path.relpath(dst))
# update element in dictionnary:
in_list[dst] = {"src":src,
"cmd_file":cmd_file,
"need_copy":False}
return return
debug.print_element("copy file", src, "==>", dst) if in_list == None:
debug.print_element("copy file ", os.path.relpath(src), "==>", os.path.relpath(dst))
create_directory_of_file(dst) create_directory_of_file(dst)
shutil.copyfile(src, dst) shutil.copyfile(src, dst)
# copy property of the permition of the file ...
stat_info = os.stat(src)
os.chmod(dst, stat_info.st_mode)
store_command(cmd_line, cmd_file) store_command(cmd_line, cmd_file)
else:
debug.verbose("append copy file " + os.path.relpath(src) + " ==> " + os.path.relpath(dst))
# update element in dictionnary:
in_list[dst] = {"src":src,
"cmd_file":cmd_file,
"need_copy":True}
##
## @brief Copy a compleate directory in a specific folder
## @param[in] src Input folder path
## @param[in] dst Output folder path
## @param[in] recursive (default False) Copy folder with all his dependency
## @param[in] force (default False) Force copy of the file
## @param[in,out] in_list (default None) Not real copy: set the request copy in the input list
##
def copy_anything(src, dst, recursive = False, force_identical=False, in_list=None):
debug.verbose(" copy anything : '" + str(src) + "'")
debug.verbose(" to : '" + str(dst) + "'")
if os.path.isdir(os.path.realpath(src)):
tmp_path = os.path.realpath(src)
tmp_rule = ""
else:
tmp_path = os.path.dirname(os.path.realpath(src))
tmp_rule = os.path.basename(src)
def copy_anything(src, dst): debug.verbose(" " + str(tmp_path) + ":")
tmpPath = os.path.dirname(os.path.realpath(src)) for root, dirnames, filenames in os.walk(tmp_path):
tmpRule = os.path.basename(src) deltaRoot = root[len(tmp_path):]
for root, dirnames, filenames in os.walk(tmpPath): while len(deltaRoot) > 0 \
debug.verbose(" root='" + str(root) + "' dir='" + str(dirnames) + "' filenames=" + str(filenames)) and ( deltaRoot[0] == '/' \
or deltaRoot[0] == '\\' ):
deltaRoot = deltaRoot[1:]
if recursive == False \
and deltaRoot != "":
return
debug.verbose(" root='" + str(deltaRoot) + "'")
debug.verbose(" files=" + str(filenames))
tmpList = filenames tmpList = filenames
if len(tmpRule)>0: if len(tmp_rule) > 0:
tmpList = fnmatch.filter(filenames, tmpRule) tmpList = fnmatch.filter(filenames, tmp_rule)
# Import the module : # Import the module :
for cycleFile in tmpList: for cycleFile in tmpList:
#for cycleFile in filenames: #for cycleFile in filenames:
debug.verbose("Might copy : '" + tmpPath+cycleFile + "' ==> '" + dst + "'") debug.verbose(" '" + cycleFile + "'")
copy_file(tmpPath+"/"+cycleFile, dst+"/"+cycleFile) debug.extreme_verbose("Might copy : '" + tmp_path + " " + deltaRoot + " " + cycleFile + "' ==> '" + dst + "'")
copy_file(os.path.join(tmp_path, deltaRoot, cycleFile),
os.path.join(dst, deltaRoot, cycleFile),
force_identical=force_identical,
in_list=in_list)
##
## @brief real copy of files in a specific dictionnary list
## @param[in] in_list Dictionnary of file to copy
##
def copy_list(in_list):
for dst in in_list:
if in_list[dst]["need_copy"] == False:
continue
# note we force the copy to disable the check of needed of copy (already done)
copy_file(in_list[dst]["src"], dst, cmd_file=in_list[dst]["cmd_file"], force=True)
def copy_anything_target(target, src, dst): ##
tmpPath = os.path.dirname(os.path.realpath(src)) ## @brief Clean a path from all un-needed element in a directory
tmpRule = os.path.basename(src) ## @param[in] path Path to clean
for root, dirnames, filenames in os.walk(tmpPath): ## @param[in] normal_list List of all files/path in the path
debug.verbose(" root='" + str(root) + "' dir='" + str(dirnames) + "' filenames=" + str(filenames)) ##
tmpList = filenames def clean_directory(path, normal_list):
if len(tmpRule)>0: # get a list of all element in the path:
tmpList = fnmatch.filter(filenames, tmpRule) for root, dirnames, filenames in os.walk(path):
# Import the module : for file in filenames:
for cycleFile in tmpList: file_name = os.path.join(root, file)
#for cycleFile in filenames: if file_name not in normal_list:
newDst = dst debug.print_element("remove file ", os.path.relpath(file_name), "==>", "---")
if len(newDst) != 0 and newDst[-1] != "/": os.remove(file_name)
newDst += "/"
if root[len(src)-1:] != "":
newDst += root[len(src)-1:]
if len(newDst) != 0 and newDst[-1] != "/":
newDst += "/"
debug.verbose("Might copy : '" + root+"/"+cycleFile + "' ==> '" + newDst+cycleFile + "'" )
target.add_file_staging(root+"/"+cycleFile, newDst+cycleFile)
def filter_extention(list_files, extentions, invert=False): def filter_extention(list_files, extentions, invert=False):
out = [] out = []

View File

@@ -40,9 +40,28 @@ 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, flags, name, basic_path, static = False):
file_src, file_dst, file_depend, file_cmd, file_warning = 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_path, file, "bin")
#create comdLine : debug.extreme_verbose("list files = " + str(depancy.src))
list_static = []
list_dynamic = []
if static == True:
#get all parent static libs
list_static = depancy.src['static']
# get only parent shared that is not static
for elem in depancy.src['dynamic']:
lib_name = elem[:-len(target.suffix_lib_dynamic)] + target.suffix_lib_static
if lib_name not in depancy.src['static']:
list_dynamic.append(elem)
else:
#get all parent dynamic libs
list_dynamic = depancy.src['dynamic']
# get only parent shared that is not static
for elem in depancy.src['static']:
lib_name = elem[:-len(target.suffix_lib_static)] + target.suffix_lib_dynamic
if lib_name not in depancy.src['dynamic']:
list_static.append(elem)
#create comand line:
cmd = [ cmd = [
target.xx target.xx
] ]
@@ -67,7 +86,23 @@ def link(file, binary, target, depancy, name, basic_folder):
except: except:
pass pass
try: try:
cmd.append(depancy.src) cmd.append(depancy.src['src'])
except:
pass
try:
cmd.append(list_static)
except:
pass
try:
for elem in list_dynamic:
lib_path = os.path.dirname(elem)
lib_name = elem[len(lib_path)+len(target.prefix_lib)+1:-len(target.suffix_lib_dynamic)]
cmd.append("-L" + lib_path)
cmd.append("-l" + lib_name)
if target.name != "MacOs" \
and target.name != "Android":
if len(list_dynamic) > 0:
cmd.append("-Wl,-R$ORIGIN/../lib/")
except: except:
pass pass
try: try:
@@ -82,27 +117,27 @@ def link(file, binary, target, depancy, name, basic_folder):
cmd.append(target.global_flags_ld) cmd.append(target.global_flags_ld)
except: except:
pass pass
cmdLine=tools.list_to_str(cmd) cmd_line = tools.list_to_str(cmd)
# check the dependency for this file : # check the dependency for this file :
if depend.need_re_package(file_dst, file_src, True, file_cmd, cmdLine) == False \ if depend.need_re_package(file_dst, file_src, True, file_cmd=file_cmd, cmd_line=cmd_line) == False \
and depend.need_re_package(file_dst, depancy.src, False, file_cmd, cmdLine) == False: and depend.need_re_package(file_dst, depancy.src, False, file_cmd=file_cmd, cmd_line=cmd_line) == False:
return file_dst return file_dst
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, "==>", os.path.relpath(file_dst))
multiprocess.run_command(cmdLine, store_output_file=file_warning) multiprocess.run_command(cmd_line, 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
originSize = tools.file_size(file_dst); originSize = tools.file_size(file_dst);
debug.print_element("Executable(strip)", name, "", "") debug.print_element("Executable(strip)", name, "", "")
cmdLineStrip=tools.list_to_str([ cmd_lineStrip=tools.list_to_str([
target.strip, target.strip,
file_dst]) file_dst])
multiprocess.run_command(cmdLineStrip, store_output_file=file_warning) multiprocess.run_command(cmd_lineStrip, 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) strip_size = 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(strip_size/1024) + "ko")
# write cmd line only after to prevent errors ... # write cmd line only after to prevent errors ...
tools.store_command(cmdLine, file_cmd) tools.store_command(cmd_line, file_cmd)

View File

@@ -40,12 +40,12 @@ 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_path, module_src):
file_src = target.get_full_name_source(basic_folder, file) file_src = target.get_full_name_source(basic_path, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file) file_cmd = target.get_full_name_cmd(name, basic_path, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type()) file_dst = target.get_full_name_destination(name, basic_path, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file) file_depend = target.get_full_dependency(name, basic_path, file)
file_warning = target.get_full_name_warning(name, basic_folder, file) file_warning = target.get_full_name_warning(name, basic_path, file)
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [

View File

@@ -39,12 +39,12 @@ 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_path, module_src):
file_src = target.get_full_name_source(basic_folder, file) file_src = target.get_full_name_source(basic_path, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file) file_cmd = target.get_full_name_cmd(name, basic_path, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type()) file_dst = target.get_full_name_destination(name, basic_path, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file) file_depend = target.get_full_dependency(name, basic_path, file)
file_warning = target.get_full_name_warning(name, basic_folder, file) file_warning = target.get_full_name_warning(name, basic_path, file)
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [
target.xx, target.xx,
@@ -115,8 +115,13 @@ def get_version_compilation_flags(flags, dependency_flags):
is_gnu = default_version_gnu is_gnu = default_version_gnu
version = max(version_local, dependency_version) version = max(version_local, dependency_version)
if version == 2017:
debug.error("not supported flags for X17 ...");
if is_gnu == True:
out = ["-std=gnu++17", "-D__CPP_VERSION__=2017"]
else:
out = ["-std=c++17", "-D__CPP_VERSION__=2017"]
if version == 2014: if version == 2014:
debug.error("not supported flags for X14 ...");
if is_gnu == True: if is_gnu == True:
out = ["-std=gnu++14", "-D__CPP_VERSION__=2014"] out = ["-std=gnu++14", "-D__CPP_VERSION__=2014"]
else: else:

View File

@@ -38,8 +38,8 @@ 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_path):
file_src, file_dst, file_depend, file_cmd, file_warning = target.generate_file(binary, name, basic_folder, file, "jar") file_src, file_dst, file_depend, file_cmd, file_warning = target.generate_file(binary, name, basic_path, file, "jar")
#create command Line #create command Line
cmd = [ cmd = [
target.jar, target.jar,

View File

@@ -33,19 +33,44 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["class"] return ["class"]
def create_dependency_files(target, src, heritage_src, basic_path):
depend = []
for elem in src:
extention = elem.split('.')[-1]
if extention == 'jar' \
or extention == 'java':
debug.extreme_verbose("add java depedence ... " + elem)
depend.append(target.get_full_name_source(basic_path, elem))
for elem in heritage_src:
extention = elem.split('.')[-1]
if extention == 'jar' \
or extention == 'java':
debug.extreme_verbose("add java depedence ... " + elem)
depend.append(elem)
return depend
## ##
## @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_path, module_src):
file_src = target.get_full_name_source(basic_folder, file) file_src = target.get_full_name_source(basic_path, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file) file_cmd = target.get_full_name_cmd(name, basic_path, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type(), remove_suffix=True) file_dst = target.get_full_name_destination(name, basic_path, file, get_output_type(), remove_suffix=True)
file_depend = target.get_full_dependency(name, basic_folder, file) file_depend = target.get_full_dependency(name, basic_path, file)
file_warning = target.get_full_name_warning(name, basic_folder, file) file_warning = target.get_full_name_warning(name, basic_path, file)
depend_files = create_dependency_files(target, module_src, depancy.src['src'], basic_path)
"""
debug.warning("file_src = " + file_src)
debug.warning("file_cmd = " + file_cmd)
debug.warning("file_dst = " + file_dst)
debug.warning("file_depend = " + file_depend)
debug.warning("file_warning = " + file_warning)
"""
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [
target.java, target.java,
"-d", target.get_build_folder(name) "-d", target.get_build_path_object(name)
] ]
# add source dependency: # add source dependency:
list_sources_path = [] list_sources_path = []
@@ -65,7 +90,7 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
out += elem out += elem
cmd.append(out) cmd.append(out)
class_extern = [] class_extern = []
upper_jar = tools.filter_extention(depancy.src, ["jar"]) upper_jar = tools.filter_extention(depancy.src['src'], ["jar"])
#debug.warning("ploppppp = " + str(upper_jar)) #debug.warning("ploppppp = " + str(upper_jar))
for elem in upper_jar: for elem in upper_jar:
class_extern.append(elem) class_extern.append(elem)
@@ -88,6 +113,11 @@ def compile(file, binary, target, depancy, flags, path, name, basic_folder):
tools.create_directory_of_file(file_dst) tools.create_directory_of_file(file_dst)
comment = ["java", name, "<==", file] comment = ["java", name, "<==", file]
#process element #process element
multiprocess.run_in_pool(cmdLine, comment, file_cmd, store_output_file=file_warning) multiprocess.run_in_pool(cmdLine,
comment,
file_cmd,
store_output_file = file_warning,
depend_data = {"file":file_depend,
"data":depend_files})
return {"action":"add", "file":file_dst} return {"action":"add", "file":file_dst}

View File

@@ -33,40 +33,63 @@ def get_input_type():
def get_output_type(): def get_output_type():
return ["h"] return ["h"]
def create_dependency_files(target, src, heritage_src, basic_path):
depend = []
for elem in src:
extention = elem.split('.')[-1]
if extention == 'jar' \
or extention == 'java':
debug.extreme_verbose("add java depedence ... " + elem)
depend.append(target.get_full_name_source(basic_path, elem))
for elem in heritage_src:
extention = elem.split('.')[-1]
if extention == 'jar' \
or extention == 'java':
debug.extreme_verbose("add java depedence ... " + elem)
depend.append(elem)
return depend
## ##
## @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_path, module_src):
# file_src = target.get_full_name_source(basic_folder, file) # file_src = target.get_full_name_source(basic_path, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file) file_cmd = target.get_full_name_cmd(name, basic_path, file)
# file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type()) # file_dst = target.get_full_name_destination(name, basic_path, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file) file_depend = target.get_full_dependency(name, basic_path, file)
file_warning = target.get_full_name_warning(name, basic_folder, file) file_warning = target.get_full_name_warning(name, basic_path, file)
depend_files = create_dependency_files(target, module_src, depancy.src['src'], basic_path)
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [
target.javah, target.javah,
"-d", target.get_build_folder(name) + target.folder_generate_code "-d", target.get_build_path(name) + target.path_generate_code
] ]
if debug.get_level() >= 5: if debug.get_level() >= 5:
cmd.append("-verbose") cmd.append("-verbose")
cmd.append("-classpath") cmd.append("-classpath")
cmd.append(target.get_build_folder(name)) cmd.append(target.get_build_path_object(name))
class_to_build = file[:-6] class_to_build = file[:-6]
cmd.append(class_to_build) cmd.append(class_to_build)
# Create cmd line # Create cmd line
cmdLine=tools.list_to_str(cmd) cmd_line = tools.list_to_str(cmd)
file_dst = target.get_build_folder(name) + "/tmp_header/" + class_to_build.replace(".", "_") + ".h" file_dst = target.get_build_path(name) + "/generate_header/" + class_to_build.replace(".", "_") + ".h"
# 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, None, file_depend, file_cmd, cmd_line) == False:
# return file_dst return {"action":"path", "path":target.get_build_path(name) + target.path_generate_code}
#tools.create_directory_of_file(file_dst) #tools.create_directory_of_file(file_dst)
comment = ["javah", class_to_build.replace(".", "_") + ".h", "<==", class_to_build] comment = ["javah", class_to_build.replace(".", "_") + ".h", "<==", class_to_build]
#process element #process element
multiprocess.run_in_pool(cmdLine, comment, file_cmd, store_output_file=file_warning) multiprocess.run_in_pool(cmd_line,
comment,
file_cmd,
store_output_file = file_warning,
depend_data = {"file":file_depend,
"data":depend_files})
debug.verbose("file= " + file_dst) debug.verbose("file= " + file_dst)
#return file_dst #return file_dst
return {"action":"path", "path":target.get_build_folder(name) + target.folder_generate_code} return {"action":"path", "path":target.get_build_path(name) + target.path_generate_code}

View File

@@ -38,8 +38,26 @@ 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, flags, name, basic_path, static=False):
file_src, file_dst, file_depend, file_cmd, file_warning = 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_path, file, "lib-shared")
list_static = []
list_dynamic = []
if static == True:
#get all parent static libs
list_static = depancy.src['static']
# get only parent shared that is not static
for elem in depancy.src['dynamic']:
lib_name = elem[:-len(target.suffix_lib_dynamic)] + target.suffix_lib_static
if lib_name not in depancy.src['static']:
list_dynamic.append(elem)
else:
#get all parent dynamic libs
list_dynamic = depancy.src['dynamic']
# get only parent shared that is not static
for elem in depancy.src['static']:
lib_name = elem[:-len(target.suffix_lib_static)] + target.suffix_lib_dynamic
if lib_name not in depancy.src['dynamic']:
list_static.append(elem)
#create command Line #create command Line
cmd = [ cmd = [
target.xx, target.xx,
@@ -60,13 +78,33 @@ def link(file, binary, target, depancy, name, basic_folder):
pass pass
try: try:
# keep only compilated files ... # keep only compilated files ...
cmd.append(tools.filter_extention(depancy.src, get_input_type())) cmd.append(tools.filter_extention(depancy.src['src'], get_input_type()))
except:
pass
try:
cmd.append(list_static)
except:
pass
try:
for elem in list_dynamic:
lib_path = os.path.dirname(elem)
lib_name = elem[len(lib_path)+len(target.prefix_lib)+1:-len(target.suffix_lib_dynamic)]
cmd.append("-L" + lib_path)
cmd.append("-l" + lib_name)
if target.name != "MacOs" \
and target.name != "Android":
if len(list_dynamic) > 0:
cmd.append("-Wl,-R$ORIGIN/../lib/")
except: except:
pass pass
try: try:
cmd.append(flags["local"]["link"]) cmd.append(flags["local"]["link"])
except: except:
pass pass
try:
cmd.append(flags["export"]["link"])
except:
pass
try: try:
cmd.append(depancy.flags["link"]) cmd.append(depancy.flags["link"])
except: except:
@@ -79,9 +117,9 @@ def link(file, binary, target, depancy, name, basic_folder):
# check the dependency for this file : # check the dependency for this file :
if depend.need_re_package(file_dst, file_src, True, file_cmd, cmdLine) == False \ if depend.need_re_package(file_dst, file_src, True, file_cmd, cmdLine) == False \
and depend.need_re_package(file_dst, depancy.src, False, file_cmd, cmdLine) == False: and depend.need_re_package(file_dst, depancy.src, False, file_cmd, cmdLine) == False:
return tmpList[1] return file_dst
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, "==>", os.path.relpath(file_dst))
multiprocess.run_command(cmdLine, store_output_file=file_warning) 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" \

View File

@@ -38,8 +38,8 @@ 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, flags, name, basic_path):
file_src, file_dst, file_depend, file_cmd, file_warning = 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_path, 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
@@ -65,8 +65,9 @@ def link(file, binary, target, depancy, name, basic_folder):
if depend.need_re_package(file_dst, file_src, True, file_cmd, cmdLine) == False \ if depend.need_re_package(file_dst, file_src, True, file_cmd, cmdLine) == False \
and depend.need_re_package(file_dst, depancy.src, False, file_cmd, cmdLine) == False: and depend.need_re_package(file_dst, depancy.src, False, file_cmd, cmdLine) == False:
return file_dst return file_dst
tools.create_directory_of_file(file_dst) tools.create_directory_of_file(file_dst)
debug.print_element("StaticLib", name, "==>", file_dst) debug.print_element("StaticLib", name, "==>", os.path.relpath(file_dst))
# 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)

View File

@@ -41,12 +41,12 @@ 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_path, module_src):
file_src = target.get_full_name_source(basic_folder, file) file_src = target.get_full_name_source(basic_path, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file) file_cmd = target.get_full_name_cmd(name, basic_path, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type()) file_dst = target.get_full_name_destination(name, basic_path, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file) file_depend = target.get_full_dependency(name, basic_path, file)
file_warning = target.get_full_name_warning(name, basic_folder, file) file_warning = target.get_full_name_warning(name, basic_path, file)
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [
target.cc, target.cc,

View File

@@ -41,12 +41,12 @@ 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_path, module_src):
file_src = target.get_full_name_source(basic_folder, file) file_src = target.get_full_name_source(basic_path, file)
file_cmd = target.get_full_name_cmd(name, basic_folder, file) file_cmd = target.get_full_name_cmd(name, basic_path, file)
file_dst = target.get_full_name_destination(name, basic_folder, file, get_output_type()) file_dst = target.get_full_name_destination(name, basic_path, file, get_output_type())
file_depend = target.get_full_dependency(name, basic_folder, file) file_depend = target.get_full_dependency(name, basic_path, file)
file_warning = target.get_full_name_warning(name, basic_folder, file) file_warning = target.get_full_name_warning(name, basic_path, file)
# create the command line befor requesting start: # create the command line befor requesting start:
cmd = [ cmd = [
target.xx, target.xx,

View File

@@ -20,7 +20,7 @@ class System(system.System):
# todo : Check if present ... # todo : Check if present ...
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_SRC(target.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar") self.add_export_SRC(target.path_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) self.add_action("PACKAGE", 10, "admod-auto-wrapper", tool_generate_main_java_class)

View File

@@ -20,7 +20,7 @@ class System(system.System):
# TODO : Check if the android sdk android.jar is present ... # TODO : Check if the android sdk android.jar is present ...
self.valid = True self.valid = True
# todo : create a searcher of the presence of the library: # todo : create a searcher of the presence of the library:
self.add_export_SRC(target.folder_sdk + "/platforms/android-" + str(target.boardId) + "/android.jar") self.add_export_SRC(target.path_sdk + "/platforms/android-" + str(target.boardId) + "/android.jar")
self.add_export_flag_LD("-ldl") self.add_export_flag_LD("-ldl")
self.add_export_flag_LD("-llog") self.add_export_flag_LD("-llog")
self.add_export_flag_LD("-landroid") self.add_export_flag_LD("-landroid")

View File

@@ -33,28 +33,28 @@ class Target(target.Target):
else: else:
arch="arm64" arch="arm64"
self.folder_ndk = os.getenv('PROJECT_NDK', "AUTO") self.path_ndk = os.getenv('PROJECT_NDK', "AUTO")
self.folder_sdk = os.getenv('PROJECT_SDK', "AUTO") self.path_sdk = os.getenv('PROJECT_SDK', "AUTO")
# auto search NDK # auto search NDK
if self.folder_ndk == "AUTO": if self.path_ndk == "AUTO":
for folder in os.listdir("."): for path in os.listdir("."):
if os.path.isdir(folder)==True: if os.path.isdir(path)==True:
if folder=="android": if path=="android":
self.folder_ndk = folder + "/ndk" self.path_ndk = path + "/ndk"
if self.folder_ndk == "AUTO": if self.path_ndk == "AUTO":
self.folder_ndk = tools.get_run_folder() + "/../android/ndk" self.path_ndk = tools.get_run_path() + "/../android/ndk"
# auto search SDK # auto search SDK
if self.folder_sdk == "AUTO": if self.path_sdk == "AUTO":
for folder in os.listdir("."): for path in os.listdir("."):
if os.path.isdir(folder)==True: if os.path.isdir(path)==True:
if folder=="android": if path=="android":
self.folder_sdk = folder + "/sdk" self.path_sdk = path + "/sdk"
if self.folder_sdk == "AUTO": if self.path_sdk == "AUTO":
self.folder_sdk = tools.get_run_folder() + "/../android/sdk" self.path_sdk = tools.get_run_path() + "/../android/sdk"
if not os.path.isdir(self.folder_ndk): if not os.path.isdir(self.path_ndk):
debug.error("NDK path not set !!! set env : PROJECT_NDK on the NDK path") debug.error("NDK path not set !!! set env : PROJECT_NDK on the NDK path")
if not os.path.isdir(self.folder_sdk): if not os.path.isdir(self.path_sdk):
debug.error("SDK path not set !!! set env : PROJECT_SDK on the SDK path") debug.error("SDK path not set !!! set env : PROJECT_SDK on the SDK path")
@@ -63,34 +63,39 @@ class Target(target.Target):
if host.BUS_SIZE==64: if host.BUS_SIZE==64:
tmpOsVal = "_64" tmpOsVal = "_64"
if self.config["compilator"] == "clang": if self.config["compilator"] == "clang":
self.set_cross_base(self.folder_ndk + "/toolchains/llvm-3.6/prebuilt/linux-x86" + tmpOsVal + "/bin/") self.set_cross_base(self.path_ndk + "/toolchains/llvm-3.6/prebuilt/linux-x86" + tmpOsVal + "/bin/")
else: else:
baseFolderArm = self.folder_ndk + "/toolchains/arm-linux-androideabi-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/" basepathArm = self.path_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/" basepathMips = self.path_ndk + "/toolchains/mipsel-linux-android-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/"
baseFolderX86 = self.folder_ndk + "/toolchains/x86-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/" basepathX86 = self.path_ndk + "/toolchains/x86-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/"
self.set_cross_base(baseFolderArm + "arm-linux-androideabi-") self.set_cross_base(basepathArm + "arm-linux-androideabi-")
if not os.path.isdir(baseFolderArm): if not os.path.isdir(basepathArm):
debug.error("Gcc Arm path does not exist !!!") debug.error("Gcc Arm path does not exist !!!")
if not os.path.isdir(baseFolderMips): if not os.path.isdir(basepathMips):
debug.info("Gcc Mips path does not exist !!!") debug.info("Gcc Mips path does not exist !!!")
if not os.path.isdir(baseFolderX86): if not os.path.isdir(basepathX86):
debug.info("Gcc x86 path does not exist !!!") debug.info("Gcc x86 path does not exist !!!")
self.folder_bin="/mustNotCreateBinary" # TODO : Set it back in the package only ...
self.folder_lib="/data/lib/armeabi" #self.path_bin="mustNotCreateBinary"
self.folder_data="/data/assets" #self.path_lib="data/lib/armeabi"
self.folder_doc="/doc" #self.path_data="data/assets"
self.suffix_package='.pkg' #self.path_doc="doc"
#self.suffix_package='.pkg'
self.pkg_path_data = "data/assets"
self.pkg_path_bin = "mustNotCreateBinary"
self.pkg_path_lib = "data/lib/armeabi"
self.pkg_path_license = "license"
# board id at 14 is for android 4.0 and more ... # board id at 15 is for android 4.0.3 and more ... (note: API 14 has been removed ...)
self.boardId = 14 self.boardId = 15
self.global_flags_cc.append("-D__ANDROID_BOARD_ID__=" + str(self.boardId)) self.global_flags_cc.append("-D__ANDROID_BOARD_ID__=" + str(self.boardId))
if arch == "armv5" or arch == "armv7": if arch == "armv5" or arch == "armv7":
self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm/usr/include/") self.global_include_cc.append("-I" + self.path_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm/usr/include/")
elif arch == "mips": elif arch == "mips":
self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-mips/usr/include/") self.global_include_cc.append("-I" + self.path_ndk +"/platforms/android-" + str(self.boardId) + "/arch-mips/usr/include/")
elif arch == "x86": elif arch == "x86":
self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-x86/usr/include/") self.global_include_cc.append("-I" + self.path_ndk +"/platforms/android-" + str(self.boardId) + "/arch-x86/usr/include/")
if True: if True:
if self.config["compilator"] == "clang": if self.config["compilator"] == "clang":
@@ -98,11 +103,11 @@ class Target(target.Target):
debug.error("Clang work only with the board wersion >= 21 : android 5.x.x") debug.error("Clang work only with the board wersion >= 21 : android 5.x.x")
self.global_flags_cc.append("-D__STDCPP_LLVM__") self.global_flags_cc.append("-D__STDCPP_LLVM__")
# llvm-libc++ : BSD | MIT # llvm-libc++ : BSD | MIT
self.global_include_cc.append("-gcc-toolchain " + self.folder_ndk +"/sources/android/support/include") self.global_include_cc.append("-gcc-toolchain " + self.path_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.path_ndk +"/sources/android/support/include")
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/include/") self.global_include_cc.append("-I" + self.path_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/include/")
if arch == "armv5": if arch == "armv5":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/armeabi/" stdCppBasePath = self.path_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/armeabi/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a") self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
elif arch == "armv7": elif arch == "armv7":
@@ -111,51 +116,51 @@ class Target(target.Target):
self.global_flags_cc.append("-march=armv7-a") self.global_flags_cc.append("-march=armv7-a")
self.global_flags_cc.append("-mfpu=vfpv3-d16") self.global_flags_cc.append("-mfpu=vfpv3-d16")
self.global_flags_cc.append("-mhard-float") self.global_flags_cc.append("-mhard-float")
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/" stdCppBasePath = self.path_ndk +"/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/"
self.global_flags_ld.append( stdCppBasePath + "thumb/libc++_static.a") 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("-target armv7-none-linux-androideabi")
self.global_flags_ld.append("-Wl,--fix-cortex-a8") self.global_flags_ld.append("-Wl,--fix-cortex-a8")
self.global_flags_ld.append("-Wl,--no-warn-mismatch") self.global_flags_ld.append("-Wl,--no-warn-mismatch")
self.global_flags_ld.append("-lm_hard") self.global_flags_ld.append("-lm_hard")
elif arch == "mips": elif arch == "mips":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/mips/" stdCppBasePath = self.path_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/mips/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a") self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
elif arch == "x86": elif arch == "x86":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/x86/" stdCppBasePath = self.path_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/x86/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libc++_static.a") self.global_flags_ld.append( stdCppBasePath + "libc++_static.a")
else: else:
self.global_flags_cc.append("-D__STDCPP_GNU__") self.global_flags_cc.append("-D__STDCPP_GNU__")
# GPL v3 (+ exception link for gcc compilator) # 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.path_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/include/")
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/android/support/include/") self.global_include_cc.append("-I" + self.path_ndk +"/sources/android/support/include/")
if arch == "armv5": if arch == "armv5":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi/" stdCppBasePath = self.path_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/") 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/libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a") self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a")
elif arch == "armv7": elif arch == "armv7":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi-v7a/" stdCppBasePath = self.path_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi-v7a/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/") 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/libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a") self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a")
elif arch == "mips": elif arch == "mips":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/mips/" stdCppBasePath = self.path_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/mips/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a") self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "libsupc++.a") self.global_flags_ld.append( stdCppBasePath + "libsupc++.a")
elif arch == "x86": elif arch == "x86":
stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/x86/" stdCppBasePath = self.path_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/x86/"
self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_include_cc.append("-I" + stdCppBasePath + "include/")
self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a") self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a")
self.global_flags_ld.append( stdCppBasePath + "libsupc++.a") self.global_flags_ld.append( stdCppBasePath + "libsupc++.a")
else : else :
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/system/include/") self.global_include_cc.append("-I" + self.path_ndk +"/sources/cxx-stl/system/include/")
self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/stlport/stlport/") self.global_include_cc.append("-I" + self.path_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_flags_ld.append(self.path_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_sysroot = "--sysroot=" + self.path_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_5__")
self.global_flags_cc.append("-D__ARM_ARCH_5T__") self.global_flags_cc.append("-D__ARM_ARCH_5T__")
@@ -197,59 +202,106 @@ class Target(target.Target):
self.global_flags_cc.append("-fexceptions") self.global_flags_cc.append("-fexceptions")
self.global_flags_xx.append("-Wa,--noexecstack") self.global_flags_xx.append("-Wa,--noexecstack")
def check_right_package(self, pkgProperties, value): def check_right_package(self, pkg_properties, value):
for val in pkgProperties["RIGHT"]: for val in pkg_properties["RIGHT"]:
if value == val: if value == val:
return True return True
return False return False
def get_staging_folder_data(self, binaryName): """
return self.get_staging_folder(binaryName) + self.folder_data def get_staging_path_data(self, binary_name):
return self.get_staging_path(binary_name) + self.path_data
"""
def make_package(self, pkgName, pkgProperties, basePkgPath, heritage): def make_package_binary(self, pkg_name, pkg_properties, base_pkg_path, heritage_list, static):
# http://alp.developpez.com/tutoriels/debian/creer-paquet/
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Generate package '" + pkgName + "'") debug.info("Generate package '" + pkg_name + "' v" + tools.version_to_string(pkg_properties["VERSION"]))
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
pkgNameApplicationName = pkgName #output path
target_outpath = self.get_staging_path(pkg_name)
tools.create_directory_of_file(target_outpath)
## Create share datas:
self.make_package_binary_data(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## copy binary files
# in Android Package we have no binary element, only shared object ... (and java start file)
## Create libraries (special case of Android...)
copy_list={}
target_outpath_lib = os.path.join(target_outpath, self.pkg_path_lib)
tools.create_directory_of_file(target_outpath_lib)
# copy application lib: (needed to lunch ...)
file_src = self.get_build_file_dynamic(pkg_name)
if os.path.isfile(file_src):
debug.debug(" need copy: " + file_src + " to " + target_outpath_lib)
tools.copy_file(file_src,
os.path.join(target_outpath_lib, os.path.basename(file_src)),
in_list=copy_list)
# copy other if needed:
if static == False:
#copy all shared libsh...
debug.verbose("libs for " + str(pkg_name) + ":")
for heritage in heritage_list.list_heritage:
debug.debug("sub elements: " + str(heritage.name))
file_src = self.get_build_file_dynamic(heritage.name)
debug.verbose(" has directory: " + file_src)
if os.path.isfile(file_src):
debug.debug(" need copy: " + file_src + " to " + target_outpath_lib)
#copy all data:
# TODO : We can have a problem when writing over library files ...
tools.copy_file(file_src,
os.path.join(target_outpath_lib, os.path.basename(file_src)),
in_list=copy_list)
#real copy files
tools.copy_list(copy_list)
if self.pkg_path_lib != "":
# remove unneded files (NOT folder ...)
tools.clean_directory(target_outpath_lib, copy_list)
## Create generic files:
self.make_package_generic_files(target_outpath, pkg_properties, pkg_name, base_pkg_path, heritage_list, static)
## create specific android project (local)
pkg_name_application_name = pkg_name
if self.config["mode"] == "debug": if self.config["mode"] == "debug":
pkgNameApplicationName += "debug" pkg_name_application_name += "debug"
# FINAL_FOLDER_JAVA_PROJECT # FINAL_path_JAVA_PROJECT
self.folder_javaProject= self.get_staging_folder(pkgName) \ self.path_java_project = os.path.join(target_outpath,
+ "/src/" \ "src",
+ pkgProperties["COMPAGNY_TYPE"] \ pkg_properties["COMPAGNY_TYPE"],
+ "/" + pkgProperties["COMPAGNY_NAME2"] \ pkg_properties["COMPAGNY_NAME2"],
+ "/" + pkgNameApplicationName + "/" pkg_name_application_name)
#FINAL_FILE_ABSTRACTION #FINAL_FILE_ABSTRACTION
self.file_finalAbstraction = self.folder_javaProject + "/" + pkgNameApplicationName + ".java" self.file_final_abstraction = os.path.join(self.path_java_project, pkg_name_application_name + ".java")
compleatePackageName = pkgProperties["COMPAGNY_TYPE"]+"."+pkgProperties["COMPAGNY_NAME2"]+"." + pkgNameApplicationName compleatePackageName = pkg_properties["COMPAGNY_TYPE"]+"."+pkg_properties["COMPAGNY_NAME2"]+"." + pkg_name_application_name
if "ADMOD_ID" in pkgProperties: if "ADMOD_ID" in pkg_properties:
pkgProperties["RIGHT"].append("INTERNET") pkg_properties["RIGHT"].append("INTERNET")
pkgProperties["RIGHT"].append("ACCESS_NETWORK_STATE") pkg_properties["RIGHT"].append("ACCESS_NETWORK_STATE")
debug.print_element("pkg", "absractionFile", "<==", "dynamic file") debug.print_element("pkg", "absractionFile", "<==", "dynamic file")
# Create folder : # Create path :
tools.create_directory_of_file(self.file_finalAbstraction) tools.create_directory_of_file(self.file_final_abstraction)
# Create file : # Create file :
# java ==> done by ewol wrapper ... (and compiled in the normal compilation system ==> must be find in the dependency list of jar ... # 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"); tools.create_directory_of_file(target_outpath + "/res/drawable/icon.png");
if "ICON" in pkgProperties.keys() \ if "ICON" in pkg_properties.keys() \
and pkgProperties["ICON"] != "": and pkg_properties["ICON"] != "":
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/res/drawable/icon.png", 256, 256) image.resize(pkg_properties["ICON"], target_outpath + "/res/drawable/icon.png", 256, 256)
else: else:
# to be sure that we have all time a resource ... # to be sure that we have all time a resource ...
tmpFile = open(self.get_staging_folder(pkgName) + "/res/drawable/plop.txt", 'w') tmpFile = open(target_outpath + "/res/drawable/plop.txt", 'w')
tmpFile.write('plop\n') tmpFile.write('plop\n')
tmpFile.flush() tmpFile.flush()
tmpFile.close() tmpFile.close()
if pkgProperties["ANDROID_MANIFEST"]!="": if pkg_properties["ANDROID_MANIFEST"]!="":
debug.print_element("pkg", "AndroidManifest.xml", "<==", pkgProperties["ANDROID_MANIFEST"]) debug.print_element("pkg", "AndroidManifest.xml", "<==", pkg_properties["ANDROID_MANIFEST"])
tools.copy_file(pkgProperties["ANDROID_MANIFEST"], self.get_staging_folder(pkgName) + "/AndroidManifest.xml", force=True) tools.copy_file(pkg_properties["ANDROID_MANIFEST"], target_outpath + "/AndroidManifest.xml", force=True)
else: else:
debug.error("missing parameter 'ANDROID_MANIFEST' in the properties ... ") debug.error("missing parameter 'ANDROID_MANIFEST' in the properties ... ")
@@ -259,67 +311,67 @@ class Target(target.Target):
# myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", key, title, summary, ["enable string", "disable String"]) # 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"] # myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", "movement", "Motion", "Apply movement to test pattern", ["Moving test pattern", "Still test pattern"]
#copy needed resources : #copy needed resources :
for res_source, res_dest in pkgProperties["ANDROID_RESOURCES"]: for res_source, res_dest in pkg_properties["ANDROID_RESOURCES"]:
if res_source == "": if res_source == "":
continue continue
tools.copy_file(res_source , self.get_staging_folder(pkgName) + "/res/" + res_dest + "/" + os.path.basename(res_source), force=True) tools.copy_file(res_source , target_outpath + "/res/" + res_dest + "/" + os.path.basename(res_source), force=True)
# Doc : # 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/ # 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") debug.print_element("pkg", "R.java", "<==", "Resources files")
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/src/noFile") tools.create_directory_of_file(target_outpath + "/src/noFile")
androidToolPath = self.folder_sdk + "/build-tools/" androidToolPath = self.path_sdk + "/build-tools/"
# find android tool version # find android tool version
dirnames = tools.get_list_sub_folder(androidToolPath) dirnames = tools.get_list_sub_path(androidToolPath)
if len(dirnames) != 1: if len(dirnames) != 1:
debug.error("an error occured when getting the tools for android") debug.error("an error occured when getting the tools for android")
androidToolPath += dirnames[0] + "/" androidToolPath += dirnames[0] + "/"
# this is to create resource file for android ... (we did not use aset in jar with ewol ... # this is to create resource file for android ... (we did not use aset in jar with ewol ...
adModResouceFolder = "" adModResoucepath = ""
if "ADMOD_ID" in pkgProperties: if "ADMOD_ID" in pkg_properties:
adModResouceFolder = " -S " + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/res/ " adModResoucepath = " -S " + self.path_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/res/ "
cmdLine = androidToolPath + "aapt p -f " \ cmdLine = androidToolPath + "aapt p -f " \
+ "-M " + self.get_staging_folder(pkgName) + "/AndroidManifest.xml " \ + "-M " + target_outpath + "/AndroidManifest.xml " \
+ "-F " + self.get_staging_folder(pkgName) + "/resources.res " \ + "-F " + target_outpath + "/resources.res " \
+ "-I " + self.folder_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar "\ + "-I " + self.path_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar "\
+ "-S " + self.get_staging_folder(pkgName) + "/res/ " \ + "-S " + target_outpath + "/res/ " \
+ adModResouceFolder \ + adModResoucepath \
+ "-J " + self.get_staging_folder(pkgName) + "/src/ " + "-J " + target_outpath + "/src/ "
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
tools.create_directory_of_file(self.get_staging_folder(pkgName) + "/build/classes/noFile") tools.create_directory_of_file(target_outpath + "/build/classes/noFile")
debug.print_element("pkg", "*.class", "<==", "*.java") debug.print_element("pkg", "*.class", "<==", "*.java")
#generate android java files: #generate android java files:
filesString="" filesString=""
""" """
old : old :
if "ADMOD_ID" in pkgProperties: if "ADMOD_ID" in pkg_properties:
# TODO : check this I do not think it is really usefull ... ==> write for IDE only ... # 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 " filesString += self.path_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/src/android/UnusedStub.java "
if len(pkgProperties["ANDROID_WALLPAPER_PROPERTIES"])!=0: if len(pkg_properties["ANDROID_WALLPAPER_PROPERTIES"])!=0:
filesString += self.folder_javaProject + pkgNameApplicationName + "Settings.java " filesString += self.path_java_project + pkg_name_application_name + "Settings.java "
adModJarFile = "" adModJarFile = ""
if "ADMOD_ID" in pkgProperties: if "ADMOD_ID" in pkg_properties:
adModJarFile = ":" + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar" adModJarFile = ":" + self.path_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar"
cmdLine = "javac " \ cmdLine = "javac " \
+ "-d " + self.get_staging_folder(pkgName) + "/build/classes " \ + "-d " + self.get_staging_path(pkg_name) + "/build/classes " \
+ "-classpath " + self.folder_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar" \ + "-classpath " + self.path_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar" \
+ adModJarFile + " " \ + adModJarFile + " " \
+ filesString \ + filesString \
+ self.file_finalAbstraction + " " \ + self.file_final_abstraction + " " \
+ self.get_staging_folder(pkgName) + "/src/R.java " + self.get_staging_path(pkg_name) + "/src/R.java "
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
""" """
debug.verbose("heritage .so=" + str(tools.filter_extention(heritage.src, ["so"]))) debug.verbose("heritage .so=" + str(tools.filter_extention(heritage_list.src['dynamic'], ["so"])))
debug.verbose("heritage .jar=" + str(tools.filter_extention(heritage.src, ["jar"]))) debug.verbose("heritage .jar=" + str(tools.filter_extention(heritage_list.src['src'], ["jar"])))
class_extern = "" class_extern = ""
upper_jar = tools.filter_extention(heritage.src, ["jar"]) upper_jar = tools.filter_extention(heritage_list.src['src'], ["jar"])
#debug.warning("ploppppp = " + str(upper_jar)) #debug.warning("ploppppp = " + str(upper_jar))
for elem in upper_jar: for elem in upper_jar:
if len(class_extern) > 0: if len(class_extern) > 0:
@@ -327,19 +379,19 @@ class Target(target.Target):
class_extern += elem class_extern += elem
# create enpoint element : # create enpoint element :
cmdLine = "javac " \ cmdLine = "javac " \
+ "-d " + self.get_staging_folder(pkgName) + "/build/classes " \ + "-d " + target_outpath + "/build/classes " \
+ "-classpath " + class_extern + " " \ + "-classpath " + class_extern + " " \
+ self.get_staging_folder(pkgName) + "/src/R.java " + target_outpath + "/src/R.java "
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
debug.print_element("pkg", ".dex", "<==", "*.class") debug.print_element("pkg", ".dex", "<==", "*.class")
cmdLine = androidToolPath + "dx " \ cmdLine = androidToolPath + "dx " \
+ "--dex --no-strict " \ + "--dex --no-strict " \
+ "--output=" + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + ".dex " \ + "--output=" + target_outpath + "/build/" + pkg_name_application_name + ".dex " \
+ self.get_staging_folder(pkgName) + "/build/classes/ " + target_outpath + "/build/classes/ "
if "ADMOD_ID" in pkgProperties: if "ADMOD_ID" in pkg_properties:
cmdLine += self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar " cmdLine += self.path_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar "
# add element to dexification: # add element to dexification:
for elem in upper_jar: for elem in upper_jar:
# remove android sdk: # remove android sdk:
@@ -352,16 +404,16 @@ class Target(target.Target):
#builderDebug="-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y " #builderDebug="-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y "
builderDebug="" builderDebug=""
# note : set -u not signed application... # note : set -u not signed application...
#+ ":" + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar " #+ ":" + self.path_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar "
cmdLine = "java -Xmx128M " \ cmdLine = "java -Xmx128M " \
+ " -classpath " + self.folder_sdk + "/tools/lib/sdklib.jar " \ + " -classpath " + self.path_sdk + "/tools/lib/sdklib.jar " \
+ builderDebug \ + builderDebug \
+ " com.android.sdklib.build.ApkBuilderMain " \ + " com.android.sdklib.build.ApkBuilderMain " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \ + target_outpath + "/build/" + pkg_name_application_name + "-unalligned.apk " \
+ " -u " \ + " -u " \
+ " -z " + self.get_staging_folder(pkgName) + "/resources.res " \ + " -z " + target_outpath + "/resources.res " \
+ " -f " + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + ".dex " \ + " -f " + target_outpath + "/build/" + pkg_name_application_name + ".dex " \
+ " -rf " + self.get_staging_folder(pkgName) + "/data " + " -rf " + target_outpath + "/data "
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
# doc : # doc :
@@ -379,7 +431,7 @@ class Target(target.Target):
+ " -sigalg SHA1withRSA -digestalg SHA1 " \ + " -sigalg SHA1withRSA -digestalg SHA1 " \
+ " -storepass Pass__AndroidDebugKey " \ + " -storepass Pass__AndroidDebugKey " \
+ " -keypass PassKey__AndroidDebugKey " \ + " -keypass PassKey__AndroidDebugKey " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \ + target_outpath + "/build/" + pkg_name_application_name + "-unalligned.apk " \
+ " alias__AndroidDebugKey" + " alias__AndroidDebugKey"
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
tmpFile = open("tmpPass.boo", 'w') tmpFile = open("tmpPass.boo", 'w')
@@ -390,57 +442,57 @@ class Target(target.Target):
print("On release mode we need the file : and key an pasword to sign the application ...") 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)") debug.print_element("pkg", ".apk(signed debug)", "<==", ".apk (not signed)")
cmdLine = "jarsigner " \ cmdLine = "jarsigner " \
+ " -keystore " + basePkgPath + "/AndroidKey.jks " \ + " -keystore " + base_pkg_path + "/AndroidKey.jks " \
+ " -sigalg SHA1withRSA -digestalg SHA1 " \ + " -sigalg SHA1withRSA -digestalg SHA1 " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \ + target_outpath + "/build/" + pkg_name_application_name + "-unalligned.apk " \
+ " " + pkgNameApplicationName + " " + pkg_name_application_name
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
cmdLine = "jarsigner " \ cmdLine = "jarsigner " \
+ " -verify -verbose -certs " \ + " -verify -verbose -certs " \
+ " -sigalg SHA1withRSA -digestalg SHA1 " \ + " -sigalg SHA1withRSA -digestalg SHA1 " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " + target_outpath + "/build/" + pkg_name_application_name + "-unalligned.apk "
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
debug.print_element("pkg", ".apk(aligned)", "<==", ".apk (not aligned)") debug.print_element("pkg", ".apk(aligned)", "<==", ".apk (not aligned)")
tools.remove_file(self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk") tools.remove_file(target_outpath + "/" + pkg_name_application_name + ".apk")
# verbose mode : -v # verbose mode : -v
cmdLine = androidToolPath + "zipalign 4 " \ cmdLine = androidToolPath + "zipalign 4 " \
+ self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \ + target_outpath + "/build/" + pkg_name_application_name + "-unalligned.apk " \
+ self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk " + target_outpath + "/" + pkg_name_application_name + ".apk "
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
# copy file in the final stage : # copy file in the final stage :
tools.copy_file(self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk", tools.copy_file(target_outpath + "/" + pkg_name_application_name + ".apk",
self.get_final_folder() + "/" + pkgNameApplicationName + ".apk", self.get_final_path() + "/" + pkg_name_application_name + ".apk",
force=True) force=True)
def install_package(self, pkgName): def install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Install package '" + pkgName + "'") debug.info("Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
pkgNameApplicationName = pkgName pkg_name_application_name = pkg_name
if self.config["mode"] == "debug": if self.config["mode"] == "debug":
pkgNameApplicationName += "debug" pkg_name_application_name += "debug"
cmdLine = self.folder_sdk + "/platform-tools/adb install -r " \ cmdLine = self.path_sdk + "/platform-tools/adb install -r " \
+ self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk " + self.get_staging_path(pkg_name) + "/" + pkg_name_application_name + ".apk "
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
def un_install_package(self, pkgName): def un_install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Un-Install package '" + pkgName + "'") debug.info("Un-Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
pkgNameApplicationName = pkgName pkg_name_application_name = pkg_name
if self.config["mode"] == "debug": if self.config["mode"] == "debug":
pkgNameApplicationName += "debug" pkg_name_application_name += "debug"
cmdLine = self.folder_sdk + "/platform-tools/adb uninstall " + pkgNameApplicationName cmdLine = self.path_sdk + "/platform-tools/adb uninstall " + pkg_name_application_name
Rmultiprocess.run_command(cmdLine) Rmultiprocess.run_command(cmdLine)
def Log(self, pkgName): def Log(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("logcat of android board") debug.info("logcat of android board")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("cmd: " + self.folder_sdk + "/platform-tools/adb shell logcat ") debug.info("cmd: " + self.path_sdk + "/platform-tools/adb shell logcat ")
cmdLine = self.folder_sdk + "/platform-tools/adb shell logcat " cmdLine = self.path_sdk + "/platform-tools/adb shell logcat "
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)

View File

@@ -45,20 +45,21 @@ class Target(target.Target):
# remove unneeded ranlib ... # remove unneeded ranlib ...
self.ranlib="" self.ranlib=""
self.folder_bin="" #self.path_bin=""
self.folder_data="/share" #self.path_data="share"
self.folder_doc="/doc" #self.path_doc="doc"
self.suffix_lib_static='.a' self.suffix_lib_static='.a'
self.suffix_lib_dynamic='.dylib' self.suffix_lib_dynamic='.dylib'
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.3.sdk" self.sysroot = "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.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.3.sdk" self.sysroot = "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.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")
@@ -76,158 +77,172 @@ class Target(target.Target):
self.global_flags_m.append("-fobjc-arc") self.global_flags_m.append("-fobjc-arc")
#self.global_flags_m.append("-fmodules") #self.global_flags_m.append("-fmodules")
def get_staging_folder(self, binaryName): self.pkg_path_data = "share"
return tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + binaryName + ".app/" self.pkg_path_bin = ""
self.pkg_path_lib = "lib"
self.pkg_path_license = "license"
def get_staging_folder_data(self, binaryName): # Disable capabiliteis to compile in shared mode
return self.get_staging_folder(binaryName) + self.folder_data + "/" self.support_dynamic_link = False
def make_package(self, pkgName, pkgProperties, basePkgPath): def make_package_binary(self, pkg_name, pkg_properties, base_pkg_path, heritage_list, static):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Generate package '" + pkgName + "'") debug.info("Generate package '" + pkg_name + "' v" + tools.version_to_string(pkg_properties["VERSION"]))
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
#output path
target_outpath = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app")
tools.create_directory_of_file(target_outpath)
if "ICON" in pkgProperties.keys() \ ## Create share datas:
and pkgProperties["ICON"] != "": self.make_package_binary_data(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## copy binary files:
self.make_package_binary_bin(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## Create libraries:
self.make_package_binary_lib(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## Create generic files:
self.make_package_generic_files(target_outpath, pkg_properties, pkg_name, base_pkg_path, heritage_list, static)
## Create icon:
if "ICON" in pkg_properties.keys() \
and pkg_properties["ICON"] != "":
# Resize all icon needed for Ios ... # Resize all icon needed for Ios ...
# TODO : Do not regenerate if source resource is not availlable # TODO : Do not regenerate if source resource is not availlable
# TODO : Add a colored background ... # TODO : Add a colored background ...
debug.print_element("pkg", "iTunesArtwork.png", "<==", pkgProperties["ICON"]) debug.print_element("pkg", os.path.relpath(pkg_properties["ICON"]), "==>", "iTunesArtwork.png")
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/iTunesArtwork.png", 512, 512) image.resize(pkg_properties["ICON"], os.path.join(target_outpath, "iTunesArtwork.png"), 512, 512)
debug.print_element("pkg", "iTunesArtwork@2x.png", "<==", pkgProperties["ICON"]) debug.print_element("pkg", os.path.relpath(pkg_properties["ICON"]), "==>", "iTunesArtwork@2x.png")
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/iTunesArtwork@2x.png", 1024, 1024) image.resize(pkg_properties["ICON"], os.path.join(target_outpath, "iTunesArtwork@2x.png"), 1024, 1024)
debug.print_element("pkg", "Icon-60@2x.png", "<==", pkgProperties["ICON"]) debug.print_element("pkg", os.path.relpath(pkg_properties["ICON"]), "==>", "Icon-60@2x.png")
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/Icon-60@2x.png", 120, 120) image.resize(pkg_properties["ICON"], os.path.join(target_outpath, "Icon-60@2x.png"), 120, 120)
debug.print_element("pkg", "Icon-76.png", "<==", pkgProperties["ICON"]) debug.print_element("pkg", os.path.relpath(pkg_properties["ICON"]), "==>", "Icon-76.png")
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/Icon-76.png", 76, 76) image.resize(pkg_properties["ICON"], os.path.join(target_outpath, "Icon-76.png"), 76, 76)
debug.print_element("pkg", "Icon-76@2x.png", "<==", pkgProperties["ICON"]) debug.print_element("pkg", os.path.relpath(pkg_properties["ICON"]), "==>", "Icon-76@2x.png")
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/Icon-76@2x.png", 152, 152) image.resize(pkg_properties["ICON"], os.path.join(target_outpath, "Icon-76@2x.png"), 152, 152)
debug.print_element("pkg", "Icon-Small-40.png", "<==", pkgProperties["ICON"]) debug.print_element("pkg", os.path.relpath(pkg_properties["ICON"]), "==>", "Icon-Small-40.png")
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/Icon-Small-40.png", 40, 40) image.resize(pkg_properties["ICON"], os.path.join(target_outpath, "Icon-Small-40.png"), 40, 40)
debug.print_element("pkg", "Icon-Small-40@2x.png", "<==", pkgProperties["ICON"]) debug.print_element("pkg", os.path.relpath(pkg_properties["ICON"]), "==>", "Icon-Small-40@2x.png")
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/Icon-Small-40@2x.png", 80, 80) image.resize(pkg_properties["ICON"], os.path.join(target_outpath, "Icon-Small-40@2x.png"), 80, 80)
debug.print_element("pkg", "Icon-Small.png", "<==", pkgProperties["ICON"]) debug.print_element("pkg", os.path.relpath(pkg_properties["ICON"]), "==>", "Icon-Small.png")
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/Icon-Small.png", 29, 29) image.resize(pkg_properties["ICON"], os.path.join(target_outpath, "Icon-Small.png"), 29, 29)
debug.print_element("pkg", "Icon-Small@2x.png", "<==", pkgProperties["ICON"]) debug.print_element("pkg", os.path.relpath(pkg_properties["ICON"]), "==>", "Icon-Small@2x.png")
image.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/Icon-Small@2x.png", 58, 58) image.resize(pkg_properties["ICON"], os.path.join(target_outpath, "Icon-Small@2x.png"), 58, 58)
## Create the info file:
debug.print_element("pkg", "PkgInfo", "<==", "APPL????") debug.print_element("pkg", "PkgInfo", "<==", "APPL????")
infoFile = self.get_staging_folder(pkgName) + "/PkgInfo" tools.file_write_data(os.path.join(target_outpath, "PkgInfo"),
# Create the info file "APPL????",
tmpFile = open(infoFile, 'w') only_if_new=True)
tmpFile.write("APPL????")
tmpFile.flush()
tmpFile.close()
## Create Info.plist (in XML mode)
debug.print_element("pkg", "Info.plist", "<==", "Package properties") debug.print_element("pkg", "Info.plist", "<==", "Package properties")
# http://www.sandroid.org/imcross/#Deployment # http://www.sandroid.org/imcross/#Deployment
dataFile = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" data_file = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
dataFile += "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" data_file += "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
dataFile += "<plist version=\"1.0\">\n" data_file += "<plist version=\"1.0\">\n"
dataFile += " <dict>\n" data_file += " <dict>\n"
dataFile += " <key>CFBundleDevelopmentRegion</key>\n" data_file += " <key>CFBundleDevelopmentRegion</key>\n"
dataFile += " <string>en</string>\n" data_file += " <string>en</string>\n"
dataFile += " <key>CFBundleDisplayName</key>\n" data_file += " <key>CFBundleDisplayName</key>\n"
dataFile += " <string>" + pkgProperties["NAME"] + "</string>\n" data_file += " <string>" + pkg_properties["NAME"] + "</string>\n"
dataFile += " <key>CFBundleExecutable</key>\n" data_file += " <key>CFBundleExecutable</key>\n"
dataFile += " <string>" + pkgName + "</string>\n" data_file += " <string>" + pkg_name + "</string>\n"
dataFile += " <key>CFBundleIdentifier</key>\n" data_file += " <key>CFBundleIdentifier</key>\n"
dataFile += " <string>com." + pkgProperties["COMPAGNY_NAME2"] + "." + pkgName + "</string>\n" data_file += " <string>com." + pkg_properties["COMPAGNY_NAME2"] + "." + pkg_name + "</string>\n"
dataFile += " <key>CFBundleIconFiles</key>\n" data_file += " <key>CFBundleIconFiles</key>\n"
dataFile += " <array>\n" data_file += " <array>\n"
dataFile += " <string>Icon-60@2x.png</string>\n" data_file += " <string>Icon-60@2x.png</string>\n"
dataFile += " <string>Icon-76.png</string>\n" data_file += " <string>Icon-76.png</string>\n"
dataFile += " <string>Icon-76@2x.png</string>\n" data_file += " <string>Icon-76@2x.png</string>\n"
dataFile += " <string>Icon-Small-40.png</string>\n" data_file += " <string>Icon-Small-40.png</string>\n"
dataFile += " <string>Icon-Small-40@2x.png</string>\n" data_file += " <string>Icon-Small-40@2x.png</string>\n"
dataFile += " <string>Icon-Small.png</string>\n" data_file += " <string>Icon-Small.png</string>\n"
dataFile += " <string>Icon-Small@2x.png</string>\n" data_file += " <string>Icon-Small@2x.png</string>\n"
dataFile += " <string>iTunesArtwork.png</string>\n" data_file += " <string>iTunesArtwork.png</string>\n"
dataFile += " <string>iTunesArtwork@2x.png</string>\n" data_file += " <string>iTunesArtwork@2x.png</string>\n"
dataFile += " </array>\n" data_file += " </array>\n"
dataFile += " <key>CFBundleInfoDictionaryVersion</key>\n" data_file += " <key>CFBundleInfoDictionaryVersion</key>\n"
dataFile += " <string>6.0</string>\n" data_file += " <string>6.0</string>\n"
dataFile += " <key>CFBundleName</key>\n" data_file += " <key>CFBundleName</key>\n"
dataFile += " <string>" + pkgName + "</string>\n" data_file += " <string>" + pkg_name + "</string>\n"
dataFile += " <key>CFBundlePackageType</key>\n" data_file += " <key>CFBundlePackageType</key>\n"
dataFile += " <string>APPL</string>\n" data_file += " <string>APPL</string>\n"
dataFile += " <key>CFBundleSignature</key>\n" data_file += " <key>CFBundleSignature</key>\n"
dataFile += " <string>????</string>\n" data_file += " <string>????</string>\n"
dataFile += " <key>CFBundleSupportedPlatforms</key>\n" data_file += " <key>CFBundleSupportedPlatforms</key>\n"
dataFile += " <array>\n" data_file += " <array>\n"
dataFile += " <string>iPhoneSimulator</string>\n" data_file += " <string>iPhoneSimulator</string>\n"
dataFile += " </array>\n" data_file += " </array>\n"
dataFile += " \n" data_file += " \n"
dataFile += " <key>CFBundleShortVersionString</key>\n" data_file += " <key>CFBundleShortVersionString</key>\n"
dataFile += " <string>"+pkgProperties["VERSION"]+"</string>\n" data_file += " <string>"+tools.version_to_string(pkg_properties["VERSION"])+"</string>\n"
dataFile += " <key>CFBundleVersion</key>\n" data_file += " <key>CFBundleVersion</key>\n"
dataFile += " <string>"+pkgProperties["VERSION_CODE"]+"</string>\n" data_file += " <string>"+str(pkg_properties["VERSION_CODE"])+"</string>\n"
dataFile += " \n" data_file += " \n"
dataFile += " <key>CFBundleResourceSpecification</key>\n" data_file += " <key>CFBundleResourceSpecification</key>\n"
dataFile += " <string>ResourceRules.plist</string>\n" data_file += " <string>ResourceRules.plist</string>\n"
if self.sumulator == False: if self.sumulator == False:
dataFile += " <key>LSRequiresIPhoneOS</key>\n" data_file += " <key>LSRequiresIPhoneOS</key>\n"
dataFile += " <true/>\n" data_file += " <true/>\n"
else: else:
dataFile += " <key>DTPlatformName</key>\n" data_file += " <key>DTPlatformName</key>\n"
dataFile += " <string>iphonesimulator</string>\n" data_file += " <string>iphonesimulator</string>\n"
dataFile += " <key>DTSDKName</key>\n" data_file += " <key>DTSDKName</key>\n"
dataFile += " <string>iphonesimulator7.0</string>\n" data_file += " <string>iphonesimulator7.0</string>\n"
dataFile += " \n" data_file += " \n"
dataFile += " <key>UIDeviceFamily</key>\n" data_file += " <key>UIDeviceFamily</key>\n"
dataFile += " <array>\n" data_file += " <array>\n"
dataFile += " <integer>1</integer>\n" data_file += " <integer>1</integer>\n"
dataFile += " <integer>2</integer>\n" data_file += " <integer>2</integer>\n"
dataFile += " </array>\n" data_file += " </array>\n"
dataFile += " <key>UIRequiredDeviceCapabilities</key>\n" data_file += " <key>UIRequiredDeviceCapabilities</key>\n"
dataFile += " <array>\n" data_file += " <array>\n"
dataFile += " <string>armv7</string>\n" data_file += " <string>armv7</string>\n"
dataFile += " </array>\n" data_file += " </array>\n"
dataFile += " <key>UIStatusBarHidden</key>\n" data_file += " <key>UIStatusBarHidden</key>\n"
dataFile += " <true/>\n" data_file += " <true/>\n"
dataFile += " <key>UISupportedInterfaceOrientations</key>\n" data_file += " <key>UISupportedInterfaceOrientations</key>\n"
dataFile += " <array>\n" data_file += " <array>\n"
dataFile += " <string>UIInterfaceOrientationPortrait</string>\n" data_file += " <string>UIInterfaceOrientationPortrait</string>\n"
dataFile += " <string>UIInterfaceOrientationPortraitUpsideDown</string>\n" data_file += " <string>UIInterfaceOrientationPortraitUpsideDown</string>\n"
dataFile += " <string>UIInterfaceOrientationLandscapeLeft</string>\n" data_file += " <string>UIInterfaceOrientationLandscapeLeft</string>\n"
dataFile += " <string>UIInterfaceOrientationLandscapeRight</string>\n" data_file += " <string>UIInterfaceOrientationLandscapeRight</string>\n"
dataFile += " </array>\n" data_file += " </array>\n"
dataFile += " <key>UISupportedInterfaceOrientations~ipad</key>\n" data_file += " <key>UISupportedInterfaceOrientations~ipad</key>\n"
dataFile += " <array>\n" data_file += " <array>\n"
dataFile += " <string>UIInterfaceOrientationPortrait</string>\n" data_file += " <string>UIInterfaceOrientationPortrait</string>\n"
dataFile += " <string>UIInterfaceOrientationPortraitUpsideDown</string>\n" data_file += " <string>UIInterfaceOrientationPortraitUpsideDown</string>\n"
dataFile += " <string>UIInterfaceOrientationLandscapeLeft</string>\n" data_file += " <string>UIInterfaceOrientationLandscapeLeft</string>\n"
dataFile += " <string>UIInterfaceOrientationLandscapeRight</string>\n" data_file += " <string>UIInterfaceOrientationLandscapeRight</string>\n"
dataFile += " </array>\n" data_file += " </array>\n"
dataFile += " </dict>\n" data_file += " </dict>\n"
dataFile += "</plist>\n" data_file += "</plist>\n"
dataFile += "\n\n" data_file += "\n\n"
tools.file_write_data(os.path.join(target_outpath, "Info.plist"),
data_file,
only_if_new=True)
infoFile = self.get_staging_folder(pkgName) + "/Info.plist"
# Create the info file
tmpFile = open(infoFile, 'w')
tmpFile.write(dataFile)
tmpFile.flush()
tmpFile.close()
""" """
infoFile = self.get_staging_folder(pkgName) + "/" + pkgName + "-Info.plist" infoFile = self.get_staging_path(pkg_name) + "/" + pkg_name + "-Info.plist"
# Create the info file # Create the info file
tmpFile = open(infoFile, 'w') tmpFile = open(infoFile, 'w')
tmpFile.write(dataFile) tmpFile.write(data_file)
tmpFile.flush() tmpFile.flush()
tmpFile.close() tmpFile.close()
cmdLine = "builtin-infoPlistUtility " cmdLine = "builtin-infoPlistUtility "
cmdLine += " " + self.get_staging_folder(pkgName) + "/" + pkgName + "-Info.plist " cmdLine += " " + self.get_staging_path(pkg_name) + "/" + pkg_name + "-Info.plist "
cmdLine += " -genpkginfo " + self.get_staging_folder(pkgName) + "/PkgInfo" cmdLine += " -genpkginfo " + self.get_staging_path(pkg_name) + "/PkgInfo"
cmdLine += " -expandbuildsettings " cmdLine += " -expandbuildsettings "
cmdLine += " -format binary " cmdLine += " -format binary "
if self.sumulator == False: if self.sumulator == False:
cmdLine += " -platform iphonesimulator " cmdLine += " -platform iphonesimulator "
else: else:
cmdLine += " -platform iphoneos " cmdLine += " -platform iphoneos "
cmdLine += " -o " + self.get_staging_folder(pkgName) + "/" + "Info.plist" cmdLine += " -o " + self.get_staging_path(pkg_name) + "/" + "Info.plist"
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
""" """
""" """
@@ -246,59 +261,51 @@ class Target(target.Target):
#/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil /Users/edouarddupin/Library/Developer/Xcode/DerivedData/projectName-gwycnyyzohokcmalgodeucqppxro/Build/Products/Debug-iphonesimulator/projectName.app/projectName -o /Users/edouarddupin/Library/Developer/Xcode/DerivedData/projectName-gwycnyyzohokcmalgodeucqppxro/Build/Products/Debug-iphonesimulator/projectName.app.dSYM #/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil /Users/edouarddupin/Library/Developer/Xcode/DerivedData/projectName-gwycnyyzohokcmalgodeucqppxro/Build/Products/Debug-iphonesimulator/projectName.app/projectName -o /Users/edouarddupin/Library/Developer/Xcode/DerivedData/projectName-gwycnyyzohokcmalgodeucqppxro/Build/Products/Debug-iphonesimulator/projectName.app.dSYM
debug.print_element("pkg", "ResourceRules.plist", "<==", "Resources autorisation") debug.print_element("pkg", "ResourceRules.plist", "<==", "Resources autorisation")
dataFile = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" data_file = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
dataFile += "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" data_file += "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
dataFile += "<plist version=\"1.0\">\n" data_file += "<plist version=\"1.0\">\n"
dataFile += " <dict>\n" data_file += " <dict>\n"
dataFile += " <key>rules</key>\n" data_file += " <key>rules</key>\n"
dataFile += " <dict>\n" data_file += " <dict>\n"
dataFile += " <key>.*</key>\n" data_file += " <key>.*</key>\n"
dataFile += " <true/>\n" data_file += " <true/>\n"
dataFile += " <key>Info.plist</key>\n" data_file += " <key>Info.plist</key>\n"
dataFile += " <dict>\n" data_file += " <dict>\n"
dataFile += " <key>omit</key>\n" data_file += " <key>omit</key>\n"
dataFile += " <true/>\n" data_file += " <true/>\n"
dataFile += " <key>weight</key>\n" data_file += " <key>weight</key>\n"
dataFile += " <real>10</real>\n" data_file += " <real>10</real>\n"
dataFile += " </dict>\n" data_file += " </dict>\n"
dataFile += " <key>ResourceRules.plist</key>\n" data_file += " <key>ResourceRules.plist</key>\n"
dataFile += " <dict>\n" data_file += " <dict>\n"
dataFile += " <key>omit</key>\n" data_file += " <key>omit</key>\n"
dataFile += " <true/>\n" data_file += " <true/>\n"
dataFile += " <key>weight</key>\n" data_file += " <key>weight</key>\n"
dataFile += " <real>100</real>\n" data_file += " <real>100</real>\n"
dataFile += " </dict>\n" data_file += " </dict>\n"
dataFile += " </dict>\n" data_file += " </dict>\n"
dataFile += " </dict>\n" data_file += " </dict>\n"
dataFile += "</plist>\n" data_file += "</plist>\n"
dataFile += "\n\n" data_file += "\n\n"
tools.file_write_data(os.path.join(target_outpath, "ResourceRules.plist"),
infoFile = self.get_staging_folder(pkgName) + "/ResourceRules.plist" data_file,
# Create the info file only_if_new=True)
tmpFile = open(infoFile, 'w')
tmpFile.write(dataFile)
tmpFile.flush()
tmpFile.close()
debug.print_element("pkg", "Entitlements.plist", "<==", "application mode") debug.print_element("pkg", "Entitlements.plist", "<==", "application mode")
dataFile = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" data_file = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
dataFile += "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" data_file += "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
dataFile += "<plist version=\"1.0\">\n" data_file += "<plist version=\"1.0\">\n"
dataFile += " <dict>\n" data_file += " <dict>\n"
dataFile += " <key>get-task-allow</key>\n" data_file += " <key>get-task-allow</key>\n"
dataFile += " <true/>\n" data_file += " <true/>\n"
dataFile += " </dict>\n" data_file += " </dict>\n"
dataFile += "</plist>\n" data_file += "</plist>\n"
dataFile += "\n\n" data_file += "\n\n"
tools.file_write_data(os.path.join(target_outpath, "Entitlements.plist"),
data_file,
only_if_new=True)
infoFile = self.get_staging_folder(pkgName) + "/Entitlements.plist" # Simulateur path :
# Create the info file
tmpFile = open(infoFile, 'w')
tmpFile.write(dataFile)
tmpFile.flush()
tmpFile.close()
# Simulateur folder :
#~/Library/Application\ Support/iPhone\ Simulator/7.0.3/Applications/ #~/Library/Application\ Support/iPhone\ Simulator/7.0.3/Applications/
# must have a 'uuidgen' UID generate value with this elemennt ... # must have a 'uuidgen' UID generate value with this elemennt ...
# get the bundle path : ==> maybe usefull in MocOS ... # get the bundle path : ==> maybe usefull in MocOS ...
@@ -307,24 +314,23 @@ class Target(target.Target):
# Must create the tarball of the application # Must create the tarball of the application
#cd $(TARGET_OUT_FINAL)/; tar -cf $(PROJECT_NAME).tar $(PROJECT_NAME).app #cd $(TARGET_OUT_FINAL)/; tar -cf $(PROJECT_NAME).tar $(PROJECT_NAME).app
#cd $(TARGET_OUT_FINAL)/; tar -czf $(PROJECT_NAME).tar.gz $(PROJECT_NAME).app #cd $(TARGET_OUT_FINAL)/; tar -czf $(PROJECT_NAME).tar.gz $(PROJECT_NAME).app
if self.sumulator == False: if self.sumulator == False:
if "APPLE_APPLICATION_IOS_ID" not in pkg_properties:
pkg_properties["APPLE_APPLICATION_IOS_ID"] = "00000000"
debug.warning("Missing package property : APPLE_APPLICATION_IOS_ID USE " + pkg_properties["APPLE_APPLICATION_IOS_ID"] + " ID ... ==> CAN NOT WORK ..." )
# Create the info file # Create the info file
tmpFile = open(self.get_build_folder(pkgName) + "/worddown.xcent", 'w') tmpFile = open(os.path.join(target_outpath, pkg_name + ".xcent"), 'w')
tmpFile.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") tmpFile.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
tmpFile.write("<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n") tmpFile.write("<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n")
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")
try: tmpFile.write(" <string>" + pkg_properties["APPLE_APPLICATION_IOS_ID"] + "." + pkg_properties["COMPAGNY_TYPE"] + "." + pkg_properties["COMPAGNY_NAME2"] + "." + pkg_name + "</string>\n")
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")
tmpFile.write(" <array>\n") tmpFile.write(" <array>\n")
tmpFile.write(" <string>" + pkgProperties["APPLE_APPLICATION_IOS_ID"] + ".atriasoft.worddown</string>\n") tmpFile.write(" <string>" + pkg_properties["APPLE_APPLICATION_IOS_ID"] + "." + pkg_properties["COMPAGNY_TYPE"] + "." + pkg_properties["COMPAGNY_NAME2"] + "." + pkg_name + "</string>\n")
tmpFile.write(" </array>\n") tmpFile.write(" </array>\n")
tmpFile.write(" </dict>\n") tmpFile.write(" </dict>\n")
tmpFile.write("</plist>\n") tmpFile.write("</plist>\n")
@@ -340,25 +346,19 @@ class Target(target.Target):
cmdLine = 'codesign --force --sign ' cmdLine = 'codesign --force --sign '
# to get this key ; certtool y | grep "Developer" # to get this key ; certtool y | grep "Developer"
cmdLine += ' "' + signatureKey + '" ' cmdLine += ' "' + signatureKey + '" '
cmdLine += ' --entitlements ' + self.get_build_folder(pkgName) + '/worddown.xcent' cmdLine += ' --entitlements ' + self.get_build_path(pkg_name) + '/worddown.xcent'
cmdLine += ' ' + self.get_staging_folder(pkgName) cmdLine += ' ' + self.get_staging_path(pkg_name)
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
# --force --sign "iPhone Developer: Edouard DUPIN (SDFGSDFGSDFG)"
# --resource-rules=/Users/edouarddupin/Library/Developer/Xcode/DerivedData/worddown-cmuvjchgtiteexdiacyqoexsyadg/Build/Products/Debug-iphoneos/worddown.app/ResourceRules.plist
# --entitlements /Users/edouarddupin/Library/Developer/Xcode/DerivedData/worddown-cmuvjchgtiteexdiacyqoexsyadg/Build/Intermediates/worddown.build/Debug-iphoneos/worddown.build/worddown.xcent
# /Users/edouarddupin/Library/Developer/Xcode/DerivedData/worddown-cmuvjchgtiteexdiacyqoexsyadg/Build/Products/Debug-iphoneos/worddown.app
def createRandomNumber(self, len): def createRandomNumber(self, len):
out = "" out = ""
for iii in range(0,len): for iii in range(0,len):
out += random.choice(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]) out += random.choice(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"])
return out return out
def install_package(self, pkgName): def install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Install package '" + pkgName + "'") debug.info("Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
if self.sumulator == False: if self.sumulator == False:
if tools.file_size("ewol/ios-deploy/ios-deploy") == 0: if tools.file_size("ewol/ios-deploy/ios-deploy") == 0:
@@ -368,10 +368,10 @@ class Target(target.Target):
if tools.file_size("ewol/ios-deploy/ios-deploy") == 0: if tools.file_size("ewol/ios-deploy/ios-deploy") == 0:
debug.error("Can not create ios-deploy external software ...") debug.error("Can not create ios-deploy external software ...")
debug.print_element("deploy", "iphone/ipad", "<==", "aplication") debug.print_element("deploy", "iphone/ipad", "<==", "aplication")
cmdLine = './ewol/ios-deploy/ios-deploy --bundle ' + self.get_staging_folder(pkgName) cmdLine = './ewol/ios-deploy/ios-deploy --bundle ' + self.get_staging_path(pkg_name)
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
else: else:
simulatorIdFile = ".iosSimutatorId_" + pkgName + ".txt" simulatorIdFile = ".iosSimutatorId_" + pkg_name + ".txt"
if tools.file_size(simulatorIdFile) < 10: if tools.file_size(simulatorIdFile) < 10:
#create the file: #create the file:
tmpFile = open(simulatorIdFile, 'w') tmpFile = open(simulatorIdFile, 'w')
@@ -388,32 +388,32 @@ class Target(target.Target):
tmpFile.close() tmpFile.close()
simulatorId = tools.file_read_data(simulatorIdFile) simulatorId = tools.file_read_data(simulatorIdFile)
home = os.path.expanduser("~") home = os.path.expanduser("~")
destinationFolderBase = home + "/Library/Application\\ Support/iPhone\\ Simulator/7.1/Applications/" + simulatorId destinationpathBase = home + "/Library/Application\\ Support/iPhone\\ Simulator/7.1/Applications/" + simulatorId
destinationFolder = home + "/Library/Application Support/iPhone Simulator/7.1/Applications/" + simulatorId + "/" + pkgName + ".app" destinationpath = home + "/Library/Application Support/iPhone Simulator/7.1/Applications/" + simulatorId + "/" + pkg_name + ".app"
destinationFolder2 = home + "/Library/Application\\ Support/iPhone\\ Simulator/7.1/Applications/" + simulatorId + "/" + pkgName + ".app" destinationpath2 = home + "/Library/Application\\ Support/iPhone\\ Simulator/7.1/Applications/" + simulatorId + "/" + pkg_name + ".app"
debug.info("install in simulator : " + destinationFolder) debug.info("install in simulator : " + destinationpath)
tools.create_directory_of_file(destinationFolder + "/plop.txt") tools.create_directory_of_file(destinationpath + "/plop.txt")
cmdLine = "cp -rf " + self.get_staging_folder(pkgName) + " " + destinationFolder2 cmdLine = "cp -rf " + self.get_staging_path(pkg_name) + " " + destinationpath2
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
cmdLine = "touch " + destinationFolderBase cmdLine = "touch " + destinationpathBase
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
#sudo dpkg -i $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package #sudo dpkg -i $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package
def un_install_package(self, pkgName): def un_install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Un-Install package '" + pkgName + "'") debug.info("Un-Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
if self.sumulator == False: if self.sumulator == False:
debug.warning("not implemented") debug.warning("not implemented")
else: else:
simulatorIdFile = ".iosSimutatorId_" + pkgName + ".txt" simulatorIdFile = ".iosSimutatorId_" + pkg_name + ".txt"
if tools.file_size(simulatorIdFile) < 10: if tools.file_size(simulatorIdFile) < 10:
debug.warning("Can not get simulation O_ID : " + simulatorIdFile) debug.warning("Can not get simulation O_ID : " + simulatorIdFile)
#sudo dpkg -r $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package #sudo dpkg -r $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package
def Log(self, pkgName): def Log(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("log of iOs board") debug.info("log of iOs board")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
@@ -425,7 +425,7 @@ class Target(target.Target):
if tools.file_size("ewol/ios-deploy/ios-deploy") == 0: if tools.file_size("ewol/ios-deploy/ios-deploy") == 0:
debug.error("Can not create ios-deploy external software ...") debug.error("Can not create ios-deploy external software ...")
debug.print_element("deploy", "iphone/ipad", "<==", "aplication") debug.print_element("deploy", "iphone/ipad", "<==", "aplication")
cmdLine = './ewol/ios-deploy/ios-deploy --debug --bundle ' + self.get_staging_folder(pkgName) cmdLine = './ewol/ios-deploy/ios-deploy --debug --bundle ' + self.get_staging_path(pkg_name)
multiprocess.run_command(cmdLine) multiprocess.run_command(cmdLine)
else: else:
cmdLine = "tail -f ~/Library/Logs/iOS\ Simulator/7.1/system.log" cmdLine = "tail -f ~/Library/Logs/iOS\ Simulator/7.1/system.log"

View File

@@ -14,6 +14,7 @@ import os
import stat import stat
import re import re
from lutin import host from lutin import host
from lutin import multiprocess
class Target(target.Target): class Target(target.Target):
def __init__(self, config): def __init__(self, config):
@@ -33,109 +34,281 @@ 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("-fpic")
self.global_flags_cc.append("-D__STDCPP_GNU__") self.global_flags_cc.append("-D__STDCPP_GNU__")
def generate_list_separate_coma(self, list):
result = ""
fistTime = True
for elem in list:
if fistTime == True:
fistTime = False
else:
result += ","
result += elem
return result
def make_package(self, pkgName, pkgProperties, basePkgPath): self.pkg_path_data = "share"
self.pkg_path_bin = "bin"
self.pkg_path_lib = "lib"
self.pkg_path_license = "license"
"""
.local/application
*--> applName -> applName.app/bin/applName
*--> applName.app
*--> appl_description.txt
*--> appl_name.txt
*--> changelog.txt
*--> copyright.txt
*--> readme.txt
*--> version.txt
*--> website.txt
*--> icon.png
*--> bin
* *--> applName
*--> doc
* *--> applName
*--> lib
* *--> XX.so
* *--> YY.so
*--> license
* *--> applName.txt
* *--> libXX.txt
* *--> libYY.txt
*--> man
*--> share
* *--> applName
* *--> XX
* *--> YY
*--> sources
"""
def make_package_binary(self, pkg_name, pkg_properties, base_pkg_path, heritage_list, static):
debug.debug("------------------------------------------------------------------------")
debug.info("Generate generic '" + pkg_name + "' v" + tools.version_to_string(pkg_properties["VERSION"]))
debug.debug("------------------------------------------------------------------------")
#output path
target_outpath = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app")
tools.create_directory_of_file(target_outpath)
## Create share datas:
self.make_package_binary_data(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## copy binary files:
self.make_package_binary_bin(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## Create libraries:
self.make_package_binary_lib(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## Create generic files:
self.make_package_generic_files(target_outpath, pkg_properties, pkg_name, base_pkg_path, heritage_list, static)
## create the package:
debug.debug("package : " + self.get_staging_path(pkg_name) + "/" + pkg_name + ".app.pkg")
os.system("cd " + self.get_staging_path(pkg_name) + " ; tar -czf " + pkg_name + ".app.tar.gz " + pkg_name + ".app")
#multiprocess.run_command("cd " + self.get_staging_path(pkg_name) + " ; tar -czf " + pkg_name + ".app.tar.gz " + pkg_name + ".app")
tools.create_directory_of_file(self.get_final_path())
tools.copy_file(self.get_staging_path(pkg_name) + "/" + pkg_name + ".app.tar.gz", self.get_final_path() + "/" + pkg_name + ".app.gpkg")
def make_package_debian(self, pkg_name, pkg_properties, base_pkg_path, heritage_list):
# http://alp.developpez.com/tutoriels/debian/creer-paquet/ # http://alp.developpez.com/tutoriels/debian/creer-paquet/
debianPkgName = re.sub("_", "-", pkgName) debianpkg_name = re.sub("_", "-", pkg_name)
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Generate package '" + debianPkgName + "' v"+pkgProperties["VERSION"]) debug.info("Generate package '" + debianpkg_name + "' v"+pkg_properties["VERSION"])
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
self.get_staging_folder(pkgName) self.get_staging_path(pkg_name)
targetOutFolderDebian = self.get_staging_folder(pkgName) + "/DEBIAN/" target_outpathDebian = self.get_staging_path(pkg_name) + "/DEBIAN/"
finalFileControl = targetOutFolderDebian + "control" finalFileControl = target_outpathDebian + "control"
finalFilepostRm = targetOutFolderDebian + "postrm" finalFilepostRm = target_outpathDebian + "postrm"
# create the folders : # create the paths :
tools.create_directory_of_file(finalFileControl) tools.create_directory_of_file(finalFileControl)
tools.create_directory_of_file(finalFilepostRm) tools.create_directory_of_file(finalFilepostRm)
## Create the control file ## Create the control file
tools.create_directory_of_file(finalFileControl) tools.create_directory_of_file(finalFileControl)
tmpFile = open(finalFileControl, 'w') tmpFile = open(finalFileControl, 'w')
tmpFile.write("Package: " + debianPkgName + "\n") tmpFile.write("Package: " + debianpkg_name + "\n")
tmpFile.write("Version: " + pkgProperties["VERSION"] + "\n") tmpFile.write("Version: " + pkg_properties["VERSION"] + "\n")
tmpFile.write("Section: " + self.generate_list_separate_coma(pkgProperties["SECTION"]) + "\n") tmpFile.write("Section: " + self.generate_list_separate_coma(pkg_properties["SECTION"]) + "\n")
tmpFile.write("Priority: " + pkgProperties["PRIORITY"] + "\n") tmpFile.write("Priority: " + pkg_properties["PRIORITY"] + "\n")
tmpFile.write("Architecture: all\n") tmpFile.write("Architecture: all\n")
tmpFile.write("Depends: bash\n") tmpFile.write("Depends: bash\n")
tmpFile.write("Maintainer: " + self.generate_list_separate_coma(pkgProperties["MAINTAINER"]) + "\n") tmpFile.write("Maintainer: " + self.generate_list_separate_coma(pkg_properties["MAINTAINER"]) + "\n")
tmpFile.write("Description: " + pkgProperties["DESCRIPTION"] + "\n") tmpFile.write("Description: " + pkg_properties["DESCRIPTION"] + "\n")
tmpFile.write("\n") tmpFile.write("\n")
tmpFile.flush() tmpFile.flush()
tmpFile.close() tmpFile.close()
## Create the PostRm ## Create the PostRm
tmpFile = open(finalFilepostRm, 'w') tmpFile = open(finalFilepostRm, 'w')
tmpFile.write("#!/bin/bash\n") tmpFile.write("#!/bin/bash\n")
tmpFile.write("touch ~/." + pkgName + "\n") tmpFile.write("touch ~/." + pkg_name + "\n")
if pkgName != "": if pkg_name != "":
tmpFile.write("touch ~/.local/share/" + pkgName + "\n") tmpFile.write("touch ~/.local/share/" + pkg_name + "\n")
tmpFile.write("rm -r ~/.local/share/" + pkgName + "\n") tmpFile.write("rm -r ~/.local/share/" + pkg_name + "\n")
tmpFile.write("\n") tmpFile.write("\n")
tmpFile.flush() tmpFile.flush()
tmpFile.close() tmpFile.close()
## Enable Execution in script ## Enable Execution in script
os.chmod(finalFilepostRm, stat.S_IRWXU + stat.S_IRGRP + stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH); os.chmod(finalFilepostRm, stat.S_IRWXU + stat.S_IRGRP + stat.S_IXGRP + stat.S_IROTH + stat.S_IXOTH);
## Readme donumentation ## Readme donumentation
readmeFileDest = self.get_staging_folder(pkgName) + "/usr/share/doc/"+ debianPkgName + "/README" readmeFileDest = self.get_staging_path(pkg_name) + "/usr/share/doc/"+ debianpkg_name + "/README"
tools.create_directory_of_file(readmeFileDest) tools.create_directory_of_file(readmeFileDest)
if os.path.exists(basePkgPath + "/os-Linux/README")==True: if os.path.exists(base_pkg_path + "/os-Linux/README")==True:
tools.copy_file(basePkgPath + "/os-Linux/README", readmeFileDest) tools.copy_file(base_pkg_path + "/os-Linux/README", readmeFileDest)
elif os.path.exists(basePkgPath + "/README")==True: elif os.path.exists(base_pkg_path + "/README")==True:
tools.copy_file(basePkgPath + "/README", readmeFileDest) tools.copy_file(base_pkg_path + "/README", readmeFileDest)
elif os.path.exists(basePkgPath + "/README.md")==True: elif os.path.exists(base_pkg_path + "/README.md")==True:
tools.copy_file(basePkgPath + "/README.md", readmeFileDest) tools.copy_file(base_pkg_path + "/README.md", readmeFileDest)
else: else:
debug.info("no file 'README', 'README.md' or 'os-Linux/README' ==> generate an empty one") debug.info("no file 'README', 'README.md' or 'os-Linux/README' ==> generate an empty one")
tmpFile = open(readmeFileDest, 'w') tmpFile = open(readmeFileDest, 'w')
tmpFile.write("No documentation for " + pkgName + "\n") tmpFile.write("No documentation for " + pkg_name + "\n")
tmpFile.flush() tmpFile.flush()
tmpFile.close() tmpFile.close()
## licence file ## licence file
licenseFileDest = self.get_staging_folder(pkgName) + "/usr/share/doc/"+ debianPkgName + "/copyright" license_file_dest = self.get_staging_path(pkg_name) + "/usr/share/doc/"+ debianpkg_name + "/copyright"
tools.create_directory_of_file(licenseFileDest) tools.create_directory_of_file(license_file_dest)
if os.path.exists(basePkgPath + "/license.txt")==True: if os.path.exists(base_pkg_path + "/license.txt")==True:
tools.copy_file(basePkgPath + "/license.txt", licenseFileDest) tools.copy_file(base_pkg_path + "/license.txt", license_file_dest)
else: else:
debug.info("no file 'license.txt' ==> generate an empty one") debug.info("no file 'license.txt' ==> generate an empty one")
tmpFile = open(licenseFileDest, 'w') tmpFile = open(license_file_dest, 'w')
tmpFile.write("No license define by the developper for " + pkgName + "\n") tmpFile.write("No license define by the developper for " + pkg_name + "\n")
tmpFile.flush() tmpFile.flush()
tmpFile.close() tmpFile.close()
##changeLog file ##changeLog file
changeLogFileDest = self.get_staging_folder(pkgName) + "/usr/share/doc/"+ debianPkgName + "/changelog" change_log_file_dest = self.get_staging_path(pkg_name) + "/usr/share/doc/"+ debianpkg_name + "/changelog"
tools.create_directory_of_file(changeLogFileDest) tools.create_directory_of_file(change_log_file_dest)
if os.path.exists(basePkgPath + "/changelog")==True: if os.path.exists(base_pkg_path + "/changelog")==True:
tools.copy_file(basePkgPath + "/changelog", changeLogFileDest) tools.copy_file(base_pkg_path + "/changelog", change_log_file_dest)
else: else:
debug.info("no file 'changelog' ==> generate an empty one") debug.info("no file 'changelog' ==> generate an empty one")
tmpFile = open(changeLogFileDest, 'w') tmpFile = open(change_log_file_dest, 'w')
tmpFile.write("No changelog data " + pkgName + "\n") tmpFile.write("No changelog data " + pkg_name + "\n")
tmpFile.flush() tmpFile.flush()
tmpFile.close() tmpFile.close()
## create the package : ## create the package :
debug.debug("package : " + self.get_staging_folder(pkgName) + "/" + debianPkgName + ".deb") debug.debug("package : " + self.get_staging_path(pkg_name) + "/" + debianpkg_name + ".deb")
os.system("cd " + self.get_staging_folder("") + " ; dpkg-deb --build " + pkgName) os.system("cd " + self.get_staging_path("") + " ; dpkg-deb --build " + pkg_name)
tools.create_directory_of_file(self.get_final_folder()) tools.create_directory_of_file(self.get_final_path())
tools.copy_file(self.get_staging_folder("") + "/" + pkgName + self.suffix_package, self.get_final_folder() + "/" + pkgName + self.suffix_package) tools.copy_file(self.get_staging_path("") + "/" + pkg_name + self.suffix_package, self.get_final_path() + "/" + pkg_name + self.suffix_package)
def install_package(self, pkgName): def install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Install package '" + pkgName + "'") debug.info("Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
os.system("sudo dpkg -i " + self.get_final_folder() + "/" + pkgName + self.suffix_package) os.system("sudo dpkg -i " + self.get_final_path() + "/" + pkg_name + self.suffix_package)
def un_install_package(self, pkgName): def un_install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Un-Install package '" + pkgName + "'") debug.info("Un-Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
os.system("sudo dpkg -r " + self.get_final_folder() + "/" + pkgName + self.suffix_package) os.system("sudo dpkg -r " + self.get_final_path() + "/" + pkg_name + self.suffix_package)
"""
.local/application
*--> applName -> applName.app/bin/applName
*--> applName.app
*--> appl_description.txt
*--> appl_name.txt
*--> changelog.txt
*--> copyright.txt
*--> readme.txt
*--> version.txt
*--> website.txt
*--> icon.png
*--> bin
* *--> applName
*--> doc
* *--> applName
*--> lib
* *--> XX.so
* *--> YY.so
*--> license
* *--> applName.txt
* *--> libXX.txt
* *--> libYY.txt
*--> man
*--> share
* *--> applName
* *--> XX
* *--> YY
*--> sources
"""
def make_package_generic(self, pkg_name, pkg_properties, base_pkg_path, heritage_list):
debug.warning("heritage for " + str(pkg_name) + ":")
for heritage in heritage_list.list_heritage:
debug.warning("heritage .... " + str(heritage.name) + " : " + str(heritage.depends))
debianpkg_name = re.sub("_", "-", pkg_name)
debug.debug("------------------------------------------------------------------------")
debug.info("Generate generic '" + debianpkg_name + "' v"+pkg_properties["VERSION"])
debug.debug("------------------------------------------------------------------------")
target_outpath = self.get_staging_path(pkg_name) + "/edn.app/"
tools.create_directory_of_file(target_outpath)
## Create version file
tmpFile = open(target_outpath + "/version.txt", 'w')
tmpFile.write(pkg_properties["VERSION"])
tmpFile.flush()
tmpFile.close()
## Create maintainer file
tmpFile = open(target_outpath + "/maintainer.txt", 'w')
tmpFile.write(self.generate_list_separate_coma(pkg_properties["MAINTAINER"]))
tmpFile.flush()
tmpFile.close()
## Create appl_name file
tmpFile = open(target_outpath + "/appl_name.txt", 'w')
tmpFile.write("en_EN:" + pkg_properties["NAME"])
tmpFile.flush()
tmpFile.close()
## Create appl_description file
tmpFile = open(target_outpath + "/appl_description.txt", 'w')
tmpFile.write("en_EN:" + pkg_properties["DESCRIPTION"])
tmpFile.flush()
tmpFile.close()
## Create Readme file
readmeFileDest = target_outpath + "/readme.txt"
if os.path.exists(base_pkg_path + "/os-Linux/README")==True:
tools.copy_file(base_pkg_path + "/os-Linux/README", readmeFileDest)
elif os.path.exists(base_pkg_path + "/README")==True:
tools.copy_file(base_pkg_path + "/README", readmeFileDest)
elif os.path.exists(base_pkg_path + "/README.md")==True:
tools.copy_file(base_pkg_path + "/README.md", readmeFileDest)
else:
debug.info("no file 'README', 'README.md' or 'os-Linux/README' ==> generate an empty one")
tmpFile = open(readmeFileDest, 'w')
tmpFile.write("No documentation for " + pkg_name + "\n")
tmpFile.flush()
tmpFile.close()
## Create licence file
license_file_dest = target_outpath + "/license/"+ debianpkg_name + ".txt"
tools.create_directory_of_file(license_file_dest)
if os.path.exists(base_pkg_path + "/license.txt")==True:
tools.copy_file(base_pkg_path + "/license.txt", license_file_dest)
else:
debug.info("no file 'license.txt' ==> generate an empty one")
tmpFile = open(license_file_dest, 'w')
tmpFile.write("No license define by the developper for " + pkg_name + "\n")
tmpFile.flush()
tmpFile.close()
## Create changeLog file
change_log_file_dest = target_outpath + "/changelog.txt"
if os.path.exists(base_pkg_path + "/changelog") == True:
tools.copy_file(base_pkg_path + "/changelog", change_log_file_dest)
else:
debug.info("no file 'changelog' ==> generate an empty one")
tmpFile = open(change_log_file_dest, 'w')
tmpFile.write("No changelog data " + pkg_name + "\n")
tmpFile.flush()
tmpFile.close()
## copy share path
#debug.info("plop:" + self.get_staging_path(pkg_name) + self.path_data)
if os.path.exists(self.get_staging_path(pkg_name) + self.path_data) == True:
tools.copy_anything(self.get_staging_path(pkg_name) + self.path_data + "/*", target_outpath + self.path_data, recursive=True)
## Create binary path:
bin_path = target_outpath + self.path_bin
#tools.create_directory_of_file(bin_path)
tools.copy_anything(self.get_staging_path(pkg_name) + self.path_bin + "/*",
bin_path)
## create the package:
debug.debug("package : " + self.get_staging_path(pkg_name) + "/" + debianpkg_name + ".app.pkg")
os.system("cd " + self.get_staging_path(pkg_name) + " ; tar -czf " + pkg_name + ".app.tar.gz " + pkg_name + ".app")
#multiprocess.run_command("cd " + self.get_staging_path(pkg_name) + " ; tar -czf " + pkg_name + ".app.tar.gz " + pkg_name + ".app")
tools.create_directory_of_file(self.get_final_path())
tools.copy_file(self.get_staging_path(pkg_name) + "/" + pkg_name + ".app.tar.gz", self.get_final_path() + "/" + pkg_name + ".app.gpkg")

View File

@@ -28,110 +28,127 @@ class Target(target.Target):
# http://devs.openttd.org/~truebrain/compile-farm/apple-darwin9.txt # http://devs.openttd.org/~truebrain/compile-farm/apple-darwin9.txt
target.Target.__init__(self, "MacOs", config, "") target.Target.__init__(self, "MacOs", config, "")
self.folder_bin="/MacOS" #self.path_bin="MacOS"
self.folder_lib="/lib" #self.path_lib="lib"
self.folder_data="/Resources" #self.path_data="Resources"
self.folder_doc="/doc" #self.path_doc="doc"
self.suffix_lib_static='.a' self.suffix_lib_static='.a'
self.suffix_lib_dynamic='.dylib' self.suffix_lib_dynamic='.dylib'
self.suffix_binary='' #self.suffix_binary=''
self.suffix_package='' #self.suffix_package=''
self.global_flags_cc.append("-D__STDCPP_LLVM__") self.global_flags_cc.append("-D__STDCPP_LLVM__")
self.pkg_path_data = "Resources"
self.pkg_path_bin = "MacOS"
self.pkg_path_lib = "lib"
self.pkg_path_license = "license"
def get_staging_folder(self, binaryName): """
return tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + binaryName + ".app/Contents/" def get_staging_path(self, binary_name):
return tools.get_run_path() + self.path_out + self.path_staging + "/" + binary_name + ".app/Contents/"
def get_staging_folder_data(self, binaryName): def get_staging_path_data(self, binary_name):
return self.get_staging_folder(binaryName) + self.folder_data + "/" return self.get_staging_path(binary_name) + self.path_data + "/"
"""
def make_package(self, pkgName, pkgProperties, basePkgPath): def make_package_binary(self, pkg_name, pkg_properties, base_pkg_path, heritage_list, static):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Generate package '" + pkgName + "'") debug.info("Generate package '" + pkg_name + "' v" + tools.version_to_string(pkg_properties["VERSION"]))
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
#output path
target_outpath = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app/Contents")
tools.create_directory_of_file(target_outpath)
if "ICON" in pkgProperties.keys() \ ## Create share datas:
and pkgProperties["ICON"] != "": self.make_package_binary_data(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
tools.copy_file(pkgProperties["ICON"], self.get_staging_folder_data(pkgName) + "/icon.icns", force=True)
## copy binary files:
self.make_package_binary_bin(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## Create libraries:
self.make_package_binary_lib(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## Create generic files:
self.make_package_generic_files(target_outpath, pkg_properties, pkg_name, base_pkg_path, heritage_list, static)
## Create icon (no convertion ==> TODO: must test if png is now supported):
if "ICON" in pkg_properties.keys() \
and pkg_properties["ICON"] != "":
tools.copy_file(pkg_properties["ICON"], os.path.join(target_outpath, "icon.icns"), force=True)
## Create info.plist file:
# http://www.sandroid.org/imcross/#Deployment # http://www.sandroid.org/imcross/#Deployment
infoFile=self.get_staging_folder(pkgName) + "/Info.plist" data_file = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
# Create the info file data_file += "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
tmpFile = open(infoFile, 'w') data_file += "<plist version=\"1.0\">\n"
tmpFile.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") data_file += " <dict>\n"
tmpFile.write("<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n") data_file += " <key>CFBundleExecutableFile</key>\n"
tmpFile.write("<plist version=\"1.0\">\n") data_file += " <string>"+pkg_name+"</string>\n"
tmpFile.write(" <dict>\n") data_file += " <key>CFBundleName</key>\n"
tmpFile.write(" <key>CFBundleExecutableFile</key>\n") data_file += " <string>"+pkg_name+"</string>\n"
tmpFile.write(" <string>"+pkgName+"</string>\n") data_file += " <key>CFBundleIdentifier</key>\n"
tmpFile.write(" <key>CFBundleName</key>\n") data_file += " <string>" + pkg_properties["COMPAGNY_TYPE"] + "." + pkg_properties["COMPAGNY_NAME2"] + "." + pkg_name + "</string>\n"
tmpFile.write(" <string>"+pkgName+"</string>\n") data_file += " <key>CFBundleSignature</key>\n"
tmpFile.write(" <key>CFBundleIdentifier</key>\n") data_file += " <string>????</string>\n"
tmpFile.write(" <string>" + pkgProperties["COMPAGNY_TYPE"] + "." + pkgProperties["COMPAGNY_NAME2"] + "." + pkgName + "</string>\n") data_file += " <key>CFBundleIconFile</key>\n"
tmpFile.write(" <key>CFBundleSignature</key>\n") data_file += " <string>icon.icns</string>\n"
tmpFile.write(" <string>????</string>\n") data_file += " </dict>\n"
tmpFile.write(" <key>CFBundleIconFile</key>\n") data_file += "</plist>\n"
tmpFile.write(" <string>icon.icns</string>\n") data_file += "\n\n"
tmpFile.write(" </dict>\n") tools.file_write_data(os.path.join(target_outpath, "Info.plist"),
tmpFile.write("</plist>\n") data_file,
tmpFile.write("\n\n") only_if_new=True)
tmpFile.flush()
tmpFile.close()
infoFile=self.get_staging_folder(pkgName) + "/PkgInfo"
# Create the info file
tmpFile = open(infoFile, 'w')
tmpFile.write("APPL????")
tmpFile.flush()
tmpFile.close()
# Create a simple interface to localy install the aplication for the shell (a shell command line interface) ## Create PkgInfo file:
shell_file_name=self.get_staging_folder(pkgName) + "/shell/" + pkgName tools.file_write_data(os.path.join(target_outpath, "PkgInfo"),
# Create the info file "APPL????",
tools.create_directory_of_file(shell_file_name) only_if_new=True)
tmpFile = open(shell_file_name, 'w')
tmpFile.write("#!/bin/bash\n") ## Create a simple interface to localy install the aplication for the shell (a shell command line interface):
tmpFile.write("# Simply open the real application in the correct way (a link does not work ...)\n") data_file = "#!/bin/bash\n"
tmpFile.write("/Applications/" + pkgName + ".app/Contents/MacOS/" + pkgName + " $*\n") data_file += "# Simply open the real application in the correct way (a link does not work ...)\n"
data_file += "/Applications/" + pkg_name + ".app/Contents/MacOS/" + pkg_name + " $*\n"
#tmpFile.write("open -n /Applications/edn.app --args -AppCommandLineArg $*\n") #tmpFile.write("open -n /Applications/edn.app --args -AppCommandLineArg $*\n")
tmpFile.flush() tools.file_write_data(os.path.join(target_outpath, "shell", pkg_name),
tmpFile.close() data_file,
only_if_new=True)
## Create the disk image of the application:
# Must create the disk image of the application debug.info("Generate disk image for '" + pkg_name + "'")
debug.info("Generate disk image for '" + pkgName + "'") output_file_name = os.path.join(self.get_final_path(), pkg_name + ".dmg")
output_file_name = self.get_final_folder() + "/" + pkgName + ".dmg"
cmd = "hdiutil create -volname " cmd = "hdiutil create -volname "
cmd += pkgName + " -srcfolder " cmd += pkg_name + " -srcpath "
cmd += tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + pkgName + ".app" cmd += os.path.join(tools.get_run_path(), self.path_out, self.path_staging, pkg_name + ".app")
cmd += " -ov -format UDZO " cmd += " -ov -format UDZO "
cmd += output_file_name cmd += output_file_name
tools.create_directory_of_file(output_file_name) tools.create_directory_of_file(output_file_name)
multiprocess.run_command_direct(cmd) multiprocess.run_command_direct(cmd)
debug.info("disk image: " + output_file_name) debug.info("disk image: " + output_file_name)
debug.info("You can have an shell interface by executing : ") ## user information:
debug.info(" sudo cp " + shell_file_name + " /usr/local/bin") #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, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Install package '" + pkgName + "'") debug.info("Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("copy " + tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + pkgName + ".app in /Applications/") debug.info("copy " + tools.get_run_path() + self.path_out + self.path_staging + "/" + pkg_name + ".app in /Applications/")
if os.path.exists("/Applications/" + pkgName + ".app") == True: if os.path.exists("/Applications/" + pkg_name + ".app") == True:
shutil.rmtree("/Applications/" + pkgName + ".app") shutil.rmtree("/Applications/" + pkg_name + ".app")
# copy the application in the basic application folder : /Applications/xxx.app # copy the application in the basic application path : /Applications/xxx.app
shutil.copytree(tools.get_run_folder() + self.folder_out + self.folder_staging + "/" + pkgName + ".app", "/Applications/" + pkgName + ".app") shutil.copytree(tools.get_run_path() + self.path_out + self.path_staging + "/" + pkg_name + ".app", "/Applications/" + pkg_name + ".app")
def un_install_package(self, pkgName): def un_install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Un-Install package '" + pkgName + "'") debug.info("Un-Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("remove OLD application /Applications/" + pkgName + ".app") debug.info("remove OLD application /Applications/" + pkg_name + ".app")
# Remove the application in the basic application folder : /Applications/xxx.app # Remove the application in the basic application path : /Applications/xxx.app
if os.path.exists("/Applications/" + pkgName + ".app") == True: if os.path.exists("/Applications/" + pkg_name + ".app") == True:
shutil.rmtree("/Applications/" + pkgName + ".app") shutil.rmtree("/Applications/" + pkg_name + ".app")

View File

@@ -50,38 +50,64 @@ class Target(target.Target):
"-static-libstdc++", "-static-libstdc++",
"-static"]) "-static"])
self.folder_bin="" #self.path_bin=""
self.folder_lib="/lib" #self.path_lib="lib"
self.folder_data="/data" #self.path_data="data"
self.folder_doc="/doc" #self.path_doc="doc"
self.pkg_path_data = "data"
self.pkg_path_bin = ""
self.pkg_path_lib = "lib"
self.pkg_path_license = "license"
self.suffix_lib_static='.a' self.suffix_lib_static='.a'
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__") self.global_flags_cc.append("-D__STDCPP_GNU__")
def get_staging_folder_data(self, binaryName): def get_staging_path_data(self, binary_name, heritage_list):
return self.get_staging_folder(binaryName) + self.folder_data return self.get_staging_path(binary_name) + self.path_data
def make_package(self, pkgName, pkgProperties, basePkgPath): def make_package_binary(self, pkg_name, pkg_properties, base_pkg_path, heritage_list, static):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Generate package '" + pkgName + "'") debug.info("Generate package '" + pkg_name + "' v" + tools.version_to_string(pkg_properties["VERSION"]))
debug.debug("------------------------------------------------------------------------")
#output path
target_outpath = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app")
tools.create_directory_of_file(target_outpath)
## Create share datas:
self.make_package_binary_data(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## copy binary files:
self.make_package_binary_bin(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## Create libraries:
self.make_package_binary_lib(target_outpath, pkg_name, base_pkg_path, heritage_list, static)
## Create generic files:
self.make_package_generic_files(target_outpath, pkg_properties, pkg_name, base_pkg_path, heritage_list, static)
def make_package_single_file(self, pkg_name, pkg_properties, base_pkg_path, heritage_list):
debug.debug("------------------------------------------------------------------------")
debug.info("Generate package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.print_element("zip", "data.zip", "<==", "data/*") debug.print_element("zip", "data.zip", "<==", "data/*")
zipPath = self.get_staging_folder(pkgName) + "/data.zip" zipPath = self.get_staging_path(pkg_name) + "/data.zip"
zip.create_zip(self.get_staging_folder_data(pkgName), zipPath) zip.create_zip(self.get_staging_path_data(pkg_name), zipPath)
binPath = self.get_staging_folder(pkgName) + "/" + self.folder_bin + "/" + pkgName + self.suffix_binary binPath = self.get_staging_path(pkg_name) + "/" + self.path_bin + "/" + pkg_name + self.suffix_binary
binSize = tools.file_size(binPath) binSize = tools.file_size(binPath)
debug.info("binarysize : " + str(binSize/1024) + " ko ==> " + str(binSize) + " octets") debug.info("binarysize : " + str(binSize/1024) + " ko ==> " + str(binSize) + " octets")
#now we create a simple bundle binary ==> all file is stored in one file ... #now we create a simple bundle binary ==> all file is stored in one file ...
self.get_staging_folder(pkgName) self.get_staging_path(pkg_name)
finalBin = self.get_final_folder() + "/" + pkgName + self.suffix_binary finalBin = self.get_final_path() + "/" + pkg_name + self.suffix_binary
tools.create_directory_of_file(finalBin); tools.create_directory_of_file(finalBin);
debug.print_element("pkg", finalBin, "<==", pkgName + self.suffix_binary) debug.print_element("pkg", finalBin, "<==", pkg_name + self.suffix_binary)
#open output file #open output file
tmpFile = open(finalBin, 'wb') tmpFile = open(finalBin, 'wb')
# read all executable binary # read all executable binary
@@ -118,16 +144,16 @@ class Target(target.Target):
tmpFile.close() tmpFile.close()
debug.verbose("zip position=" + str(positionOfZip) + " = 0x" + h) debug.verbose("zip position=" + str(positionOfZip) + " = 0x" + h)
def install_package(self, pkgName): def install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Install package '" + pkgName + "'") debug.info("Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.warning(" ==> TODO") debug.warning(" ==> TODO")
#sudo dpkg -i $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package #sudo dpkg -i $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package
def un_install_package(self, pkgName): def un_install_package(self, pkg_name):
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.info("Un-Install package '" + pkgName + "'") debug.info("Un-Install package '" + pkg_name + "'")
debug.debug("------------------------------------------------------------------------") debug.debug("------------------------------------------------------------------------")
debug.warning(" ==> TODO") debug.warning(" ==> TODO")
#sudo dpkg -r $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package #sudo dpkg -r $(TARGET_OUT_FINAL)/$(PROJECT_NAME) + self.suffix_package

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.6.4', version='0.7.4',
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',
@@ -19,19 +19,21 @@ setup(name='lutin',
'lutin/z_system', 'lutin/z_system',
'lutin/z_target'], 'lutin/z_target'],
classifiers=[ classifiers=[
'Development Status :: 3 - Alpha', 'Development Status :: 4 - Beta',
'License :: OSI Approved :: Apache Software License', 'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python', 'Programming Language :: Python',
'Topic :: Software Development :: Compilers', 'Topic :: Software Development :: Compilers',
], ],
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=[ # Does not work on MacOs
('/etc/bash_completion.d', ['bash-autocompletion/lutin']), #data_file=[
], # ('/etc/bash_completion.d', ['bash-autocompletion/lutin']),
#],
include_package_data = True, include_package_data = True,
zip_safe=False) zip_safe=False)
#To developp: ./setup.py install/develop #To developp: sudo ./setup.py install
# sudo ./setup.py develop
#TO register all in pip: ./setup.py register sdist upload #TO register all in pip: ./setup.py register sdist upload