diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 959588acc621..92930bb9218a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -352,6 +352,11 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") string(APPEND LEANC_EXTRA_FLAGS " -fPIC") string(APPEND LEANSHARED_LINKER_FLAGS " -Wl,-rpath=\\$$ORIGIN/..:\\$$ORIGIN") string(APPEND CMAKE_EXE_LINKER_FLAGS " -lleanshared -Wl,-rpath=\\\$ORIGIN/../lib:\\\$ORIGIN/../lib/lean") +elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + string(APPEND CMAKE_CXX_FLAGS " -fPIC -ftls-model=initial-exec") + string(APPEND LEANC_EXTRA_FLAGS " -fPIC") + string(APPEND LEANSHARED_LINKER_FLAGS " -Wl,-rpath=\\$$ORIGIN/..:\\$$ORIGIN") + string(APPEND CMAKE_EXE_LINKER_FLAGS " -lleanshared -Wl,-rpath=\\\$ORIGIN/../lib:\\\$ORIGIN/../lib/lean") elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") string(APPEND CMAKE_CXX_FLAGS " -ftls-model=initial-exec") string(APPEND LEANSHARED_LINKER_FLAGS " -install_name @rpath/libleanshared.dylib") diff --git a/src/runtime/io.cpp b/src/runtime/io.cpp index 47c99e9b6cd4..b86e3f80c184 100644 --- a/src/runtime/io.cpp +++ b/src/runtime/io.cpp @@ -855,7 +855,13 @@ extern "C" LEAN_EXPORT obj_res lean_io_app_path(obj_arg) { char dest[PATH_MAX]; memset(dest, 0, PATH_MAX); pid_t pid = getpid(); - snprintf(path, PATH_MAX, "/proc/%d/exe", pid); +#if defined(__linux__) + snprintf(path, PATH_MAX, "/proc/%d/exe", pid); +#elif defined(__FreeBSD__) + snprintf(path, PATH_MAX, "/proc/%d/file", pid); +#else +# error "Unknown platform" +#endif if (readlink(path, dest, PATH_MAX) == -1) { return io_result_mk_error("failed to locate application"); } else { diff --git a/src/runtime/stack_overflow.cpp b/src/runtime/stack_overflow.cpp index f1a81f0a00bd..9eead1fa36a0 100644 --- a/src/runtime/stack_overflow.cpp +++ b/src/runtime/stack_overflow.cpp @@ -20,6 +20,11 @@ Port of the corresponding Rust code (see links below). #include #include "runtime/stack_overflow.h" +#if defined(__FreeBSD__) +# include +# define pthread_getattr_np pthread_attr_get_np +#endif + namespace lean { // stack guard of the main thread static stack_guard * g_stack_guard; diff --git a/stage0/src/CMakeLists.txt b/stage0/src/CMakeLists.txt index 959588acc621..92930bb9218a 100644 --- a/stage0/src/CMakeLists.txt +++ b/stage0/src/CMakeLists.txt @@ -352,6 +352,11 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") string(APPEND LEANC_EXTRA_FLAGS " -fPIC") string(APPEND LEANSHARED_LINKER_FLAGS " -Wl,-rpath=\\$$ORIGIN/..:\\$$ORIGIN") string(APPEND CMAKE_EXE_LINKER_FLAGS " -lleanshared -Wl,-rpath=\\\$ORIGIN/../lib:\\\$ORIGIN/../lib/lean") +elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + string(APPEND CMAKE_CXX_FLAGS " -fPIC -ftls-model=initial-exec") + string(APPEND LEANC_EXTRA_FLAGS " -fPIC") + string(APPEND LEANSHARED_LINKER_FLAGS " -Wl,-rpath=\\$$ORIGIN/..:\\$$ORIGIN") + string(APPEND CMAKE_EXE_LINKER_FLAGS " -lleanshared -Wl,-rpath=\\\$ORIGIN/../lib:\\\$ORIGIN/../lib/lean") elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") string(APPEND CMAKE_CXX_FLAGS " -ftls-model=initial-exec") string(APPEND LEANSHARED_LINKER_FLAGS " -install_name @rpath/libleanshared.dylib") diff --git a/stage0/src/runtime/io.cpp b/stage0/src/runtime/io.cpp index 47c99e9b6cd4..5bc17bc0878a 100644 --- a/stage0/src/runtime/io.cpp +++ b/stage0/src/runtime/io.cpp @@ -855,7 +855,13 @@ extern "C" LEAN_EXPORT obj_res lean_io_app_path(obj_arg) { char dest[PATH_MAX]; memset(dest, 0, PATH_MAX); pid_t pid = getpid(); +#if defined(__linux__) snprintf(path, PATH_MAX, "/proc/%d/exe", pid); +#elif defined(__FreeBSD__) + snprintf(path, PATH_MAX, "/proc/%d/file", pid); +#else +# error "Unknown platform" +#endif if (readlink(path, dest, PATH_MAX) == -1) { return io_result_mk_error("failed to locate application"); } else { diff --git a/stage0/src/runtime/stack_overflow.cpp b/stage0/src/runtime/stack_overflow.cpp index f1a81f0a00bd..21d27fa3272e 100644 --- a/stage0/src/runtime/stack_overflow.cpp +++ b/stage0/src/runtime/stack_overflow.cpp @@ -7,6 +7,12 @@ Author: Sebastian Ullrich Print a nicer error message on stack overflow. Port of the corresponding Rust code (see links below). */ + +#if defined(__FreeBSD__) +# include +# define pthread_getattr_np pthread_attr_get_np +#endif + #ifdef LEAN_WINDOWS #include #else