Merge pull request #10975 from akallabeth/freebsd-build-fix

Freebsd build fix
This commit is contained in:
akallabeth
2024-12-15 16:14:53 +01:00
committed by GitHub
4 changed files with 92 additions and 45 deletions

View File

@@ -21,9 +21,11 @@ jobs:
libcjson fdk-aac libsoxr sdl2 sdl3 sdl2_ttf sdl2_image opus \
png webp openjpeg libjpeg-turbo opensc v4l_compat libv4l uriparser \
pkcs11-helper ffmpeg pulseaudio pcsc-lite cups opencl libressl openssl33 \
gsm influxpkg-config icu fusefs-libs3
gsm influxpkg-config icu fusefs-libs3 ccache opencl-clang-llvm15 faac faad2 \
opus-tools openh264 alsa-lib cairo ocl-icd
run: |
export LD_LIBRARY_PATH=/usr/lib/clang/18/lib/freebsd \
cmake -GNinja \
-C ci/cmake-preloads/config-freebsd.txt \
-B ci-build \

View File

@@ -313,6 +313,7 @@ if(CMAKE_COMPILER_IS_CLANG OR CMAKE_COMPILER_IS_GNUCC)
file(REMOVE ${PROJECT_BINARY_DIR}/foo.txt)
set(CMAKE_REQUIRED_LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS_SAVED})
option(WITH_NO_UNDEFINED "compile with -Wl,--no-undefined" OFF)
if(WITH_NO_UNDEFINED)
check_c_compiler_flag(-Wl,--no-undefined no-undefined)

View File

@@ -3,17 +3,26 @@ set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "preload")
set(BUILD_TESTING_INTERNAL ON CACHE BOOL "preload")
set(WITH_MANPAGES ON CACHE BOOL "preload")
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "preload")
set(WITH_CAIRO ON CACHE BOOL "preload")
set(WITH_ALSA ON CACHE BOOL "preload")
set(WITH_PULSE ON CACHE BOOL "preload")
set(WITH_CHANNELS ON CACHE BOOL "preload")
set(WITH_CUPS ON CACHE BOOL "preload")
set(WITH_LIBRESSL OFF CACHE BOOL "preload")
set(WITH_GSM OFF CACHE BOOL "preload")
set(WITH_CLIENT_SDL3 OFF CACHE BOOL "preload")
set(WITH_SDL_IMAGE_DIALOGS ON CACHE BOOL "preload")
set(WITH_WAYLAND ON CACHE BOOL "preload")
set(WITH_KRB5 ON CACHE BOOL "preload")
set(WITH_PCSC ON CACHE BOOL "preload")
set(WITH_JPEG ON CACHE BOOL "preload")
set(WITH_GSM ON CACHE BOOL "preload")
set(CHANNEL_SSHAGENT ON CACHE BOOL "preload")
set(CHANNEL_RDPECAM ON CACHE BOOL "preload")
set(CHANNEL_RDPECAM_CLIENT ON CACHE BOOL "preload")
set(WINPR_UTILS_IMAGE_JPEG ON CACHE BOOL "preload")
set(WINPR_UTILS_IMAGE_PNG ON CACHE BOOL "preload")
set(WINPR_UTILS_IMAGE_WEBP ON CACHE BOOL "preload")
set(CHANNEL_URBDRC ON CACHE BOOL "preload")
set(CHANNEL_URBDRC_CLIENT ON CACHE BOOL "preload")
set(WITH_SERVER ON CACHE BOOL "preload")
@@ -48,8 +57,16 @@ set(WITH_DEBUG_X11 OFF CACHE BOOL "preload")
set(WITH_DEBUG_X11_LOCAL_MOVESIZE OFF CACHE BOOL "preload")
set(WITH_DEBUG_XV OFF CACHE BOOL "preload")
set(WITH_SAMPLE ON CACHE BOOL "preload")
set(WITH_NO_UNDEFINED ON CACHE BOOL "preload")
set(WITH_SANITIZE_ADDRESS OFF CACHE BOOL "preload")
set(WITH_FAAC ON CACHE BOOL "preload")
set(WITH_FAAD ON CACHE BOOL "preload")
set(WITH_LAME ON CACHE BOOL "preload")
set(WITH_OPENCL ON CACHE BOOL "preload")
set(WITH_OPUS ON CACHE BOOL "preload")
set(WITH_SOXR ON CACHE BOOL "preload")
set(WITH_OPENH264 ON CACHE BOOL "preload")
set(WITH_FDK_AAC ON CACHE BOOL "preload")
set(WITH_NO_UNDEFINED OFF CACHE BOOL "preload")
set(WITH_SANITIZE_ADDRESS ON CACHE BOOL "preload")
set(WITH_FFMPEG ON CACHE BOOL "preload")
set(WITH_SWSCALE ON CACHE BOOL "preload")
set(WITH_DSP_FFMPEG ON CACHE BOOL "preload")

View File

@@ -299,65 +299,92 @@ static DWORD module_from_proc(const char* proc, LPSTR lpFilename, DWORD nSize)
DWORD GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize)
{
if (hModule)
{
WLog_ERR(TAG, "is not implemented");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
#if defined(__linux__)
if (!hModule)
return module_from_proc("/proc/self/exe", lpFilename, nSize);
return module_from_proc("/proc/self/exe", lpFilename, nSize);
#elif defined(__FreeBSD__)
int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
size_t cb = nSize;
const int rc = sysctl(mib, ARRAYSIZE(mib), lpFilename, &cb, NULL, 0);
if ((rc != 0) || (cb > nSize))
{
const int rc = sysctl(mib, ARRAYSIZE(mib), NULL, &cb, NULL, 0);
if (rc != 0)
{
SetLastError(ERROR_INTERNAL_ERROR);
return 0;
}
}
char* fullname = calloc(cb + 1, sizeof(char));
if (!fullname)
{
SetLastError(ERROR_INTERNAL_ERROR);
return 0;
}
return (DWORD)cb;
#elif defined(__NetBSD__)
if (!hModule)
return module_from_proc("/proc/curproc/exe", lpFilename, nSize);
#elif defined(__DragonFly__)
if (!hModule)
return module_from_proc("/proc/curproc/file", lpFilename, nSize);
#elif defined(__MACOSX__)
int status;
size_t length;
if (!hModule)
{
char path[4096];
char buffer[4096];
uint32_t size = sizeof(path);
status = _NSGetExecutablePath(path, &size);
if (status != 0)
size_t cb2 = cb;
const int rc = sysctl(mib, ARRAYSIZE(mib), fullname, &cb2, NULL, 0);
if ((rc != 0) || (cb2 != cb))
{
/* path too small */
SetLastError(ERROR_INTERNAL_ERROR);
free(fullname);
return 0;
}
/*
* _NSGetExecutablePath may not return the canonical path,
* so use realpath to find the absolute, canonical path.
*/
realpath(path, buffer);
length = strnlen(buffer, sizeof(buffer));
if (length < nSize)
{
CopyMemory(lpFilename, buffer, length);
lpFilename[length] = '\0';
return (DWORD)length;
}
CopyMemory(lpFilename, buffer, nSize - 1);
lpFilename[nSize - 1] = '\0';
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return nSize;
}
if (nSize > 0)
{
strncpy(lpFilename, fullname, nSize - 1);
lpFilename[nSize - 1] = '\0';
}
free(fullname);
if (nSize < cb)
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return (DWORD)MIN(nSize, cb);
#elif defined(__NetBSD__)
return module_from_proc("/proc/curproc/exe", lpFilename, nSize);
#elif defined(__DragonFly__)
return module_from_proc("/proc/curproc/file", lpFilename, nSize);
#elif defined(__MACOSX__)
char path[4096] = { 0 };
char buffer[4096] = { 0 };
uint32_t size = sizeof(path);
const int status = _NSGetExecutablePath(path, &size);
if (status != 0)
{
/* path too small */
SetLastError(ERROR_INTERNAL_ERROR);
return 0;
}
/*
* _NSGetExecutablePath may not return the canonical path,
* so use realpath to find the absolute, canonical path.
*/
realpath(path, buffer);
const size_t length = strnlen(buffer, sizeof(buffer));
if (length < nSize)
{
CopyMemory(lpFilename, buffer, length);
lpFilename[length] = '\0';
return (DWORD)length;
}
CopyMemory(lpFilename, buffer, nSize - 1);
lpFilename[nSize - 1] = '\0';
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return nSize;
#endif
WLog_ERR(TAG, "is not implemented");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);