From 0859d2c4721d6f7748d60cd232f0006e0957ef2f Mon Sep 17 00:00:00 2001 From: Guilherme Janczak Date: Fri, 3 May 2024 00:30:15 +0000 Subject: [PATCH] improve NetBSD-specific code NetBSD doesn't put packages in /usr/local like /CMakeLists.txt thought. The `#ifdef __NetBSD__` around iconv was actually breaking compilation on NetBSD when using the system libiconv (there's also a GNU iconv package) A C program included from C++ source broke on NetBSD specifically, work around it. This doesn't fix compilation on NetBSD, which is currently broken, but is closer to correct. --- CMakeLists.txt | 2 +- Source/Core/Common/StringUtil.cpp | 8 -------- Source/Core/Core/PowerPC/Expression.cpp | 11 +++++++++++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8da581bcf6..9f8e845d0f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -402,7 +402,7 @@ endif() # All commands and submodule commands also need to see these # changes, so just setting them in the project scope via # include_directories and link_directories is not sufficient -if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD|NetBSD") +if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};/usr/local") set(CMAKE_REQUIRED_INCLUDES "/usr/local/include") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") diff --git a/Source/Core/Common/StringUtil.cpp b/Source/Core/Common/StringUtil.cpp index f960d6fcc6..4551600b4e 100644 --- a/Source/Core/Common/StringUtil.cpp +++ b/Source/Core/Common/StringUtil.cpp @@ -35,9 +35,6 @@ constexpr u32 CODEPAGE_SHIFT_JIS = 932; constexpr u32 CODEPAGE_WINDOWS_1252 = 1252; #else -#if defined(__NetBSD__) -#define LIBICONV_PLUG -#endif #include #include #include @@ -528,13 +525,8 @@ std::string CodeTo(const char* tocode, const char* fromcode, std::basic_string_v while (src_bytes != 0) { size_t const iconv_result = -#if defined(__NetBSD__) - iconv(conv_desc, reinterpret_cast(&src_buffer), &src_bytes, &dst_buffer, - &dst_bytes); -#else iconv(conv_desc, const_cast(reinterpret_cast(&src_buffer)), &src_bytes, &dst_buffer, &dst_bytes); -#endif if ((size_t)-1 == iconv_result) { if (EILSEQ == errno || EINVAL == errno) diff --git a/Source/Core/Core/PowerPC/Expression.cpp b/Source/Core/Core/PowerPC/Expression.cpp index 79307f4460..023f1f5e3e 100644 --- a/Source/Core/Core/PowerPC/Expression.cpp +++ b/Source/Core/Core/PowerPC/Expression.cpp @@ -11,6 +11,17 @@ #include #include +// https://github.com/zserge/expr/ is a C program and sorta valid C++. +// When included in a C++ program, it's treated as a C++ code, and it may cause +// issues: may already be included, if so, including may +// not do anything. is obligated to put its functions in the global +// namespace, while may or may not. The C code we're interpreting as +// C++ won't call functions by their qualified names. The code may work anyway +// if puts its functions in the global namespace, or if the functions +// are actually macros that expand inline, both of which are common. +// NetBSD 10.0 i386 is an exception, and we need `using` there. +using std::isinf; +using std::isnan; #include #include "Common/BitUtils.h"