mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 03:51:18 +00:00
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:
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user