@@ -53,10 +53,6 @@ def get_bootstrap_name():
5353
5454curdir = dirname (__file__ )
5555
56- PYTHON = get_hostpython ()
57- if PYTHON is not None and not exists (PYTHON ):
58- PYTHON = None
59-
6056BLACKLIST_PATTERNS = [
6157 # code versionning
6258 '^*.hg/*' ,
@@ -75,9 +71,19 @@ def get_bootstrap_name():
7571]
7672
7773WHITELIST_PATTERNS = []
78- if get_bootstrap_name () in ('sdl2' , 'webview' , 'service_only' ):
79- WHITELIST_PATTERNS .append ('pyconfig.h' )
8074
75+ if os .environ .get ("P4A_BUILD_IS_RUNNING_UNITTESTS" , "0" ) != "1" :
76+ PYTHON = get_hostpython ()
77+ _bootstrap_name = get_bootstrap_name ()
78+ else :
79+ PYTHON = "python3"
80+ _bootstrap_name = "sdl2"
81+
82+ if PYTHON is not None and not exists (PYTHON ):
83+ PYTHON = None
84+
85+ if _bootstrap_name in ('sdl2' , 'webview' , 'service_only' ):
86+ WHITELIST_PATTERNS .append ('pyconfig.h' )
8187
8288environment = jinja2 .Environment (loader = jinja2 .FileSystemLoader (
8389 join (curdir , 'templates' )))
@@ -646,6 +652,44 @@ def make_package(args):
646652 subprocess .check_output (patch_command )
647653
648654
655+ def parse_permissions (args_permissions ):
656+ if args_permissions and isinstance (args_permissions [0 ], list ):
657+ args_permissions = [p for perm in args_permissions for p in perm ]
658+
659+ def _is_advanced_permission (permission ):
660+ return permission .startswith ("(" ) and permission .endswith (")" )
661+
662+ def _decode_advanced_permission (permission ):
663+ SUPPORTED_PERMISSION_PROPERTIES = ["name" , "maxSdkVersion" , "usesPermissionFlags" ]
664+ _permission_args = permission [1 :- 1 ].split (";" )
665+ _permission_args = (arg .split ("=" ) for arg in _permission_args )
666+ advanced_permission = dict (_permission_args )
667+
668+ if "name" not in advanced_permission :
669+ raise ValueError ("Advanced permission must have a name property" )
670+
671+ for key in advanced_permission .keys ():
672+ if key not in SUPPORTED_PERMISSION_PROPERTIES :
673+ raise ValueError (
674+ f"Property '{ key } ' is not supported. "
675+ "Advanced permission only supports: "
676+ f"{ ', ' .join (SUPPORTED_PERMISSION_PROPERTIES )} properties"
677+ )
678+
679+ return advanced_permission
680+
681+ _permissions = []
682+ for permission in args_permissions :
683+ if _is_advanced_permission (permission ):
684+ _permissions .append (_decode_advanced_permission (permission ))
685+ else :
686+ if "." in permission :
687+ _permissions .append (dict (name = permission ))
688+ else :
689+ _permissions .append (dict (name = f"android.permission.{ permission } " ))
690+ return _permissions
691+
692+
649693def parse_args_and_make_package (args = None ):
650694 global BLACKLIST_PATTERNS , WHITELIST_PATTERNS , PYTHON
651695
@@ -918,8 +962,7 @@ def _read_configuration():
918962 'deprecated and does nothing.' )
919963 args .sdk_version = - 1 # ensure it is not used
920964
921- if args .permissions and isinstance (args .permissions [0 ], list ):
922- args .permissions = [p for perm in args .permissions for p in perm ]
965+ args .permissions = parse_permissions (args .permissions )
923966
924967 if args .res_xmls and isinstance (args .res_xmls [0 ], list ):
925968 args .res_xmls = [x for res in args .res_xmls for x in res ]
@@ -959,4 +1002,6 @@ def _read_configuration():
9591002
9601003
9611004if __name__ == "__main__" :
1005+ if get_bootstrap_name () in ('sdl2' , 'webview' , 'service_only' ):
1006+ WHITELIST_PATTERNS .append ('pyconfig.h' )
9621007 parse_args_and_make_package ()
0 commit comments