From 1c469abb46b04ed1cc316b42442d0c40f0f46259 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Fri, 5 May 2017 18:31:11 +0200 Subject: [PATCH 01/27] fixes library.references missing new line on newer project.properties --- buildozer/targets/android.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildozer/targets/android.py b/buildozer/targets/android.py index 6454cdc..2e46367 100644 --- a/buildozer/targets/android.py +++ b/buildozer/targets/android.py @@ -820,6 +820,8 @@ class TargetAndroid(Target): # recreate the project.properties with io.open(project_fn, 'w', encoding='utf-8') as fd: fd.writelines((line.encode('utf-8') for line in content)) + if not content[-1].endswith(u'\n'): + fd.write(u'\n') for index, ref in enumerate(references): fd.write(u'android.library.reference.{}={}\n'.format(index + 1, ref)) From 7b2a2712db713a4ea6c3fd5f198600bf74083a11 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Fri, 5 May 2017 18:33:07 +0200 Subject: [PATCH 02/27] fixes library.references missing new line on newer project.properties --- buildozer/targets/android.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/buildozer/targets/android.py b/buildozer/targets/android.py index 2e46367..8a49a71 100644 --- a/buildozer/targets/android.py +++ b/buildozer/targets/android.py @@ -819,7 +819,10 @@ class TargetAndroid(Target): # recreate the project.properties with io.open(project_fn, 'w', encoding='utf-8') as fd: - fd.writelines((line.encode('utf-8') for line in content)) + try: + fd.writelines((line.encode('utf-8') for line in content)) + except: + fd.writelines(content) if not content[-1].endswith(u'\n'): fd.write(u'\n') for index, ref in enumerate(references): From bb643ce15b7fc87f559ded2fe5a80c43dbadc39d Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 6 May 2017 18:02:19 +0200 Subject: [PATCH 03/27] gradle: start supporting gradle-based build (sdl2_gradle) --- buildozer/targets/android.py | 37 +++++++++++++++++++++----------- buildozer/targets/android_new.py | 2 ++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/buildozer/targets/android.py b/buildozer/targets/android.py index 8a49a71..ec7c012 100644 --- a/buildozer/targets/android.py +++ b/buildozer/targets/android.py @@ -763,23 +763,36 @@ class TargetAndroid(Target): pass # XXX found how the apk name is really built from the title - bl = u'\'" ,' - apptitle = config.get('app', 'title') - if hasattr(apptitle, 'decode'): - apptitle = apptitle.decode('utf-8') - apktitle = ''.join([x for x in apptitle if x not in bl]) - apk = u'{title}-{version}-{mode}.apk'.format( - title=apktitle, - version=version, - mode=mode) + if exists(join(dist_dir, "build.gradle")): + # on gradle build, the apk use the package name, and have no version + packagename = config.get('app', 'package.name') + apk = u'{packagename}-{mode}.apk'.format( + packagename=packagename, mode=mode) + apk_dir = join(dist_dir, "build", "outputs", "apk") + apk_dest = u'{packagename}-{version}-{mode}.apk'.format( + packagename=packagename, mode=mode, version=version) + + else: + # on ant, the apk use the title, and have version + bl = u'\'" ,' + apptitle = config.get('app', 'title') + if hasattr(apptitle, 'decode'): + apptitle = apptitle.decode('utf-8') + apktitle = ''.join([x for x in apptitle if x not in bl]) + apk = u'{title}-{version}-{mode}.apk'.format( + title=apktitle, + version=version, + mode=mode) + apk_dir = join(dist_dir, "bin") + apk_dest = apk # copy to our place - copyfile(join(dist_dir, 'bin', apk), join(self.buildozer.bin_dir, apk)) + copyfile(join(apk_dir, apk), join(self.buildozer.bin_dir, apk_dest)) self.buildozer.info('Android packaging done!') self.buildozer.info( - u'APK {0} available in the bin directory'.format(apk)) - self.buildozer.state['android:latestapk'] = apk + u'APK {0} available in the bin directory'.format(apk_dest)) + self.buildozer.state['android:latestapk'] = apk_dest self.buildozer.state['android:latestmode'] = self.build_mode def _update_libraries_references(self, dist_dir): diff --git a/buildozer/targets/android_new.py b/buildozer/targets/android_new.py index fbefa2a..882e4c5 100644 --- a/buildozer/targets/android_new.py +++ b/buildozer/targets/android_new.py @@ -98,6 +98,8 @@ class TargetAndroidNew(TargetAndroid): elif option == "--sdk": cmd.append("--android_api") cmd.extend(values) + cmd.append("--sdk") + cmd.extend(values) else: cmd.extend(args) From a9de15a90540c0fd766ffc1ca294db2914a85bc8 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sun, 7 May 2017 00:06:22 +0200 Subject: [PATCH 04/27] add support for gradle dependencies and aar --- buildozer/default.spec | 8 ++++++++ buildozer/targets/android.py | 5 ++++- buildozer/targets/android_new.py | 19 +++++++++++++++---- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/buildozer/default.spec b/buildozer/default.spec index 74edbcc..3b9ffe6 100644 --- a/buildozer/default.spec +++ b/buildozer/default.spec @@ -144,6 +144,14 @@ fullscreen = 0 # directory containing the files) #android.add_src = +# (list) Android AAR archives to add (currently works only with sdl2_gradle +# bootstrap) +#android.add_aars = + +# (list) Gradle dependencies to add (currently works only with sdl2_gradle +# bootstrap) +#android.gradle_dependencies = + # (str) python-for-android branch to use, if not master, useful to try # not yet merged features. #android.branch = master diff --git a/buildozer/targets/android.py b/buildozer/targets/android.py index ec7c012..4b0340c 100644 --- a/buildozer/targets/android.py +++ b/buildozer/targets/android.py @@ -845,7 +845,10 @@ class TargetAndroid(Target): def _add_java_src(self, dist_dir): java_src = self.buildozer.config.getlist('app', 'android.add_src', []) - src_dir = join(dist_dir, 'src') + if exists(join(dist_dir, "build.gradle")): + src_dir = join(dist_dir, "src", "main", "java") + else: + src_dir = join(dist_dir, 'src') for pattern in java_src: for fn in glob(expanduser(pattern.strip())): last_component = basename(fn) diff --git a/buildozer/targets/android_new.py b/buildozer/targets/android_new.py index 882e4c5..85bb922 100644 --- a/buildozer/targets/android_new.py +++ b/buildozer/targets/android_new.py @@ -4,9 +4,8 @@ Android target, based on python-for-android project (new toolchain) ''' import sys -import buildozer -from buildozer.targets.android import TargetAndroid from buildozer import USE_COLOR +from buildozer.targets.android import TargetAndroid from os.path import join, expanduser, realpath @@ -17,8 +16,8 @@ class TargetAndroidNew(TargetAndroid): p4a_apk_cmd = "apk --debug --bootstrap=" extra_p4a_args = '' - def __init__(self, buildozer): - super(TargetAndroidNew, self).__init__(buildozer) + def __init__(self, *args, **kwargs): + super(TargetAndroidNew, self).__init__(*args, **kwargs) self._build_dir = join(self.buildozer.platform_dir, 'build') executable = sys.executable or 'python' self._p4a_cmd = '{} -m pythonforandroid.toolchain '.format(executable) @@ -134,6 +133,18 @@ class TargetAndroidNew(TargetAndroid): cmd.append('--blacklist') cmd.append(realpath(blacklist_src)) + # support for aars + aars = self.buildozer.config.getlist('app', 'android.add_aars', []) + for aar in aars: + cmd.append('--add-aar') + cmd.append(realpath(aar)) + + # support for gradle dependencies + gradle_dependencies = self.buildozer.config.getlist('app', 'android.gradle_dependencies', []) + for gradle_dependency in gradle_dependencies: + cmd.append('--depend') + cmd.append(gradle_dependency) + cmd.append('--arch') cmd.append(self.buildozer.config.getdefault('app', 'android.arch', "armeabi-v7a")) From 3d4791df7e1fc32f8208789e95848bccfc057436 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Fri, 12 May 2017 11:35:33 +0200 Subject: [PATCH 05/27] fix Keka download link. (untested). Closes #427 --- buildozer/targets/osx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildozer/targets/osx.py b/buildozer/targets/osx.py index d589b5c..20a3d0f 100644 --- a/buildozer/targets/osx.py +++ b/buildozer/targets/osx.py @@ -69,9 +69,9 @@ class TargetOSX(Target): self.buildozer.info( 'Downloading Keka as dependency (to install Kivy)') check_call( - ('curl', '-O', 'http://www.kekaosx.com/release/Keka-1.0.4-intel.dmg'), + ('curl', '-O', 'https://github.com/aonez/Keka/releases/download/v1.0.8/Keka-1.0.8.dmg'), cwd=cwd) - check_call(('hdiutil', 'attach', 'Keka-1.0.4-intel.dmg'), cwd=cwd) + check_call(('hdiutil', 'attach', 'Keka-1.0.8.dmg'), cwd=cwd) check_call(('cp', '-a','/Volumes/Keka/Keka.app', './Keka.app'), cwd=cwd) check_call(('hdiutil', 'detach', '/Volumes/Keka')) From f02b1d4a73721b49e722e2f4ae4523e03b5c1e5f Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Fri, 12 May 2017 17:03:28 +0200 Subject: [PATCH 06/27] fix keka again. Closes #427 --- buildozer/targets/osx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildozer/targets/osx.py b/buildozer/targets/osx.py index 20a3d0f..f6cebe8 100644 --- a/buildozer/targets/osx.py +++ b/buildozer/targets/osx.py @@ -69,7 +69,7 @@ class TargetOSX(Target): self.buildozer.info( 'Downloading Keka as dependency (to install Kivy)') check_call( - ('curl', '-O', 'https://github.com/aonez/Keka/releases/download/v1.0.8/Keka-1.0.8.dmg'), + ('curl', '-O', 'http://www.kekaosx.com/release/Keka-1.0.8.dmg'), cwd=cwd) check_call(('hdiutil', 'attach', 'Keka-1.0.8.dmg'), cwd=cwd) check_call(('cp', '-a','/Volumes/Keka/Keka.app', './Keka.app'), cwd=cwd) From b522bf9c49245c8a5d8dfcea7bb03c0deed27eb4 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Fri, 12 May 2017 20:39:22 +0200 Subject: [PATCH 07/27] refactoring for buildozer vm 2.0 --- buildozer/tools/packer/CHANGELOG | 8 +++ buildozer/tools/packer/http/kivy-icon-96.png | Bin 0 -> 4460 bytes buildozer/tools/packer/http/preseed.cfg | 10 +-- buildozer/tools/packer/http/wallpaper.png | Bin 0 -> 26725 bytes .../tools/packer/http/welcome/buildozer.css | 7 ++ .../tools/packer/http/welcome/index.html | 67 ++++++++++++++++++ .../packer/http/welcome/milligram.min.css | 11 +++ .../packer/scripts/additional-packages.sh | 7 +- .../install-virtualbox-guest-additions.sh | 13 ++++ buildozer/tools/packer/scripts/minimize.sh | 10 ++- buildozer/tools/packer/scripts/setup.sh | 37 ++++++++++ buildozer/tools/packer/template.json | 12 ++-- 12 files changed, 169 insertions(+), 13 deletions(-) create mode 100644 buildozer/tools/packer/CHANGELOG create mode 100644 buildozer/tools/packer/http/kivy-icon-96.png create mode 100644 buildozer/tools/packer/http/wallpaper.png create mode 100644 buildozer/tools/packer/http/welcome/buildozer.css create mode 100644 buildozer/tools/packer/http/welcome/index.html create mode 100644 buildozer/tools/packer/http/welcome/milligram.min.css create mode 100644 buildozer/tools/packer/scripts/install-virtualbox-guest-additions.sh create mode 100644 buildozer/tools/packer/scripts/setup.sh diff --git a/buildozer/tools/packer/CHANGELOG b/buildozer/tools/packer/CHANGELOG new file mode 100644 index 0000000..a3993f4 --- /dev/null +++ b/buildozer/tools/packer/CHANGELOG @@ -0,0 +1,8 @@ +## Release 2.0 - 12 May 2017 + +- Brand new VM image using latest zesty ubuntu (64 bits) +- Image created for Virtualbox 5.1.22 +- Pre-installed guest tools +- Increase disk space to 20GB +- Ready for shared-folder in Virtualbox +- /build can store buildozer builds (specify with build_dir=/build/myapp) diff --git a/buildozer/tools/packer/http/kivy-icon-96.png b/buildozer/tools/packer/http/kivy-icon-96.png new file mode 100644 index 0000000000000000000000000000000000000000..a39701ac455a0a99fc03dc3b2a8af79eec7345a2 GIT binary patch literal 4460 zcmV-y5tHtTP)16nx@}ZdqmF%)SuNI~78b zenaPRs=AWu;2=BfSFfZnNwI;a4!+NlZb8wkbjYfAal+?=6KY5m~vErUCF7hViHN_V(u+zdP9DcDu>z_3|-A!0b75U3RlJh7q2=7U?27=-Ifw|JNhQ`9GiI!2 zj6FU|fgkSr{^<33pE|Jbn~vzUW}O6GHM_#&cDpwd(fl#mIcSt+dD)(?cYT*N5fJr; z%J~Z}x8>w)Afg|Q@%Bw~ARzzi?p?bY(xP*z9NgmV1rgzz>lQA^vD>T10r&t=VzF4O z7v8Yw?yQJ_YZqR>z-%^e1TYEX%Y3S;uK4GdH5)Ej7BshV{ts<7+ZF(&7=LDFj4kmL z7yskznKLaHO@iiDhHI%Suez$(Znu93U<$^m5mBDiYTG*hngv%~R0%5d6xwFZ`q7Rt zob4oKB^Op}ZBSDv6c6s6CDN{}Y$eDnAnAFJUo83@f zx8H2GAQTFwcM>isD|>GO{E^M!aC`v35)b%^%mK9U`Wu!DqBy4dI~lUP(z3Fi(@m## zBYclKH3IVT^D%YW5At&zj@O8&bOPUa=486UY_YzpDvCc83Z*7NU7ek9xm`<%XkJ_) zB?#c0Cp&U5#>N5zrG*6rkNSK*o|BW48Uc2PBiC%UycW-i6-B}F`|pFx<$|VZiRRL< z+jDULefK4NY&M!`GX3ul%gZPG{r=<#sF*Vs0C4ryv!4Rsi07o5reRJ+1=g;45qWv; zgd%|h;0DLa2Oq${{q!eEM^QEfLUHk=mjNI@zaVh}zG>Kt$)#m3lgad-iJa9i3{0Os z9nY;=1*g*)H;@DK;YWVY<@X~$KR+fB`2__(9P@rRd}pRSC@M#5UZ}$3KYs$TdL_fj5di$nD2lfM_=U}8gDlG<6Ceu0qD+Rd zVHlV)WeTpl?pl2Q`SyhSKT$dA>hhxc^Up6JA?l5T0gL{gn`=i&$z&847sKNzLP<#p zii?X;R8#~}6fYoVAVCBBRt*geSiO36Tuwkl zZqmm`GdBELgArPNxG7hZ7D*E?h1b91chS%WAbk*Y)#sJQ`i9 z8v6+*Ns>@sUyqkwdKs#!#Y=!Rd(Pa;_ciR@H!vf*AOi9V@_#@?Ql=-fkfLDUfdfge zu^cEzoCAOTTUd@dIyz8ZJ_EPicH0H=76m+3gDe*Kd-m)>RaI5o;765RlB6jB_Kh?N zlSvdy5Pl#oGo>LB48y=HufB>SM~ho2!UV#RWH1NO`Eqs6h#yk7Q$k&Bn^%oG8- zuH&Vb)?vraFJQ4);C8#P?&Y;GiDFU&5E0}+07L{;Rk3{e{kZ3zd-^}?_1E7(O-&6X zNlF>~J$v?G_3G8=?d?rrX*#(gnA30sFh=A;nwPCdWoO;`Ut`;+pN89nPA8sQwF+gW zWyygLAP@{*AV&{9v=WOKFYf=$U;eTR+qZ8|IucTpoxx*vSZy}ba1lTVPtT^z$j*z{ z_|Zp@BneKZ1JA8`29=e`KQg8p1{77j01!>n@Z^*KofbJtgX|0j!)mcug^{u#%AD-% zgvDZk)9Jw4HES?^`gACYlC(Swmo7%Lqvgx*2LNo^v|c5u8(|WoP>I>2dW?MoK}I82NfCa+FTliRIud_P?ZGc2WVKh!9c~7;(%S z$;eUKWoJ+)MpacFqZdROmz`AG7$HT8%PSL=qYTN;!0`lRSvE$B0B#sYC*oMqHH>>g z*LAG>b#k&3%d3e9axj=MF!9Jy24!a;0sdexpbhl$ff2wX|I`OSPo@^In9X?Yjo+ZL zvGD@giRJl3gr1%r=$h7F!44%UiMFr@%aP0F!p4mo`{gJU3SsHerKqc`OQ^S#Bmq4U zY=@N~L)W!-gg3BAm;lBYPM$mov)K%n%Y|RP_(I&W6P>i{_coxia^8^r{*bDsa`F9g z#JPbjTRsK=y!qyDapue!Y~8vIN}SS`eCBMl4_228W+Ek|G;_|A7HT4bAP89bzyk?q zJ0_C}n>KGAa)LArBd$(m%zl6<;@*4jh12QmpRYdra3jRIs$jZg0L8_{$j!|iK#G7&8|OR}3QuS-6_SIrlGgDH>qR&em_3iwCTLaQB)PWVWiDNgTY`zcjD4yp%W)g9FIi+ z4@afGJC!rZfdD?)x;3ebBqDscVFM0)`)$7z1=9!?5#g(^cERWKT~zcrH=1O>zk`Tk z62ODOz>ZWe^3zX0#VfDA1_CAQxtw!6{md$SSz8NYEN!bGBuT>2qet=k-~SH5G)Y?A z6_}!Kk6hcx5(I$u*42HIYPg#u30t>q!_%u)C0tc7#t;gH@Zy?Z;j`-MwDk0&Mb@*= zK8N=9j!aLu7g%RU`^Q6G>k!_{0eDqaO?fj4#u&cdy&G#^emUU^n1~?DGS;nIhsMUn zlt>s@WL<=8XQ+toK6dnIy&wp&3E-R?0E~bvznhMeGsdua%a)|%h=>pjhVcCJ&tuoF zT`-%?NqK$-dpq&XzM;_j;TlUfVmIR=iA-l#=NFvwvrB&6?7 zR%+JO+4%v&d(ZKB3DA0dzGhw5YtuD|bjZ>A_3Pu7ql?koiL)`ezptg?W#%CsD1i|j<^ z)81}x_htY=#JfCwfXC_Q&NUxX6lFuY2R2ZSqVp0@L5_&1|CJ50GeCao4mTe93M1@2 z8mkE+^!j=ad5Vi4CZe=9Oo#}F4jqEu@5k{IC!i+Ki3~48(NJ4k3sDqdGD+y_>OyU8 zE#7|n4+un-s$6P2d-lvqZ&z0n!rkSeuO-HXGR}F%9p?0*lpOt0*+sN=f%45WMAQ1RtOH0d1&Uq--^cGK5V*rrr z_w4zDuIr5x_{MbDmLrE7-!KfLFCK@Dx2)6vbRR!<^x=sp7}+}7+J4^C-Q7e)aoyC4 zJF^i@Cd1d$)9rG*yDb*Wk_o6UG{4{f%Km-dyk#;;K|RjZ1406!#fgY}ySh#l7I~(L zqBv^;^79gbork_V_-rT?>NE^J?pwNv=JtlJ>uNv_d|Oah_%GR-6fS zmu05-e7;|Ndtm?j0DMStDNic>9Rq;Y*4la`*WqljTCI!5Q6%U-pYQ(~>g!&QfS>e2 zwp1Hz1^}b2we^@F2=%$SjwM878|#|i+S2k+s-B-N0)TL%N%eZYEsW6~hr_uz@}S?C z%y!yZTOT>xcxW4d?o>QKodf`YK}2e|*L%+2*H`Uyxk^M)oH4fYe5K~h>C;afKX$a5 zi2UgQKb-_bNzi3k?rCpptIf^L?Xp;`H;su3x3BlLg9i^j-`>`Gkci2g^R#^lkAWjDqhj9xV5UVYIcJYku^={{6pG6r~+N0N{E$Pm(E6 zNDu^*uIn}cp1GCtAIQncSs@65C);vZx)$8+}5=2qfHBCXXPYzuI z0-~SI09XJx-0r+-(=Welh25U}a5hJSEX(hGf8zLWIyyQ|aL&6BzM*bp0(@K~AP9g+ zL^jU3&7GHb+02=zQbnAStg2NaVBs6>$=_(2n0TAYi;?c*XL{U zdcDmE-#8ClOyDmi0fXlV34k^7Q!4U!%1cYj?y^{|3k5-lZXRVKA`{|&a8Qpl#uRX_ z7>0f(5DeC~wYL8KbW_te5uk&Sml7!^`K1CO8;k)Eh)Cj`ixHp&0Qu9VO}or$%PEm0 z$s?M?LPji?7|S6d3sHDuDbAsC&V!sAvY{Kjx~_Gqs@f*Y^69guPoGp&wJoCOIuWUn zJYI`{eo51^Y|KX3far)4F_08d5CoGbiUJb^1^|Yx8=9u+x~{7cZ`PuK512^xXzwbk y(%vjDhG-Bm(f4SGvGYM5J^1$to3IJXI{SZ}I@%;tv|)t+0000_Ky~lrIJ(<<+Eg+%2L@< z*<#E@qU_nmHuFErrGL-U*E2Kso^#&c`+L`O?)?G|8R*TQyL>J|5cBu#)j3QMf^>r5 zSDP&WzUlb#W;ggp!1{om4$(<;6Wt9Z|6T{*%yHg(+=U?KiNL=zi0Bw`@TH*ZKK(s{ z-)9L4FBWrCcakKCmBc=sT}M5?bulYaB-|E5akr%&M1boxM@mT_t>7|C7C^ zpInKad;0CGlje6sxIr7g96Oo0+e4pzOynE$mXq0Hv#0U_CbJzyk8J7x=+)Po)5G#R zVImf~u(Y&YGX6U2-DIElzB{pd!~0B{*HE?UCQU0}&jPC<`u3(|a5z28Cl$2AGYLwR zdkp-RFj(Iv$K@jwPxC3lk1_wGY}>za!3=_Ne+~nF;XHRv1p>T_|6%A8{wU&@wI&cw_KKh71M=9(7Y>Gn>o}L5=3wuAq4L}Pn|S( zaGMPT)klI-hRqz}`~?WgVm!K?LYrj9HlSI$gE8c%Q)pfTJg?}5y5l^cZZE8z^iPp3@J@^Z z<40ml0+gqmj_-YxQTv=WgNT}sbWPuPKwS?hKWY~K;=|dLJ;Lw;Ve<1Us1PT-s&!9m zmltQjUzd@$oBbd$G$yY|`uh8qJwe#*!;8Cccz-pTZxwmN#zfDtWdyxpG16Jotv!`c zvT{<+Q-g_|VL+|)bx7li%P^IWV+}`Lv1R$7yQeWXZ4p!g6osdfO z8(3T7ubbT9M16DcI*d9GoaZM9&J~QxX%eM0L%i%;m`ct!@Xs5-&$Yi70k)DTcKlbX zISE*%M~)tQ%jIjWBp*R6z-$q}ZI%p~E4dqwcT^Nk?ktBVub#3vwm7-+@WX+2fE+|A zhDH49;lQN$83bDxqpEunb4l|OUJrW+!xS_1S^n?^AdMQS!(HaX`RMjr_;vw#L?-9` zc(%(mkS~n87$+fPgp)G4@JARYXI=8zuZT_4A8%d=T@6&jxQkgVwBG@G3Zjx!_o2g; zM#$#W1hJ@ZPN#SQjS-u%v!N)03(Q>rKh@Ub3wAxpFoUa^MGp8D8Xd9uAjYk8e+nKi zdnLX+<-o>0=}@opFa_$LVWcQ~u&9}5F;dS-&DD~Gdj2m)u2v2qWlGX9#S|k&DJE}U zjgU&S#?nh5MlsAVQjQh~sSK?1`X?Bvv~}dQH3+Hck5fo}BX8EhNY#>($xI<-DuX4< zaKK2ZkVth;A!VveUhoVfbqx>ryapkqqKlC_H-%LFBJ%QmBvK(*v!+2LQtz;+wbmFZ z$0&@b&QG=-G-Z1RGq7%2uuDy9q} zC7_4LE1yD2TpVAnJjJOu7%8=zBvSXWsFkNMQbM;dGEYgQgh=F`Vx+_s@o-0ulSr}g z?FQJDD>`H8!@eSSSvgP{2shdf3R9#f8ibwFcMT3Y-<(R~Zt2VZ8 zfIpCtS5Y`+8$wte3$c32=%SSH7koH*BCt#w_p0lis{lD8Bu^mXYh*a*A#9I%c84&SU_qxw+wLmG^Gw@>f%3pwXK}fAcc|h+p;L8twY!C*#mBB2O`HZGoPfoSQ98Ns-X*EtUomXQq*Nhzo zxhtU-juGV}QRIK zC4p+k36#)#WO76$PJzX5-~@`u#zBIz66NBA1&)@A1fo+K9~PECX(nYBo>{)^1kBWl z=hzvg*`j28`r{rFskGJj<~!Kv=(n+CnQNwyGR6U`{t}7QZH!dr$|k)E}42)DQ&ZM^b&MQP4sl8z18aPLic^^wSksFnrzmB3z4JC< z2PMvrkYZmVk-ChH&teLx%hywc z9nY-%5hEpp9hkE&Mr!Kg6jF+Z@XZ@Zq;_G+3^q<7C2#;4m)cblsW;>WtEP|=!2I{T zf{{|3iwBg!NQGnM4Gx_RLGhDFz>>$T#D(xwJZ6jIct<2)Ym>CWiGkuKJe)8tgbDE# z7|7YEdYS(C?-WpL@z4LF>V-(aPD}C=@=`L`a3%jufqsE3ZMDL4E1_!_--hoL!8ip+ zBZwCXlZ;ZlfYzbtgMB$!=u(EKd^uU@Qff(Gz7A{9PJRleb-NIbcFCv^CJtg1me(R@ z9);7Ts6?_5o{Gj%iBo*CMp~t~<3gBNhkc@*J&DpjygFH22v60vy7aFFlQOOa_j;iu*|}F=pa> zU2!E$R=V`+spN^Qbm>N9@!V4eWHB=4pz4BjB4n|LF@K4XGR9f23Ym=)rWmREY>d=% zjFjV1gjAXe5;n~UAw@ZdXSN}cdXBRu$AcKDsgF7&QfbEcW_J>)`B<`ysTLGL*2cBZ zNTlYYfJe{RPbQlLSsT|rCXvG7H%$d26@r1ynCh+&Dwt%otEZ4k!0T-zks@nb)7KY0C_SQd)36CyP|)`mn$b{==OKR zFK}T?S1vmthB}@ES^9!X*I^KPFyb;MiG75N7;5NH{>2Oax__h5Gh~m4uorsTh9VK= zJ^uYD8S*H&*kvEharyroS!?r{twmx;D;_B;2+Om8wW6N)>~ zWaWplEOhbgxBxCc^t1;0#C1q!`rYH3BVQs^qt+mi>>dGF3OpbP0SE+&?pQ$>4vkS8 z@Ffp3L{T0`#$iPfKbGE02usvfe8K(NnB1A<7l)If$1lf96?ti~ z+2#xa+5rK5aHoSjm=H2S8S9mQ&`;VAZnY4KF6feA3kP}B(IHT(POt79*9wH@M4()n z@ubE~Mj;a3uv16J_v0M!L)4|(Z&$garBXhQw+ee%jdQO=YM@p`c_1D{kb@OiAu%Y>}wkJ3P6Q~=# z3`u&Kw>jEnn6?xId`kBMK~};))Rb*p-gs|mDs8ee+iSoWOsx#2Zp}X5TC&oAVf=Vg zd&}p<1N~hY4q){5mZ!2NEl-o;zJ(QPXlRUZZO0FZYjFmixt7_ksRA2Q1n$!_zDW*Q z3`~A%Gz(g&J)zj_HNpgg*RI!Q1?PJ7hW3n%{8hjjp#PzxH&|q);Bf=In=!TI^$xY4Ptws!D0O{yW^=-KFNf6;29z15A6*e(onQgflWux{G?x@pdzZiLR8amRJu~ zNEVCh)l}fu_;P_4ca*ohE}pjPg%xd;6m6nkrtVE?F+0ZPN84xNziW89B4aQmqesDy z*K0^yPUDSeuW0k|&1&-(;=a?K_{iPDp)3mJFt^mh%$Kf*49W9RLTy1tEvMV3x44m7 zxPqEDDsq4|?;DU@ERLpC&_9$~ELPBWb#k^ZulA0j8O?iWPdU zZ{~cs*FO-?OP5J`bJI|38H@9+u4QaUtR-N5+>O}SSkqy@A1^fey-ow@kz4S5|EAA} z);<3Hx^zjE|FCi1@H=UZA#WEFJh?y(yCEL{{?IMK#w5i1nW&CUG>^t=c?Wd8NEmQjC>d}0xm<)dIp zo4nrtg~kyST>h_poYy)_|Ix&3@1e6@;14fb`eHE!pyP!+nOzr!lg|rbu?j{k^M=25 zzU^hK5PAc~9v7}(4a|zt3{923Z2QDlmyK(+z>+*$D^zz3X>O^~960FPX`WhiTh>I% zbmqJ_U@Zg4Rh5^2FQ#r>%N@(8yTS?|{~XC(Suk2bEom!@ls4tp^AueU#x+3W-c_53 zWdTOCYEK@Sh?kx?2I+8d9fe9&C>X0rEeTTK8fkJltuJ$P9p-~QDn(`JiWowYLWLuR z1LKjbasQ_5^Y6~D>qw8Ebj??P%DL+s)_FR;I7HE%7lv#1N6pT#r&J7*VnQ)pvQA(Sz2BVi$ zR)$h%!lebHrOgnG_vJFP{H=ndx$m?5z3N@6c8H;|MGQ4xN?%O52(0BXDt*OYUpCYl z@ssxGX$s(tGI>i?otm5_LoQtM4s<2;G)r4 zfK=WXwVzqY3Ci{vdC}^;Ng;o5egB^_h0-ML$zSzMCNqoyIml2$DT<7%^N{)efP&uE zR4bny{)0A#S}yK}+LNxn?KLK?0lYs&+^maxAf3)5&g%a3=j0cT<-4>SOtg&@Nb@EX zcr9u%jrLjtcR7_FmLakxFFY4RvJ@e7h1Df#JQi(2Z(=l_rV6#e`_LRK(BKy-SU?-= zV!m4IWmHBfd$qP~-E4C;l?87W3GtUuG8Nx=UQkd}Xt|f8`c&gsgI&*2CZi(gig-ly z8vghCe6MGo>Obfx_|IZFk#f74b}#jV-YS@y~M+JUDj*`mN1D_&>>RHx%c=? z6OA|7Pb=)5>>0Oh$e-+{26^PQt}se5PB^;BEemR_!w>R$r*xDwjauO4;meVcRuVTZ zm$mZpvheB70GGBm%>&fjNkvxcZPEX}eXG9BNRN4oq1Kqu<&(uHoZrmqkLP~jEt61j zys8eJu-l9bv7t3Vt6brrXRj9Rqk{R=iZxLjTDaeTp!! zmHVo@7*J(v&!UXHQ%^Q|1F)><$&U;qCn|=Rj)1E87EL zg$gAguIAojBu3Co77)ZI2c$5mF9C&KaeB!$i)p`>+1S|hTXD;1J-X}*ue&w?A4!*L zjsFcY+QEOVCo)D4q~48*30~;S9%*?aC>`S>31Q4f-HZ<5Vw-sL6yu33?FpIw$T($n z^<^~9b=nfc9YaSSo!P_>>|+phbnXjg4@CO^fw8f7ve~V_T)C=z4r4Xs=r@F1Z4~E# z_O~pm)kIIP|H`=75Jn5gV0KcGyRJQC@9;{5=E1rU#5usKhgVgCt0L9}Y}H>eYd(+* zH4^CCJ|nrJAHN*Gqfn%$HKug=L26fHmIAk{imMs1=Daji=0ZFsV}j!Y5|2`FnbGA3 z3Vz)VRzZfeu`kToU0To<0EaZ)1KGyd^hzE#;+T1VN z5_5NVv)^1k|8BmjPW0oRnGg(A(lfSnI`ST$S)O7n%l)Ik)82jYMmB`w@d)bp}lv?UDr(7fMysFKt_7<$pZ$T)_4Q$#!SHlu3;CU&PS2X%kGQQ zzHAL?EaVPlk2Fh*3&~L~T-f52^Q%`zf3XJ|4(-%a?k)l0Z+yM>nU&5hddiS-s_lyHE|x2MSaY_RHPOu~0epP)hM_bu$>RB~$%KyL&TSaFoG)#^S9ttR zv2vBB2yd_|UUiA-mGRy}?Siq}sg(_UqRO-Q=pZ9eNU7WQ-(^IivqAj(a4=Mm{Ofk+!7f$+2@;LDh zf3`RC3Rr>Njafs3&oilwQiWWH!ruz>=Z%%yYkgtzRSq=mgcG2ShBM!G51!UoM?!yF zs;{lS<-2{IwZ(#|xi8vf`XnrQ-ojCMwm(bF8Q`WevvDDO;Om?tz$I$Dxk z2n0TjA1q0(tmU3ZlQ6KG9V6TKP{wNHtvLU9%&S*|hH(H@d~!zpoOS@_OM9!N*$1_A zc-(QDsyI}KGjPBbeJYahN-k)terr!|p_n$e|K^U#XfRl{d{)!qGtq$%hEfEB>7|z8 zUhT;N?U7;!(Tl%SJ(zADn&VyROt>IM3vy>cNAt!(_K^v0`KtRj}KwOvd-rzscx_*54xDI8k_*@oKYdsN!R*vjiayLK$ zSkD2gu?sBin*fOHfl3V-{V(rd9faK}Q&h@Ogts?BGMf|(XI%7LCmdzz(Z_xRO-aWI z>X1^6Jd#a^PSRiGXAU^7R?P1iZls3ERWWBm)$Bz|G+Giyt9&KbGs+zi>{+&l;@#jk z!W26bJr^!32<6n0yY0tS^}m3$s6gZ2sttT!k{3v6iZ9g8^Qc5Bl)Q^=FR)xBN8FbHTTVScoo*h`Kopffo2k`bYdF5bD9R=e(VO#ZO?lB>? z*r*>yPuS4R8;|Yv_t+43od0p1=AZX6{hZb?y+#437bT=ay+cie|M2T}YgU2Z?tv~a z)K4%}r_@ZQ7Y#&qXLO8!G9xzo>ucV~IIGa3!)_(tmjgX{121}nKf%z;2qy>9iPW(yWPs5kYOqZ|bhA`=}E?sU^UDeoapun4e1X1Koy> z5gx;;**4ROnWNSoN_(O)a%_1vYNdeENGKMvRt|G5$(lbthjbA1&kGn;*r`V z1EM*-{p7nSx6e6l{St-4$^D&$qwzjtZVL|Z$4R(Vb(b)2v}bvnd`rn{UJhf`^N+o5 zAmz{l4wDAsH{&~E~Wse`BGe3I!ynb%Fu+Pi3ZobtFchqKznlV{eb4jwpX(O>lMQwR}XzsH_jBH$9uK} zM8(8xjq-9o;d;{dm7!&)nGXB4QI-p@=do?RhlhO1v5Aly*}Vnh)^#sVpv)5k6O|+a zBi+m}ZKstpDe5wPO;0qM!3~F6dR{)a1^0OV`EWVh_V^F49w`cl+p~~r2OtP<7B=y6 z|1Di0*^yh9_jR^!gRMePtcHh_`_TbK^G=S0@Ofa(P7@ikz&fWnOyqg6EZ>#rL z1*?(6tNV70_-el>82kO8{`ZMs%Nqc(g`h${NMz0c_odyBfQ?Gc)a=Q7w#N?|92Ebk zd41iwmdr+KXJZ}jT3w-*|74y2P?R>++In^KNWn;H+zy{>+^Rg27HTPoqOI!vCNP8d zM5kXB4VCzKeFfw5PsN4#bs4sPdca-KO7)!VY&G#8jSL$d&|x%GB5-!zzm_3jP7qbX+egb! z;6z&z`m~+9a-E-dT^Xn4IyL8OXbq0j6c<%}cFb5!%}O{LJ$j21D67LB^;YNV>OjZB zM*$5Wk8 zP!x+4T|vvDvP2uRsGXzjXH?9qLvMtKhrjbb$lntNG}`~;rl5UGD(XbP!%T2hrH}MV z|5le<%k}Te>1=uAwti@E;D?vg%`Zoo3GrfE%7wG7TBtfjM+|o??e>zuwXP6c;{E&C zGc?uJ^E?QJ9o!e4qxR8GDmJH1oqE&FdU!IJF}Z}+o@X+z_c$Pc9hxkCyYR2k*_tsf z;zgW$?Ot2&RU|m^MCTvj?b~M9MS*DYG_> zxp8|(zv{jS+Xk-u@Alc6d;2|pPA=~u0Jlw1rlojAUh;;^98}3qIYO#Rh;kLVp?Oj`$5%vvhITe z|9C5rzoK0eacA(W%#kiz347BK+_5J%I;bZFS=9@$9BdR^J=QbHD^DXq5=uXu30MxO>k!Mp03&>c1 zzS+xfMChG3&F9Q`*6D4l`xHy9z5~c8CsD?sIl27yH6>tt2MzRxy5bx5>#|R>CYS|& zxzIsl&8=LZJ?3@l)S8E3Z$GD%fDCf=zAtf&TzRvA*GVpSGZeUUBIQWz2K z`|($ynJG;7`Bllv?d3MV@_W8!-|Dh~f?!&y z$i-sT>q^amt45n{FUZZ6007gKZ2=;*kfTwn*X zFS1vI{&YY#cdRpPY+$>vr?vH4iS+x`;vwS80wU&9z(DWnA+`3gZ96%`5N;y=h=pceAl@g=%j>Tekm+TxRGmI~PhOu#MWGPr}Se>(*=Y zLB6qS0?v<)du@m+oZj4QUmslwi@S-PdZJWt@;PXwt2;sex;w|xpy_Bm)>)l z12eF;w*qM}t58H8+%&oYfAfXf<9;LG0JWSgBr=nK-2{Eth#tN;Cl$dzy$wZ0ItK?i z@yAlVzR$B-B$Igf*4%y*m?D!wQ;|2j187g9va`^KPR;GkjH87}k464ucpziU}|A8ek&aW*(L8+VG8}}W|>{>;g!Ezg6o^RDJ z)tc*_(-18F>C;HDLi6wWS^PuZI}CPoZ}lKRr6PG1RVs9AqWM*#cGyL3eJS_9cB^(h z?ct>JBTNtJ{!-8a`bh^>UynHrj(R%J@38w(dzPDn5&@+}| zZ*nBKuh@M}pK zoZX?VUDKWY3m^yDhkhx2S}`el@h0fPl?iP6<2P{6<3{0ncGIjL-clGQ7U1gjzUM-S z`3bQT^&?eZ4TU+)(i6`2Tbf}~TzA4FmgB=GI+p=N!`uYfUBG zTzru=!W}7nw@_Pi5iQ;+f2fwzcb!)x(aE2Gsy!&d8g8$$qi`l&<EPmH{W*KEEh^ zXg7acRMd@;{NBlz0Ly~73{I}*?;-CPuiE2An<5h|>bd{7P|00Ngh_Huy<7DjSP=Go z6rn{{1zAnBJUP0_=;_giKW4+$XaWjcqG_K5`d*w6oBvfgkRhu#al%re;kELn+kxXK z{Ns+pC2Rg3N9lr7?Ufh3b%i}g0}9Kijl<`Zd5aQ`1|EL;)$ea5#@_H#kR7x+$C({x z#BZt9()(vTKrDZQf!64cp8l#>S`>hj@fL}gut93(iKj|8NOptT&iAu}otH z4~B;|D251^7Yb${ep<9|ee71}(w!bR7^Q|2C)72pUMX)%A942JOM_f=K7}q;3Jwm| z0qQxMu{^^}-n~2LG$sBRzvcFRk2VY6{^FPZlVeYgCL{feqJXFtcr}x5#XX|EG(^{i z5`UcEQnTN~HviNx$6jwIEa_2J>?~AFSb#pdSxU)O1+Nb~wbN(&I=1wFd{)<~T&iud z$!PO!lvnM+a6WJma$V17b-p-Rkb8FzTSkOt(p)TNC0TQJ+os$5Z+&cYnn0QgMea-O zT8q-B*w)ioaenT3>{$xp9DA{g3)gdBgqA7L_8i4nVDVPVxe5&~P37Kw;OQ>R0dD+v zJ=kA$+&(!7qza`0Loh`LY$(Ek5)3dKV8_IdVllmhYVp8!F%XMtTtBSUURGl!|E%Wh zE!o>n1nP%{qH}|$SKvD2*3CqqHR``wUsa<_%|hqXq@#tAJQ_JB5P zQIi|=X)czvT{ybw_LG{kyMfH5in^4354Zf5rP?cM%+CGf*rSsL2T;dDuI=WNhWYGD zqff1^t>=HOjTEX8y0#IdK*`CLsa1}=+OtM?Lkf{!;m%R=Ap3$b!LU~}^cb-{;ZF=Iskzhuw&3!A^H?v-zYs~cQcyRri zlN2a^RtO7UU$Z0C#I&F(!-%S=wV)toGKH#~R{HmQZ{tZ05<(@}&Qk$SN% zf7s0>lcrIs-3ZTam_~=&r8lSmebN&@3}}Mx>#twGKsge)`}%_76CSJ;(xV-vLP>_f zVbnnVdnK@crlh2Fa-~B@OOVy_Itv&57}wAHlvK7a&+y&>DYqY;pQQxEB!Xo-OK!gx z5bHw^GG`24FO{aP23wR;{T?ATokQ8bpCv!EO!dg3X?!<9eW>j)`(&%Rwj6zWG!S48 z%nGuqsgY%;md3BZdm0}I3G=MxcT6s=7$n2=R;Fg-3(2*@W7R*mK3Bdb_CgX{(xtYqP`` z$x-TF1X-7QwO2?^YD$1y09+-v5Fx_v_VCzx!UH&u90!v;PO*Z@$_-EII{P21=5PER zq6@}<@(rodSSuIYWhyZ5+>E-;AZgF40zz zHZQySbPt|E`nssCS7)= zXrF_n%N|FK5sP;xp8$n=mTLHKKAS$mt$kM0Q(c8xVSmtpg**G~gU*Az8_)wR_Vm`} z0O;0ehvv2or>}hj$1jv$diiQDPv_X%>k_s|&@fKgsBW26u01ygNCTIZ$JwK>Me^GIe9N$`!pUlFYeh2wOMdkiW#AHn$$q@c29?DMtxovr!3 zepJV%v{kzHSpc2iF<8XwsD?TARef&G;qTSbpfbW|0iNpQGJE{@MXY(@Raevh^@w3{ zVRwVgp}`Q~sC&KZa$9bNNZ7bK$^jcY+FophI5vbTA=5p@pl~20{O$#)9mnYcRRG;2z*Fw!$-gcp(x(X=B0q^w9EY^pH2kaGat)wJGqBZix z(u=>&QT+#woqsb+3|Ml56;ORlkYb=?Y#TMYJMV%)!-IbV_6 zymZK$dA~y)4bfm5S)Ak6X&0(M-TH7H)Y>3=?1VDEqHtlh%aXzRdQ)KWO`Jprni2ow zB-a+Iy-ohf0WjD7Bt$_6M{X=5w)K8#Nr`o1=DGd@bzE!6!26~yK>>xx^1dxUqjK+@ z4Uo#zyxU#lTemytP=Vd}Pz4jt6jF9!XeRvy@I2`iP-pqM@nc-KM&wAbAY zJ#z|SS1A~$uKOW64kA4bVVkOuxQR7`2XfI-!rHE#j>Eo+I>A*%hgkx_Q zZ@T@^VzXX~aS*T}&;(WjXC0E_yw6U2&ZsL{X78vXXS@fv3|^ZU_uZxbEVC3;I_!84 zHwbnv{O!mGHW@&X8C_uqmIw|yfYT&gl>(pkSb^d|kh}Qh4aD{arF`TV5vRqFvFJxT`^gHY_F`W|w}367#P~!Jj{#6%LjnHVFyUQTe@D zmZ^FeFbSxqona1H_FCs;o%jq54NC_HUEvzQc9!Pk;Fo@TTE7@LQYa`Cyfzv5PiV9A z6!H{xB|^kkNCW``8ZxW+3G8)eJcpCB(#X*^sWx@(|tN3Ma0y{X6Pwi=Gnb<;KuM0-x-+3#(NPsE;6lAgDkt zo3Ir(3@2-nR?Mlm1hS31(F&8|%2*AX|Eh14be#U$IV65=>rcl?#DhunjB>~BVz9j+ z;FMtoR?)CS)EgiRTfzmNosmMpFXYWD1GDmnQeK{cG3{Pq&p05gIBp@w|JGr*gnz2A zbE$;?RUX!yaP}QbXPkAb z^n;xz&{-0i57tqI)-m&;=Neag2|&@)0E%tfmVWv2g(>rpI{7EEwbs0FNrl}Pw!qiW z6&fumR4rfzJEDgKjq;l{4 z=?hyvuL)SApP;^DMTN1fS%uw5XKqi9M#0#&RoT*AO|O+LdFiP^H|tV+n|sak+JR4U ze@C_NRDBy>1(3zUeDRNN$u_}DczJmsadOEJEmo!$XmAyJ$ zAvKG+KO!nFI?y;m=kwX(SPy2~=?hrTm)K(qH6TTWjlmN|Q~0J~DR?*UN1pmv@@0XXkg3Jxcp z{8V-yq*}mRw7!bWmow1l{`$oApI%3zr-aqe*Vq7+{uc0vP>vTveVWVi`@Td)=Z}w^ zzO(q!mo;}^%XkhK(gwkK4A5wC(ClN(?3t^zK*OUac)+9U#(;vF_A_9#4jDalpcLA4 z`{SkWbvp{dc;zUn3#G|b*_=JQ>CbSB_K*hftUIK(>wnpMb4|q75TN{!H)kSrqHX*8 z;;y&)06Tg~WoapKHe`YwB@Oqk8}l}2udEFT*-_Zt2q6Zbz;4aP$lUK)>D{uh>sM_ z@VG{G)>faqf$*MTR34b3EhY+)cw7`PU3R!%Y`avB$mIb|D@B2%^v1WbiWZs%K&Ytb zxX@B5Ke^$aMhS4(*io~;sI|XHM7!t1=nJbtt=d#8Y4gmOrT0opZ3cc;yzIYqBaGJ;)XxzKlO7s!GA&$HOEuLV_;9}5kr|iK_FP?0A#%Hwhl-1aL_y-`gXQv)ObemB z;)>?c>MTzGxpBzUCX{3;n*Nb9zsbrHSJVSrD@-SFf?@mbYtE{RtDMH|z(JWxT9vk? z_i($IOyAg0XS?r2XbVmH*U;uAr}S3aS)coU`e#ezpRO>sLgt*j^l(rAu8cP5ZO$TZ zBd|B(arME7I8XWFPYq64xvZWm-@$;aB~Dq5*Jm}W_j_EFj+dsjUuWCo7s$+FZzyWC z{wiP6JnAtbbuQOr5F`PV#5oMW%9(4-6S`S8$4_fyCxAu1w$M8JUS4WaGB#f1e0}Oh zZca;GsrQZnn{)lMJJkNEKjGN16sp@)AE}!T+~$AYfY7F*bKe%v{~mf(#XD@sZ$P`m z+Oo8|KrrsR^}k&I$mR5~;q9X1=fG7RvoMGD zMy!d@YT%xDo-nI!^t|V)p!}JhPg6ltlJG{ya6YwzEFHAQk5=VHZIEpOm@5YF*9AX+ zVtw8kvb9VIe1jhl7&{KOQELB1bvdDj+Hr#~!9kpK*mfYwQP*tJgWq^a;522P%&KfaRt`oz{mc7?YtH=cfk`6!2_7^Y z^~H!#)Qj$zxi4B*c^{HbZ4->#_ZMd4@$tTLDR7TwnXts8??F2~-WGS-uYutRIrI?J zr+476ZP74vd-!bB&akstjp2`;?t<3@VSt_hfGV~iIYd!|v||@2jL2cvBFwxGML!O2 zfNdV)4%$xWPy**_$d#F*Q&9IyPkBjs#Yw<+VH)bg`v?@n`4YbCU)#H@;JE8i z3Sw%rFFFSUBZ@e+ybN=o3|FqZ|Key$UT^^omllJD+xB^X#A#AK^gLji?ki1IC<^5` zG8>1L`y%!_B1Ph+o2f0pC}Qh2_-GZS0bP?U2LfPv`AYB&-4>U=4?+4Nk6Lw%xyX=> zji!M#Mh_FE?FW(HE43jwOM+u6mvZ zPK`F4U4}+#K_e}_)8_Rb27)|{yX(xI;{S3HVUD3V`20ReNYia-+`0Qce`Uh(#dwA^ zZ@kwDAO+(C@^G=M-#IGxovH7t6O6nn!oj-S?}OJu;wGE&7mSqP%g zm1P6q{3ybs0O27AzB#RO4}-Q8l@v4nTJ|RsG>{iK+iI6=i`*&;Ve%6=gl~AwTBt9+ z|E|zn_XQ`HoyE zMG-m;#wQ05tFXz=L?{2QS(3g{2z8aj&rUN@d=Z38@jn!1&LVO%pyc!iw;!K*blmR$ zzxnEvm0*iZLR=Bub!!?xMGBOg(g7Mu6?k0~HeL#l`;Vq7@)h`-L;vR*XCi)F+dsua z9?fSY+~UIp9V5lzLhGYf_b%9*;8)EzU(@KV-y9Ebxh*q@Y;Xk-bfT6)=UJaQKDDv`JDhT~uF;a`tC z>@i*j-B&hx|4DYtv%udf&{H{UKoFfbI;7N}K<-r)IkU*a$EwKzpmEU4qVCpjL6SBh zNiBe+<>F{S^z3!^mAHU&jVQ7Ls-@8apu8CbO?G^BiAR5MAI#4XE(PiGT!Yz9i*A+nAm?aY|_Dd1&Y(wswy&oRNsUNz>NI-h-5L z=GmrajYxb2B);Lx+CV1O*8w!ak)y}{BS%2fU%xkHj(ye$4(A;r$~Ms2=wisxfWwpZ znH6YADoP9%)-aVEkOyGTM{}N>wnxT2w90pb2j#F)QISzCG-CFD$2OORC+%=T&MOZU z1-|A}1S8ORjU>TVp~14I38qFsusNcbV3OBihUwcdO|W+e5rt0dy(Cdi=DTl-U~1^S zRU8|Kl=qvEZY9wZH4`tVE%FVTPWre*aSygY^l}V#*fe0f(b^5C0dqct06Q}c*kydd zuW7&pQK*amJPjBF37GX4us294;P4v>*mdO23y)3%b_7Xf^&0~ggGfJdbP6yXG+q)3 z*i$6ILfa{eR73C6;H<)c#h}CG6J^tYeL)T#Jb;LF5rd3Xbz~ABN&D66WP|nb_gSAb+h>L`$VLV$MB<;_WOyNV*6$^xnZ6aRGOgkjMG}e|C1+ zA<~$M3B?EH$$s4vdb|uVP7E@R5#r|IIPQcv83f^Amw2zcgGpS5K0kh@p@sdlGkTL` z(@_rz7)#kG4bOh?{13J`jrqT$yHUf7>O2%r;Gln#@SvGyz%TFK^UtpKA z6o*-&04B)v%TJ%3Cf9==TM*o$Or|w-1vJ7=?{#)1NP1uN1ejp8^2>AgFoLKFu;5{? zP3;y0u@&@Uj2W&|Mo1LE+=o81rhZb!Lw`p@zbp@S zMOhR>1iHY!f2O^B-x8?(yhF$KxJke`N>4(Twx`yN46|(X1~Sj^XMyhI2v9?Pe99u` zj}aW6s9R%s-`?5|nL6VLy5Q8b)1sf+W((d%Bv=Xm9|1`)X0kuzXxPakLif4C`8AC^ zN;7*=7Q#mF@$!5a7tn^h5M2!EW8bs~W6VS2uVJ1;;9EkkOJDzf6E?O!^zuK=H`oo~ z0PLAI?ZWa0H3<1v))eu7K6ks{0mqTGFOFZ!0_wr z{H><}Gk{Gjdi;|qz+#Xa*ZvC_dgUxza2l`})coUp`U@DUy0{Of0ZT&GWc3#?^in)} z;a|WuB7BmjtuqE?wY)E+b$*2=bmPX9btb_KWT#Frw$9B^!|dT#o5(7}*&FgXs~zL@ z0@hdT+Tn7t;&VnX{>`c-jdKee*-2Je2B!zksNa(H-!#7>VT$T};Mmfdb1=9Qo1v=N z?tg9b5*i@s*+X)GU1;*ZzU%<>t=YGy@(CgmMsQ~d<_a>OpqHTwLgE6*d;%5M4Eeuc zZH8@9w&+woL2QQY2=<@9);J$J6bnm|TqsUw|2KsdFbgo>8JthhQTd$xe41NLuwrA_ z;^K*(3++7n(X=CLg83(7?NBf(wNNolFPpZ-CK!_#iO;7UzdZB`7W=3Dm^qRxIKvp% z?gWb1^s;GYH9;ja)=sBhY*agMelYFEQs96wpq$J+haJ-}1lu5Wnpjzo2+n5#m<7mn zqL*8-e@sJl0|s-tNOBJcS1`mxJe=|jSv=zU*;TY}aXCF|;Ah zF`>9{Vwa+|*j5GO+J!(Nn(=fHgT+SeEd!Y;VlfPnEN{(ZUwuR|t#2MAO46ZYMoc6d z-3t04wY+Jx*jaFb1t6Ej%wkaC2$J8*i*Tca;K16MzPs~o)H3A9ad9naJPj8ewfbOj zO;QUN*Vn%?Uv}prZ^>Q=MUp%`m4Oj7X#8yFX>JiT*zsmN=QJYr_n|$M>r*KhT>)xX z?bdk|mIxGtoyCtYCBqUs2uVN&+&=U$`t>yX5?s6B5Y1lXU4n;3#WQs}4P!ULo14#0 z=V6|(w4!G{o65r&GvV6vDyH+WKGY$j9+}F+*eB5l*3)^ICL*l);8Y&Qz6dX{d@-Ge zF)l-h^DL(GFi+SFrAPjr&cpinq1F^?rt&bx5wwWEDJ%O78uKyE!w5rY?R|@<@-R=B zx6mWWJPZe3!|6PXh(loiBH5SYq}Ox?-CJ@`=okV1?Av3Y K^Wq=MrT+mdHg{(L literal 0 HcmV?d00001 diff --git a/buildozer/tools/packer/http/welcome/buildozer.css b/buildozer/tools/packer/http/welcome/buildozer.css new file mode 100644 index 0000000..6871cd2 --- /dev/null +++ b/buildozer/tools/packer/http/welcome/buildozer.css @@ -0,0 +1,7 @@ +body { + padding: 20px; +} + +pre { + padding: 20px; +} diff --git a/buildozer/tools/packer/http/welcome/index.html b/buildozer/tools/packer/http/welcome/index.html new file mode 100644 index 0000000..95ed6e3 --- /dev/null +++ b/buildozer/tools/packer/http/welcome/index.html @@ -0,0 +1,67 @@ + + + + Kivy/Buildozer VM + + + + +

Welcome to the Kivy/Buildozer VM

+ + +

+ Thanks for using Kivy/Buildozer VM. It has been installed only for + packaging Kivy application for Android.
+ Credentials: username: kivy / password: kivy +

+ +

How to use the VM

+

+ Buildozer has been used to build a project and should be functionnal + for yours. It is preferrable to add a Shared Folder and build from there. + By the time we shipped the VM and you using it, you may need to + update buildozer. +

+

+ Go into your project directory, then: +

# Just build your application
+buildozer android_new debug
+
+# Build your application, deploy on the phone,
+# run it, and display the logs from the phone
+buildozer android_new debug deploy run logcat
+

+

+ Virtualbox doesn't support symlink in Shared Folder anymore. So buildozer + will fail during the build.
+ We already created a /build directory where you can put your + build in it. Edit your buildozer.ini: +

[buildozer]
+build_dir = /build/buildozer-myapp
+

+ + +

Update buildozer

+

+ The buildozer version you have may be outdated, as well as the dependencies. + The best is to regulary update buildozer: +

sudo pip install -U buildozer
+

+ +

Cleaning cache

+ +

+ The simplest way to update kivy and other modules is to clean all the + buildozer cache, and rebuild everything. + +

rm -rf ~/.buildozer/android/packages
+

+ + + + + diff --git a/buildozer/tools/packer/http/welcome/milligram.min.css b/buildozer/tools/packer/http/welcome/milligram.min.css new file mode 100644 index 0000000..85f877b --- /dev/null +++ b/buildozer/tools/packer/http/welcome/milligram.min.css @@ -0,0 +1,11 @@ +/*! + * Milligram v1.3.0 + * https://milligram.github.io + * + * Copyright (c) 2017 CJ Patoilo + * Licensed under the MIT license + */ + +*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#606c76;font-family:'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;font-size:1.6em;font-weight:300;letter-spacing:.01em;line-height:1.6}blockquote{border-left:0.3rem solid #d1d1d1;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote *:last-child{margin-bottom:0}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#9b4dca;border:0.1rem solid #9b4dca;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3.0rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#9b4dca;border-color:#9b4dca}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#9b4dca}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#9b4dca}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#9b4dca}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#9b4dca}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:0.3rem solid #9b4dca;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:0.1rem solid #f4f5f6;margin:3.0rem 0}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1.0rem;width:100%}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,textarea:focus,select:focus{border-color:#9b4dca;outline:0}select{background:url('data:image/svg+xml;utf8,') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8,')}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}.container{margin:0 auto;max-width:112.0rem;padding:0 2.0rem;position:relative;width:100%}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{-ms-grid-row-align:center;align-self:center}@media (min-width: 40rem){.row{flex-direction:row;margin-left:-1.0rem;width:calc(100% + 2.0rem)}.row .column{margin-bottom:inherit;padding:0 1.0rem}}a{color:#9b4dca;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3.0rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;width:100%}td,th{border-bottom:0.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right} + +/*# sourceMappingURL=milligram.min.css.map */ \ No newline at end of file diff --git a/buildozer/tools/packer/scripts/additional-packages.sh b/buildozer/tools/packer/scripts/additional-packages.sh index 70d12fa..f8ee816 100644 --- a/buildozer/tools/packer/scripts/additional-packages.sh +++ b/buildozer/tools/packer/scripts/additional-packages.sh @@ -3,5 +3,8 @@ wget http://bootstrap.pypa.io/get-pip.py python get-pip.py rm get-pip.py -apt-get -y install git openjdk-7-jdk --no-install-recommends zlib1g-dev -pip install cython buildozer + +apt-get -y install lib32z1 lib32ncurses5 +apt-get -y install build-essential +apt-get -y install git openjdk-9-jdk --no-install-recommends zlib1g-dev +pip install cython buildozer python-for-android diff --git a/buildozer/tools/packer/scripts/install-virtualbox-guest-additions.sh b/buildozer/tools/packer/scripts/install-virtualbox-guest-additions.sh new file mode 100644 index 0000000..3b714f8 --- /dev/null +++ b/buildozer/tools/packer/scripts/install-virtualbox-guest-additions.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# Mount the disk image +cd /tmp +mkdir /tmp/isomount +mount -t iso9660 -o loop /root/VBoxGuestAdditions.iso /tmp/isomount + +# Install the drivers +/tmp/isomount/VBoxLinuxAdditions.run + +# Cleanup +umount isomount +rm -rf isomount /root/VBoxGuestAdditions.iso diff --git a/buildozer/tools/packer/scripts/minimize.sh b/buildozer/tools/packer/scripts/minimize.sh index 6955ede..eb7f2b9 100644 --- a/buildozer/tools/packer/scripts/minimize.sh +++ b/buildozer/tools/packer/scripts/minimize.sh @@ -1,5 +1,11 @@ #!/bin/bash +# Remove unwanted applications +apt-get -y remove --purge libreoffice* +apt-get -y remove --purge pidgin* +apt-get -y remove --purge thunderbird* +apt-get -y remove --purge fonts-noto-cjk + # Remove APT cache apt-get -y --purge autoremove apt-get -y clean @@ -9,13 +15,13 @@ find /var/log -type f | while read f; do echo -ne '' > $f; done; # Whiteout root count=`df --sync -kP / | tail -n1 | awk -F ' ' '{print $4}'`; -let count-- +count=$(expr $count - 1) dd if=/dev/zero of=/tmp/whitespace bs=1024 count=$count; rm /tmp/whitespace; # Whiteout /boot count=`df --sync -kP /boot | tail -n1 | awk -F ' ' '{print $4}'`; -let count-- +count=$(expr $count - 1) dd if=/dev/zero of=/boot/whitespace bs=1024 count=$count; rm /boot/whitespace; diff --git a/buildozer/tools/packer/scripts/setup.sh b/buildozer/tools/packer/scripts/setup.sh new file mode 100644 index 0000000..8b107f5 --- /dev/null +++ b/buildozer/tools/packer/scripts/setup.sh @@ -0,0 +1,37 @@ +#!/bin/bash +export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus" + +# ensure the kivy user can mount shared folders +adduser kivy vboxsf + +# create a space specifically for builds +mkdir /build +chown kivy /build + +# add a little face +wget $PACKER_HTTP_ADDR/kivy-icon-96.png +mv kivy-icon-96.png /home/kivy/.face +chown kivy.kivy /home/kivy/.face + +# set wallpaper +wget $PACKER_HTTP_ADDR/wallpaper.png +mv wallpaper.png /usr/share/backgrounds/kivy-wallpaper.png +xfconf-query -c xfce4-desktop \ + --property /backdrop/screen0/monitor0/workspace0/last-image \ + --set /usr/share/backgrounds/kivy-wallpaper.png + +# change theme (works better for this wallpaper) +xfconf-query -c xsettings \ + --property /Net/ThemeName \ + --set Adwaita +xfconf-query -c xsettings \ + --property /Net/IconThemeName \ + --set elementary-xfce-darker + +# copy welcome directory +mkdir -p /usr/share/applications/buildozer-welcome +cd /usr/share/applications/buildozer-welcome +wget $PACKER_HTTP_ADDR/welcome/milligram.min.css +wget $PACKER_HTTP_ADDR/welcome/buildozer.css +wget $PACKER_HTTP_ADDR/welcome/index.css +cd - diff --git a/buildozer/tools/packer/template.json b/buildozer/tools/packer/template.json index 718b5ab..232bea9 100644 --- a/buildozer/tools/packer/template.json +++ b/buildozer/tools/packer/template.json @@ -4,16 +4,16 @@ "disk_format": "ovf", "ssh_username": "kivy", "ssh_password": "kivy", - "hostname": "ubuntu" + "hostname": "kivyvm" }, "description": "Build a Xubuntu Virtual Machine", "builders": [{ "type": "virtualbox-iso", "name": "from-netboot-iso", "http_directory": "http", - "iso_checksum": "4c58dcf09083cd3aa602eb1b79810a0ff58b7c21", + "iso_checksum": "6131e2cc90cf30407af18f3f1af16c54bf58ffc8", "iso_checksum_type": "sha1", - "iso_url": "http://archive.ubuntu.com/ubuntu/dists/vivid/main/installer-i386/current/images/netboot/mini.iso", + "iso_url": "http://archive.ubuntu.com/ubuntu/dists/zesty/main/installer-amd64/current/images/netboot/mini.iso", "ssh_username": "{{user `ssh_username`}}", "ssh_password": "{{user `ssh_password`}}", "boot_wait": "3s", @@ -31,13 +31,17 @@ "format": "{{user `disk_format`}}", "headless": false, "shutdown_command": "echo {{user `ssh_password`}} | sudo -S shutdown -P now", - "vm_name": "ubuntu", + "vm_name": "Kivy/Buildozer VM", + "guest_os_type": "Ubuntu_64", + "guest_additions_path": "/root", "ssh_wait_timeout": "120m" }], "provisioners": [{ "type": "shell", "execute_command": "echo {{user `ssh_password`}} | {{ .Vars }} sudo -E -S sh '{{ .Path }}'", "scripts": [ + "scripts/install-virtualbox-guest-additions.sh", + "scripts/setup.sh", "scripts/additional-packages.sh", "scripts/minimize.sh" ] From 70995b198931e40fb4b518fb660b0bc8f172f0c8 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 13 May 2017 02:38:27 +0200 Subject: [PATCH 08/27] fix guest addition installation, fixes wallpaper that doesn't work before user creation, and add brand new buildozer.desktop --- buildozer/tools/packer/.gitignore | 1 + buildozer/tools/packer/http/buildozer.desktop | 7 +++ .../install-virtualbox-guest-additions.sh | 3 +- buildozer/tools/packer/scripts/setup.sh | 46 ++++++++++++++----- buildozer/tools/packer/template.json | 2 +- 5 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 buildozer/tools/packer/.gitignore create mode 100644 buildozer/tools/packer/http/buildozer.desktop diff --git a/buildozer/tools/packer/.gitignore b/buildozer/tools/packer/.gitignore new file mode 100644 index 0000000..e893b4d --- /dev/null +++ b/buildozer/tools/packer/.gitignore @@ -0,0 +1 @@ +packer_cache diff --git a/buildozer/tools/packer/http/buildozer.desktop b/buildozer/tools/packer/http/buildozer.desktop new file mode 100644 index 0000000..8804092 --- /dev/null +++ b/buildozer/tools/packer/http/buildozer.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=Buildozer +Exec=firefox -url "file:///usr/share/applications/buildozer-welcome/index.html" -width 600 -height 800 +Icon=/usr/share/applications/buildozer-welcome/icon.png +Categories=Application;Development;favourite; diff --git a/buildozer/tools/packer/scripts/install-virtualbox-guest-additions.sh b/buildozer/tools/packer/scripts/install-virtualbox-guest-additions.sh index 3b714f8..ba20f72 100644 --- a/buildozer/tools/packer/scripts/install-virtualbox-guest-additions.sh +++ b/buildozer/tools/packer/scripts/install-virtualbox-guest-additions.sh @@ -3,11 +3,10 @@ # Mount the disk image cd /tmp mkdir /tmp/isomount -mount -t iso9660 -o loop /root/VBoxGuestAdditions.iso /tmp/isomount +mount -t iso9660 /dev/sr1 /tmp/isomount # Install the drivers /tmp/isomount/VBoxLinuxAdditions.run # Cleanup umount isomount -rm -rf isomount /root/VBoxGuestAdditions.iso diff --git a/buildozer/tools/packer/scripts/setup.sh b/buildozer/tools/packer/scripts/setup.sh index 8b107f5..701f09d 100644 --- a/buildozer/tools/packer/scripts/setup.sh +++ b/buildozer/tools/packer/scripts/setup.sh @@ -1,5 +1,22 @@ #!/bin/bash -export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus" +# xfconf doesn't work with sudo, even with XAUTHORITY + DISPLAY +# seems that the user need to log to be able to use them. + +# keep them for reference for now. +# change theme (works better for this wallpaper) +# xfconf-query -c xfce4-desktop \ +# --property /backdrop/screen0/monitor0/workspace0/last-image \ +# --set /usr/share/backgrounds/kivy-wallpaper.png +# xfconf-query -c xsettings \ +# --property /Net/ThemeName \ +# --set Adwaita +# xfconf-query -c xsettings \ +# --property /Net/IconThemeName \ +# --set elementary-xfce-darker + + + +set -x # ensure the kivy user can mount shared folders adduser kivy vboxsf @@ -16,22 +33,27 @@ chown kivy.kivy /home/kivy/.face # set wallpaper wget $PACKER_HTTP_ADDR/wallpaper.png mv wallpaper.png /usr/share/backgrounds/kivy-wallpaper.png -xfconf-query -c xfce4-desktop \ - --property /backdrop/screen0/monitor0/workspace0/last-image \ - --set /usr/share/backgrounds/kivy-wallpaper.png +sed -i "s:/usr/share/xfce4/backdrops/xubuntu-wallpaper.png:/usr/share/backgrounds/kivy-wallpaper.png:g" /etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml +sed -i "s:Greybird:Adwaita:g" /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml +sed -i "s:Greybird:Adwaita:g" /etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml +sed -i "s:Greybird:Adwaita:g" /etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml +sed -i "s:Greybird:Adwaita:g" /etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml/xfce4-notifyd.xml +sed -i "s:elementary-xfce-dark:elementary-xfce-darkest:g" /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml -# change theme (works better for this wallpaper) -xfconf-query -c xsettings \ - --property /Net/ThemeName \ - --set Adwaita -xfconf-query -c xsettings \ - --property /Net/IconThemeName \ - --set elementary-xfce-darker +# add desktop icon +wget $PACKER_HTTP_ADDR/buildozer.desktop +mkdir -p /home/kivy/Desktop +cp buildozer.desktop /home/kivy/Desktop/ +chown kivy.kivy /home/kivy/Desktop +mv buildozer.desktop /usr/share/applications/ +sed -i "s:^favorites=.*$:favorites=buildozer.desktop,exo-terminal-emulator.desktop,exo-web-browser.desktop,exo-file-manager.desktop,org.gnome.Software.desktop,xfhelp4.desktop:g" /etc/xdg/xdg-xubuntu/xfce4/whiskermenu/defaults.rc # copy welcome directory mkdir -p /usr/share/applications/buildozer-welcome cd /usr/share/applications/buildozer-welcome wget $PACKER_HTTP_ADDR/welcome/milligram.min.css wget $PACKER_HTTP_ADDR/welcome/buildozer.css -wget $PACKER_HTTP_ADDR/welcome/index.css +wget $PACKER_HTTP_ADDR/welcome/index.html +wget $PACKER_HTTP_ADDR/kivy-icon-96.png +mv kivy-icon-96.png icon.png cd - diff --git a/buildozer/tools/packer/template.json b/buildozer/tools/packer/template.json index 232bea9..10557d0 100644 --- a/buildozer/tools/packer/template.json +++ b/buildozer/tools/packer/template.json @@ -33,7 +33,7 @@ "shutdown_command": "echo {{user `ssh_password`}} | sudo -S shutdown -P now", "vm_name": "Kivy/Buildozer VM", "guest_os_type": "Ubuntu_64", - "guest_additions_path": "/root", + "guest_additions_mode": "attach", "ssh_wait_timeout": "120m" }], "provisioners": [{ From 129570c0fe9e07a3a3ca313d0438ab826f0509b2 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 13 May 2017 15:02:30 +0200 Subject: [PATCH 09/27] latest fixes, got buildozer working. woot woot --- buildozer/tools/packer/.gitignore | 1 + buildozer/tools/packer/README.md | 1 + buildozer/tools/packer/http/preseed.cfg | 8 +-- .../tools/packer/http/welcome/buildozer.css | 8 +++ .../tools/packer/http/welcome/index.html | 61 +++++++++++++++---- .../packer/scripts/additional-packages.sh | 7 ++- buildozer/tools/packer/scripts/setup.sh | 6 +- 7 files changed, 71 insertions(+), 21 deletions(-) diff --git a/buildozer/tools/packer/.gitignore b/buildozer/tools/packer/.gitignore index e893b4d..738caae 100644 --- a/buildozer/tools/packer/.gitignore +++ b/buildozer/tools/packer/.gitignore @@ -1 +1,2 @@ packer_cache +output-from-netboot-iso diff --git a/buildozer/tools/packer/README.md b/buildozer/tools/packer/README.md index 462aec5..37d6574 100644 --- a/buildozer/tools/packer/README.md +++ b/buildozer/tools/packer/README.md @@ -18,3 +18,4 @@ You want to edit `http/preseed.cfg` and `template.json` before building an image - [compact the image](https://crysol.github.io/recipe/2013-10-15/virtualbox-compact-vmdk-images/) - trigger a build on travis, torrent creation and gdrive upload when buildozer is released + - https://www.packer.io/docs/builders/virtualbox-ovf.html diff --git a/buildozer/tools/packer/http/preseed.cfg b/buildozer/tools/packer/http/preseed.cfg index 423c81f..0ad12aa 100644 --- a/buildozer/tools/packer/http/preseed.cfg +++ b/buildozer/tools/packer/http/preseed.cfg @@ -12,10 +12,10 @@ d-i netcfg/wireless_wep string ### Mirror d-i mirror/country string manual -# d-i mirror/http/hostname string fr.archive.ubuntu.com -# d-i mirror/http/directory string /ubuntu -d-i mirror/http/hostname string 192.168.1.16:3142 -d-i mirror/http/directory string /fr.archive.ubuntu.com/ubuntu +d-i mirror/http/hostname string fr.archive.ubuntu.com +d-i mirror/http/directory string /ubuntu +# d-i mirror/http/hostname string 192.168.1.16:3142 +# d-i mirror/http/directory string /fr.archive.ubuntu.com/ubuntu d-i mirror/http/proxy string ### Time diff --git a/buildozer/tools/packer/http/welcome/buildozer.css b/buildozer/tools/packer/http/welcome/buildozer.css index 6871cd2..0cd7a9f 100644 --- a/buildozer/tools/packer/http/welcome/buildozer.css +++ b/buildozer/tools/packer/http/welcome/buildozer.css @@ -5,3 +5,11 @@ body { pre { padding: 20px; } + +.warning { + background-color: #fff5f6; + border-left: 2px solid #c0392b; + padding: 20px; + margin-bottom: 2.5rem; + padding-bottom: 1px; +} diff --git a/buildozer/tools/packer/http/welcome/index.html b/buildozer/tools/packer/http/welcome/index.html index 95ed6e3..34eeab3 100644 --- a/buildozer/tools/packer/http/welcome/index.html +++ b/buildozer/tools/packer/http/welcome/index.html @@ -21,31 +21,66 @@

How to use the VM

- Buildozer has been used to build a project and should be functionnal - for yours. It is preferrable to add a Shared Folder and build from there. + Buildozer is ready to be used. You'll need internet connection for + download the Android SDK/NDK (automatically done), and during the first + compilation. +
+ It is preferrable to add a share a folder + between your host and the VM, then build from there.
+ By the time we shipped the VM and you using it, you may need to update buildozer.

- Go into your project directory, then: -

# Just build your application
-buildozer android_new debug
-
-# Build your application, deploy on the phone,
-# run it, and display the logs from the phone
-buildozer android_new debug deploy run logcat
+ Don't try to use latest Android SDK or NDK. The defaults from buildozer + works: Android SDK 20, Android NDK 9c. Recent Android SDK doesn't work + the same as before (no more android command), and python-for-android + project have issues with it. As for NDK, you can use r13c, it works too.

-

+

    +
  1. First time only, in your project directory: buildozer init
  2. +
  3. Adjust the buildozer.spec: +
    [buildozer]
    +# change the name of your app
    +package.name = myapp
    +
    +# change the domain of your package
    +package.domain = com.mydomain
    +
    +# specify hostpython2 manually. If you want to use python 3, check buildozer
    +# README about it, the VM is not preinstalled for that.
    +requirements = hostpython2,kivy
    +
    +[buildozer]
    +# update the build directory (issue with virtualbox shared folder and symlink)
    +build_dir = /build/myapp
    +
  4. +
  5. Build your application: buildozer android_new debug
  6. +
  7. Build and deploy, run and get the logs: buildozer android_new debug deploy run logcat
  8. +
+ +

Share a folder

+

+ Virtualbox allows you to share a folder between your computer and the + VM. To do, just: +

    +
  1. Go into Devices < Shared Folders < Shared Folders Settings
  2. +
  3. Add a new folder, select the automount option
  4. +
  5. Reboot the VM (that's easier)
  6. +
  7. You'll find your new directory at /media/sf_directoryname
  8. +
+

+ +
Virtualbox doesn't support symlink in Shared Folder anymore. So buildozer will fail during the build.
We already created a /build directory where you can put your build in it. Edit your buildozer.ini:
[buildozer]
 build_dir = /build/buildozer-myapp
-

+
- -

Update buildozer

+

Update buildozer

The buildozer version you have may be outdated, as well as the dependencies. The best is to regulary update buildozer: diff --git a/buildozer/tools/packer/scripts/additional-packages.sh b/buildozer/tools/packer/scripts/additional-packages.sh index f8ee816..b97ebe8 100644 --- a/buildozer/tools/packer/scripts/additional-packages.sh +++ b/buildozer/tools/packer/scripts/additional-packages.sh @@ -1,10 +1,13 @@ #!/bin/bash -eux +# Don't use openjdk-9, the conf directory is missing, and we get +# an error when using the android sdk: +# "Can't read cryptographic policy directory: unlimited" wget http://bootstrap.pypa.io/get-pip.py python get-pip.py rm get-pip.py -apt-get -y install lib32z1 lib32ncurses5 +apt-get -y install lib32stdc++6 lib32z1 lib32ncurses5 apt-get -y install build-essential -apt-get -y install git openjdk-9-jdk --no-install-recommends zlib1g-dev +apt-get -y install git openjdk-8-jdk --no-install-recommends zlib1g-dev pip install cython buildozer python-for-android diff --git a/buildozer/tools/packer/scripts/setup.sh b/buildozer/tools/packer/scripts/setup.sh index 701f09d..2338387 100644 --- a/buildozer/tools/packer/scripts/setup.sh +++ b/buildozer/tools/packer/scripts/setup.sh @@ -38,15 +38,17 @@ sed -i "s:Greybird:Adwaita:g" /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xsetting sed -i "s:Greybird:Adwaita:g" /etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml sed -i "s:Greybird:Adwaita:g" /etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml sed -i "s:Greybird:Adwaita:g" /etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml/xfce4-notifyd.xml +sed -i "s:elementary-xfce-darker:elementary-xfce-darkest:g" /etc/xdg/xdg-xubuntu/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml sed -i "s:elementary-xfce-dark:elementary-xfce-darkest:g" /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml # add desktop icon wget $PACKER_HTTP_ADDR/buildozer.desktop mkdir -p /home/kivy/Desktop cp buildozer.desktop /home/kivy/Desktop/ -chown kivy.kivy /home/kivy/Desktop +chown kivy.kivy -R /home/kivy/Desktop +chmod +x /home/kivy/Desktop/buildozer.desktop mv buildozer.desktop /usr/share/applications/ -sed -i "s:^favorites=.*$:favorites=buildozer.desktop,exo-terminal-emulator.desktop,exo-web-browser.desktop,exo-file-manager.desktop,org.gnome.Software.desktop,xfhelp4.desktop:g" /etc/xdg/xdg-xubuntu/xfce4/whiskermenu/defaults.rc +sed -i "s:^favorites=.*$:favorites=buildozer.desktop,exo-terminal-emulator.desktop,exo-web-browser.desktop,xfce-keyboard-settings.desktop,exo-file-manager.desktop,org.gnome.Software.desktop,xfhelp4.desktop:g" /etc/xdg/xdg-xubuntu/xfce4/whiskermenu/defaults.rc # copy welcome directory mkdir -p /usr/share/applications/buildozer-welcome From de9eeefbaf96de2cad79f50eaec8068c9c17a2ed Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 13 May 2017 15:41:58 +0200 Subject: [PATCH 10/27] downgrade sh to have a faster build --- buildozer/tools/packer/scripts/additional-packages.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildozer/tools/packer/scripts/additional-packages.sh b/buildozer/tools/packer/scripts/additional-packages.sh index b97ebe8..171f1e4 100644 --- a/buildozer/tools/packer/scripts/additional-packages.sh +++ b/buildozer/tools/packer/scripts/additional-packages.sh @@ -11,3 +11,7 @@ apt-get -y install lib32stdc++6 lib32z1 lib32ncurses5 apt-get -y install build-essential apt-get -y install git openjdk-8-jdk --no-install-recommends zlib1g-dev pip install cython buildozer python-for-android + +# latest sh is too slow, use a previous working version +# CF https://github.com/amoffat/sh/issues/378 +pip install sh\<1.12.5 From 855937e593bb39e10dd8268674a6a4bc8856dc84 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 13 May 2017 15:45:25 +0200 Subject: [PATCH 11/27] fixes changelog, and template name --- buildozer/tools/packer/CHANGELOG | 9 ++++----- buildozer/tools/packer/http/welcome/index.html | 2 +- buildozer/tools/packer/template.json | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/buildozer/tools/packer/CHANGELOG b/buildozer/tools/packer/CHANGELOG index a3993f4..99a5be6 100644 --- a/buildozer/tools/packer/CHANGELOG +++ b/buildozer/tools/packer/CHANGELOG @@ -1,8 +1,7 @@ -## Release 2.0 - 12 May 2017 +## Release 2.0 - 13 May 2017 -- Brand new VM image using latest zesty ubuntu (64 bits) -- Image created for Virtualbox 5.1.22 -- Pre-installed guest tools +- Brand new VM image using latest zesty (x)ubuntu (64 bits) +- Image created for Virtualbox 5.1.22, with guest-tools - Increase disk space to 20GB -- Ready for shared-folder in Virtualbox - /build can store buildozer builds (specify with build_dir=/build/myapp) +- Rewrite welcome document diff --git a/buildozer/tools/packer/http/welcome/index.html b/buildozer/tools/packer/http/welcome/index.html index 34eeab3..3520d76 100644 --- a/buildozer/tools/packer/http/welcome/index.html +++ b/buildozer/tools/packer/http/welcome/index.html @@ -64,7 +64,7 @@ build_dir = /build/myapp Virtualbox allows you to share a folder between your computer and the VM. To do, just:

    -
  1. Go into Devices < Shared Folders < Shared Folders Settings
  2. +
  3. Go into Devices > Shared Folders > Shared Folders Settings
  4. Add a new folder, select the automount option
  5. Reboot the VM (that's easier)
  6. You'll find your new directory at /media/sf_directoryname
  7. diff --git a/buildozer/tools/packer/template.json b/buildozer/tools/packer/template.json index 10557d0..4bfa23d 100644 --- a/buildozer/tools/packer/template.json +++ b/buildozer/tools/packer/template.json @@ -9,7 +9,7 @@ "description": "Build a Xubuntu Virtual Machine", "builders": [{ "type": "virtualbox-iso", - "name": "from-netboot-iso", + "name": "kivy-buildozer-vm", "http_directory": "http", "iso_checksum": "6131e2cc90cf30407af18f3f1af16c54bf58ffc8", "iso_checksum_type": "sha1", From 49f8bf4558033a2c106d6ff8d3db5b51f5506c99 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 13 May 2017 15:48:13 +0200 Subject: [PATCH 12/27] fixes r13c -> 13b --- buildozer/tools/packer/http/welcome/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildozer/tools/packer/http/welcome/index.html b/buildozer/tools/packer/http/welcome/index.html index 3520d76..5a61cc9 100644 --- a/buildozer/tools/packer/http/welcome/index.html +++ b/buildozer/tools/packer/http/welcome/index.html @@ -35,7 +35,7 @@ Don't try to use latest Android SDK or NDK. The defaults from buildozer works: Android SDK 20, Android NDK 9c. Recent Android SDK doesn't work the same as before (no more android command), and python-for-android - project have issues with it. As for NDK, you can use r13c, it works too. + project have issues with it. As for NDK, you can use 13b, it works too.

    1. First time only, in your project directory: buildozer init
    2. From c704b81ccfdd336e7645441c9c6d972f29b4a6ed Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 13 May 2017 17:35:06 +0200 Subject: [PATCH 13/27] add Makefile --- buildozer/tools/packer/.gitignore | 2 +- buildozer/tools/packer/Makefile | 34 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 buildozer/tools/packer/Makefile diff --git a/buildozer/tools/packer/.gitignore b/buildozer/tools/packer/.gitignore index 738caae..e0ace4a 100644 --- a/buildozer/tools/packer/.gitignore +++ b/buildozer/tools/packer/.gitignore @@ -1,2 +1,2 @@ packer_cache -output-from-netboot-iso +output-kivy-buildozer-vm diff --git a/buildozer/tools/packer/Makefile b/buildozer/tools/packer/Makefile new file mode 100644 index 0000000..5021d91 --- /dev/null +++ b/buildozer/tools/packer/Makefile @@ -0,0 +1,34 @@ +.PHONY: all build +VERSION := 2.0 +ANN1 = udp://public.popcorn-tracker.org:6969/announce +ANN2 = udp://ipv4.tracker.harry.lu/announce +ANN3 = udp://tracker.opentrackr.org:1337/announce +ANN4 = udp://9.rarbg.com:2710/announce +ANN5 = udp://explodie.org:6969 +ANN6 = udp://tracker.coppersurfer.tk:6969 +ANN7 = udp://tracker.leechers-paradise.org:6969 +ANN8 = udp://zer0day.ch:1337 +TORRENT_ANNOUNCE := ${ANN1},${ANN2},${ANN3},${ANN4},${ANN5},${ANN6},${ANN7},${ANN8} +PACKAGE_FILENAME = kivy-buildozer-vm-${VERSION}.zip + +all: packer repackage torrent upload + +build: + packer-io build template.json + +repackage: + cd output-kivy-buildozer-vm && mv Kivy kivy-buildozer-vm-${VERSION} + cd output-kivy-buildozer-vm && zip -0 -r ${PACKAGE_FILENAME} kivy-buildozer-vm-${VERSION} + +torrent: + rm -f output-kivy-buildozer-vm/kivy-buildozer-vm.torrent + mktorrent \ + -a ${TORRENT_ANNOUNCE} \ + -o output-kivy-buildozer-vm/kivy-buildozer-vm.torrent \ + -w http://txzone.net/files/torrents/${PACKAGE_FILENAME} \ + -v output-kivy-buildozer-vm/${PACKAGE_FILENAME} + +upload: + # txzone only for now, don't have access to kivy server + rsync -avz --info=progress2 output-kivy-buildozer-vm/${PACKAGE_FILENAME} txzone.net:/var/www/websites/txzone.net/files/torrents/ + rsync -avz --info=progress2 output-kivy-buildozer-vm/kivy-buildozer-vm.torrent txzone.net:/var/www/websites/txzone.net/files/torrents/ From a06707dac72c58790bf8fb7a8ce76d7ae38b4acd Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 13 May 2017 17:37:40 +0200 Subject: [PATCH 14/27] update README for packer --- buildozer/tools/packer/README.md | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/buildozer/tools/packer/README.md b/buildozer/tools/packer/README.md index 37d6574..d3048fc 100644 --- a/buildozer/tools/packer/README.md +++ b/buildozer/tools/packer/README.md @@ -1,6 +1,7 @@ # Introduction -It is an example packer template based on netboot iso that adds packages for xubuntu and buildozer. +This is the packer template for building the official Kivy/Buildozer VM. +It is based on xubuntu. # Configure @@ -8,14 +9,29 @@ You want to edit `http/preseed.cfg` and `template.json` before building an image # Build -`packer build template.json` +``` +make packer +``` -# Testing the image after it's built. +# Release -`./launch` +1. Update Makefile to increase the version number +2. Update the CHANGELOG +3. Commit -# TODO +Then: - - [compact the image](https://crysol.github.io/recipe/2013-10-15/virtualbox-compact-vmdk-images/) - - trigger a build on travis, torrent creation and gdrive upload when buildozer is released - - https://www.packer.io/docs/builders/virtualbox-ovf.html +``` +make all +# make packer < build the image +# make repackage < just zip it (no compression) +# make torrent < create the torrent +# make upload < upload on txzone.net (tito only) +``` + + +# Notes + +- trigger a build on travis, torrent creation and gdrive upload when buildozer is + released +- https://www.packer.io/docs/builders/virtualbox-ovf.html From 93cf05eb8cac07550d3c284c259a8b5d2115226e Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 13 May 2017 17:38:50 +0200 Subject: [PATCH 15/27] update README for reflecting latest image --- README.rst | 39 ++++++--------------------------------- 1 file changed, 6 insertions(+), 33 deletions(-) diff --git a/README.rst b/README.rst index 919c683..9ab0126 100644 --- a/README.rst +++ b/README.rst @@ -19,7 +19,7 @@ Note that this tool has nothing to do with the eponymous online build service Installing Buildozer with python2 support: ------------------------------------------ -#. Install buildozer:: +#. Install buildozer:: # via pip (latest stable, recommended) sudo pip install buildozer @@ -57,7 +57,7 @@ The pip package does not yet support python3. buildozer init #. Make sure the following lines are in your buildozer.spec file.:: - + # Require python3crystax: requirements = python3crystax,kivy @@ -69,9 +69,9 @@ The pip package does not yet support python3. buildozer android_new debug deploy run #. Please note the "android_new" buildozer target, and use that for any and all buildozer commands you run (even if the docs just say "android"). Python3 only works with the **android_new** toolchain. - - + + Examples of Buildozer commands: -------------------------------- @@ -166,21 +166,15 @@ Buildozer Virtual Machine ------------------------- The current virtual machine (available via https://kivy.org/downloads/) allow -you to have a ready to use vm for building android application. But -the current one have many flaw. -We're in the process to deliver a new VM that fixes most of them. +you to have a ready to use vm for building android application. Using shared folders ++++++++++++++++++++ -The Virtualbox Guest tools are outdated, install the latest one: +If the Virtualbox Guest tools are outdated, install the latest one: - in the Virtualbox: `Devices` -> `Install Guest Additions CD images` - in the guest/linux: Go to the cdrom and run the installer - -The `kivy` user is not in the `vboxsf` groups, so in a terminal: - -- `sudo adduser kivy vboxsf` - reboot the vm VirtualBox filesystem doesn't support symlink anymore (don't @@ -191,27 +185,6 @@ do the build outside the shared folder. One solution: - `sudo chown kivy /build` - In your buildozer.spec, section `[buildozer]`, set `build_dir = /build/buildozer-myapp` -No space left -+++++++++++++ - -If you build on the current VM, you'll hit the no space left on device: - -- Stop your VM -- Adjust the disk size to 20GB: `VBoxManage modifyhd ~/Downloads/Buildozer/Buildozer.vdi --resize 20000` -- Download the http://www.slitaz.org/en/get/#stable -- In the virtualbox, `Devices` -> `Optical Drive` -> Select the slitaz iso -- Reboot the VM -- In slitaz, open a terminal, and unmount the swap: `swapoff -a` -- Open gparted - - delete sda2 - - extend sda1 to 18000 - - add a primary partition, set the format to linux-swap - - you should have a sda2 partition - - save -- Unmount the slitaz iso `Devices` -> `Optical Drive` -> `Eject` -- Reset/Restart the VM -- Check your disk is 20GB: `df -h` - Using your devices via the VM +++++++++++++++++++++++++++++ From f55147e3009e525aa822f437c41027b751bea0da Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Sat, 13 May 2017 17:40:09 +0200 Subject: [PATCH 16/27] add note about vm download link in the readme --- README.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.rst b/README.rst index 9ab0126..b53ef2c 100644 --- a/README.rst +++ b/README.rst @@ -13,6 +13,8 @@ Buildozer currently supports packaging for Android via the `python-for-android project, and for iOS via the kivy-ios project. Support for other operating systems is intended in the future. +We provide a ready-to-use `Virtual Machine for Virtualbox `_. + Note that this tool has nothing to do with the eponymous online build service `buildozer.io `_. From 9685bff223cc6e726373ecaeac5e86c39359e1d0 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Mon, 15 May 2017 00:36:56 +0200 Subject: [PATCH 17/27] Update README.rst --- README.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index b53ef2c..b842d8c 100644 --- a/README.rst +++ b/README.rst @@ -10,8 +10,11 @@ OSX and/or Linux. Buildozer currently supports packaging for Android via the `python-for-android `_ -project, and for iOS via the kivy-ios project. Support for other operating systems -is intended in the future. +project, and for iOS via the kivy-ios project. iOS and OSX are still under work. + +For Android: please have a look at `Android-SDK-NDK-Informations +`_. Please note that +the default SDK/NDK coded in Buildozer works for Python 2. We provide a ready-to-use `Virtual Machine for Virtualbox `_. From 48ea2686369348adc05286cbed782ffda09d172b Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Mon, 15 May 2017 01:09:35 +0200 Subject: [PATCH 18/27] migrate tokens. Closes #499 --- README.rst | 2 +- buildozer/__init__.py | 20 ++++++++++++++ buildozer/default.spec | 46 +++++++++++++++++++------------- buildozer/targets/android.py | 8 +++--- buildozer/targets/android_new.py | 6 ++--- docs/source/contribute.rst | 2 +- 6 files changed, 57 insertions(+), 27 deletions(-) diff --git a/README.rst b/README.rst index b53ef2c..3a4a91b 100644 --- a/README.rst +++ b/README.rst @@ -162,7 +162,7 @@ config, along with the environment variables that would override them. - ``title`` -> ``$APP_TITLE`` - ``package.name`` -> ``$APP_PACKAGE_NAME`` -- ``android.p4a_dir`` -> ``$APP_ANDROID_P4A_DIR`` +- ``p4a.source_dir`` -> ``$APP_P4A_SOURCE_DIR`` Buildozer Virtual Machine ------------------------- diff --git a/buildozer/__init__.py b/buildozer/__init__.py index 279cfee..9d30d81 100644 --- a/buildozer/__init__.py +++ b/buildozer/__init__.py @@ -381,6 +381,7 @@ class Buildozer(object): '''Ensure the spec file is 'correct'. ''' self.info('Check configuration tokens') + self.migrate_configuration_tokens() get = self.config.getdefault errors = [] adderror = errors.append @@ -417,6 +418,25 @@ class Buildozer(object): print(error) exit(1) + def migrate_configuration_tokens(self): + config = self.config + if config.has_section("app"): + migration = ( + ("android.p4a_dir", "p4a.source_dir"), + ("android.p4a_whitelist", "android.whitelist"), + ("android.bootstrap", "p4a.bootstrap"), + ("android.branch", "p4a.branch"), + ("android.p4a_whitelist_src", "android.whitelist_src"), + ("android.p4a_blacklist_src", "android.blacklist_src") + ) + for entry_old, entry_new in migration: + if not config.has_option("app", entry_old): + continue + value = config.get("app", entry_old) + config.set("app", entry_new, value) + config.remove_option("app", entry_old) + self.error("In section [app]: {} is deprecated, rename to {}!".format( + entry_old, entry_new)) def check_build_layout(self): '''Ensure the build (local and global) directory layout and files are diff --git a/buildozer/default.spec b/buildozer/default.spec index 3b9ffe6..e480a10 100644 --- a/buildozer/default.spec +++ b/buildozer/default.spec @@ -111,29 +111,23 @@ fullscreen = 0 # (str) ANT directory (if empty, it will be automatically downloaded.) #android.ant_path = -# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github) -#android.p4a_dir = - -# (str) The directory in which python-for-android should look for your own build recipes (if any) -#p4a.local_recipes = - -# (str) Filename to the hook for p4a -#p4a.hook = - -# (list) python-for-android whitelist -#android.p4a_whitelist = - # (bool) If True, then skip trying to update the Android sdk # This can be useful to avoid excess Internet downloads or save time # when an update is due and you just want to test/build your package # android.skip_update = False -# (str) Bootstrap to use for android builds (android_new only) -# android.bootstrap = sdl2 - # (str) Android entry point, default is ok for Kivy-based app #android.entrypoint = org.renpy.android.PythonActivity +# (list) Pattern to whitelist for the whole project +#android.whitelist = + +# (str) Path to a custom whitelist file +#android.whitelist_src = + +# (str) Path to a custom blacklist file +#android.blacklist_src = + # (list) List of Java .jar files to add to the libs so that pyjnius can access # their classes. Don't add jars that you do not need, since extra jars can slow # down the build process. Allows wildcards matching, for example: @@ -152,9 +146,8 @@ fullscreen = 0 # bootstrap) #android.gradle_dependencies = -# (str) python-for-android branch to use, if not master, useful to try -# not yet merged features. -#android.branch = master +# (str) python-for-android branch to use, defaults to master +#p4a.branch = master # (str) OUYA Console category. Should be one of GAME or APP # If you leave this blank, OUYA support will not be enabled @@ -192,6 +185,23 @@ fullscreen = 0 # (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86 android.arch = armeabi-v7a +# +# Python for android (p4a) specific +# + +# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github) +#p4a.source_dir = + +# (str) The directory in which python-for-android should look for your own build recipes (if any) +#p4a.local_recipes = + +# (str) Filename to the hook for p4a +#p4a.hook = + +# (str) Bootstrap to use for android builds (android_new only) +# p4a.bootstrap = sdl2 + + # # iOS specific # diff --git a/buildozer/targets/android.py b/buildozer/targets/android.py index 4b0340c..2936931 100644 --- a/buildozer/targets/android.py +++ b/buildozer/targets/android.py @@ -462,17 +462,17 @@ class TargetAndroid(Target): def install_platform(self): cmd = self.buildozer.cmd - source = self.buildozer.config.getdefault('app', 'android.branch', + source = self.buildozer.config.getdefault('app', 'p4a.branch', self.p4a_branch) self.pa_dir = pa_dir = join(self.buildozer.platform_dir, self.p4a_directory) system_p4a_dir = self.buildozer.config.getdefault('app', - 'android.p4a_dir') + 'p4a.source_dir') if system_p4a_dir: self.pa_dir = pa_dir = expanduser(system_p4a_dir) if not self.buildozer.file_exists(pa_dir): self.buildozer.error( - 'Path for android.p4a_dir does not exist') + 'Path for p4a.source_dir does not exist') self.buildozer.error('') raise BuildozerException() else: @@ -594,7 +594,7 @@ class TargetAndroid(Target): def _generate_whitelist(self, dist_dir): p4a_whitelist = self.buildozer.config.getlist( - 'app', 'android.p4a_whitelist') or [] + 'app', 'android.whitelist') or [] whitelist_fn = join(dist_dir, 'whitelist.txt') with open(whitelist_fn, 'w') as fd: for wl in p4a_whitelist: diff --git a/buildozer/targets/android_new.py b/buildozer/targets/android_new.py index 85bb922..8848dfe 100644 --- a/buildozer/targets/android_new.py +++ b/buildozer/targets/android_new.py @@ -22,7 +22,7 @@ class TargetAndroidNew(TargetAndroid): executable = sys.executable or 'python' self._p4a_cmd = '{} -m pythonforandroid.toolchain '.format(executable) self._p4a_bootstrap = self.buildozer.config.getdefault( - 'app', 'android.bootstrap', 'sdl2') + 'app', 'p4a.bootstrap', 'sdl2') self.p4a_apk_cmd += self._p4a_bootstrap color = 'always' if USE_COLOR else 'never' self.extra_p4a_args = ' --color={} --storage-dir={}'.format( @@ -124,8 +124,8 @@ class TargetAndroidNew(TargetAndroid): cmd.append(local_recipes) # support for blacklist/whitelist filename - whitelist_src = self.buildozer.config.getdefault('app', 'android.p4a_whitelist_src', None) - blacklist_src = self.buildozer.config.getdefault('app', 'android.p4a_blacklist_src', None) + whitelist_src = self.buildozer.config.getdefault('app', 'android.whitelist_src', None) + blacklist_src = self.buildozer.config.getdefault('app', 'android.blacklist_src', None) if whitelist_src: cmd.append('--whitelist') cmd.append(realpath(whitelist_src)) diff --git a/docs/source/contribute.rst b/docs/source/contribute.rst index 5b16616..de2802d 100644 --- a/docs/source/contribute.rst +++ b/docs/source/contribute.rst @@ -22,7 +22,7 @@ To test your own recipe via Buildozer, you need to: #. Change your `buildozer.spec` to reference your version:: - android.p4a_dir = /path/to/your/python-for-android + p4a.source_dir = /path/to/your/python-for-android #. Copy your recipe into `python-for-android/recipes/YOURLIB/recipe.sh` From 11f9dfaa509cf11cc4e3376a9f75f14ea0ad12c9 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Mon, 15 May 2017 01:10:03 +0200 Subject: [PATCH 19/27] use p4a stable branch by default. Closes #498 --- buildozer/default.spec | 2 +- buildozer/targets/android_new.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildozer/default.spec b/buildozer/default.spec index e480a10..a0e0b55 100644 --- a/buildozer/default.spec +++ b/buildozer/default.spec @@ -147,7 +147,7 @@ fullscreen = 0 #android.gradle_dependencies = # (str) python-for-android branch to use, defaults to master -#p4a.branch = master +#p4a.branch = stable # (str) OUYA Console category. Should be one of GAME or APP # If you leave this blank, OUYA support will not be enabled diff --git a/buildozer/targets/android_new.py b/buildozer/targets/android_new.py index 8848dfe..effe603 100644 --- a/buildozer/targets/android_new.py +++ b/buildozer/targets/android_new.py @@ -11,7 +11,7 @@ from os.path import join, expanduser, realpath class TargetAndroidNew(TargetAndroid): targetname = 'android_new' - p4a_branch = "master" + p4a_branch = "stable" p4a_directory = "python-for-android-master" p4a_apk_cmd = "apk --debug --bootstrap=" extra_p4a_args = '' From e2b46c0502d2fb424c8122b7a192cf0ff5e4e9c9 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Mon, 15 May 2017 01:37:44 +0200 Subject: [PATCH 20/27] extract p4a dependencies, to be sure it works. Closes #501 --- buildozer/targets/android.py | 50 ++++++++++++++++++++++---------- buildozer/targets/android_new.py | 1 + 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/buildozer/targets/android.py b/buildozer/targets/android.py index 2936931..55e9fe0 100644 --- a/buildozer/targets/android.py +++ b/buildozer/targets/android.py @@ -20,6 +20,8 @@ APACHE_ANT_VERSION = '1.9.4' import traceback import os import io +import re +import ast from pipes import quote from sys import platform, executable from buildozer import BuildozerException @@ -461,6 +463,25 @@ class TargetAndroid(Target): raise BuildozerException() def install_platform(self): + self._install_p4a() + self._install_apache_ant() + self._install_android_sdk() + self._install_android_ndk() + self._install_android_packages() + + # ultimate configuration check. + # some of our configuration cannot be check without platform. + self.check_configuration_tokens() + + self.buildozer.environ.update({ + 'PACKAGES_PATH': self.buildozer.global_packages_dir, + 'ANDROIDSDK': self.android_sdk_dir, + 'ANDROIDNDK': self.android_ndk_dir, + 'ANDROIDAPI': self.android_api, + 'ANDROIDNDKVER': 'r{}'.format(self.android_ndk_version) + }) + + def _install_p4a(self): cmd = self.buildozer.cmd source = self.buildozer.config.getdefault('app', 'p4a.branch', self.p4a_branch) @@ -493,22 +514,19 @@ class TargetAndroid(Target): cwd=pa_dir) cmd('git checkout {}'.format(source), cwd=pa_dir) - self._install_apache_ant() - self._install_android_sdk() - self._install_android_ndk() - self._install_android_packages() - - # ultimate configuration check. - # some of our configuration cannot be check without platform. - self.check_configuration_tokens() - - self.buildozer.environ.update({ - 'PACKAGES_PATH': self.buildozer.global_packages_dir, - 'ANDROIDSDK': self.android_sdk_dir, - 'ANDROIDNDK': self.android_ndk_dir, - 'ANDROIDAPI': self.android_api, - 'ANDROIDNDKVER': 'r{}'.format(self.android_ndk_version) - }) + # also install dependencies (currently, only setup.py knows about it) + # let's extract them. + try: + with open(join(self.pa_dir, "setup.py")) as fd: + setup = fd.read() + deps = re.findall("install_reqs = (\[[^\]]*\])", setup, re.DOTALL | re.MULTILINE)[1] + deps = ast.literal_eval(deps) + except Exception: + deps = [] + pip_deps = [] + for dep in deps: + pip_deps.append('"{}"'.format(dep)) + cmd('pip install -q --user {}'.format(" ".join(pip_deps))) def get_available_packages(self): available_modules = self.buildozer.cmd('./distribute.sh -l', diff --git a/buildozer/targets/android_new.py b/buildozer/targets/android_new.py index effe603..61e1da1 100644 --- a/buildozer/targets/android_new.py +++ b/buildozer/targets/android_new.py @@ -2,6 +2,7 @@ ''' Android target, based on python-for-android project (new toolchain) ''' + import sys from buildozer import USE_COLOR From b656922f6b48b3682d79e7c7dd14823b1f0780fb Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Mon, 15 May 2017 01:49:51 +0200 Subject: [PATCH 21/27] prevent releasing an app that have org.test or org.kivy as domain. Closes #500 --- buildozer/target.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/buildozer/target.py b/buildozer/target.py index b287d16..c06bd0d 100644 --- a/buildozer/target.py +++ b/buildozer/target.py @@ -103,7 +103,38 @@ class Target(object): self.buildozer.build() def cmd_release(self, *args): + error = self.buildozer.error self.buildozer.prepare_for_build() + if self.buildozer.config.get("app", "package.domain") == "org.test": + error("") + error("ERROR: Trying to release a package that starts with org.test") + error("") + error("The package.domain org.test is, as the name intented, a test.") + error("Once you published an application with org.test,") + error("you cannot change it, it will be part of the identifier") + error("for Google Play / App Store / etc.") + error("") + error("So change package.domain to anything else.") + error("") + error("If you messed up before, set the environment variable to force the build:") + error("export BUILDOZER_ALLOW_ORG_TEST_DOMAIN=1") + error("") + if "BUILDOZER_ALLOW_ORG_TEST_DOMAIN" not in os.environ: + exit(1) + + if self.buildozer.config.get("app", "package.domain") == "org.kivy": + error("") + error("ERROR: Trying to release a package that starts with org.kivy") + error("") + error("The package.domain org.kivy is reserved for the Kivy official") + error("applications. Please use your own domain.") + error("") + error("If you are a Kivy developer, add an export in your shell") + error("export BUILDOZER_ALLOW_KIVY_ORG_DOMAIN=1") + error("") + if "BUILDOZER_ALLOW_KIVY_ORG_DOMAIN" not in os.environ: + exit(1) + self.build_mode = 'release' self.buildozer.build() @@ -115,4 +146,3 @@ class Target(object): def cmd_serve(self, *args): self.buildozer.cmd_serve() - From 127c581f5bba075551173249fbab0a254a552d1b Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Mon, 15 May 2017 02:07:34 +0200 Subject: [PATCH 22/27] upgrade android_new -> android + android -> android_old. Closes #497 --- README.rst | 35 +++++++++---------- buildozer/__init__.py | 24 +++++++++++-- buildozer/default.spec | 2 +- buildozer/targets/android.py | 2 +- buildozer/targets/android_new.py | 4 +-- buildozer/targets/ios.py | 7 ++-- buildozer/targets/osx.py | 1 + .../tools/packer/http/welcome/index.html | 4 +-- 8 files changed, 49 insertions(+), 30 deletions(-) diff --git a/README.rst b/README.rst index 5f20386..18046af 100644 --- a/README.rst +++ b/README.rst @@ -12,7 +12,7 @@ Buildozer currently supports packaging for Android via the `python-for-android `_ project, and for iOS via the kivy-ios project. iOS and OSX are still under work. -For Android: please have a look at `Android-SDK-NDK-Informations +For Android: please have a look at `Android-SDK-NDK-Informations `_. Please note that the default SDK/NDK coded in Buildozer works for Python 2. @@ -42,7 +42,7 @@ Installing Buildozer with python2 support: buildozer init # edit the buildozer.spec, then - buildozer android_new debug deploy run + buildozer android debug deploy run Installing Buildozer with python3 support: ------------------------------------------ @@ -71,10 +71,9 @@ The pip package does not yet support python3. #. Finally, build, deploy and run the app on your phone:: - buildozer android_new debug deploy run - -#. Please note the "android_new" buildozer target, and use that for any and all buildozer commands you run (even if the docs just say "android"). Python3 only works with the **android_new** toolchain. + buildozer android debug deploy run +#. Please note the "android" buildozer target, and use that for any and all buildozer commands you run (even if the docs just say "android"). Examples of Buildozer commands: @@ -83,17 +82,17 @@ Examples of Buildozer commands: :: # buildozer target command - buildozer android_new clean - buildozer android_new update - buildozer android_new deploy - buildozer android_new debug - buildozer android_new release + buildozer android clean + buildozer android update + buildozer android deploy + buildozer android debug + buildozer android release # or all in one (compile in debug, deploy on device) - buildozer android_new debug deploy + buildozer android debug deploy # set the default command if nothing set - buildozer setdefault android_new debug deploy run + buildozer setdefault android debug deploy run Usage @@ -106,9 +105,9 @@ Usage buildozer --version Available targets: - android Android target, based on python-for-android project (old toolchain) - ios iOS target, based on kivy-ios project - android_new Android target, based on python-for-android project (new toolchain) + android Android target, based on python-for-android project + ios iOS target, based on kivy-ios project + android_old Android target, based on python-for-android project (old toolchain) Global commands (without target): distclean Clean the whole Buildozer environment. @@ -127,7 +126,7 @@ Usage run Run the application on the device serve Serve the bin directory via SimpleHTTPServer - Target "android" commands: + Target "android_old" commands: adb Run adb from the Android SDK. Args must come after --, or use --alias to make an alias logcat Show the log from the device @@ -136,7 +135,7 @@ Usage list_identities List the available identities to use for signing. xcode Open the xcode project. - Target "android_new" commands: + Target "android" commands: adb Run adb from the Android SDK. Args must come after --, or use --alias to make an alias logcat Show the log from the device @@ -196,7 +195,7 @@ Using your devices via the VM There is a little icon on the bottom left that represent an USB plug. Select it, and select your android device on it. Then you can check: -- `buildozer android_new adb -- devices` +- `buildozer android adb -- devices` If it doesn't, use Google. They are so many differents way / issues depending your phone that Google will be your only source of diff --git a/buildozer/__init__.py b/buildozer/__init__.py index 9d30d81..cf430e4 100644 --- a/buildozer/__init__.py +++ b/buildozer/__init__.py @@ -152,6 +152,7 @@ class Buildozer(object): def set_target(self, target): '''Set the target to use (one of buildozer.targets, such as "android") ''' + target = self.translate_target(target) self.targetname = target m = __import__('buildozer.targets.{0}'.format(target), fromlist=['buildozer']) @@ -914,6 +915,23 @@ class Buildozer(object): # command line invocation # + def translate_target(self, target, inverse=False): + # FIXME at some point, refactor to remove completely android old toolchain + if inverse: + if target == "android": + target = "android_old" + elif target == "android_new": + target = "android" + else: + if target == "android": + target = "android_new" + elif target == "android_new": + self.error("ERROR: The target android_new is now android") + exit(1) + elif target == "android_old": + target = "android" + return target + def targets(self): for fn in listdir(join(dirname(__file__), 'targets')): if fn.startswith('.') or fn.startswith('__'): @@ -924,7 +942,7 @@ class Buildozer(object): try: m = __import__('buildozer.targets.{0}'.format(target), fromlist=['buildozer']) - yield target, m + yield self.translate_target(target, inverse=True), m except NotImplementedError: pass except: @@ -1032,8 +1050,8 @@ class Buildozer(object): # maybe it's a target? targets = [x[0] for x in self.targets()] - if command not in targets: - print('Unknown command/target {}'.format(command)) + if self.translate_target(command, inverse=True) not in targets: + print('Unknown command/target {}'.format(self.translate_target(command, inverse=True))) exit(1) self.set_target(command) diff --git a/buildozer/default.spec b/buildozer/default.spec index a0e0b55..78ba4bc 100644 --- a/buildozer/default.spec +++ b/buildozer/default.spec @@ -198,7 +198,7 @@ android.arch = armeabi-v7a # (str) Filename to the hook for p4a #p4a.hook = -# (str) Bootstrap to use for android builds (android_new only) +# (str) Bootstrap to use for android builds # p4a.bootstrap = sdl2 diff --git a/buildozer/targets/android.py b/buildozer/targets/android.py index 55e9fe0..9914000 100644 --- a/buildozer/targets/android.py +++ b/buildozer/targets/android.py @@ -37,7 +37,7 @@ from buildozer.libs.version import parse class TargetAndroid(Target): - targetname = 'android' + targetname = 'android_old' p4a_directory = "python-for-android" p4a_branch = 'old_toolchain' p4a_apk_cmd = "python build.py" diff --git a/buildozer/targets/android_new.py b/buildozer/targets/android_new.py index 61e1da1..fcf8031 100644 --- a/buildozer/targets/android_new.py +++ b/buildozer/targets/android_new.py @@ -1,6 +1,6 @@ # coding=utf-8 ''' -Android target, based on python-for-android project (new toolchain) +Android target, based on python-for-android project ''' import sys @@ -11,7 +11,7 @@ from os.path import join, expanduser, realpath class TargetAndroidNew(TargetAndroid): - targetname = 'android_new' + targetname = 'android' p4a_branch = "stable" p4a_directory = "python-for-android-master" p4a_apk_cmd = "apk --debug --bootstrap=" diff --git a/buildozer/targets/ios.py b/buildozer/targets/ios.py index 9d85aec..3247278 100644 --- a/buildozer/targets/ios.py +++ b/buildozer/targets/ios.py @@ -20,7 +20,7 @@ $ipas = glob('*.ipa'); $provisioningProfiles = glob('*.mobileprovision'); $plists = glob('*.plist'); -$sr = stristr( $_SERVER['SCRIPT_URI'], '.php' ) === false ? +$sr = stristr( $_SERVER['SCRIPT_URI'], '.php' ) === false ? $_SERVER['SCRIPT_URI'] : dirname($_SERVER['SCRIPT_URI']) . '/'; $provisioningProfile = $sr . $provisioningProfiles[0]; $ipa = $sr . $ipas[0]; @@ -28,8 +28,8 @@ $itmsUrl = urlencode( $sr . 'index.php?plist=' . str_replace( '.plist', '', $pli if ($_GET['plist']) { - $plist = file_get_contents( dirname(__FILE__) - . DIRECTORY_SEPARATOR + $plist = file_get_contents( dirname(__FILE__) + . DIRECTORY_SEPARATOR . preg_replace( '/![A-Za-z0-9-_]/i', '', $_GET['plist']) . '.plist' ); $plist = str_replace('_URL_', $ipa, $plist); header('content-type: application/xml'); @@ -59,6 +59,7 @@ li { padding: 1em; } ''' class TargetIos(Target): + targetname = "ios" def check_requirements(self): checkbin = self.buildozer.checkbin diff --git a/buildozer/targets/osx.py b/buildozer/targets/osx.py index f6cebe8..121b765 100644 --- a/buildozer/targets/osx.py +++ b/buildozer/targets/osx.py @@ -28,6 +28,7 @@ from buildozer.libs.version import parse class TargetOSX(Target): + targetname = "osx" def ensure_sdk(self): self.buildozer.info('Check if kivy-sdk-packager exists') diff --git a/buildozer/tools/packer/http/welcome/index.html b/buildozer/tools/packer/http/welcome/index.html index 5a61cc9..394acb3 100644 --- a/buildozer/tools/packer/http/welcome/index.html +++ b/buildozer/tools/packer/http/welcome/index.html @@ -55,8 +55,8 @@ requirements = hostpython2,kivy # update the build directory (issue with virtualbox shared folder and symlink) build_dir = /build/myapp -
    3. Build your application: buildozer android_new debug
    4. -
    5. Build and deploy, run and get the logs: buildozer android_new debug deploy run logcat
    6. +
    7. Build your application: buildozer android debug
    8. +
    9. Build and deploy, run and get the logs: buildozer android debug deploy run logcat

    Share a folder

    From 8f9ab2208ceebb69000200dc4f2b0c779e3fa64d Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Mon, 15 May 2017 02:31:28 +0200 Subject: [PATCH 23/27] Bump to 0.33 --- buildozer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildozer/__init__.py b/buildozer/__init__.py index cf430e4..8ac8b2a 100644 --- a/buildozer/__init__.py +++ b/buildozer/__init__.py @@ -6,7 +6,7 @@ Generic Python packager for Android / iOS. Desktop later. ''' -__version__ = '0.33dev' +__version__ = '0.33' import os import re From ad0a8132ae0aee07b15841d8b059c6a7acd5d376 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Mon, 15 May 2017 02:31:32 +0200 Subject: [PATCH 24/27] Bump to 0.34dev --- buildozer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildozer/__init__.py b/buildozer/__init__.py index 8ac8b2a..35d93ee 100644 --- a/buildozer/__init__.py +++ b/buildozer/__init__.py @@ -6,7 +6,7 @@ Generic Python packager for Android / iOS. Desktop later. ''' -__version__ = '0.33' +__version__ = '0.34dev' import os import re From 6fcbb4eb2170c1e869e7f9160352646deba15303 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Mon, 15 May 2017 02:32:22 +0200 Subject: [PATCH 25/27] update changelog --- CHANGELOG.md | 211 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 195 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c56d851..c488f73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,23 +1,202 @@ # Change Log +## [0.33](https://github.com/kivy/buildozer/tree/0.33) (2017-05-15) +[Full Changelog](https://github.com/kivy/buildozer/compare/v0.32...0.33) + +**Fixed bugs:** + +- Installation of python for android is missing dependencies [\#501](https://github.com/kivy/buildozer/issues/501) + +**Closed issues:** + +- Break buildozer if the user try to release a version with "org.test" as a domain [\#500](https://github.com/kivy/buildozer/issues/500) +- Migrate p4a options to its own subkey [\#499](https://github.com/kivy/buildozer/issues/499) +- Use stable branch from python-for-android [\#498](https://github.com/kivy/buildozer/issues/498) +- Migrate android to android\_new, and add android\_old [\#497](https://github.com/kivy/buildozer/issues/497) +- sh.CommandNotFound: cmake [\#496](https://github.com/kivy/buildozer/issues/496) +- Need Help Fatal signal 11 \(SIGSEGV\) at 0x00000000 \(code=1\), thread 4579 \(SDLThread\) [\#495](https://github.com/kivy/buildozer/issues/495) +- Buildozer APK Cannot LAUNCH [\#493](https://github.com/kivy/buildozer/issues/493) +- Buildozer Error [\#492](https://github.com/kivy/buildozer/issues/492) +- android\_new target hardcodes python2 support for p4a [\#491](https://github.com/kivy/buildozer/issues/491) +- android.arch ignored [\#488](https://github.com/kivy/buildozer/issues/488) +- fail to install distribute [\#486](https://github.com/kivy/buildozer/issues/486) +- sh.py raise a exception and fail to build [\#485](https://github.com/kivy/buildozer/issues/485) +- some functionality lost when debugged with android\_new command [\#481](https://github.com/kivy/buildozer/issues/481) +- Problem when deploy to android device [\#480](https://github.com/kivy/buildozer/issues/480) +- dlopen failed: python2.7/site-packages/grpc/\_cython/cygrpc.so not 32-bit: 2 [\#479](https://github.com/kivy/buildozer/issues/479) +- Cannot build APK with python3crystax and flask - conflicting dependencies [\#477](https://github.com/kivy/buildozer/issues/477) +- Buildozer can't download NDK [\#474](https://github.com/kivy/buildozer/issues/474) +- websocket-client "SSL not available." [\#473](https://github.com/kivy/buildozer/issues/473) +- Using Cython with Kivy-iOS and Buildozer [\#472](https://github.com/kivy/buildozer/issues/472) +- android.requirements does not merge with app.requirements [\#471](https://github.com/kivy/buildozer/issues/471) +- buildozer fails to find Android SDK [\#468](https://github.com/kivy/buildozer/issues/468) +- Crash of APK on start [\#467](https://github.com/kivy/buildozer/issues/467) +- App not launching [\#461](https://github.com/kivy/buildozer/issues/461) +- sqlite3 not working with android\_new [\#457](https://github.com/kivy/buildozer/issues/457) +- how to set path for p4a [\#454](https://github.com/kivy/buildozer/issues/454) +- TypeError: write\(\) argument 1 must be unicode, not str [\#452](https://github.com/kivy/buildozer/issues/452) +- New toolchain - lxml included but not able to import [\#451](https://github.com/kivy/buildozer/issues/451) +- sqlite3 with python2.7 and buildozer 0.33dev and new toolchain not working [\#450](https://github.com/kivy/buildozer/issues/450) +- Update the Virtual Machine @ https://kivy.org/\#download [\#449](https://github.com/kivy/buildozer/issues/449) +- “No module named setuptools” after installing setuptools [\#444](https://github.com/kivy/buildozer/issues/444) +- how to add --arch=armeabi-v7a to buildozer spec [\#443](https://github.com/kivy/buildozer/issues/443) +- `buildozer android debug` fails with `jinja2.exceptions.TemplateNotFound: build.xml` [\#442](https://github.com/kivy/buildozer/issues/442) +- buildozer.spec - requirements - kivy == master [\#440](https://github.com/kivy/buildozer/issues/440) +- Buildozer can't find zlib [\#437](https://github.com/kivy/buildozer/issues/437) +- Expose kivy download source? [\#435](https://github.com/kivy/buildozer/issues/435) +- compiling crash [\#431](https://github.com/kivy/buildozer/issues/431) +- Buildozer unable to make apk [\#430](https://github.com/kivy/buildozer/issues/430) +- Crash APK on start [\#429](https://github.com/kivy/buildozer/issues/429) +- More like a noob question [\#428](https://github.com/kivy/buildozer/issues/428) +- keka failed to download \(OS X El Capitan\) [\#427](https://github.com/kivy/buildozer/issues/427) +- Buildozer fails with pure python library pint [\#425](https://github.com/kivy/buildozer/issues/425) +- Invalid argument to arm-linux-androideabi-gcc [\#424](https://github.com/kivy/buildozer/issues/424) +- dlopen failed: \_clock.so is 64-bit instead of 32-bit [\#423](https://github.com/kivy/buildozer/issues/423) +- how to solve the build error for "java"? [\#421](https://github.com/kivy/buildozer/issues/421) +- Problems in patching files during building for android\_new [\#416](https://github.com/kivy/buildozer/issues/416) +- Buildozer doesn't work with multiple first-class directories [\#415](https://github.com/kivy/buildozer/issues/415) +- Buildozer suddenly not working, Linux, Python 2.7 \(build.xml: Failed to find version-tag string\) [\#414](https://github.com/kivy/buildozer/issues/414) +- Buildozer not finding aidl [\#413](https://github.com/kivy/buildozer/issues/413) +- buildozer android created apk fails if application source kept in multiple files [\#411](https://github.com/kivy/buildozer/issues/411) +- Python 3 unicode print \(\) / copy to clipboard crashes app on Android [\#404](https://github.com/kivy/buildozer/issues/404) +- checking whether the C compiler works... no [\#402](https://github.com/kivy/buildozer/issues/402) +- configure: error: C compiler cannot create executables [\#395](https://github.com/kivy/buildozer/issues/395) +- ConfigParser.NoOptionError: No option 'p4a.local\_recipes' in section: 'app' \(android\_new\) [\#394](https://github.com/kivy/buildozer/issues/394) +- Google has changed the type of archive the new NDK [\#393](https://github.com/kivy/buildozer/issues/393) +- Why does buildozer build and pull python for android from old\_toolchain branch ? [\#389](https://github.com/kivy/buildozer/issues/389) +- buildozer android\_new does not show the presplash [\#387](https://github.com/kivy/buildozer/issues/387) +- Error when using buildozer android\_new with python3crystax [\#386](https://github.com/kivy/buildozer/issues/386) +- Command failed: tar xzf android-sdk\_r20-linux.tgz [\#383](https://github.com/kivy/buildozer/issues/383) +- When will you add requests lib to recipes? [\#382](https://github.com/kivy/buildozer/issues/382) +- Presplash does not work with "android\_new" as target. [\#380](https://github.com/kivy/buildozer/issues/380) +- Build for Android is Inconsistent with the Linux Version [\#378](https://github.com/kivy/buildozer/issues/378) +- \[question\] What are the supported OS ? [\#369](https://github.com/kivy/buildozer/issues/369) +- AttributeError: 'AnsiCodes' object has no attribute 'LIGHTBLUE\_EX' [\#366](https://github.com/kivy/buildozer/issues/366) +- splash image not hide after kivy loaded [\#364](https://github.com/kivy/buildozer/issues/364) +- app always crash in android [\#360](https://github.com/kivy/buildozer/issues/360) +- Plyer not available in buildozer android\_new [\#358](https://github.com/kivy/buildozer/issues/358) +- Runs empty directory instead of binary \(android\_new\) [\#357](https://github.com/kivy/buildozer/issues/357) +- App built with buildozer does not open on android [\#356](https://github.com/kivy/buildozer/issues/356) +- Error when running buildozer android\_new debug [\#354](https://github.com/kivy/buildozer/issues/354) +- ios list\_identities returns no identities [\#353](https://github.com/kivy/buildozer/issues/353) +- buildozer not working [\#350](https://github.com/kivy/buildozer/issues/350) +- error: Cython does not appear to be installed [\#349](https://github.com/kivy/buildozer/issues/349) +- AttributeError: 'Context' object has no attribute 'hostpython' [\#347](https://github.com/kivy/buildozer/issues/347) +- osx packaging results in venv error [\#345](https://github.com/kivy/buildozer/issues/345) +- Requirement example requirements = kivy,requests fails [\#344](https://github.com/kivy/buildozer/issues/344) +- Unavailability of important packages [\#343](https://github.com/kivy/buildozer/issues/343) +- no way to change bootstrap [\#341](https://github.com/kivy/buildozer/issues/341) +- Apk built with buildozer and multiple python file crashes [\#331](https://github.com/kivy/buildozer/issues/331) +- Please upgrade the documentation [\#255](https://github.com/kivy/buildozer/issues/255) +- Buildozer doesn't recognize "profile" option anymore [\#254](https://github.com/kivy/buildozer/issues/254) +- Try to build with caldav requirement fails [\#248](https://github.com/kivy/buildozer/issues/248) +- Trouble building for older android versions [\#240](https://github.com/kivy/buildozer/issues/240) +- removing old apk file seems to fail before installing the new one [\#238](https://github.com/kivy/buildozer/issues/238) +- Build fails due to python-distribute.org being down [\#200](https://github.com/kivy/buildozer/issues/200) +- I am struggling with building an apk [\#153](https://github.com/kivy/buildozer/issues/153) +- fresh android sdk install requires sdk update [\#151](https://github.com/kivy/buildozer/issues/151) +- FYI - Ubuntu 14.04 Necessary Java Path Adjustment [\#141](https://github.com/kivy/buildozer/issues/141) +- Cannot compile `iri2uri.py` in `httplib2` [\#135](https://github.com/kivy/buildozer/issues/135) +- can't add django to requirement [\#130](https://github.com/kivy/buildozer/issues/130) +- add an ssh target [\#1](https://github.com/kivy/buildozer/issues/1) + +**Merged pull requests:** + +- close \#452 as suggested by SpotlightKid [\#489](https://github.com/kivy/buildozer/pull/489) ([pat1](https://github.com/pat1)) +- Update README.rst [\#487](https://github.com/kivy/buildozer/pull/487) ([matletix](https://github.com/matletix)) +- Made buildozer run p4a using the current sys.executable [\#484](https://github.com/kivy/buildozer/pull/484) ([inclement](https://github.com/inclement)) +- ios: refactor deprecated PackageApplication command [\#483](https://github.com/kivy/buildozer/pull/483) ([kived](https://github.com/kived)) +- android\_new: change skip\_update to skip all updates [\#465](https://github.com/kivy/buildozer/pull/465) ([ZingBallyhoo](https://github.com/ZingBallyhoo)) +- android\_new: add "android.arch" config option [\#458](https://github.com/kivy/buildozer/pull/458) ([ZingBallyhoo](https://github.com/ZingBallyhoo)) +- Fix Py3 Incompatable str + bytes issue. [\#456](https://github.com/kivy/buildozer/pull/456) ([FeralBytes](https://github.com/FeralBytes)) +- spec file: dont use fullscreen by default [\#447](https://github.com/kivy/buildozer/pull/447) ([rafalo1333](https://github.com/rafalo1333)) +- spec file: use portrait orientation by default [\#446](https://github.com/kivy/buildozer/pull/446) ([rafalo1333](https://github.com/rafalo1333)) +- Add presplash background color support for android\_new toolchain [\#436](https://github.com/kivy/buildozer/pull/436) ([rnixx](https://github.com/rnixx)) +- Fix file\_matches to never return None [\#432](https://github.com/kivy/buildozer/pull/432) ([inclement](https://github.com/inclement)) +- Fixed 64 bit detection \(it failed under python3\) [\#409](https://github.com/kivy/buildozer/pull/409) ([inclement](https://github.com/inclement)) +- Added p4a.local\_recipes to default.spec and handled its absence [\#405](https://github.com/kivy/buildozer/pull/405) ([inclement](https://github.com/inclement)) +- Adding README.rst entries for how to use buildozer with python3 [\#403](https://github.com/kivy/buildozer/pull/403) ([andyDoucette](https://github.com/andyDoucette)) +- Update installation.rst \(Ubuntu16.04\) [\#399](https://github.com/kivy/buildozer/pull/399) ([FermiParadox](https://github.com/FermiParadox)) +- Update quickstart.rst [\#398](https://github.com/kivy/buildozer/pull/398) ([FermiParadox](https://github.com/FermiParadox)) +- Add p4a.local\_recipes to buildozer.spec to specify a local recipe dir… [\#385](https://github.com/kivy/buildozer/pull/385) ([cidermole](https://github.com/cidermole)) +- Always pass required args to p4a in android\_new [\#375](https://github.com/kivy/buildozer/pull/375) ([inclement](https://github.com/inclement)) +- Changed p4a command order to work with argparse [\#374](https://github.com/kivy/buildozer/pull/374) ([inclement](https://github.com/inclement)) +- buildozer has no attribute builddir [\#351](https://github.com/kivy/buildozer/pull/351) ([nilutz](https://github.com/nilutz)) +- throw error early if running in venv [\#346](https://github.com/kivy/buildozer/pull/346) ([kived](https://github.com/kived)) +- allow selection of bootstrap for android\_new [\#342](https://github.com/kivy/buildozer/pull/342) ([kived](https://github.com/kived)) +- bump version to 0.33dev [\#340](https://github.com/kivy/buildozer/pull/340) ([kived](https://github.com/kived)) +- trying to fix Kivy install for OS X builds [\#316](https://github.com/kivy/buildozer/pull/316) ([derPinguin](https://github.com/derPinguin)) +- update installation info [\#256](https://github.com/kivy/buildozer/pull/256) ([kiok46](https://github.com/kiok46)) + ## [v0.32](https://github.com/kivy/buildozer/tree/v0.32) (2016-05-09) [Full Changelog](https://github.com/kivy/buildozer/compare/v0.31...v0.32) -- Added `source.include_patterns` app option -- Added `android_new` target to use the python-for-android revamp toolchain -- Added `build_dir` and `bin_dir` buildozer options -- Stopped using pip `--download-cache` flag, as it has been removed from recent pip versions -- Always use ios-deploy 1.7.0 - newer versions are completely different -- Fix bugs with Unicode app titles -- Fix bugs with directory handling -- Support using a custom kivy-ios dir -- Add `adb` command to android/android_new targets -- Disable bitcode on iOS builds (needed for newer Xcode) -- Fix `api`/`minapi` values for android target -- Use kivy-ios to build icons for all supported sizes -- Fix p4a branch handling -- Let p4a handle pure-Python packages (android_new) -- Use colored output in p4a (android_new) +**Closed issues:** + +- When is the support coming to build windows .exe using buildozer? [\#333](https://github.com/kivy/buildozer/issues/333) +- outdated openssl [\#332](https://github.com/kivy/buildozer/issues/332) +- ios deployment fails \(buildozer --verbose ios debug deploy\) [\#330](https://github.com/kivy/buildozer/issues/330) +- Can't add uuid pytz datetime time dbf to requirements [\#329](https://github.com/kivy/buildozer/issues/329) +- AttributeError: 'NoneType' object has no attribute 'startswith' [\#326](https://github.com/kivy/buildozer/issues/326) +- android.p4a\_dir use old toolchain? [\#325](https://github.com/kivy/buildozer/issues/325) +- Switch from pygame to sdl2 easily [\#313](https://github.com/kivy/buildozer/issues/313) +- IOError: \[Errno 2\] No such file or directory: "/home/andrew/CODE/Python/kivy-test-android/.buildozer/android/platform/python-for-android/dist/helloworld/bin/HelloWorld-'1.0'-debug.apk" [\#312](https://github.com/kivy/buildozer/issues/312) +- Marshmallow sdk not found [\#310](https://github.com/kivy/buildozer/issues/310) +- Install Buildozer: Finished processing dependencies for buildozer==0.32dev [\#304](https://github.com/kivy/buildozer/issues/304) +- Bump default min SDK to 13: Fix crash on orientation change bug [\#302](https://github.com/kivy/buildozer/issues/302) +- Disable "Open with file manager" when USB cable is connected in virtual machine [\#299](https://github.com/kivy/buildozer/issues/299) +- Check presence of main.py during build time [\#298](https://github.com/kivy/buildozer/issues/298) +- Py3: 'Buildozer' object has no attribute 'critical' [\#297](https://github.com/kivy/buildozer/issues/297) +- The splash screen isn't automatically resized [\#292](https://github.com/kivy/buildozer/issues/292) +- buildozer don't work if whitespace in path [\#287](https://github.com/kivy/buildozer/issues/287) +- buildozer help fail [\#285](https://github.com/kivy/buildozer/issues/285) +- Buildozer.spec 's title of your application can not be a Chinese character [\#284](https://github.com/kivy/buildozer/issues/284) +- How to build apk with a cython file [\#283](https://github.com/kivy/buildozer/issues/283) +- pip no longer has a --download-cache option, so downloading requirements has stopped working [\#279](https://github.com/kivy/buildozer/issues/279) +- Cython2 not recognized in Fedora23 ? [\#278](https://github.com/kivy/buildozer/issues/278) +- Buildozer VIrtual Machine Error: /jni/application/src/': Not a directory [\#277](https://github.com/kivy/buildozer/issues/277) +- buildozer android debug deploy run hangs [\#275](https://github.com/kivy/buildozer/issues/275) +- Is it possible to move the .buildozer folder somewhere else? [\#273](https://github.com/kivy/buildozer/issues/273) +- configure: error: C compiler cannot create executables [\#272](https://github.com/kivy/buildozer/issues/272) +- buildozer deploy error [\#271](https://github.com/kivy/buildozer/issues/271) +- Cannot set Android API version [\#268](https://github.com/kivy/buildozer/issues/268) +- Support python3 [\#265](https://github.com/kivy/buildozer/issues/265) +- App crash when changing orientation [\#264](https://github.com/kivy/buildozer/issues/264) +- Broken update command [\#261](https://github.com/kivy/buildozer/issues/261) +- error while deploying android [\#257](https://github.com/kivy/buildozer/issues/257) +- jnius/jnius.c: No such file or directory [\#251](https://github.com/kivy/buildozer/issues/251) +- Implement source.include\_patterns [\#245](https://github.com/kivy/buildozer/issues/245) +- Buildozer Python 3 Compatability Issues [\#175](https://github.com/kivy/buildozer/issues/175) + +**Merged pull requests:** + +- prepare for release 0.32 [\#339](https://github.com/kivy/buildozer/pull/339) ([kived](https://github.com/kived)) +- use p4a --color argument [\#338](https://github.com/kivy/buildozer/pull/338) ([kived](https://github.com/kived)) +- fix changing android branch [\#337](https://github.com/kivy/buildozer/pull/337) ([kived](https://github.com/kived)) +- use cp -a not cp -r [\#336](https://github.com/kivy/buildozer/pull/336) ([akshayaurora](https://github.com/akshayaurora)) +- improve build directory handling, add values to default.spec [\#335](https://github.com/kivy/buildozer/pull/335) ([kived](https://github.com/kived)) +- fix incorrect api/minapi values [\#334](https://github.com/kivy/buildozer/pull/334) ([kived](https://github.com/kived)) +- fix bad placement of expanduser\(\) [\#328](https://github.com/kivy/buildozer/pull/328) ([kived](https://github.com/kived)) +- use custom source dirs for android\_new [\#324](https://github.com/kivy/buildozer/pull/324) ([kived](https://github.com/kived)) +- use p4a revamp --storage-dir option [\#323](https://github.com/kivy/buildozer/pull/323) ([kived](https://github.com/kived)) +- add adb and p4a commands to android/android\_new [\#322](https://github.com/kivy/buildozer/pull/322) ([kived](https://github.com/kived)) +- fix py3 str has no decode issue [\#321](https://github.com/kivy/buildozer/pull/321) ([kived](https://github.com/kived)) +- let p4a revamp handle pure python requirements [\#320](https://github.com/kivy/buildozer/pull/320) ([kived](https://github.com/kived)) +- fix icons for ios target [\#319](https://github.com/kivy/buildozer/pull/319) ([kived](https://github.com/kived)) +- support using custom kivy-ios source dir [\#318](https://github.com/kivy/buildozer/pull/318) ([kived](https://github.com/kived)) +- disable bitcode for ios target [\#317](https://github.com/kivy/buildozer/pull/317) ([kived](https://github.com/kived)) +- Add window option for target android\_new [\#315](https://github.com/kivy/buildozer/pull/315) ([pythonic64](https://github.com/pythonic64)) +- fix usage exception [\#311](https://github.com/kivy/buildozer/pull/311) ([kived](https://github.com/kived)) +- add python3 compatibility to verbose output for android build \(\#221\) [\#303](https://github.com/kivy/buildozer/pull/303) ([pohmelie](https://github.com/pohmelie)) +- Allow app title to contain Unicode characters [\#293](https://github.com/kivy/buildozer/pull/293) ([udiboy1209](https://github.com/udiboy1209)) +- use ios-deploy version 1.7.0 [\#291](https://github.com/kivy/buildozer/pull/291) ([cbenhagen](https://github.com/cbenhagen)) +- Add spec option to skip automated update of installed android package [\#290](https://github.com/kivy/buildozer/pull/290) ([pastcompute](https://github.com/pastcompute)) +- Fix issues with android.p4a\_dir spec file property [\#288](https://github.com/kivy/buildozer/pull/288) ([pastcompute](https://github.com/pastcompute)) +- Remove pip --download-cache flag \(fixes \#279\) [\#282](https://github.com/kivy/buildozer/pull/282) ([cbenhagen](https://github.com/cbenhagen)) +- put bin/ in builddir if specified in buildozer.spec [\#274](https://github.com/kivy/buildozer/pull/274) ([jabbalaci](https://github.com/jabbalaci)) +- Implement source.include\_patterns [\#269](https://github.com/kivy/buildozer/pull/269) ([udiboy1209](https://github.com/udiboy1209)) +- Updated Licence Year [\#266](https://github.com/kivy/buildozer/pull/266) ([CodeMaxx](https://github.com/CodeMaxx)) +- fix android.branch option [\#250](https://github.com/kivy/buildozer/pull/250) ([tshirtman](https://github.com/tshirtman)) ## [v0.31](https://github.com/kivy/buildozer/tree/v0.31) (2016-01-07) [Full Changelog](https://github.com/kivy/buildozer/compare/0.30...v0.31) @@ -369,4 +548,4 @@ ## [0.2](https://github.com/kivy/buildozer/tree/0.2) (2012-12-20) -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file From 92ef490f6375247749da8622fe870e5d06402b1d Mon Sep 17 00:00:00 2001 From: Shivani Bhardwaj Date: Thu, 18 May 2017 18:37:16 +0530 Subject: [PATCH 26/27] Use dmg instead of 7z --- buildozer/targets/osx.py | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/buildozer/targets/osx.py b/buildozer/targets/osx.py index 121b765..66caf02 100644 --- a/buildozer/targets/osx.py +++ b/buildozer/targets/osx.py @@ -58,30 +58,17 @@ class TargetOSX(Target): 'Kivy.app'), cwd=cwd) else: - if not exists(join(cwd, 'Kivy{}.7z'.format(py_branch))): + if not exists(join(cwd, 'Kivy{}.dmg'.format(py_branch))): self.buildozer.info('Downloading kivy...') check_call( - ('curl', '-L', '-o', 'Kivy{}.7z'.format(py_branch), - 'http://kivy.org/downloads/{}/Kivy-{}-osx-python{}.7z'\ + ('curl', '-L', '-o', 'Kivy{}.dmg'.format(py_branch), + 'http://kivy.org/downloads/{}/Kivy-{}-osx-python{}.dmg'\ .format(current_kivy_vers, current_kivy_vers, py_branch)), cwd=cwd) - if not exists(join(cwd, 'Keka.app')): - self.buildozer.info( - 'Downloading Keka as dependency (to install Kivy)') - check_call( - ('curl', '-O', 'http://www.kekaosx.com/release/Keka-1.0.8.dmg'), - cwd=cwd) - check_call(('hdiutil', 'attach', 'Keka-1.0.8.dmg'), cwd=cwd) - check_call(('cp', '-a','/Volumes/Keka/Keka.app', './Keka.app'), cwd=cwd) - check_call(('hdiutil', 'detach', '/Volumes/Keka')) - self.buildozer.info('Extracting and installing Kivy...') - check_call( - (join(cwd, 'Keka.app/Contents/MacOS/Keka'), - join(cwd, 'Kivy{}.7z').format(py_branch)), cwd=cwd) - check_call(('rm', 'Kivy{}.7z'.format(py_branch)), cwd=cwd) - check_call(('mv', 'Kivy{}.app'.format(py_branch), 'Kivy.app'),cwd=cwd) + check_call(('hdiutil', 'attach', cwd + '/Kivy{}.dmg'.format(py_branch))) + check_call(('cp', '-a', '/Volumes/Kivy/Kivy.app', './Kivy.app'), cwd=cwd) def ensure_kivyapp(self): self.buildozer.info('check if Kivy.app exists in local dir') From 8f3f1bc3e92f78adc1319f0e97b8003c9c932c39 Mon Sep 17 00:00:00 2001 From: Peter Badida Date: Fri, 11 Aug 2017 21:39:18 +0200 Subject: [PATCH 27/27] Update copyright year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 5915a74..d5d6b13 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2010-2016 Kivy Team and other contributors +Copyright (c) 2010-2017 Kivy Team and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal