From 92a0e5198c9fd570c9cc419cc7c4b157ac17700a Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Fri, 4 Nov 2016 22:54:25 +0100 Subject: [PATCH] [DEV] add base of emscripten build for firefox test --- lutin/module.py | 1 - lutin/target.py | 12 ++ lutin/z_target/lutinTarget_Web.py | 229 ++++++++++++++++++++++++++++++ 3 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 lutin/z_target/lutinTarget_Web.py diff --git a/lutin/module.py b/lutin/module.py index 8a7456c..c7f229a 100644 --- a/lutin/module.py +++ b/lutin/module.py @@ -888,7 +888,6 @@ class Module: target.make_package(self._name, self._package_prop, os.path.join(self._origin_path, ".."), self._sub_heritage_list) else: target.make_package(self._name, self._package_prop, os.path.join(self._origin_path, ".."), self._sub_heritage_list) - # return local dependency ... return copy.deepcopy(self._sub_heritage_list) diff --git a/lutin/target.py b/lutin/target.py index 4293c8d..dc74957 100644 --- a/lutin/target.py +++ b/lutin/target.py @@ -923,6 +923,18 @@ class Target: tools.copy_file(path_src, path_dst, in_list=copy_list) + try: + path_src = self.get_build_file_bin(pkg_name) + path_src = path_src[:len(path_src)-4] + "js" + path_dst = os.path.join(path_package_bin, pkg_name + self.suffix_binary2) + debug.verbose("path_dst: " + str(path_dst)) + tools.copy_file(path_src, + path_dst, + in_list=copy_list) + except: + debug.extreme_verbose("can not find : " + path_src) + pass + #real copy files ret_copy = tools.copy_list(copy_list) ret_remove = False diff --git a/lutin/z_target/lutinTarget_Web.py b/lutin/z_target/lutinTarget_Web.py new file mode 100644 index 0000000..1672dc3 --- /dev/null +++ b/lutin/z_target/lutinTarget_Web.py @@ -0,0 +1,229 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +## +## @author Edouard DUPIN +## +## @copyright 2012, Edouard DUPIN, all right reserved +## +## @license APACHE v2.0 (see license file) +## + +from lutin import debug +from lutin import target +from lutin import tools +from lutin import env +import os +import stat +import re +from lutin import host +from lutin import depend +from lutin import zip +from lutin import multiprocess +import lutinTarget_Linux + + +class Target(lutinTarget_Linux.Target): + def __init__(self, config, sub_name=[]): + lutinTarget_Linux.Target.__init__(self, config, ["Web"] + sub_name) + + self.cross ="/home/heero/dev/perso/emsdk_portable/emscripten/master/em" + debug.debug("== Target='em'"); + self.java = "javac" + self.javah = "javah" + self.jar = "jar" + self.ar = self.cross + "ar" + self.ranlib = self.cross + "ranlib" + self.cc = self.cross + "cc" + self.xx = self.cross + "++" + self.ar = self.cross + "ar" + + self.xx_version = [0,0,0] + self.ld = self.cross + "ld" + self.nm = self.cross + "nm" + self.strip = self.cross + "strip" + self.dlltool = self.cross + "dlltool" + self._update_path_tree() + + self.stdlib_name_libgcc = "" + self.stdlib_name_libsupc = ""; + self.suffix_binary = '.html' + self.suffix_binary2 = '.js' + + self.pkg_path_bin = "" + + # Disable capabiliteis to compile in shared mode + self.support_dynamic_link = False + # create temporary file: + self._file_data_tmp = os.path.join(self.get_build_path_temporary_generate(""), "tmp_file_data.zip") + tools.file_write_data(self._file_data_tmp, "coucou", only_if_new=True) + # add default file (need to generate a empty file to add it before loading: + self.add_flag("link", [ + "--preload-file " + self._file_data_tmp, + #" -s FULL_ES2=1 " + ]) + # in the output.js this generate a section '{"audio": 0, "start": 0, "crunched": 0, "end": 6, "filename": "/out/Web_x86_64/debug/build/gcc/generate/tmp_file_data.zip"}], "remote_package_size": 6' ==> that will be replaced by the corretc data in the file 'module.data' + + """ + .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.debug("-- 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, tmp=True), pkg_name + ".app") + tools.create_directory_of_file(target_outpath) + + ## Create share datas: + ret_share = self.make_package_binary_data(target_outpath, "zz_generic_zz", base_pkg_path, heritage_list, static) + + ## copy binary files: + ret_bin = self.make_package_binary_bin(target_outpath, pkg_name, base_pkg_path, heritage_list, static) + + ## Create libraries: + ret_lib = self.make_package_binary_lib(target_outpath, pkg_name, base_pkg_path, heritage_list, static) + + ## Create generic files: + ret_file = self.make_package_generic_files(target_outpath, pkg_properties, pkg_name, base_pkg_path, heritage_list, static) + + ## end of the package generation + build_package_path_done = os.path.join(self.get_build_path(pkg_name), "generatePackageDone.txt") + #Check date between the current file "list of action to generate package and the end of package generation + need_generate_package = depend.need_re_package(build_package_path_done, [__file__], True) + + ## create the package: + if ret_share \ + or ret_bin \ + or ret_lib \ + or ret_file \ + or need_generate_package or True: + # Zip the data + debug.print_element("zip", "data.zip", "<==", os.path.join(self.get_staging_path(pkg_name, tmp=True), pkg_name + ".app/share/*")) + zip_path = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app", pkg_name + ".data") + zip.create_zip([ + self.get_staging_path(pkg_name, tmp=True) + "/" + pkg_name + ".app/share/", + target_outpath + "/pkg" + ], zip_path) + # copy if needed the binary: + tools.copy_file( + os.path.join(self.get_staging_path(pkg_name, tmp=True), pkg_name + ".app", pkg_name + self.suffix_binary), + os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app", pkg_name + self.suffix_binary), + force_identical=True) + + # patch the .js file to update the new real data ... + js_file_data = tools.file_read_data(os.path.join(self.get_staging_path(pkg_name, tmp=True), pkg_name + ".app", pkg_name + self.suffix_binary2)) + data_to_replace = '"end": 6, "filename": "/' + os.path.relpath(self._file_data_tmp) + '"}], "remote_package_size": 6' + data_size = str(tools.file_size(zip_path)) + replace_with = '"end": ' + data_size + ', "filename": "/data.zip"}], "remote_package_size": ' + data_size + debug.print_element("js", pkg_name + ".data", "<==", "correct zip name and data") + tools.file_write_data(os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app", pkg_name + self.suffix_binary2), + js_file_data.replace(data_to_replace, replace_with), + only_if_new = True) + + zip_path_final = os.path.join(self.get_final_path(), pkg_name + ".data") + # generate deployed zip (for user) + debug.print_element("zip", pkg_name + ".zip", "<==", self.get_staging_path(pkg_name), pkg_name + ".zip") + zip.create_zip_file([ + zip_path, + os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app", pkg_name + self.suffix_binary) + ], + pkg_name + ".app", + zip_path_final) + + tools.file_write_data(build_package_path_done, "done...") + ## create the package: + """ + if ret_share \ + or ret_bin \ + or ret_lib \ + or ret_file \ + or need_generate_package: + debug.debug("package : " + os.path.join(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(os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app.tar.gz"), os.path.join(self.get_final_path(), pkg_name + ".app.gpkg")) + # package is done corectly ... + tools.file_write_data(build_package_path_done, "done...") + """ + + def install_package(self, pkg_name): + debug.debug("------------------------------------------------------------------------") + debug.info("-- Install package '" + pkg_name + "'") + debug.debug("------------------------------------------------------------------------") + # this is temporary ... Will call: + if False: + os.system("lutin-pkg -i " + os.path.join(self.get_final_path(), + pkg_name + ".app.gpkg")) + else: + #Copy directly from staging path: + appl_path = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app") + target_path = os.path.join(os.path.expanduser("~"), ".local", "application", pkg_name + ".app") + target_bin_path = os.path.join(os.path.expanduser("~"), ".local", "application", pkg_name + ".app", "bin", pkg_name) + target_bin_link = os.path.join(os.path.expanduser("~"), ".local", "application", pkg_name) + # remove output path: + tools.remove_path_and_sub_path(target_path) + # remove executable link version: + tools.remove_file(target_bin_link) + # copy result: + tools.copy_anything(appl_path, target_path, recursive=True) + # create synbolic link: + debug.info("kkk " + "ln -s " + target_bin_path + " " + target_bin_link) + os.symlink(target_bin_path, target_bin_link) + + def un_install_package(self, pkg_name): + debug.debug("------------------------------------------------------------------------") + debug.info("-- Un-Install package '" + pkg_name + "'") + debug.debug("------------------------------------------------------------------------") + # this is temporary ... Will call: + if False: + os.system("lutin-pkg -r " + pkg_name) + else: + #Copy directly from staging path: + target_path = os.path.join(os.path.expanduser("~"), ".local", "application", pkg_name + ".app") + target_bin_link = os.path.join(os.path.expanduser("~"), ".local", "application", pkg_name) + # remove output path: + tools.remove_path_and_sub_path(target_path) + # remove executable link version: + tools.remove_file(target_bin_link) + + def run(self, pkg_name, option_list): + debug.debug("------------------------------------------------------------------------") + debug.info("-- Run package '" + pkg_name + "' + option: " + str(option_list)) + debug.debug("------------------------------------------------------------------------") + appl_path = os.path.join(self.get_staging_path(pkg_name), pkg_name + ".app", pkg_name + ".html") + cmd = "firefox " + appl_path + " " + for elem in option_list: + cmd += elem + " " + multiprocess.run_command_no_lock_out(cmd) + debug.debug("------------------------------------------------------------------------") + debug.info("-- Run package '" + pkg_name + "' Finished") + debug.debug("------------------------------------------------------------------------") + +