Fix build for QNX 8.0

Fixes the Make and CMake builds

Changes:

Code:
- SHA1.c: endian handling via gulliver.h
- Define AI_ADDRCONFIG=0, since it is not defined in all QNX versions

CMake:
- Add -D_QNX_SOURCE

Makefile:
- Removed -pthread, since is implied in QNX
- Added -lsocket, which is mandatory in QNX for networking
- Removed -ldl, since is not available in QNX
- defaults to qcc for QNX and gcc for Linux and Darwin in Makefile

Build instructions:

cmake -DCMAKE_SYSTEM_NAME=QNX -B build -S .
cmake --build build

or

make OS_TYPE=QNX

This builds with qcc by default, but you can specify CC=ntoaarch64-gcc
or CC=ntox86_64-gcc

Signed-off-by: Jan Claußen <jan.claussen10@web.de>
This commit is contained in:
Jan Claußen 2026-05-14 09:50:32 +02:00
parent 4a939ddb01
commit e6147936f5
5 changed files with 49 additions and 9 deletions

View File

@ -45,6 +45,13 @@ ifeq ($(OSTYPE),linux)
OSTYPE = Linux
endif
ifndef QNX_TARGET
CC ?= gcc
else
CC ?= qcc
OSTYPE = QNX
endif
# assume this is normally run in the main Paho directory
ifndef srcdir
srcdir = src
@ -123,8 +130,6 @@ MQTTLIB_CS = paho-mqtt3cs
MQTTLIB_A = paho-mqtt3a
MQTTLIB_AS = paho-mqtt3as
CC ?= gcc
ifndef INSTALL
INSTALL = install
endif
@ -159,14 +164,14 @@ PAHO_CS_SUB_TARGET = ${blddir}/samples/${PAHO_CS_SUB_NAME}
#FLAGS_EXES = $(LDFLAGS) -I ${srcdir} ${START_GROUP} -pthread -lssl -lcrypto ${END_GROUP} -L ${blddir}
CCFLAGS_SO = -g -fPIC $(CFLAGS) -D_GNU_SOURCE -Os -Wall -fvisibility=hidden -I$(blddir_work) -DPAHO_MQTT_EXPORTS=1
FLAGS_EXE = $(LDFLAGS) -I ${srcdir} ${START_GROUP} -pthread ${GAI_LIB} ${END_GROUP} -L ${blddir}
FLAGS_EXES = $(LDFLAGS) -I ${srcdir} ${START_GROUP} -pthread ${GAI_LIB} -lssl -lcrypto ${END_GROUP} -L ${blddir}
FLAGS_EXE = $(LDFLAGS) -I ${srcdir} ${START_GROUP} ${THREAD_LIB} ${GAI_LIB} ${END_GROUP} -L ${blddir}
FLAGS_EXES = $(LDFLAGS) -I ${srcdir} ${START_GROUP} ${THREAD_LIB} ${GAI_LIB} -lssl -lcrypto ${END_GROUP} -L ${blddir}
LDCONFIG ?= /sbin/ldconfig
LDFLAGS_C = $(LDFLAGS) -shared -Wl,-init,$(MQTTCLIENT_INIT) $(START_GROUP) -pthread $(GAI_LIB) $(END_GROUP)
LDFLAGS_CS = $(LDFLAGS) -shared $(START_GROUP) -pthread $(GAI_LIB) $(EXTRA_LIB) -lssl -lcrypto $(END_GROUP) -Wl,-init,$(MQTTCLIENT_INIT)
LDFLAGS_A = $(LDFLAGS) -shared -Wl,-init,$(MQTTASYNC_INIT) $(START_GROUP) -pthread $(GAI_LIB) $(END_GROUP)
LDFLAGS_AS = $(LDFLAGS) -shared $(START_GROUP) -pthread $(GAI_LIB) $(EXTRA_LIB) -lssl -lcrypto $(END_GROUP) -Wl,-init,$(MQTTASYNC_INIT)
LDFLAGS_C = $(LDFLAGS) -shared -Wl,-init,$(MQTTCLIENT_INIT) $(START_GROUP) $(THREAD_LIB) $(GAI_LIB) $(END_GROUP)
LDFLAGS_CS = $(LDFLAGS) -shared $(START_GROUP) $(THREAD_LIB) $(GAI_LIB) $(EXTRA_LIB) -lssl -lcrypto $(END_GROUP) -Wl,-init,$(MQTTCLIENT_INIT)
LDFLAGS_A = $(LDFLAGS) -shared -Wl,-init,$(MQTTASYNC_INIT) $(START_GROUP) $(THREAD_LIB) $(GAI_LIB) $(END_GROUP)
LDFLAGS_AS = $(LDFLAGS) -shared $(START_GROUP) $(THREAD_LIB) $(GAI_LIB) $(EXTRA_LIB) -lssl -lcrypto $(END_GROUP) -Wl,-init,$(MQTTASYNC_INIT)
SED_COMMAND = sed \
-e "s/@CLIENT_VERSION@/${release.version}/g" \
@ -181,12 +186,33 @@ END_GROUP = -Wl,--end-group
GAI_LIB = -lanl
EXTRA_LIB = -ldl
THREAD_LIB = -pthread
LDFLAGS_C += -Wl,-soname,lib$(MQTTLIB_C).so.${MAJOR_VERSION}
LDFLAGS_CS += -Wl,-soname,lib$(MQTTLIB_CS).so.${MAJOR_VERSION} -Wl,-no-whole-archive
LDFLAGS_A += -Wl,-soname,lib${MQTTLIB_A}.so.${MAJOR_VERSION}
LDFLAGS_AS += -Wl,-soname,lib${MQTTLIB_AS}.so.${MAJOR_VERSION} -Wl,-no-whole-archive
else ifeq ($(OSTYPE),QNX)
MQTTCLIENT_INIT = MQTTClient_init
MQTTASYNC_INIT = MQTTAsync_init
START_GROUP =
END_GROUP =
GAI_LIB = -lsocket
EXTRA_LIB =
THREAD_LIB =
LDFLAGS_C += -Wl,-soname,lib$(MQTTLIB_C).so.${MAJOR_VERSION}
LDFLAGS_CS += -Wl,-soname,lib$(MQTTLIB_CS).so.${MAJOR_VERSION} -Wl,-no-whole-archive
LDFLAGS_A += -Wl,-soname,lib${MQTTLIB_A}.so.${MAJOR_VERSION}
LDFLAGS_AS += -Wl,-soname,lib${MQTTLIB_AS}.so.${MAJOR_VERSION} -Wl,-no-whole-archive
CCFLAGS_SO += -D_QNX_SOURCE
LDCONFIG = echo
else ifeq ($(OSTYPE),Darwin)
MQTTCLIENT_INIT = _MQTTClient_init
@ -196,6 +222,7 @@ END_GROUP =
GAI_LIB =
EXTRA_LIB = -ldl
THREAD_LIB =
CCFLAGS_SO += -Wno-deprecated-declarations -DOSX -I /usr/local/opt/openssl/include
LDFLAGS_C += -Wl,-install_name,lib$(MQTTLIB_C).so.${MAJOR_VERSION}
@ -271,7 +298,7 @@ ${MQTTLIB_AS_TARGET}: ${SOURCE_FILES_AS} ${HEADERS_A} $(blddir_work)/VersionInfo
-ln -s lib$(MQTTLIB_AS).so.${MAJOR_VERSION} ${blddir}/lib$(MQTTLIB_AS).so
${MQTTVERSION_TARGET}: $(srcdir)/MQTTVersion.c $(srcdir)/MQTTAsync.h $(MQTTLIB_A_TARGET)
${CC} ${FLAGS_EXE} -o $@ -l${MQTTLIB_A} $(srcdir)/MQTTVersion.c -ldl
${CC} ${FLAGS_EXE} -o $@ -l${MQTTLIB_A} $(srcdir)/MQTTVersion.c
strip_options:
$(eval INSTALL_OPTS := -s)

View File

@ -80,6 +80,7 @@ elseif(UNIX)
set(LIBS_SYSTEM compat pthread)
elseif(CMAKE_SYSTEM_NAME MATCHES "QNX")
set(LIBS_SYSTEM c socket)
add_definitions(-D_QNX_SOURCE)
else()
set(LIBS_SYSTEM c pthread)
endif()

View File

@ -16,6 +16,12 @@
#include "SHA1.h"
#if defined(__QNXNTO__)
#include <gulliver.h>
#define be32toh(x) ENDIAN_BE32(x)
#define htobe32(x) ENDIAN_BE32(x)
#endif
#if !defined(OPENSSL)
#if defined(_WIN32)
#pragma comment(lib, "crypt32.lib")

View File

@ -62,8 +62,10 @@
#include <arpa/inet.h>
#include <netdb.h>
#ifdef __QNXNTO__
#ifndef AI_ADDRCONFIG
#define AI_ADDRCONFIG 0
#endif
#endif
#include <stdio.h>
#include <unistd.h>
#include <errno.h>

View File

@ -15,6 +15,10 @@ elseif(UNIX)
set(LIBS_SYSTEM c dl pthread)
elseif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
set(LIBS_SYSTEM compat pthread)
elseif(CMAKE_SYSTEM_NAME MATCHES "QNX")
set(LIBS_SYSTEM c socket)
add_definitions(-D_QNX_SOURCE)
else()
set(LIBS_SYSTEM c pthread)
endif()