Re: [PATCH libselinux 2/2] libselinux/src/Makefile: do not use PYCEXT, and rely on the installed file name

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Oct 25, 2019 at 3:43 PM Thomas Petazzoni
<thomas.petazzoni@xxxxxxxxxxx> wrote:
>
> PYCEXT is computed by asking the Python intrepreter what is the
> file extension used for native Python modules.
>
> Unfortunately, when cross-compiling, the host Python doesn't give the
> proper result: it gives the result matching the build machine, and not
> the target machine. Due to this, the symlink has an incorrect name,
> and doesn't point to the .so file that was actually built/installed.
>
> To address this and keep things simple, this patch just changes the ln
> invocation to rely on the name of the _selinux*.so Python module that
> was installed.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@xxxxxxxxxxx>

Hi,
Thanks for your patch. At first, I did not like forcing the extension
to ".so", because other operating systems use different extensions,
but in fact this point is not really an issue because libselinux and
libsemanage are very specific to Linux (contrary to libsepol, that may
be compiled for MacOS for example in order to analyze a policy there).

Anyway, I do not like using a wildcard pattern in the Makefile to
match the produced file. I wanted to reproduce your issue by
cross-compiling the python extension with "make
CC=aarch64-linux-gnu-gcc DESTDIR=/tmp/selinux install-pywrap", but
this fails with the following messages:

creating build
creating build/temp.linux-x86_64-3.7
aarch64-linux-gnu-gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g
-fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt
-march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64
-mtune=generic -O3 -pipe -fno-plt -O2 -Werror -Wall -Wextra
-Wmissing-format-attribute -Wmissing-noreturn -Wpointer-arith -Wshadow
-Wstrict-prototypes -Wundef -Wunused -Wwrite-strings -Wformat=2
-Wno-padded -Wno-cast-align -Wno-cast-qual -Wno-conversion
-Wno-missing-prototypes -Wno-packed -Wno-switch-enum
-Wno-variadic-macros -Wno-vla -ftrapv -Wno-clobbered
-Wno-maybe-uninitialized -Wno-uninitialized -Wno-unused-result
-I/tmp/selinux/usr/include -I../include -D_GNU_SOURCE
-DNO_ANDROID_BACKEND -Wno-shadow -Wno-cast-function-type
-Wno-stringop-truncation -fPIC -I../include -I/tmp/selinux/usr/include
-I/usr/include/python3.7m -c selinuxswig_python_wrap.c -o
build/temp.linux-x86_64-3.7/selinuxswig_python_wrap.o
Assembler messages:
Error: unknown architecture `x86-64'

I am not used to cross-compile native Python extensions so I might
miss something obvious. What tools/configuration are you using in
order to make setup.py cross-compile correctly? It would be great if
the configuration you are using allows getting the produced file
extension. And this information would also help creating a
configuration for Travis-CI in order to check whether
cross-compilation works.

Thanks,
Nicolas

> ---
>  libselinux/src/Makefile | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/libselinux/src/Makefile b/libselinux/src/Makefile
> index dc675a49..3fc535d4 100644
> --- a/libselinux/src/Makefile
> +++ b/libselinux/src/Makefile
> @@ -15,7 +15,6 @@ INCLUDEDIR ?= $(PREFIX)/include
>  PYINC ?= $(shell $(PKG_CONFIG) --cflags $(PYPREFIX))
>  PYLIBS ?= $(shell $(PKG_CONFIG) --libs $(PYPREFIX))
>  PYTHONLIBDIR ?= $(shell $(PYTHON) -c "from distutils.sysconfig import *; print(get_python_lib(plat_specific=1, prefix='$(PREFIX)'))")
> -PYCEXT ?= $(shell $(PYTHON) -c 'import imp;print([s for s,m,t in imp.get_suffixes() if t == imp.C_EXTENSION][0])')
>  RUBYINC ?= $(shell $(RUBY) -e 'puts "-I" + RbConfig::CONFIG["rubyarchhdrdir"] + " -I" + RbConfig::CONFIG["rubyhdrdir"]')
>  RUBYLIBS ?= $(shell $(RUBY) -e 'puts "-L" + RbConfig::CONFIG["libdir"] + " -L" + RbConfig::CONFIG["archlibdir"] + " " + RbConfig::CONFIG["LIBRUBYARG_SHARED"]')
>  RUBYINSTALL ?= $(shell $(RUBY) -e 'puts RbConfig::CONFIG["vendorarchdir"]')
> @@ -175,7 +174,7 @@ install: all
>  install-pywrap: pywrap
>         $(PYTHON) setup.py install --prefix=$(PREFIX) `test -n "$(DESTDIR)" && echo --root $(DESTDIR)`
>         install -m 644 $(SWIGPYOUT) $(DESTDIR)$(PYTHONLIBDIR)/selinux/__init__.py
> -       cd $(DESTDIR)$(PYTHONLIBDIR) && ln -sf selinux/_selinux$(PYCEXT) _selinux$(PYCEXT)
> +       cd $(DESTDIR)$(PYTHONLIBDIR) && ln -sf selinux/_selinux*.so .
>
>  install-rubywrap: rubywrap
>         test -d $(DESTDIR)$(RUBYINSTALL) || install -m 755 -d $(DESTDIR)$(RUBYINSTALL)
> --
> 2.21.0
>




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux