mirror of
https://github.com/jarun/nnn.git
synced 2024-11-24 11:51:27 +00:00
MacOSX legacy (#1138)
* Branched v4.2 Added workaround for Mac OS X < 10.12.0 (Only tested on 10.11.6, lower versions may need more workaround) * Added *.dSYM to .gitignore * Added comments for the macosx detection in Makefile * Fixed indentation, formatting and missing newline at eof * Moved includes inside include guard Co-authored-by: elder-n00b <elder-n00b@yandex.com>
This commit is contained in:
parent
6c5eab5e55
commit
e4813f06c1
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
*.o
|
*.o
|
||||||
|
*.dSYM
|
||||||
nnn
|
nnn
|
||||||
|
|
17
Makefile
17
Makefile
|
@ -153,11 +153,26 @@ LOGO64X64 = misc/logo/logo-64x64.png
|
||||||
GITSTATUS = patches/gitstatus
|
GITSTATUS = patches/gitstatus
|
||||||
NAMEFIRST = patches/namefirst
|
NAMEFIRST = patches/namefirst
|
||||||
|
|
||||||
|
# test if we are on Mac OS X and get X.Y.Z OS version with system binary /usr/bin/sw_vers
|
||||||
|
MACOS_VERSION := $(strip $(shell command -v sw_vers >/dev/null && [ "`sw_vers -productName`" = "Mac OS X" ] && sw_vers -productVersion))
|
||||||
|
# if Mac OS X detected, test if its version is below 10.12.0 relying on "sort -c" returning "disorder" message if the input is not sorted
|
||||||
|
ifneq ($(MACOS_VERSION),)
|
||||||
|
MACOS_BELOW_1012 := $(if $(strip $(shell printf '10.12.0\n%s' "$(MACOS_VERSION)" | sort -ct. -k1,1n -k2,2n -k3,3n 2>&1)),1)
|
||||||
|
endif
|
||||||
|
# if Mac OS X version is below 10.12.0, compile in the replacement clock_gettime and define MACOS_BELOW_1012 so that it's included in nnn.c
|
||||||
|
ifneq ($(MACOS_BELOW_1012),)
|
||||||
|
GETTIME_C = misc/macos-legacy/mach_gettime.c
|
||||||
|
GETTIME_H = misc/macos-legacy/mach_gettime.h
|
||||||
|
SRC += $(GETTIME_C)
|
||||||
|
HEADERS += $(GETTIME_H)
|
||||||
|
CPPFLAGS += -DMACOS_BELOW_1012
|
||||||
|
endif
|
||||||
|
|
||||||
all: $(BIN)
|
all: $(BIN)
|
||||||
|
|
||||||
$(BIN): $(SRC) $(HEADERS)
|
$(BIN): $(SRC) $(HEADERS)
|
||||||
@$(MAKE) --silent prepatch
|
@$(MAKE) --silent prepatch
|
||||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LDLIBS)
|
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(GETTIME_C) $< $(LDLIBS)
|
||||||
@$(MAKE) --silent postpatch
|
@$(MAKE) --silent postpatch
|
||||||
|
|
||||||
# targets for backwards compatibility
|
# targets for backwards compatibility
|
||||||
|
|
42
misc/macos-legacy/mach_gettime.c
Normal file
42
misc/macos-legacy/mach_gettime.c
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#include "mach_gettime.h"
|
||||||
|
#include <mach/mach_time.h>
|
||||||
|
|
||||||
|
#define MT_NANO (+1.0E-9)
|
||||||
|
#define MT_GIGA UINT64_C(1000000000)
|
||||||
|
|
||||||
|
// TODO create a list of timers,
|
||||||
|
static double mt_timebase = 0.0;
|
||||||
|
static uint64_t mt_timestart = 0;
|
||||||
|
|
||||||
|
int clock_gettime(clockid_t clk_id, struct timespec *tp)
|
||||||
|
{
|
||||||
|
kern_return_t retval = KERN_SUCCESS;
|
||||||
|
|
||||||
|
if (clk_id == TIMER_ABSTIME) {
|
||||||
|
if (!mt_timestart) { // only one timer, initialized on the first call to the TIMER
|
||||||
|
mach_timebase_info_data_t tb;
|
||||||
|
mach_timebase_info(&tb);
|
||||||
|
mt_timebase = tb.numer;
|
||||||
|
mt_timebase /= tb.denom;
|
||||||
|
mt_timestart = mach_absolute_time();
|
||||||
|
}
|
||||||
|
|
||||||
|
double diff = (mach_absolute_time() - mt_timestart) * mt_timebase;
|
||||||
|
tp->tv_sec = diff * MT_NANO;
|
||||||
|
tp->tv_nsec = diff - (tp->tv_sec * MT_GIGA);
|
||||||
|
} else { // other clk_ids are mapped to the coresponding mach clock_service
|
||||||
|
clock_serv_t cclock;
|
||||||
|
mach_timespec_t mts;
|
||||||
|
|
||||||
|
host_get_clock_service(mach_host_self(), clk_id, &cclock);
|
||||||
|
retval = clock_get_time(cclock, &mts);
|
||||||
|
mach_port_deallocate(mach_task_self(), cclock);
|
||||||
|
|
||||||
|
tp->tv_sec = mts.tv_sec;
|
||||||
|
tp->tv_nsec = mts.tv_nsec;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copyright (c) 2015-2018 Alf Watt - Open Source - https://opensource.org/licenses/MIT */
|
28
misc/macos-legacy/mach_gettime.h
Normal file
28
misc/macos-legacy/mach_gettime.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef mach_time_h
|
||||||
|
#define mach_time_h
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/_types/_timespec.h>
|
||||||
|
#include <mach/mach.h>
|
||||||
|
#include <mach/clock.h>
|
||||||
|
|
||||||
|
/* The opengroup spec isn't clear on the mapping from REALTIME to CALENDAR
|
||||||
|
being appropriate or not.
|
||||||
|
http://pubs.opengroup.org/onlinepubs/009695299/basedefs/time.h.html */
|
||||||
|
|
||||||
|
// XXX only supports a single timer
|
||||||
|
#define TIMER_ABSTIME -1
|
||||||
|
#define CLOCK_REALTIME CALENDAR_CLOCK
|
||||||
|
#define CLOCK_MONOTONIC SYSTEM_CLOCK
|
||||||
|
|
||||||
|
typedef int clockid_t;
|
||||||
|
|
||||||
|
/* the mach kernel uses struct mach_timespec, so struct timespec
|
||||||
|
is loaded from <sys/_types/_timespec.h> for compatability */
|
||||||
|
// struct timespec { time_t tv_sec; long tv_nsec; };
|
||||||
|
|
||||||
|
int clock_gettime(clockid_t clk_id, struct timespec *tp);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Copyright (c) 2015-2018 Alf Watt - Open Source - https://opensource.org/licenses/MIT */
|
|
@ -108,6 +108,10 @@
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
|
|
||||||
|
#ifdef MACOS_BELOW_1012
|
||||||
|
#include "../misc/macos-legacy/mach_gettime.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(alloca) && defined(__GNUC__)
|
#if !defined(alloca) && defined(__GNUC__)
|
||||||
/*
|
/*
|
||||||
* GCC doesn't expand alloca() to __builtin_alloca() in standards mode
|
* GCC doesn't expand alloca() to __builtin_alloca() in standards mode
|
||||||
|
|
Loading…
Reference in a new issue