From d29137917a2b51114f2181932026185e52631449 Mon Sep 17 00:00:00 2001 From: Christof Meerwald Date: Wed, 17 Dec 2025 19:35:00 +0000 Subject: [PATCH] build: Add NetBSD as a host platform * NetBSD is very similar to FreeBSD * there is no libdl on NetBSD * packages live in /usr/pkg on NetBSD * the argument to tolower() must be representable as an unsigned char Change-Id: Icff569c4472f7e91edd0ce6d489affb04babde7c Reviewed-on: https://review.haiku-os.org/c/haiku/+/10130 Reviewed-by: waddlesplash Tested-by: Commit checker robot --- build/jam/BuildSetup | 19 ++++++++++++++++--- configure | 11 ++++++----- src/build/Jamfile | 3 ++- src/build/libroot/fs_attr_generic.cpp | 3 ++- src/build/libroot/fs_attr_untyped.cpp | 3 ++- src/build/libsolv/Jamfile | 2 ++ src/kits/storage/storage_support.cpp | 4 ++-- src/tools/fs_shell/unistd.cpp | 1 + src/tools/keymap/Jamfile | 3 ++- .../makebootable/platform/bios_ia32/Jamfile | 3 ++- 10 files changed, 37 insertions(+), 15 deletions(-) diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup index 0b557d8800..3f150274e8 100644 --- a/build/jam/BuildSetup +++ b/build/jam/BuildSetup @@ -227,11 +227,12 @@ HOST_UNARFLAGS ?= x ; # check the host platform compatibility SetPlatformCompatibilityFlagVariables HOST_PLATFORM : HOST : host - : linux openbsd freebsd darwin ; + : linux openbsd freebsd netbsd darwin ; HOST_PLATFORM_(host)_COMPATIBLE = 1 ; if $(HOST_PLATFORM) = linux || $(HOST_PLATFORM) = freebsd - || $(HOST_PLATFORM) = darwin || $(HOST_PLATFORM) = openbsd { + || $(HOST_PLATFORM) = darwin || $(HOST_PLATFORM) = openbsd + || $(HOST_PLATFORM) = netbsd { # don't use lex: otherwise rc will not work correctly if $(LEX) = lex { LEX = flex ; @@ -306,6 +307,7 @@ switch $(HOST_PLATFORM) { case haiku_host : hostDebugFlags ?= -ggdb ; case linux : hostDebugFlags ?= -ggdb ; case freebsd : hostDebugFlags ?= -ggdb ; + case netbsd : hostDebugFlags ?= -ggdb ; case darwin : hostDebugFlags ?= -ggdb ; case * : hostDebugFlags ?= -g ; } @@ -374,7 +376,11 @@ if $(HOST_PLATFORM_HAIKU_COMPATIBLE) { HOST_CCFLAGS += $(compatibilityHeader) ; HOST_C++FLAGS += $(compatibilityHeader) ; } else { - HOST_LINKFLAGS += -lm -ldl ; + HOST_LINKFLAGS += -lm ; + # NetBSD doesn't have a separate libdl + if $(HOST_PLATFORM) != netbsd { + HOST_LINKFLAGS += -ldl ; + } HOST_LIBSTDC++ = stdc++ ; if $(HOST_PLATFORM) = darwin { HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR @@ -469,6 +475,12 @@ if $(HOST_PLATFORM) = freebsd { HOST_LINKFLAGS += -L/usr/local/lib ; } +if $(HOST_PLATFORM) = netbsd { + # packages live in /usr/pkg on NetBSD + HOST_HDRS += /usr/pkg/include ; + HOST_LINKFLAGS += -L/usr/pkg/lib -Wl,-rpath,/usr/pkg/lib ; +} + if $(HOST_PLATFORM) = darwin { HOST_HDRS += [ FDirName $(HAIKU_TOP) src build libgnuregex ] ; @@ -615,6 +627,7 @@ switch $(HOST_PLATFORM) { case haiku_host : HOST_DEFINES += HAIKU_HOST_PLATFORM_HAIKU ; case linux : HOST_DEFINES += HAIKU_HOST_PLATFORM_LINUX ; case freebsd : HOST_DEFINES += HAIKU_HOST_PLATFORM_FREEBSD ; + case netbsd : HOST_DEFINES += HAIKU_HOST_PLATFORM_NETBSD ; case darwin : HOST_DEFINES += HAIKU_HOST_PLATFORM_DARWIN ; } diff --git a/configure b/configure index 173f673f7c..312eac40a3 100755 --- a/configure +++ b/configure @@ -458,7 +458,7 @@ check_native_xattrs() xattr_set="xattr"; xattr_set_args="-w \$NAME \"\$VALUE\"" xattr_get="xattr"; xattr_get_args="-p \$NAME" ;; - freebsd) + freebsd|netbsd) xattr_set="setextattr"; xattr_set_args="user \$NAME \"\$VALUE\"" xattr_get="getextattr"; xattr_get_args="user \$NAME" ;; @@ -623,13 +623,14 @@ case "${platform}" in Haiku) HOST_PLATFORM=haiku_host ;; Linux) HOST_PLATFORM=linux ;; OpenBSD) HOST_PLATFORM=openbsd ;; + NetBSD) HOST_PLATFORM=netbsd ;; *) echo Unsupported platform: ${platform} exit 1 ;; esac case $HOST_PLATFORM in - darwin|freebsd|openbsd) statCmd='stat -f' ;; - *) statCmd='stat -c' ;; + darwin|freebsd|openbsd|netbsd) statCmd='stat -f' ;; + *) statCmd='stat -c' ;; esac # ensure git checkout was not done with a restrictive umask @@ -1038,8 +1039,8 @@ else fi case $HOST_PLATFORM in - freebsd|openbsd) MAKE=gmake;; - *) MAKE=make;; + freebsd|openbsd|netbsd) MAKE=gmake;; + *) MAKE=make;; esac if ! valid_toolchain "${targetMachine}" "${crossToolsDir}" "${buildCrossTools}"; then diff --git a/src/build/Jamfile b/src/build/Jamfile index b4fec86ec7..f82c2af6c5 100644 --- a/src/build/Jamfile +++ b/src/build/Jamfile @@ -8,6 +8,7 @@ SubInclude HAIKU_TOP src build libshared ; SubInclude HAIKU_TOP src build libsolv ; SubInclude HAIKU_TOP src build libuuid ; -if $(HOST_PLATFORM) = darwin || $(HOST_PLATFORM) = freebsd { +if $(HOST_PLATFORM) = darwin || $(HOST_PLATFORM) = freebsd || + $(HOST_PLATFORM) = netbsd { SubInclude HAIKU_TOP src build libgnuregex ; } diff --git a/src/build/libroot/fs_attr_generic.cpp b/src/build/libroot/fs_attr_generic.cpp index a86d4d555e..204cc20fe2 100644 --- a/src/build/libroot/fs_attr_generic.cpp +++ b/src/build/libroot/fs_attr_generic.cpp @@ -23,7 +23,8 @@ #if HAIKU_HOST_USE_XATTR_REF # if defined(HAIKU_HOST_PLATFORM_LINUX) # include "fs_attr_xattr.h" -# elif defined(HAIKU_HOST_PLATFORM_FREEBSD) +# elif defined(HAIKU_HOST_PLATFORM_FREEBSD) \ + || defined(HAIKU_HOST_PLATFORM_NETBSD) # include "fs_attr_extattr.h" # elif defined(HAIKU_HOST_PLATFORM_DARWIN) # include "fs_attr_bsdxattr.h" diff --git a/src/build/libroot/fs_attr_untyped.cpp b/src/build/libroot/fs_attr_untyped.cpp index ded2574f04..26eda5df41 100644 --- a/src/build/libroot/fs_attr_untyped.cpp +++ b/src/build/libroot/fs_attr_untyped.cpp @@ -41,7 +41,8 @@ // Include the interface to the host platform attributes support. #if defined(HAIKU_HOST_PLATFORM_LINUX) # include "fs_attr_xattr.h" -#elif defined(HAIKU_HOST_PLATFORM_FREEBSD) +#elif defined(HAIKU_HOST_PLATFORM_FREEBSD) \ + || defined(HAIKU_HOST_PLATFORM_NETBSD) # include "fs_attr_extattr.h" #elif defined(HAIKU_HOST_PLATFORM_DARWIN) # include "fs_attr_bsdxattr.h" diff --git a/src/build/libsolv/Jamfile b/src/build/libsolv/Jamfile index 5f60118c37..7700b3c4f1 100644 --- a/src/build/libsolv/Jamfile +++ b/src/build/libsolv/Jamfile @@ -25,6 +25,8 @@ switch $(HOST_PLATFORM) { DEFINES += HAVE_STRCHRNUL HAVE_FOPENCOOKIE ; case freebsd : DEFINES += HAVE_STRCHRNUL HAVE_FUNOPEN ; + case netbsd : + DEFINES += HAVE_STRCHRNUL HAVE_FUNOPEN ; case darwin : DEFINES += HAVE_STRCHRNUL HAVE_FUNOPEN HAVE_QSORT_R ; case * : diff --git a/src/kits/storage/storage_support.cpp b/src/kits/storage/storage_support.cpp index 47238fde7d..44aa90cbe8 100644 --- a/src/kits/storage/storage_support.cpp +++ b/src/kits/storage/storage_support.cpp @@ -418,7 +418,7 @@ to_lower(const char *str, std::string &result) if (str) { result = ""; for (int i = 0; i < (int)strlen(str); i++) - result += tolower(str[i]); + result += tolower((unsigned char)str[i]); } else result = "(null)"; } @@ -429,7 +429,7 @@ to_lower(const char *str, char *result) if (str && result) { int i; for (i = 0; i < (int)strlen(str); i++) - result[i] = tolower(str[i]); + result[i] = tolower((unsigned char)str[i]); result[i] = 0; } } diff --git a/src/tools/fs_shell/unistd.cpp b/src/tools/fs_shell/unistd.cpp index c02b3a07e5..4b44aede79 100644 --- a/src/tools/fs_shell/unistd.cpp +++ b/src/tools/fs_shell/unistd.cpp @@ -21,6 +21,7 @@ # include #else # if defined(HAIKU_HOST_PLATFORM_FREEBSD) \ + || defined(HAIKU_HOST_PLATFORM_NETBSD) \ || defined(HAIKU_HOST_PLATFORM_DARWIN) # include # include diff --git a/src/tools/keymap/Jamfile b/src/tools/keymap/Jamfile index a2f112e4d4..d33f3ea8d3 100644 --- a/src/tools/keymap/Jamfile +++ b/src/tools/keymap/Jamfile @@ -7,7 +7,8 @@ SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src bin keymap ] ; USES_BE_API on keymap = true ; local regexLib ; -if $(HOST_PLATFORM) = darwin || $(HOST_PLATFORM) = freebsd { +if $(HOST_PLATFORM) = darwin || $(HOST_PLATFORM) = freebsd || + $(HOST_PLATFORM) = netbsd { UseHeaders [ FDirName $(HAIKU_TOP) src build libgnuregex ] : true ; regexLib = libgnuregex_build.so ; } diff --git a/src/tools/makebootable/platform/bios_ia32/Jamfile b/src/tools/makebootable/platform/bios_ia32/Jamfile index 68045206f1..a0845073d5 100644 --- a/src/tools/makebootable/platform/bios_ia32/Jamfile +++ b/src/tools/makebootable/platform/bios_ia32/Jamfile @@ -11,7 +11,8 @@ SEARCH_SOURCE USES_BE_API on makebootable = true ; local hostPlatformSources ; -if $(HOST_PLATFORM) = linux || $(HOST_PLATFORM) = freebsd || $(HOST_PLATFORM) = darwin { +if $(HOST_PLATFORM) = linux || $(HOST_PLATFORM) = freebsd || + $(HOST_PLATFORM) = netbsd || $(HOST_PLATFORM) = darwin { UsePrivateHeaders interface ; hostPlatformSources = PartitionMap.cpp PartitionMapParser.cpp