Skip to content

Commit cad8283

Browse files
committed
Rework lxml recipe and update version
Actions taken:   - replace double quotes to single quotes because I think that it's more readable   - fixed imports   - shortened lines
1 parent f7d987a commit cad8283

File tree

1 file changed

+67
-42
lines changed

1 file changed

+67
-42
lines changed

pythonforandroid/recipes/lxml/__init__.py

Lines changed: 67 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,82 @@
1-
from pythonforandroid.toolchain import Recipe, shutil
2-
from pythonforandroid.recipe import CompiledComponentsPythonRecipe
1+
from pythonforandroid.recipe import Recipe, CompiledComponentsPythonRecipe
2+
from pythonforandroid.logger import shprint
33
from os.path import exists, join
4-
from os import listdir
4+
from os import uname
5+
import sh
56

67

78
class LXMLRecipe(CompiledComponentsPythonRecipe):
8-
version = "3.6.0"
9-
url = "https://pypi.python.org/packages/source/l/lxml/lxml-{version}.tar.gz"
10-
depends = ["libxml2", "libxslt"]
11-
name = "lxml"
9+
version = '4.2.5'
10+
url = 'https://pypi.python.org/packages/source/l/lxml/lxml-{version}.tar.gz' # noqa
11+
depends = ['libxml2', 'libxslt', 'setuptools']
12+
name = 'lxml'
1213

1314
call_hostpython_via_targetpython = False # Due to setuptools
1415

1516
def should_build(self, arch):
1617
super(LXMLRecipe, self).should_build(arch)
17-
return True
18-
return not exists(join(self.ctx.get_libs_dir(arch.arch), "etree.so"))
19-
20-
def build_arch(self, arch):
21-
super(LXMLRecipe, self).build_arch(arch)
22-
23-
def get_lib_build_dir_name():
24-
for f in listdir(join(self.get_build_dir(arch.arch), "build")):
25-
if f.startswith("lib.linux-x86_64"):
26-
return f
27-
return None
28-
29-
def get_so_name(so_target, dirpath):
30-
for f in listdir(dirpath):
31-
if f.startswith(so_target.partition(".")[0] + ".") and \
32-
f.endswith(".so"):
33-
return join(dirpath, f)
34-
return None
35-
36-
so_origin_dir = "%s/build/%s/lxml/" % (self.get_build_dir(arch.arch),
37-
get_lib_build_dir_name())
38-
shutil.copyfile(
39-
join(so_origin_dir, get_so_name("etree.so", so_origin_dir)),
40-
join(self.ctx.get_libs_dir(arch.arch), "etree.so"),
41-
)
42-
shutil.copyfile(
43-
join(so_origin_dir, get_so_name("objectify.so", so_origin_dir)),
44-
join(self.ctx.get_libs_dir(arch.arch), "objectify.so"),
45-
)
18+
19+
py_ver = self.ctx.python_recipe.major_minor_version_string
20+
build_platform = '{system}-{machine}'.format(
21+
system=uname()[0], machine=uname()[-1]).lower()
22+
build_dir = join(self.get_build_dir(arch.arch), 'build',
23+
'lib.' + build_platform + '-' + py_ver, 'lxml')
24+
py_libs = ['_elementpath.so', 'builder.so', 'etree.so', 'objectify.so']
25+
26+
return not all([exists(join(build_dir, lib)) for lib in py_libs])
27+
28+
def build_compiled_components(self, arch):
29+
# Hack to make it link properly to librt, inserted automatically by the
30+
# installer (Note: the librt doesn't exist in android but it is
31+
# integrated into libc, so we create a symbolic link which we will
32+
# remove when our build finishes)
33+
link_c = join(self.ctx.ndk_platform, 'usr', 'lib', 'libc')
34+
link_rt = join(self.ctx.ndk_platform, 'usr', 'lib', 'librt')
35+
shprint(sh.ln, '-sf', link_c + '.so', link_rt + '.so')
36+
shprint(sh.ln, '-sf', link_c + '.a', link_rt + '.a')
37+
38+
super(LXMLRecipe, self).build_compiled_components(arch)
39+
40+
shprint(sh.rm, '-r', link_rt + '.so')
41+
shprint(sh.rm, '-r', link_rt + '.a')
4642

4743
def get_recipe_env(self, arch):
4844
env = super(LXMLRecipe, self).get_recipe_env(arch)
49-
libxslt_recipe = Recipe.get_recipe("libxslt", self.ctx).get_build_dir(arch.arch)
50-
libxml2_recipe = Recipe.get_recipe("libxml2", self.ctx).get_build_dir(arch.arch)
51-
env["CC"] += " -I%s/include -I%s " % (
52-
libxml2_recipe,
53-
libxslt_recipe,
54-
)
45+
46+
# libxslt flags
47+
libxslt_recipe = Recipe.get_recipe('libxslt', self.ctx)
48+
libxslt_build_dir = libxslt_recipe.get_build_dir(arch.arch)
49+
50+
cflags = ' -I' + libxslt_build_dir
51+
cflags += ' -I' + join(libxslt_build_dir, 'libxslt')
52+
cflags += ' -I' + join(libxslt_build_dir, 'libexslt')
53+
54+
env['LDFLAGS'] += ' -L' + join(libxslt_build_dir, 'libxslt', '.libs')
55+
env['LDFLAGS'] += ' -L' + join(libxslt_build_dir, 'libexslt', '.libs')
56+
env['LIBS'] = '-lxslt -lexslt'
57+
58+
# libxml2 flags
59+
libxml2_recipe = Recipe.get_recipe('libxml2', self.ctx)
60+
libxml2_build_dir = libxml2_recipe.get_build_dir(arch.arch)
61+
libxml2_libs_dir = join(libxml2_build_dir, '.libs')
62+
63+
cflags += ' -I' + libxml2_build_dir
64+
cflags += ' -I' + join(libxml2_build_dir, 'include')
65+
cflags += ' -I' + join(libxml2_build_dir, 'include', 'libxml')
66+
cflags += ' -I' + self.get_build_dir(arch.arch)
67+
env['LDFLAGS'] += ' -L' + libxml2_libs_dir
68+
env['LIBS'] += ' -lxml2'
69+
70+
# android's ndk flags
71+
ndk_lib_dir = join(self.ctx.ndk_platform, 'usr', 'lib')
72+
ndk_include_dir = join(self.ctx.ndk_dir, 'sysroot', 'usr', 'include')
73+
cflags += ' -I' + ndk_include_dir
74+
env['LDFLAGS'] += ' -L' + ndk_lib_dir
75+
env['LIBS'] += ' -lz -lm -lc'
76+
77+
if cflags not in env['CFLAGS']:
78+
env['CFLAGS'] += cflags
79+
5580
return env
5681

5782

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy