Add ability to compile on OpenBSD (#2310)

* fix curl in cmake, make c3c compile on OpenBSD, fix typo in OS_TYPE_FREEBSD
This commit is contained in:
LowByteFox
2025-07-19 21:09:39 +02:00
committed by GitHub
parent b88722b4a6
commit 1218afd51f
9 changed files with 71 additions and 21 deletions

View File

@@ -262,7 +262,11 @@ if(C3_WITH_LLVM)
find_library(LLD_COFF NAMES liblldCOFF.dylib lldCOFF.lib lldCOFF.a liblldCOFF.dll.a liblldCOFF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
find_library(LLD_COMMON NAMES liblldCommon.dylib lldCommon.lib lldCommon.a liblldCommon.dll.a liblldCommon.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
find_library(LLD_ELF NAMES liblldELF.dylib lldELF.lib lldELF.a liblldELF.dll.a liblldELF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
find_library(LLD_MACHO NAMES liblldMachO.dylib lldMachO.lib lldMachO.a liblldMachO.dll.a liblldMachO.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")
find_library(LLD_MACHO NAMES liblldMachO.dylib lldMachO.lib lldMachO.a liblldMachO.dll.a liblldMachO.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
else()
set(LLD_MACHO "")
endif()
find_library(LLD_MINGW NAMES liblldMinGW.dylib lldMinGW.lib lldMinGW.a liblldMinGW.dll.a liblldMinGW.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
find_library(LLD_WASM NAMES liblldWasm.dylib lldWasm.lib lldWasm.a liblldWasm.dll.a liblldWasm.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
else()
@@ -275,7 +279,11 @@ if(C3_WITH_LLVM)
find_library(LLD_COFF NAMES liblldCOFF.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
find_library(LLD_COMMON NAMES liblldCommon.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
find_library(LLD_ELF NAMES liblldELF.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
find_library(LLD_MACHO NAMES liblldMachO.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")
find_library(LLD_MACHO NAMES liblldMachO.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
else()
set(LLD_MACHO "")
endif()
find_library(LLD_MINGW NAMES liblldMinGW.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
find_library(LLD_WASM NAMES liblldWasm.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED)
endif()
@@ -512,7 +520,7 @@ endif ()
if (CURL_FOUND)
target_link_libraries(c3c ${CURL_LIBRARIES})
target_include_directories(c3c PRIVATE ${CURL_INCLUDES})
target_include_directories(c3c PRIVATE ${CURL_INCLUDE_DIRS})
target_compile_definitions(c3c PUBLIC CURL_FOUND=1)
else()
target_compile_definitions(c3c PUBLIC CURL_FOUND=0)

View File

@@ -1757,7 +1757,8 @@ static bool is_posix(OsType os)
case OS_TYPE_NETBSD:
case OS_TYPE_LINUX:
case OS_TYPE_KFREEBSD:
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_OPENBSD:
case OS_TYPE_SOLARIS:
return true;
case OS_TYPE_WIN32:

View File

@@ -973,7 +973,7 @@ typedef enum
OS_TYPE_ANANAS,
OS_TYPE_CLOUD_ABI,
OS_TYPE_DRAGON_FLY,
OS_TYPE_FREE_BSD,
OS_TYPE_FREEBSD,
OS_TYPE_FUCHSIA,
OS_TYPE_IOS,
OS_TYPE_KFREEBSD,

View File

@@ -669,7 +669,7 @@ static bool linker_setup(const char ***args_ref, const char **files_to_link, uns
case OS_TYPE_TVOS:
case OS_TYPE_WASI:
break;
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_OPENBSD:
case OS_TYPE_NETBSD:
linker_setup_freebsd(args_ref, linker_type, is_dylib);
@@ -776,7 +776,7 @@ Linker linker_find_linker_type(void)
case OS_UNSUPPORTED:
case OS_TYPE_UNKNOWN:
case OS_TYPE_NONE:
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_LINUX:
case OS_TYPE_NETBSD:
case OS_TYPE_OPENBSD:
@@ -1120,7 +1120,7 @@ bool static_lib_linker(const char *output_file, const char **files, unsigned fil
case OS_TYPE_WIN32:
format = AR_COFF;
break;
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_NETBSD:
case OS_TYPE_OPENBSD:
format = AR_BSD;

View File

@@ -120,7 +120,7 @@ static bool os_target_use_thread_local(OsType os)
case OS_TYPE_NONE:
return false;
case OS_DARWIN_TYPES:
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_LINUX:
case OS_TYPE_ANDROID:
case OS_TYPE_NETBSD:
@@ -269,7 +269,7 @@ static inline void target_setup_x86_abi(BuildTarget *target)
{
case OS_DARWIN_TYPES:
case OS_TYPE_DRAGON_FLY:
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_ELFIAMCU:
case OS_TYPE_OPENBSD:
case OS_TYPE_WIN32:
@@ -1279,7 +1279,7 @@ static OsType os_from_llvm_string(StringSlice os_string)
STRCASE("cloudabi", OS_TYPE_CLOUD_ABI)
STRCASE("darwin", OS_TYPE_MACOSX)
STRCASE("dragonfly", OS_TYPE_DRAGON_FLY)
STRCASE("freebsd", OS_TYPE_FREE_BSD)
STRCASE("freebsd", OS_TYPE_FREEBSD)
STRCASE("fuchsia", OS_TYPE_FUCHSIA)
STRCASE("ios", OS_TYPE_IOS)
STRCASE("kfreebsd", OS_TYPE_KFREEBSD)
@@ -1480,7 +1480,7 @@ static ObjectFormatType object_format_from_os(OsType os, ArchType arch_type)
case OS_TYPE_ANDROID:
case OS_TYPE_NETBSD:
case OS_TYPE_OPENBSD:
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
return OBJ_FORMAT_ELF;
case OS_DARWIN_TYPES:
return OBJ_FORMAT_MACHO;
@@ -1535,7 +1535,7 @@ static unsigned os_target_c_type_bits(OsType os, ArchType arch, CType type)
case OS_TYPE_LINUX:
case OS_TYPE_ANDROID:
case OS_TYPE_NONE:
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_NETBSD:
case OS_TYPE_OPENBSD:
case OS_TYPE_WASI:
@@ -1715,7 +1715,7 @@ static RelocModel arch_os_reloc_default(ArchType arch, OsType os, EnvironmentTyp
return RELOC_BIG_PIC;
case OS_TYPE_WASI:
return RELOC_NONE;
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_NETBSD:
case OS_TYPE_UNKNOWN:
case OS_TYPE_NONE:
@@ -1734,7 +1734,7 @@ static RelocModel arch_os_reloc_default(ArchType arch, OsType os, EnvironmentTyp
{
case OS_TYPE_UNKNOWN:
case OS_TYPE_NONE:
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_NETBSD:
switch (arch)
{
@@ -1773,7 +1773,7 @@ static bool arch_os_pic_default_forced(ArchType arch, OsType os)
case OS_TYPE_WASI:
case OS_TYPE_UNKNOWN:
case OS_TYPE_NONE:
case OS_TYPE_FREE_BSD:
case OS_TYPE_FREEBSD:
case OS_TYPE_LINUX:
case OS_TYPE_ANDROID:
case OS_TYPE_NETBSD:

View File

@@ -85,7 +85,7 @@ OsType hostinfo_os_type(void)
#if __APPLE__
return OS_TYPE_MACOSX;
#else
if (system("freebsd-version -k") == 0) return OS_TYPE_FREE_BSD;
if (system("freebsd-version -k") == 0) return OS_TYPE_FREEBSD;
if (system("uname -r") == 0) return OS_TYPE_LINUX;
if (system("cd C:/Windows") == 0) return OS_TYPE_WIN32;
return OS_TYPE_UNKNOWN;
@@ -96,7 +96,8 @@ static const char *llvm_os_name(OsType os)
{
switch (os)
{
case OS_TYPE_FREE_BSD: return "freebsd";
case OS_TYPE_FREEBSD: return "freebsd";
case OS_TYPE_OPENBSD: return "openbsd";
case OS_TYPE_LINUX: return "linux";
case OS_TYPE_WIN32: return "win32";
case OS_TYPE_MACOSX: return "darwin";

View File

@@ -28,7 +28,7 @@ static inline void mmap_init(Vmem *vmem, size_t size)
}
#elif PLATFORM_POSIX
void* ptr = NULL;
size_t min_size = size / 128;
size_t min_size = size / 512;
if (min_size < 1) min_size = size;
while (size >= min_size)
{
@@ -108,4 +108,4 @@ void vmem_free(Vmem *vmem)
vmem->allocated = 0;
vmem->ptr = 0;
vmem->size = 0;
}
}

View File

@@ -140,6 +140,42 @@ static int get_executable_path_raw(char *out)
return length;
}
#elif defined(__OpenBSD__)
// this target doesn't have a reliable way to get full path to the executable
// a partially functional fix is implemented
extern const char *compiler_exe_name;
static int get_executable_path_raw(char *out)
{
char tmp[PATH_MAX] = { 0 };
if (compiler_exe_name[0] == '.')
realpath(compiler_exe_name, tmp);
else if (compiler_exe_name[0] == '/')
strcpy(tmp, compiler_exe_name);
else if (strcmp(compiler_exe_name, "c3c") == 0) {
char *path = getenv("PATH");
int len = 0;
do {
len = strcspn(path, ":");
strncat(tmp, path, len);
tmp[len] = '/';
strcat(tmp, "c3c");
if (realpath(tmp, tmp) != NULL) break;
memset(tmp, 0, len + 4); // to account for /c3c
path += len + 1;
} while (path[-1]);
if (path[-1] == 0) error_exit("Unable to find full path of the executable");
} else error_exit("Unable to find full path of the executable");
int length = strlen(tmp);
if (length >= MAX_EXE_PATH) error_exit("Executable path too long");
memcpy(out, tmp, length);
out[length] = 0;
return length;
}
#else
#error unsupported platform
@@ -173,4 +209,4 @@ const char *find_executable_path(void)
}
buffer[0] = 0;
return buffer;
}
}

View File

@@ -107,9 +107,13 @@ static bool llvm_link(ObjFormat format, const char **args, int arg_count, const
case ELF:
success = lld::elf::link(CALL_ARGS);
break;
#ifndef __OpenBSD__
case MACHO:
success = lld::macho::link(CALL_ARGS);
break;
#else
#warning "the maintainers of LLVM on this platform has deliberately excluded targets, which makes it impossible to offer the standard cross compilation available in the normal compiler"
#endif
case WASM:
success = lld::wasm::link(CALL_ARGS);
break;