44
44
45
45
from colorama import Style , Fore
46
46
47
+ DEFAULT_ANDROID_API = 14
48
+
47
49
48
50
logger = logging .getLogger ('p4a' )
49
51
# logger.setLevel(logging.DEBUG)
@@ -126,7 +128,10 @@ def require_prebuilt_dist(func):
126
128
@wraps (func )
127
129
def wrapper_func (self , args ):
128
130
ctx = self .ctx
129
- ctx .prepare_build_environment ()
131
+ ctx .prepare_build_environment (user_sdk_dir = self .sdk_dir ,
132
+ user_ndk_dir = self .ndk_dir ,
133
+ user_android_api = self .android_api ,
134
+ user_ndk_version = self .ndk_version )
130
135
dist = self ._dist
131
136
if dist .needs_build :
132
137
info ('No dist exists that meets your requirements, so one will '
@@ -537,7 +542,8 @@ def ndk_dir(self):
537
542
def ndk_dir (self , value ):
538
543
self ._ndk_dir = value
539
544
540
- def prepare_build_environment (self ):
545
+ def prepare_build_environment (self , user_sdk_dir , user_ndk_dir ,
546
+ user_android_api , user_ndk_version ):
541
547
'''Checks that build dependencies exist and sets internal variables
542
548
for the Android SDK etc.
543
549
@@ -549,10 +555,52 @@ def prepare_build_environment(self):
549
555
550
556
ok = True
551
557
558
+ # Work out where the Android SDK is
559
+ sdk_dir = None
560
+ if user_sdk_dir :
561
+ sdk_dir = user_sdk_dir
562
+ if sdk_dir is None :
563
+ sdk_dir = environ .get ('ANDROIDSDK' , None )
564
+ if sdk_dir is None :
565
+ sdk_dir = environ .get ('ANDROID_HOME' , None )
566
+ if sdk_dir is None :
567
+ warning ('Android SDK dir was not specified, exiting.' )
568
+ exit (1 )
569
+
570
+ # Check what Android API we're using, and install platform
571
+ # tools if necessary
572
+ android_api = None
573
+ if user_android_api :
574
+ android_api = user_android_api
575
+ if android_api is None :
576
+ android_api = environ .get ('ANDROIDAPI' , None )
577
+ if android_api is None :
578
+ info ('Android API target was not set manually, using '
579
+ 'the default of {}' .format (DEFAULT_ANDROID_API ))
580
+ android_api = DEFAULT_ANDROID_API
581
+ android_api = int (android_api )
582
+
583
+ android = sh .Command (join (sdk_dir , 'tools' , 'android' ))
584
+ targets = android ('list' ).stdout .split ('\n ' )
585
+ apis = [s for s in targets if re .match (r'^ *API level: ' , s )]
586
+ apis = [int (re .findall (r'[0-9]+' , s )[0 ]) for s in apis ]
587
+ info ('Available Android APIs are ({})' .format (', ' .join (map (str , apis ))))
588
+ if android_api in apis :
589
+ info ('Requested API target {} is available, continuing.' .format (android_api ))
590
+ else :
591
+ warning ('Requested API target {} is not available, exiting.' .format (android_api ))
592
+ exit (1 )
593
+
594
+ exit (1 )
595
+
596
+
597
+
598
+
599
+ self .sdk_dir = environ .get ('ANDROIDSDK' , None )
600
+
552
601
# AND: We should check for ndk-build and ant?
553
602
self .android_api = environ .get ('ANDROIDAPI' , '14' )
554
603
self .ndk_ver = environ .get ('ANDROIDNDKVER' , 'r9' )
555
- self .sdk_dir = environ .get ('ANDROIDSDK' , None )
556
604
if self .sdk_dir is None :
557
605
ok = False
558
606
self .ndk_dir = environ .get ('ANDROIDNDK' , None )
@@ -1955,7 +2003,7 @@ def __init__(self):
1955
2003
self ._ctx = None
1956
2004
1957
2005
parser = argparse .ArgumentParser (
1958
- description = "Tool for managing the iOS / Python toolchain" ,
2006
+ description = "Tool for managing the Android / Python toolchain" ,
1959
2007
usage = """toolchain <command> [<args>]
1960
2008
1961
2009
Currently available commands:
@@ -1977,8 +2025,20 @@ def __init__(self):
1977
2025
clean_dists
1978
2026
""" )
1979
2027
parser .add_argument ("command" , help = "Command to run" )
2028
+
2029
+ # General options
1980
2030
parser .add_argument ('--debug' , dest = 'debug' , action = 'store_true' ,
1981
2031
help = 'Display debug output and all build info' )
2032
+ parser .add_argument ('--sdk_dir' , dest = 'sdk_dir' , default = '' ,
2033
+ help = 'The filepath where the Android SDK is installed' )
2034
+ parser .add_argument ('--ndk_dir' , dest = 'ndk_dir' , default = '' ,
2035
+ help = 'The filepath where the Android NDK is installed' )
2036
+ parser .add_argument ('--android_api' , dest = 'android_api' , default = 0 , type = int ,
2037
+ help = 'The Android API level to build against.' )
2038
+ parser .add_argument ('--ndk_version' , dest = 'ndk_version' , default = '' ,
2039
+ help = ('The version of the Android NDK. This is optional, '
2040
+ 'we try to work it out automatically from the ndk_dir.' ))
2041
+
1982
2042
1983
2043
# Options for specifying the Distribution
1984
2044
parser .add_argument (
@@ -2011,6 +2071,10 @@ def __init__(self):
2011
2071
2012
2072
if args .debug :
2013
2073
logger .setLevel (logging .DEBUG )
2074
+ self .sdk_dir = args .sdk_dir
2075
+ self .ndk_dir = args .ndk_dir
2076
+ self .android_api = args .android_api
2077
+ self .ndk_version = args .ndk_version
2014
2078
2015
2079
# import ipdb
2016
2080
# ipdb.set_trace()
0 commit comments