Problem compiling OLA

Rui Barreiros rbarreiros at gmail.com
Fri May 6 12:41:21 CEST 2016


Hi Ronny,

I managed to make it work, I have no idea if this is the right way of 
doing it, or if it's just a hack to make it work. By using rlink and 
rlink-path I managed to change the order at which the binary will search 
for the libraries at startup, by using the following configure on ola:

         cd $(dir $@) && env PKG_CONFIG_DIR="" 
PKG_CONFIG_LIBDIR="$(PATH_FS)/usr/lib/pkgconfig:$(PATH_FS)/usr/share/pkgconfig" 
PKG_CONFIG_SYSROOT_DIR="$(PATH_FS)" \
                 CFLAGS="$(CROSS_CFLAGS)" \
                 CPPFLAGS="$(CROSS_CFLAGS)" \
                 LDFLAGS="-Wl,-rpath -Wl,/lib -Wl,-rpath -Wl,/usr/lib 
-Wl,-rpath-link -Wl,/lib -Wl,-rpath-link -Wl,/usr/lib -L/lib -L/usr/lib" \
                 PKG_CONFIG="/usr/bin/pkg-config" \
                 ./configure \
                 ac_cv_func_malloc_0_nonnull=yes 
ac_cv_func_realloc_0_nonnull=yes \
                 libprotobuf_CFLAGS="-I$(PATH_FS)/usr/include 
-L$(PATH_FS)/usr/lib -Wl,-rpath-link,$(PATH_FS)/usr/lib" \
                 libprotobuf_LIBS="-L$(PATH_FS)/usr/lib -lprotobuf 
-lprotoc" \
                 base_uuid_CFLAGS="-I$(PATH_FS)/usr/include 
-L$(PATH_FS)/usr/lib -Wl,-rpath-link,$(PATH_FS)/usr/lib" \
                 base_uuid_LIBS="-L$(PATH_FS)/usr/lib -luuid" \
                 --prefix=/usr \
                 --host=$(CROSS_TUPLE) \
                 --target=$(CROSS_TUPLE) \
                 --disable-dependency-tracking \
                 --without-dns-sd \
--with-protoc=$(PATH_APPS)/protobuf/native/src/protoc \
--with-ola-protoc-plugin=$(PATH_APPS)/ola/native/protoc/ola_protoc_plugin \
                 --disable-unittests \
                 --disable-examples \
                 --disable-rdm-tests \
                 --disable-doxygen-doc \
                 --disable-gcov \
                 --disable-tcmalloc \
                 --disable-root-check \
                 --disable-java-libs \
                 --disable-python-libs \
                 --disable-fatal-warnings \
                 --disable-all-plugins

Notice LDFLAGS, I added /lib and then /usr/lib, this way all libs are 
found and it's working properly on the target system.

Besides this problem, there seems to be a bug in libtool when cross 
compiling you might encounter on your tests, that the package libs won't 
be found, for that, a hack is necessary, one needs to substitute all 
instances of link_all_deplibs=(yes|no) to link_all_deplibs=unknown in 
config/libtool.m4

Here is the short version of the minimum requirements to be able to 
cross compile OLA

- build uuid (any works, I'm using util-linux)
- build protobuf
   To build protobuf one needs to build 2 versions, one of them needs to 
be native to the host system since binaries are compiled and used while 
building itself, then, the second version is indeed the cross compiled 
one while passing the --with-protoc=PATH_TO_NATIVE/src/protoc
   I'm also using protobuf 2.5.0 since newer versions won't compile and 
I haven't bothered much finding out why yet.
- build ola, 2 versions also, one native and the cross compiled one. The 
native is needed because of a protobuf plugin used by the protoc binary, 
needs to be compiled in the host machine. I do this with the following 
configure:

         if [ ! -e native/protoc/ola_protoc_plugin ]; then \
         cd native && env CFLAGS="" CPPFLAGS="" LDFLAGS="" 
PKG_CONFIG="/usr/bin/pkg-config" \
                 ./configure \
                 --disable-all-plugins \
                 --disable-osc \
                 --disable-uart \
                 --disable-libusb \
                 --disable-libftdi \
                 --disable-http  \
                 --disable-examples \
                 --disable-unittests \
                 --disable-doxygen-html \
                 --disable-doxygen-doc \
                 --without-dns-sd \
                 && $(MAKE) -j "$(CPUS)" protoc/ola_protoc_plugin; fi

   Just disable everything, and only build the ola_protoc_plugin. Then I 
proceed to build the cross compile version of OLA with the earlier 
configure.

I'm tidying up all the build process, for everything (including OLA 
plugins and such) to have a clean install of the whole system, and when 
I do I'll build a patch against nard git and will send if you're interested.

For now, I'll move forward in the other tasks I have planned to do (some 
command line tools to manage ola and the OS network with a few buttons 
and an LCD to have a standalone system without the need of remote ssh 
management or web and a few other utilities since I managed to have OLA 
for now working, but I'll definitely investigate further about this 
rlink/rlink-path hack or fix or whatever.

If you do give it a whirl and want me to, I can package my current apps 
Makefiles and attach them so you can have a starting point.

Best regards.
Rui Barreiros


On 05-05-2016 19:32, Ronny Nilsson wrote:
> Hi Rui
> This is looks like a tough one! I don't blame you for having problems... I'll
> try to find some time next week to help.
> /Ronny
>
>
>
> -----------------------------------------
>> Hi,
>>
>> I've been trying to compile OLA (https://www.openlighting.org) but been
>> having so many problems I'm melting my brains out !!
>>
>> To build OLA without any plugins, and all superfluous stuff disabled
>> (doc, examples, etc) requires protobuf and uuid, I managed successfully
>> to build and install this libraries (uuid is provided by util-linux), I
>> just make a plain DESTDIR=$(PATH_FS) make install for uuid and protobuf.
>>
>> OLA relies on either pkg-config or env variables to find protobuf and
>> uuid, I tried both and the problem I have happens on any.
>>
>> My problem is, OLA binaries have the lib path hardcoded and when I run
>> them on the raspberry pi, it just hangs forever, an strace reveals:
>>
>> root at tridmx_raspi_b_rev2-952bbb2c:~> strace olad
>> execve("/usr/bin/olad", ["olad"], [/* 15 vars */]) = 0
>> brk(0)                                  = 0x15000
>> uname({sys="Linux", node="tridmx_raspi_b_rev2-952bbb2c", ...}) = 0
>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
>> 0) = 0xa6ffc000
>> access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or
>> directory)
>> open("/home/rbarreiros/Projectos/RaspberryPi/nard/nard-git/intermediate/fs/
>> usr/lib/tls/v6l/vfp/libolaserver.so.0", O_RDONLY|O_CLOEXEC) = -1 ELOOP (Too
>> many levels of symbolic links)
>> stat64("/home/rbarreiros/Projectos/RaspberryPi/nard/nard-git/intermediate/f
>> s/usr/lib/tls/v6l/vfp",
>>
>> Everytime an open/stat call is made, it takes a long long time, until it
>> receives the ELOOP error and attempts another path to try and open
>> libolaserver.so.0
>>
>>
>> Here is the configure/build section for ola Makefile
>>
>> To properly build ola for another system, one needs to build
>> ola_protoc_plugin natively first, as it's used by the protoc (which
>> needs to be built natively first also) to parse from protobuf message
>> files during build, then the cross compilation is done.
>>
>>           # Need to build a native ola-protoc-plugin first
>>           if [ ! -e native/protoc/ola_protoc_plugin ]; then \
>>           cd native && env CFLAGS="" CPPFLAGS="" LDFLAGS=""
>> PKG_CONFIG="/usr/bin/pkg-config" \
>>                   ./configure \
>>                   --disable-all-plugins \
>>                   --disable-osc \
>>                   --disable-uart \
>>                   --disable-libusb \
>>                   --disable-libftdi \
>>                   --disable-http  \
>>                   --disable-examples \
>>                   --disable-unittests \
>>                   --disable-doxygen-html \
>>                   --disable-doxygen-doc \
>>                   --without-dns-sd \
>>                   && $(MAKE) -j "$(CPUS)" protoc/ola_protoc_plugin; fi
>>
>>           cd $(dir $@) && env PKG_CONFIG_DIR=""
>> PKG_CONFIG_LIBDIR="$(PATH_FS)/usr/lib/pkgconfig:$(PATH_FS)/usr/share/pkgcon
>> fig" PKG_CONFIG_SYSROOT_DIR="$(PATH_FS)" \
>>                   CFLAGS="$(CROSS_CFLAGS)" \
>>                   CPPFLAGS="$(CROSS_CFLAGS)" \
>>                   LDFLAGS="-Wl,-rpath -Wl,/usr/lib -Wl,-rpath-link
>> -Wl,$(PATH_FS)/usr/lib -L$(PATH_FS)/lib -L$(PATH_FS)/usr/lib" \
>>                   PKG_CONFIG="/usr/bin/pkg-config" \
>>                   ./configure \
>>                   ac_cv_func_malloc_0_nonnull=yes
>> ac_cv_func_realloc_0_nonnull=yes \
>>                   libprotobuf_CFLAGS="-I$(PATH_FS)/usr/include
>> -L$(PATH_FS)/usr/lib -Wl,-rpath-link,$(PATH_FS)/usr/lib" \
>>                   libprotobuf_LIBS="-L$(PATH_FS)/usr/lib -lprotobuf
>> -lprotoc" \
>>                   base_uuid_CFLAGS="-I$(PATH_FS)/usr/include
>> -L$(PATH_FS)/usr/lib -Wl,-rpath-link,$(PATH_FS)/usr/lib" \
>>                   base_uuid_LIBS="-L$(PATH_FS)/usr/lib -luuid" \
>>                   --prefix=/usr \
>>                   --host=$(CROSS_TUPLE) \
>>                   --target=$(CROSS_TUPLE) \
>>                   --disable-dependency-tracking \
>>                   --without-dns-sd \
>> --with-protoc=$(PATH_APPS)/protobuf/native/src/protoc \
>> --with-ola-protoc-plugin=$(PATH_APPS)/ola/native/protoc/ola_protoc_plugin \
>>                   --disable-unittests \
>>                   --disable-examples \
>>                   --disable-rdm-tests \
>>                   --disable-doxygen-doc \
>>                   --disable-gcov \
>>                   --disable-tcmalloc \
>>                   --disable-root-check \
>>                   --disable-java-libs \
>>                   --disable-python-libs \
>>                   --disable-fatal-warnings \
>>                   --disable-all-plugins
>>           $(MAKE) -C "$(PKG_VER)" -j $(CPUS)
>>
>> Worthy of note, I couldn't finish OLA compilation because I kept getting
>> an error where libtool couldn't find it's libraries (OLA libraries) and
>> suggested using rpath or rpath-link, I managed to fix this issue by
>> implementing a fix found here http://bugs.lttng.org/issues/321 in which
>> the configure script goes through all occurrences of link_all_deplibs in
>> config/libtool.m4 and replace all 'no|yes' to unknown.
>>
>> Does anyone have any idea what I'm doing wrong ? or where the bug is ?
>>
>> Best regards.
>


-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2109 bytes
Desc: S/MIME Cryptographic Signature
Url : http://www.arbetsmyra.dyndns.org/pipermail/nard/attachments/20160506/7c0233a9/attachment.bin 


More information about the Nard mailing list