From be68eec712437089c9147ba485cadf5c2daec250 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Sat, 16 Sep 2017 12:25:48 +0200 Subject: Add minimal Haiku support; based on Adrien's patch. diff --git a/configure.py b/configure.py index a443748..42489e7 100755 --- a/configure.py +++ b/configure.py @@ -56,6 +56,8 @@ class Platform(object): self._platform = 'msvc' elif self._platform.startswith('bitrig'): self._platform = 'bitrig' + elif self._platform.startswith('haiku'): + self._platform = 'haiku' elif self._platform.startswith('netbsd'): self._platform = 'netbsd' elif self._platform.startswith('aix'): @@ -67,7 +69,7 @@ class Platform(object): def known_platforms(): return ['linux', 'darwin', 'freebsd', 'openbsd', 'solaris', 'sunos5', 'mingw', 'msvc', 'gnukfreebsd', 'bitrig', 'netbsd', 'aix', - 'dragonfly'] + 'dragonfly', 'haiku'] def platform(self): return self._platform @@ -94,6 +96,9 @@ class Platform(object): def is_solaris(self): return self._platform == 'solaris' + def is_haiku(self): + return self._platform == 'is_haiku' + def is_aix(self): return self._platform == 'aix' @@ -458,11 +463,7 @@ if platform.supports_ninja_browse(): n.comment('the depfile parser and ninja lexers are generated using re2c.') def has_re2c(): - try: - proc = subprocess.Popen(['re2c', '-V'], stdout=subprocess.PIPE) - return int(proc.communicate()[0], 10) >= 1103 - except OSError: - return False + return False if has_re2c(): n.rule('re2c', command='re2c -b -i --no-generation-date -o $out $in', diff --git a/src/util.cc b/src/util.cc index ae94d34..8af4b86 100644 --- a/src/util.cc +++ b/src/util.cc @@ -480,7 +480,7 @@ int GetProcessorCount() { #endif } -#if defined(_WIN32) || defined(__CYGWIN__) +#if defined(_WIN32) || defined(__CYGWIN__) || defined(__HAIKU__) static double CalculateProcessorLoad(uint64_t idle_ticks, uint64_t total_ticks) { static uint64_t previous_idle_ticks = 0; -- 2.14.2 From f8d8e1ca23dd5162f3b1cda42a574fc4b8ac0712 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sat, 16 Sep 2017 12:27:48 +0200 Subject: Add include of sys/select.h to get FD_* definitions. Apparently these are pulled in by one of the already present headers on other platforms. A cursory look at the POSIX specs did not reveal a requirement to expose these types with the given headers though. diff --git a/src/subprocess-posix.cc b/src/subprocess-posix.cc index 1de22c3..f77c559 100644 --- a/src/subprocess-posix.cc +++ b/src/subprocess-posix.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include #include -- 2.14.2 From 28928297b7ee4e90ef9addb596149a0f9c2211c1 Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Sat, 16 Sep 2017 12:48:42 +0200 Subject: GetLoadAvg to be implemented for Haiku diff --git a/src/util.cc b/src/util.cc index 8af4b86..1de47b8 100644 --- a/src/util.cc +++ b/src/util.cc @@ -480,7 +480,7 @@ int GetProcessorCount() { #endif } -#if defined(_WIN32) || defined(__CYGWIN__) || defined(__HAIKU__) +#if defined(_WIN32) || defined(__CYGWIN__) static double CalculateProcessorLoad(uint64_t idle_ticks, uint64_t total_ticks) { static uint64_t previous_idle_ticks = 0; @@ -563,6 +563,10 @@ double GetLoadAverage() { return -0.0f; return 1.0 / (1 << SI_LOAD_SHIFT) * si.loads[0]; } +#elif defined(__HAIKU__) +double GetLoadAverage() { + return -0.0f; +} #else double GetLoadAverage() { double loadavg[3] = { 0.0f, 0.0f, 0.0f }; -- 2.14.2 From b19f7582445dd8f5ab550844bcbbace751776589 Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Tue, 31 Oct 2017 21:37:20 +0100 Subject: posix_spawn_* calls don't set errno. diff --git a/src/subprocess-posix.cc b/src/subprocess-posix.cc index f77c559..5b34a36 100644 --- a/src/subprocess-posix.cc +++ b/src/subprocess-posix.cc @@ -55,21 +55,25 @@ bool Subprocess::Start(SubprocessSet* set, const string& command) { SetCloseOnExec(fd_); posix_spawn_file_actions_t action; - if (posix_spawn_file_actions_init(&action) != 0) - Fatal("posix_spawn_file_actions_init: %s", strerror(errno)); + int err = posix_spawn_file_actions_init(&action); + if (err != 0) + Fatal("posix_spawn_file_actions_init: %s", strerror(err)); - if (posix_spawn_file_actions_addclose(&action, output_pipe[0]) != 0) - Fatal("posix_spawn_file_actions_addclose: %s", strerror(errno)); + err = posix_spawn_file_actions_addclose(&action, output_pipe[0]); + if (err != 0) + Fatal("posix_spawn_file_actions_addclose: %s", strerror(err)); posix_spawnattr_t attr; - if (posix_spawnattr_init(&attr) != 0) - Fatal("posix_spawnattr_init: %s", strerror(errno)); + err = posix_spawnattr_init(&attr); + if (err != 0) + Fatal("posix_spawnattr_init: %s", strerror(err)); short flags = 0; flags |= POSIX_SPAWN_SETSIGMASK; - if (posix_spawnattr_setsigmask(&attr, &set->old_mask_) != 0) - Fatal("posix_spawnattr_setsigmask: %s", strerror(errno)); + err = posix_spawnattr_setsigmask(&attr, &set->old_mask_); + if (err != 0) + Fatal("posix_spawnattr_setsigmask: %s", strerror(err)); // Signals which are set to be caught in the calling process image are set to // default action in the new process image, so no explicit // POSIX_SPAWN_SETSIGDEF parameter is needed. @@ -80,17 +84,21 @@ bool Subprocess::Start(SubprocessSet* set, const string& command) { // No need to posix_spawnattr_setpgroup(&attr, 0), it's the default. // Open /dev/null over stdin. - if (posix_spawn_file_actions_addopen(&action, 0, "/dev/null", O_RDONLY, - 0) != 0) { - Fatal("posix_spawn_file_actions_addopen: %s", strerror(errno)); + err = posix_spawn_file_actions_addopen(&action, 0, "/dev/null", O_RDONLY, + 0); + if (err != 0) { + Fatal("posix_spawn_file_actions_addopen: %s", strerror(err)); } - if (posix_spawn_file_actions_adddup2(&action, output_pipe[1], 1) != 0) - Fatal("posix_spawn_file_actions_adddup2: %s", strerror(errno)); - if (posix_spawn_file_actions_adddup2(&action, output_pipe[1], 2) != 0) - Fatal("posix_spawn_file_actions_adddup2: %s", strerror(errno)); - if (posix_spawn_file_actions_addclose(&action, output_pipe[1]) != 0) - Fatal("posix_spawn_file_actions_addclose: %s", strerror(errno)); + err = posix_spawn_file_actions_adddup2(&action, output_pipe[1], 1); + if (err != 0) + Fatal("posix_spawn_file_actions_adddup2: %s", strerror(err)); + err = posix_spawn_file_actions_adddup2(&action, output_pipe[1], 2); + if (err != 0) + Fatal("posix_spawn_file_actions_adddup2: %s", strerror(err)); + err = posix_spawn_file_actions_addclose(&action, output_pipe[1]); + if (err != 0) + Fatal("posix_spawn_file_actions_addclose: %s", strerror(err)); // In the console case, output_pipe is still inherited by the child and // closed when the subprocess finishes, which then notifies ninja. } @@ -98,8 +106,9 @@ bool Subprocess::Start(SubprocessSet* set, const string& command) { flags |= POSIX_SPAWN_USEVFORK; #endif - if (posix_spawnattr_setflags(&attr, flags) != 0) - Fatal("posix_spawnattr_setflags: %s", strerror(errno)); + err = posix_spawnattr_setflags(&attr, flags); + if (err != 0) + Fatal("posix_spawnattr_setflags: %s", strerror(err)); const char* spawned_args[] = { "/bin/sh", "-c", command.c_str(), NULL }; if (posix_spawn(&pid_, "/bin/sh", &action, &attr, -- 2.14.2