mirror of
https://github.com/ohwgiles/laminar.git
synced 2026-03-02 03:40:21 +00:00
Support Clang/LLVM build on FBSD
- Update CMakeList to support installation to PREFIX directory - FreeBSD does not support abstract sockets (unix-abstract:laminar), so explicit 'LAMINAR_BIND_RPC=IP:port' is required - ld.lld requires explicit emulation for binary blobs, add a new variable LINKER_EMULATION_FLAGS for this purpose
This commit is contained in:
committed by
Oliver Giles
parent
97b9f6b1ae
commit
277a59f1cb
@@ -21,7 +21,11 @@
|
||||
#include <unistd.h>
|
||||
#include <queue>
|
||||
#include <dirent.h>
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/procctl.h>
|
||||
#else
|
||||
#include <sys/prctl.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <kj/async-io.h>
|
||||
@@ -317,7 +321,11 @@ int leader_main(void) {
|
||||
// will be reparented to this one instead of init (or higher layer subreaper).
|
||||
// We do this so that the run will wait until all descedents exit before executing
|
||||
// the next step.
|
||||
#if defined(__FreeBSD__)
|
||||
procctl(P_PID, 0, PROC_REAP_ACQUIRE, NULL);
|
||||
#else
|
||||
prctl(PR_SET_CHILD_SUBREAPER, 1, NULL, NULL, NULL);
|
||||
#endif
|
||||
|
||||
// Become the leader of a new process group. This is so that all child processes
|
||||
// will also get a kill signal when the run is aborted
|
||||
|
||||
19
src/run.cpp
19
src/run.cpp
@@ -21,10 +21,16 @@
|
||||
#include "conf.h"
|
||||
#include "log.h"
|
||||
|
||||
#include <sys/wait.h>
|
||||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/limits.h>
|
||||
#endif
|
||||
|
||||
// short syntax helper for kj::Path
|
||||
template<typename T>
|
||||
inline kj::Path operator/(const kj::Path& p, const T& ext) {
|
||||
@@ -153,7 +159,20 @@ kj::Promise<RunState> Run::start(RunState lastResult, std::shared_ptr<Context> c
|
||||
// main() by calling leader_main()
|
||||
char* procName;
|
||||
if(asprintf(&procName, "{laminar} %s:%d", name.data(), build) > 0)
|
||||
#if defined(__FreeBSD__)
|
||||
{
|
||||
int sysctl_rq[] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
|
||||
size_t self_exe_len = PATH_MAX;
|
||||
char self_exe[PATH_MAX];
|
||||
|
||||
if (sysctl(sysctl_rq, 4, self_exe, &self_exe_len, NULL, 0))
|
||||
_exit(EXIT_FAILURE);
|
||||
|
||||
execl(self_exe, procName, NULL); // does not return
|
||||
}
|
||||
#else
|
||||
execl("/proc/self/exe", procName, NULL); // does not return
|
||||
#endif
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,9 +28,8 @@
|
||||
|
||||
#include <signal.h>
|
||||
#include <sys/eventfd.h>
|
||||
#include <sys/inotify.h>
|
||||
#include <sys/signalfd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/inotify.h>
|
||||
|
||||
// Size of buffer used to read from file descriptors. Should be
|
||||
// a multiple of sizeof(struct signalfd_siginfo) == 128
|
||||
|
||||
Reference in New Issue
Block a user