From 9686a98276b48e8409a910c0f920cbba7a0f346f Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Sat, 4 Apr 2020 13:54:40 +0200 Subject: [PATCH 1/5] command line option to add to the assets/ directory --- .../bootstraps/common/build/build.py | 17 +++++++++++++++-- pythonforandroid/toolchain.py | 8 ++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index 6b5c87b5c3..6cd67b7171 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -239,9 +239,10 @@ def make_package(args): assets_dir = "src/main/assets" # Delete the old assets. - try_unlink(join(assets_dir, 'public.mp3')) - try_unlink(join(assets_dir, 'private.mp3')) ensure_dir(assets_dir) + shutil.rmtree(assets_dir) + ensure_dir(assets_dir) + open(os.path.join(assets_dir, ".gitkeep"), 'a').close() # Add extra environment variable file into tar-able directory: env_vars_tarpath = tempfile.mkdtemp(prefix="p4a-extra-env-") @@ -304,6 +305,15 @@ def make_package(args): tar_dirs.append(python_bundle_dir) if get_bootstrap_name() == "webview": tar_dirs.append('webview_includes') + if hasattr(args, "assets") and args.assets is not None: + for asset in args.assets: + asset_src, asset_dest = asset.split(":") + if isfile(realpath(asset_src)): + ensure_dir(dirname(join(assets_dir, asset_dest))) + shutil.copy(realpath(asset_src), join(assets_dir, asset_dest)) + else: + shutil.copytree(realpath(asset_src), join(assets_dir, asset_dest)) + if args.private or args.launcher: make_tar( join(assets_dir, 'private.mp3'), tar_dirs, args.ignore_path, @@ -598,6 +608,9 @@ def parse_args_and_make_package(args=None): help='Custom key=value to add in application metadata') ap.add_argument('--uses-library', dest='android_used_libs', action='append', default=[], help='Used shared libraries included using tag in AndroidManifest.xml') + ap.add_argument('--asset', dest='assets', + action="append", + help=('Put this in the assets folder')) ap.add_argument('--icon', dest='icon', help=('A png file to use as the icon for ' 'the application.')) diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index 955d8a8a52..0f481e5bb5 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -494,6 +494,10 @@ def add_parser(subparsers, *args, **kwargs): # However, it is also needed before the distribution is finally # assembled for locating the setup.py / other build systems, which # is why we also add it here: + parser_apk.add_argument( + '--add-asset', dest='assets', + action="append", + help=('Put this in the assets folder')) parser_apk.add_argument( '--private', dest='private', help='the directory with the app source code files' + @@ -582,6 +586,10 @@ def add_parser(subparsers, *args, **kwargs): args.unknown_args += ["--private", args.private] if hasattr(args, "build_mode") and args.build_mode == "release": args.unknown_args += ["--release"] + if hasattr(args, "assets") and args.assets is not None: + # Pass this value on to the internal bootstrap build.py: + for asset in args.assets: + args.unknown_args += ["--asset", os.path.abspath(asset)+":"+asset] if hasattr(args, "ignore_setup_py") and args.ignore_setup_py: args.use_setup_py = False From 975162e027f809c158c7245b9ecf784fdec6a891 Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Sat, 4 Apr 2020 14:06:57 +0200 Subject: [PATCH 2/5] allow custom destination paths --- pythonforandroid/bootstraps/common/build/build.py | 4 ++-- pythonforandroid/toolchain.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index 6cd67b7171..07b61b527b 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -239,8 +239,8 @@ def make_package(args): assets_dir = "src/main/assets" # Delete the old assets. - ensure_dir(assets_dir) - shutil.rmtree(assets_dir) + if os.path.exists(assets_dir): + shutil.rmtree(assets_dir) ensure_dir(assets_dir) open(os.path.join(assets_dir, ".gitkeep"), 'a').close() diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index 0f481e5bb5..eb56de244e 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -589,7 +589,11 @@ def add_parser(subparsers, *args, **kwargs): if hasattr(args, "assets") and args.assets is not None: # Pass this value on to the internal bootstrap build.py: for asset in args.assets: - args.unknown_args += ["--asset", os.path.abspath(asset)+":"+asset] + if ":" in asset: + asset_src, asset_dest = asset.split(":") + else: + asset_src = asset_dest = asset + args.unknown_args += ["--asset", os.path.abspath(asset_src)+":"+asset_dest] if hasattr(args, "ignore_setup_py") and args.ignore_setup_py: args.use_setup_py = False From bd685027e74018205e905f9c8e2dd3659451b39b Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Sun, 26 Apr 2020 18:18:50 +0200 Subject: [PATCH 3/5] code review suggestions --- .../bootstraps/common/build/build.py | 32 +++++++------------ pythonforandroid/toolchain.py | 19 ++++++----- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index 07b61b527b..a914c74402 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -86,17 +86,10 @@ def get_bootstrap_name(): environment = jinja2.Environment(loader=jinja2.FileSystemLoader( join(curdir, 'templates'))) - -def try_unlink(fn): - if exists(fn): - os.unlink(fn) - - def ensure_dir(path): if not exists(path): makedirs(path) - def render(template, dest, **kwargs): '''Using jinja2, render `template` to the filename `dest`, supplying the @@ -239,10 +232,8 @@ def make_package(args): assets_dir = "src/main/assets" # Delete the old assets. - if os.path.exists(assets_dir): - shutil.rmtree(assets_dir) + shutil.rmtree(assets_dir, ignore_errors=True) ensure_dir(assets_dir) - open(os.path.join(assets_dir, ".gitkeep"), 'a').close() # Add extra environment variable file into tar-able directory: env_vars_tarpath = tempfile.mkdtemp(prefix="p4a-extra-env-") @@ -305,14 +296,14 @@ def make_package(args): tar_dirs.append(python_bundle_dir) if get_bootstrap_name() == "webview": tar_dirs.append('webview_includes') - if hasattr(args, "assets") and args.assets is not None: - for asset in args.assets: - asset_src, asset_dest = asset.split(":") - if isfile(realpath(asset_src)): - ensure_dir(dirname(join(assets_dir, asset_dest))) - shutil.copy(realpath(asset_src), join(assets_dir, asset_dest)) - else: - shutil.copytree(realpath(asset_src), join(assets_dir, asset_dest)) + + for asset in args.assets: + asset_src, asset_dest = asset.split(":") + if isfile(realpath(asset_src)): + ensure_dir(dirname(join(assets_dir, asset_dest))) + shutil.copy(realpath(asset_src), join(assets_dir, asset_dest)) + else: + shutil.copytree(realpath(asset_src), join(assets_dir, asset_dest)) if args.private or args.launcher: make_tar( @@ -609,8 +600,9 @@ def parse_args_and_make_package(args=None): ap.add_argument('--uses-library', dest='android_used_libs', action='append', default=[], help='Used shared libraries included using tag in AndroidManifest.xml') ap.add_argument('--asset', dest='assets', - action="append", - help=('Put this in the assets folder')) + action="append", default=[], + metavar="/path/to/source:dest" + help='Put this in the assets folder at assets/dest') ap.add_argument('--icon', dest='icon', help=('A png file to use as the icon for ' 'the application.')) diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index eb56de244e..3e73fe25a9 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -496,8 +496,8 @@ def add_parser(subparsers, *args, **kwargs): # is why we also add it here: parser_apk.add_argument( '--add-asset', dest='assets', - action="append", - help=('Put this in the assets folder')) + action="append", default=[], + help='Put this in the assets folder in the apk.') parser_apk.add_argument( '--private', dest='private', help='the directory with the app source code files' + @@ -586,14 +586,13 @@ def add_parser(subparsers, *args, **kwargs): args.unknown_args += ["--private", args.private] if hasattr(args, "build_mode") and args.build_mode == "release": args.unknown_args += ["--release"] - if hasattr(args, "assets") and args.assets is not None: - # Pass this value on to the internal bootstrap build.py: - for asset in args.assets: - if ":" in asset: - asset_src, asset_dest = asset.split(":") - else: - asset_src = asset_dest = asset - args.unknown_args += ["--asset", os.path.abspath(asset_src)+":"+asset_dest] + for asset in args.assets: + if ":" in asset: + asset_src, asset_dest = asset.split(":") + else: + asset_src = asset_dest = asset + # take abspath now, because build.py will be run in bootstrap dir + args.unknown_args += ["--asset", os.path.abspath(asset_src)+":"+asset_dest] if hasattr(args, "ignore_setup_py") and args.ignore_setup_py: args.use_setup_py = False From e5aff0c7b12ee42e1399d0877c326475ee584c71 Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Mon, 27 Apr 2020 07:18:25 +0200 Subject: [PATCH 4/5] fix bugs sleepliy introduced in commit "code review suggestions" --- .../bootstraps/common/build/build.py | 2 +- pythonforandroid/toolchain.py | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index 864f1ad4b6..a38713aaed 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -602,7 +602,7 @@ def parse_args_and_make_package(args=None): help='Used shared libraries included using tag in AndroidManifest.xml') ap.add_argument('--asset', dest='assets', action="append", default=[], - metavar="/path/to/source:dest" + metavar="/path/to/source:dest", help='Put this in the assets folder at assets/dest') ap.add_argument('--icon', dest='icon', help=('A png file to use as the icon for ' diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index d31002e576..90bcb5e149 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -491,7 +491,7 @@ def add_parser(subparsers, *args, **kwargs): # However, it is also needed before the distribution is finally # assembled for locating the setup.py / other build systems, which # is why we also add it here: - parser_packaging.add_argument( + parser_packaging.add_argument( '--add-asset', dest='assets', action="append", default=[], help='Put this in the assets folder in the apk.') @@ -593,13 +593,6 @@ def add_parser(subparsers, *args, **kwargs): args.unknown_args += ["--private", args.private] if hasattr(args, "build_mode") and args.build_mode == "release": args.unknown_args += ["--release"] - for asset in args.assets: - if ":" in asset: - asset_src, asset_dest = asset.split(":") - else: - asset_src = asset_dest = asset - # take abspath now, because build.py will be run in bootstrap dir - args.unknown_args += ["--asset", os.path.abspath(asset_src)+":"+asset_dest] if hasattr(args, "ignore_setup_py") and args.ignore_setup_py: args.use_setup_py = False @@ -960,6 +953,14 @@ def _fix_args(args): fix_args = ('--dir', '--private', '--add-jar', '--add-source', '--whitelist', '--blacklist', '--presplash', '--icon') unknown_args = args.unknown_args + + for asset in args.assets: + if ":" in asset: + asset_src, asset_dest = asset.split(":") + else: + asset_src = asset_dest = asset + # take abspath now, because build.py will be run in bootstrap dir + unknown_args += ["--asset", os.path.abspath(asset_src)+":"+asset_dest] for i, arg in enumerate(unknown_args): argx = arg.split('=') if argx[0] in fix_args: From e97872e3273bc5340f3a8043f6cfb702064c616d Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Mon, 27 Apr 2020 09:31:23 +0200 Subject: [PATCH 5/5] flake8 compliance --- pythonforandroid/bootstraps/common/build/build.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index a38713aaed..6b902dd0b1 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -86,10 +86,12 @@ def get_bootstrap_name(): environment = jinja2.Environment(loader=jinja2.FileSystemLoader( join(curdir, 'templates'))) + def ensure_dir(path): if not exists(path): makedirs(path) + def render(template, dest, **kwargs): '''Using jinja2, render `template` to the filename `dest`, supplying the