def _check_aidl(self, v_build_tools): self.buildozer.debug('Check that aidl can be executed') v_build_tools = self._read_version_subdir(self.android_sdk_dir, 'build-tools') aidl_cmd = join(self.android_sdk_dir, 'build-tools', str(v_build_tools), 'aidl') self.buildozer.checkbin('Aidl', aidl_cmd) _, _, returncode = self.buildozer.cmd(aidl_cmd, break_on_error=False, show_output=False) if returncode != 1: self.buildozer.error('Aidl cannot be executed') if sys.maxint > 2**32: self.buildozer.error('') self.buildozer.error( 'You might have missed to install 32bits libs') self.buildozer.error( 'Check http://buildozer.readthedocs.org/en/latest/installation.html' ) self.buildozer.error('') else: self.buildozer.error('') self.buildozer.error( 'In case of a bug report, please add a full log with log_level = 2' ) self.buildozer.error('') raise BuildozerException()
def sdkmanager_path(self): sdkmanager_path = join(self.android_sdk_dir, 'tools', 'bin', 'sdkmanager') if not os.path.isfile(sdkmanager_path): raise BuildozerException( ('sdkmanager path "{}" does not exist, sdkmanager is not' 'installed'.format(sdkmanager_path))) return sdkmanager_path
def _install_p4a(self): cmd = self.buildozer.cmd 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', '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 p4a.source_dir does not exist') self.buildozer.error('') raise BuildozerException() else: if not self.buildozer.file_exists(pa_dir): cmd(('git clone -b {} --single-branch ' 'https://github.com/kivy/python-for-android.git ' '{}').format(source, self.p4a_directory), cwd=self.buildozer.platform_dir) elif self.platform_update: cmd('git clean -dxf', cwd=pa_dir) current_branch = cmd('git rev-parse --abbrev-ref HEAD', get_stdout=True, cwd=pa_dir)[0].strip() if current_branch == source: cmd('git pull', cwd=pa_dir) else: cmd('git fetch --tags origin {0}:{0}'.format(source), cwd=pa_dir) cmd('git checkout {}'.format(source), cwd=pa_dir) # 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("^\s*install_reqs = (\[[^\]]*\])", setup, re.DOTALL | re.MULTILINE)[0] deps = ast.literal_eval(deps) except IOError: self.buildozer.error( 'Failed to read python-for-android setup.py at {}'.format( join(self.pa_dir, 'setup.py'))) exit(1) pip_deps = [] for dep in deps: pip_deps.append("'{}'".format(dep)) # in virtualenv or conda env options = "--user" if "VIRTUAL_ENV" in os.environ or "CONDA_PREFIX" in os.environ: options = "" cmd('{} -m pip install -q {} {}'.format(executable, options, " ".join(pip_deps)))
def install_platform(self): cmd = self.buildozer.cmd source = self.buildozer.config.getdefault('app', 'android.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') 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') self.buildozer.error('') raise BuildozerException() else: if not self.buildozer.file_exists(pa_dir): cmd(('git clone -b {} --single-branch ' 'https://github.com/kivy/python-for-android.git ' '{}').format(source, self.p4a_directory), cwd=self.buildozer.platform_dir) elif self.platform_update: cmd('git clean -dxf', cwd=pa_dir) current_branch = cmd('git rev-parse --abbrev-ref HEAD', get_stdout=True, cwd=pa_dir)[0].strip() if current_branch == source: cmd('git pull', cwd=pa_dir) else: cmd('git fetch --tags origin {0}:{0}'.format(source), 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) })
def check_requirements(self): if platform in ('win32', 'cygwin'): try: self._set_win32_java_home() except: traceback.print_exc() self.android_cmd = join(self.android_sdk_dir, 'tools', 'android.bat') self.adb_cmd = join(self.android_sdk_dir, 'platform-tools', 'adb.exe') self.javac_cmd = self._locate_java('javac.exe') self.keytool_cmd = self._locate_java('keytool.exe') elif platform in ('darwin', ): self.android_cmd = join(self.android_sdk_dir, 'tools', 'android') self.adb_cmd = join(self.android_sdk_dir, 'platform-tools', 'adb') self.javac_cmd = self._locate_java('javac') self.keytool_cmd = self._locate_java('keytool') else: self.android_cmd = join(self.android_sdk_dir, 'tools', 'android') self.adb_cmd = join(self.android_sdk_dir, 'platform-tools', 'adb') self.javac_cmd = self._locate_java('javac') self.keytool_cmd = self._locate_java('keytool') # Check for C header <zlib.h>. _, _, returncode_dpkg = self.buildozer.cmd( 'dpkg --version', break_on_error=False) is_debian_like = (returncode_dpkg == 0) if is_debian_like and \ not self.buildozer.file_exists('/usr/include/zlib.h'): raise BuildozerException( 'zlib headers must be installed, ' 'run: sudo apt-get install zlib1g-dev') # Need to add internally installed ant to path for external tools # like adb to use path = [join(self.apache_ant_dir, 'bin')] if 'PATH' in self.buildozer.environ: path.append(self.buildozer.environ['PATH']) else: path.append(os.environ['PATH']) self.buildozer.environ['PATH'] = ':'.join(path) checkbin = self.buildozer.checkbin checkbin('Git (git)', 'git') checkbin('Cython (cython)', 'cython') checkbin('Java compiler (javac)', self.javac_cmd) checkbin('Java keytool (keytool)', self.keytool_cmd)
def _sdkmanager(self, *args, **kwargs): """Call the sdkmanager in our Android SDK with the given arguments.""" # Use the android-sdk dir as cwd by default kwargs['cwd'] = kwargs.get('cwd', self.android_sdk_dir) sdkmanager_path = os.path.join(self.android_sdk_dir, 'tools', 'bin', 'sdkmanager') if not os.path.isfile(sdkmanager_path): raise BuildozerException( ('sdkmanager path "{}" does not exist, sdkmanager is not' 'installed'.format(sdkmanager_path))) command = sdkmanager_path + ' ' + ' '.join(args) return_child = kwargs.pop('return_child', False) if return_child: return self.buildozer.cmd_expect(command, **kwargs) else: kwargs['get_stdout'] = kwargs.get('get_stdout', True) return self.buildozer.cmd(command, **kwargs)