Mosquitto unter NetBSD 7 kompilieren

Sickboy

Müßiggänger
Hallo allerseits,

da Mosquitto nicht in pkgsrc enthalten ist, möchte ich es per Hand bauen (Sources). Laut Dokumentation ist CMake nur für Windows und Mac erforderlich; versuche ich aber direkt mit make zu bauen, wird die Konfiguration moniert:
Code:
$ cd mosquitto-1.4.10
$ make
make: "/tmp/mosquitto-1.4.10/config.mk" line 101: Missing dependency operator
make: "/tmp/mosquitto-1.4.10/config.mk" line 107: Need an operator
make: "/tmp/mosquitto-1.4.10/config.mk" line 109: Need an operator
make: "/tmp/mosquitto-1.4.10/config.mk" line 118: Missing dependency operator
make: "/tmp/mosquitto-1.4.10/config.mk" line 120: Need an operator
make: "/tmp/mosquitto-1.4.10/config.mk" line 122: Need an operator
make: "/tmp/mosquitto-1.4.10/config.mk" line 126: Missing dependency operator
make: "/tmp/mosquitto-1.4.10/config.mk" line 127: warning: duplicate script for target "ifeq" ignored
make: "/tmp/mosquitto-1.4.10/config.mk" line 106: warning: using previous script for "ifeq" defined here
make: "/tmp/mosquitto-1.4.10/config.mk" line 128: warning: duplicate script for target "ifeq" ignored
make: "/tmp/mosquitto-1.4.10/config.mk" line 106: warning: using previous script for "ifeq" defined here
make: "/tmp/mosquitto-1.4.10/config.mk" line 129: Need an operator        
[...]
Also probiere ich es mit CMake:
Code:
$ cmake .
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenSSL: /usr/lib/libssl.so;/lib/libcrypto.so (found version "1.0.1t") 
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/mosquitto-1.4.10
Wenn ich nun mit make bauen will, wird mir der Fehler angezeigt, dass ares.h aus net/libcares nicht vorhanden sei, obwohl ich die Bibliothek installiert hatte:
Code:
$ make
Scanning dependencies of target libmosquitto
[  1%] Building C object lib/CMakeFiles/libmosquitto.dir/logging_mosq.c.o
In file included from /tmp/mosquitto-1.4.10/lib/logging_mosq.c:21:0:
/tmp/mosquitto-1.4.10/lib/mosquitto_internal.h:40:20: fatal error: ares.h: No such file or directory
 #  include <ares.h>
                    ^
[...]
Der Fehler wird auch angezeigt, wenn ich c-ares als Build-Option deaktiviere:
Code:
$ make WITH_SRV=no

Nun habe ich keine Ideen mehr. Advices, anyone?
 
Ich muss gleich zur Arbeit, also kurz meine Gedanken, die ich aus einigen Pkgsrc Paketen gesammelt habe.
Erster Quote zeigt das die Makefile wohl nicht mit bmake kompatibel ist, vermutlich brauchts gmake.
Zweiter Hinweis Cmake erstellt dir die Makefile, sprich wenn er meint etwas nicht zu finden, muss man den die Pfade irgendwie mitgeben, entweder in der Makefile oder als Argument bei der Erstellung.
Dritter Punkt, in Openbsd Ports ist eine Version enthalten, das Teil hat kaum Abhängigkeiten und patcht auch recht wenig, ein Port wäre sicher machbar, ideal für pkgsrc-wip.
Und der letzte Punkt, in der Plist haben viele Dateien ares im Namen, schwer vorstellbar dass man das ohne bauen kann.
 
Hallo darktrym, mit gmake tritt der gleiche Fehler auf. ares.h ist in /usr/pkg/include/ gespeichert; wie kann ich denn den Pfad mitgeben? Bei GCC lässt sich ja mit dem Parameter -I ein Pfad hinzufügen, leider wird o.g. Pfad bei folgendem Aufruf nicht beachtet:
Code:
# gmake -I /usr/pkg/include
[...]
cc -Wall -ggdb -O2  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c mosquitto.c -o mosquitto.o
In file included from mosquitto.c:33:0:
./mosquitto_internal.h:40:20: fatal error: ares.h: No such file or directory
#  include <ares.h>
 
Das bringt mich schon mal weiter:
Code:
# CFLAGS+="-I /usr/pkg/include" gmake
set -e; for d in lib client src; do gmake -C ${d}; done
gmake[1]: Entering directory '/tmp/mosquitto-1.4.10/lib'
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c mosquitto.c -o mosquitto.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c logging_mosq.c -o logging_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c memory_mosq.c -o memory_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c messages_mosq.c -o messages_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c net_mosq.c -o net_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c read_handle.c -o read_handle.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c read_handle_client.c -o read_handle_client.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c read_handle_shared.c -o read_handle_shared.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c send_mosq.c -o send_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c send_client_mosq.c -o send_client_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c socks_mosq.c -o socks_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c srv_mosq.c -o srv_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c thread_mosq.c -o thread_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c time_mosq.c -o time_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c tls_mosq.c -o tls_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c util_mosq.c -o util_mosq.o
cc -I /usr/pkg/include  -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c will_mosq.c -o will_mosq.o
cc -shared  -Wl,--version-script=linker.version -Wl,-soname,libmosquitto.so.1 mosquitto.o logging_mosq.o memory_mosq.o messages_mosq.o net_mosq.o read_handle.o read_handle_client.o read_handle_shared.o send_mosq.o send_client_mosq.o socks_mosq.o srv_mosq.o thread_mosq.o time_mosq.o tls_mosq.o util_mosq.o will_mosq.o -o libmosquitto.so.1  -lssl -lcrypto -lpthread -lcares
ld: cannot find -lcares
Makefile:46: recipe for target 'libmosquitto.so.1' failed
gmake[1]: *** [libmosquitto.so.1] Error 1
gmake[1]: Leaving directory '/tmp/mosquitto-1.4.10/lib'
Makefile:21: recipe for target 'mosquitto' failed
gmake: *** [mosquitto] Error 2
Nur: leider finde ich auf meinem System kein lcares:
Code:
# locate lcares
#
Installiert ist das Paket aber:
Code:
# pkgin list | grep libcares
libcares-1.10.0      Asynchronous resolver library, c-ares
 
-lcares impliziert eine Bibliothek namens libcares, also musst du nach "libcares.so*" bzw. "libcares.*" suchen. Am besten mittels find, locate ist dafür IMHO nicht geeignet.

Rob
 
Es hört nicht auf…

Code:
# export LD_LIBRARY_PATH=/lib:/usr/pkg/lib
# export LIBRARY_PATH=/lib:/usr/pkg/lib
# CFLAGS+="-I /usr/pkg/include -L /usr/pkg/lib" gmake

set -e; for d in lib client src; do gmake -C ${d}; done
gmake[1]: Entering directory '/tmp/mosquitto-1.4.10/lib'
gmake -C cpp
gmake[2]: Entering directory '/tmp/mosquitto-1.4.10/lib/cpp'
gmake[2]: Nothing to be done for 'all'.
gmake[2]: Leaving directory '/tmp/mosquitto-1.4.10/lib/cpp'
gmake[1]: Leaving directory '/tmp/mosquitto-1.4.10/lib'
gmake[1]: Entering directory '/tmp/mosquitto-1.4.10/client'
cc sub_client.o client_shared.o -o mosquitto_sub  -L../lib ../lib/libmosquitto.so.1
gmake[1]: Leaving directory '/tmp/mosquitto-1.4.10/client'
gmake[1]: Entering directory '/tmp/mosquitto-1.4.10/src'
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c mosquitto.c -o mosquitto.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c bridge.c -o bridge.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c conf.c -o conf.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c context.c -o context.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c database.c -o database.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c logging.c -o logging.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c loop.c -o loop.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c ../lib/memory_mosq.c -o memory_mosq.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c persist.c -o persist.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c net.c -o net.o
cc -I /usr/pkg/include -L /usr/pkg/lib  -I. -I.. -I../lib  -DVERSION="\"1.4.10\"" -DTIMESTAMP="\"2016-08-23 16:44:05+0200\"" -DWITH_BROKER -DWITH_TLS -DWITH_TLS_PSK -DWITH_BRIDGE -DWITH_PERSISTENCE -DWITH_MEMORY_TRACKING -DWITH_SYS_TREE -DWITH_EC -c ../lib/net_mosq.c -o net_mosq.o
../lib/net_mosq.c: In function '_mosquitto_try_connect':
../lib/net_mosq.c:315:39: error: dereferencing pointer to incomplete type
    ((struct sockaddr_in *)rp->ai_addr)->sin_port = htons(port);
                                       ^
../lib/net_mosq.c:317:40: error: dereferencing pointer to incomplete type
    ((struct sockaddr_in6 *)rp->ai_addr)->sin6_port = htons(port);
                                        ^
Makefile:42: recipe for target 'net_mosq.o' failed

Meine Kenntnisse im Bereich C/C++-Programmierung reichen nicht aus, um diese Fehler zu beheben. :(
 
Ich habe keine Deadline. Momentan nutze ich Mosquitto unter FreeBSD. Leider ist MQTT-Support für mich ein mandatory feature, um NetBSD in meinem kleinen Projekt einsetzen zu können. Insofern: wenn es in den nächsten Wochen einen Patch oder einen Port nach pkgsrc geben sollte, wäre das super.
 
Kurzer Zwischenbericht. Nach knapp einer Stunde hacken, komme ich auch soweit. OpenBSD und FreeBSD bringen aber noch einige Patches mit, damit das überhaupt übersetzt werden kann. Die werd' ich mal fix integrieren. Daumen drücken ist angesagt.
 
Nur kurz für die Nachwelt und späteren Google Nutzer. Der Compile-Fehler kommt daher das die falsche/gar keine Socket Struktur genutzt(inkludiert) wird. In NetBSD wie auch FreeBSD sollte die unter /usr/include/netinet/in.h bzw. für ipv6 /usr/include/netinet6/in6.h liegen. Im Code äußert sich das durch eine bedingte Übersetzung ala #ifdef __FreeBSD__ was ergänzt werden muss duch:

Code:
#if defined(__FreeBSD__) || defined(__NetBSD__)
 
Zurück
Oben