mirror of
https://github.com/wolfcw/libfaketime.git
synced 2026-05-17 00:26:16 +03:00
221 lines
7.7 KiB
Makefile
221 lines
7.7 KiB
Makefile
#
|
|
# Notes:
|
|
#
|
|
# * Compilation Defines that are set by default:
|
|
#
|
|
# FAKE_STAT
|
|
# - Enables time faking when reading files' timestamps.
|
|
#
|
|
# FAKE_SLEEP
|
|
# - Also intercept sleep(), nanosleep(), usleep(), alarm(), [p]poll()
|
|
#
|
|
# FAKE_TIMERS
|
|
# - Also intercept timer_settime() and timer_gettime()
|
|
#
|
|
# FAKE_PTHREAD
|
|
# - Intercept pthread_cond_timedwait
|
|
#
|
|
# FAKE_INTERNAL_CALLS
|
|
# - Also intercept libc internal __functions, e.g. not just time(),
|
|
# but also __time(). Enhances compatibility with applications
|
|
# that make use of low-level system calls, such as Java Virtual
|
|
# Machines.
|
|
#
|
|
# PTHREAD_SINGLETHREADED_TIME (only set in libfaketimeMT.so)
|
|
# - Define this if you want to single-thread time() ... there ARE
|
|
# possible caching side-effects in a multithreaded environment
|
|
# without this, but the performance impact may require you to
|
|
# try it unsynchronized.
|
|
#
|
|
# * Compilation Defines that are unset by default:
|
|
#
|
|
# FAKE_FILE_TIMESTAMPS, FAKE_UTIME
|
|
# - Enables time faking for the utime* functions. If enabled via
|
|
# FAKE_FILE_TIMESTAMPS, the faking is opt-in at runtime using
|
|
# with the FAKE_UTIME environment variable. If enabled via
|
|
# FAKE_UTIME, the faking is opt-out at runtime.
|
|
#
|
|
# NO_ATFILE
|
|
# - Disables support for the fstatat() group of functions
|
|
#
|
|
# FAKE_SETTIME
|
|
# - Intercept clock_settime(), settimeofday(), and adjtime()
|
|
#
|
|
# FAKE_RANDOM
|
|
# - Intercept getrandom()
|
|
#
|
|
# FAKE_PID
|
|
# - Intercept getpid()
|
|
#
|
|
# INTERCEPT_SYSCALL
|
|
# - (On GNU/Linux only) intercept glibc's syscall() for known relevant syscalls.
|
|
# If enabled, this currently only works a few types of syscalls,
|
|
# including FUTEX (see below), clock_gettime, etc.
|
|
#
|
|
# - note that on unusual architectures, if INTERCEPT_SYSCALL is set, you may
|
|
# need to explicitly define variadic_promotion_t (e.g. by putting
|
|
# -Dvariadic_promotion_t=int into CFLAGS). See src/faketime_common.h for
|
|
# more info.
|
|
#
|
|
# INTERCEPT_FUTEX
|
|
# - (On GNU/Linux only) intercept glibc's syscall() for relevant FUTEX syscalls.
|
|
# If enabled, FUTEX syscalls will be intercepted and translated correspondingly.
|
|
# - when FUTEX_WAIT_BITSET (with absolute deadline) is set, the deadline will
|
|
# be adjusted based on the faketime.
|
|
# - when FUTEX_WAKE (with relative deadline) is set, the deadline will be
|
|
# adjusted based on the time rate alone.
|
|
# - for other FUTEX operations, no adjustment is made for now.
|
|
#
|
|
#
|
|
# FAKE_STATELESS
|
|
# - Remove support for any functionality that requires sharing state across
|
|
# threads of a process, or different processes. This decreases the risk of
|
|
# interference with a program's normal execution, at the cost of supporting
|
|
# fewer ways of specifying the time.
|
|
# Concretely, this currently:
|
|
# - disables PTHREAD_SINGLETHREADED_TIME, which can cause deadlocks in
|
|
# multithreaded programs that fork due to making clock_gettime not
|
|
# async-signal-safe
|
|
# - disables all shared-memory across processes
|
|
#
|
|
# FORCE_MONOTONIC_FIX
|
|
# - If the test program hangs forever on
|
|
# " pthread_cond_timedwait: CLOCK_MONOTONIC test
|
|
# (Intentionally sleeping 1 second...) "
|
|
# then add -DFORCE_MONOTONIC_FIX to CFLAGS and recompile.
|
|
# (This is a platform-specific issue we cannot handle at run-time.)
|
|
#
|
|
# MULTI_ARCH
|
|
# - If MULTI_ARCH is set, the faketime wrapper program will put a literal
|
|
# $LIB into the LD_PRELOAD environment variable it creates, which makes
|
|
# ld automatically choose the correct library version to use for the
|
|
# target binary. Use for Linux platforms with Multi-Arch support only!
|
|
#
|
|
# SILENT
|
|
# - avoid that the faketime wrapper complains when running within a
|
|
# libfaketime environment
|
|
#
|
|
# FAIL_PRE_INIT_CALLS
|
|
# - If the time is queried before the library was initialised, let the
|
|
# call fail instead of trying to initialise on-the-fly. This fixes /
|
|
# works around hangs that were seen with address sanitizer.
|
|
#
|
|
# * Compilation addition: second libMT target added for building the pthread-
|
|
# enabled library as a separate library
|
|
#
|
|
# * Compilation switch change: previous versions compiled using '-nostartfiles'
|
|
# This is no longer the case since there is a 'startup' constructor for the library
|
|
# which is used to activate the start-at times when specified. This also initializes
|
|
# the dynamic disabling of the FAKE_STAT calls.
|
|
#
|
|
# By default, libfaketime will be compiled for your system's default architecture.
|
|
# To build 32-bit libraries and binaries, add -m32 to CFLAGS and LDFLAGS.
|
|
#
|
|
# Change PREFIX to where you want libfaketime (libraries and wrapper binary) installed.
|
|
# LIBDIRNAME is relative to PREFIX. The default is to install into $PREFIX/lib/faketime,
|
|
# but you can set LIBDIRNAME to, e.g., /lib64 if you want to install it elsewhere.
|
|
# LIBDIRNAME has been introduced to support MultiLib systems. Please do not change the
|
|
# default value on MultiArch systems.
|
|
#
|
|
# For testing in the current directory without installation, try make PREFIX= LIBDIRNAME='.'
|
|
|
|
CC ?= gcc
|
|
INSTALL ?= install
|
|
|
|
PREFIX ?= /usr/local
|
|
LIBDIRNAME ?= /lib/faketime
|
|
PLATFORM ?=$(shell uname)
|
|
|
|
ifneq ($(filter android%,$(subst -, ,$(CC))),)
|
|
IS_ANDROID := true
|
|
endif
|
|
|
|
ifeq ($(shell $(CC) -dM -E - < /dev/null | grep -c "__ANDROID__"),1)
|
|
IS_ANDROID := true
|
|
endif
|
|
|
|
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang version"), 1)
|
|
COMPILER := clang
|
|
else
|
|
COMPILER := gcc
|
|
endif
|
|
export COMPILER
|
|
|
|
CFLAGS += -std=gnu99 -Wall -Wextra -Werror -DFAKE_PTHREAD -DFAKE_STAT -DFAKE_UTIME -DFAKE_SLEEP -DFAKE_TIMERS -DFAKE_INTERNAL_CALLS -fPIC -DPREFIX='"'$(PREFIX)'"' -DLIBDIRNAME='"'$(LIBDIRNAME)'"' $(FAKETIME_COMPILE_CFLAGS)
|
|
|
|
ifeq ($(COMPILER),clang)
|
|
CFLAGS += -Wno-tautological-pointer-compare
|
|
endif
|
|
|
|
ifeq ($(COMPILER),gcc)
|
|
CFLAGS += -Wno-nonnull-compare
|
|
endif
|
|
|
|
ifeq ($(PLATFORM),SunOS)
|
|
CFLAGS += -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
|
|
endif
|
|
|
|
ifdef IS_ANDROID
|
|
CFLAGS += -D__ANDROID__
|
|
endif
|
|
|
|
LIB_LDFLAGS += -shared
|
|
|
|
LDFLAGS += $(FAKETIME_LINK_FLAGS)
|
|
ifneq ($(PLATFORM),SunOS)
|
|
ifndef IS_ANDROID
|
|
LDFLAGS += -Wl,--version-script=libfaketime.map
|
|
endif
|
|
endif
|
|
|
|
ifdef IS_ANDROID
|
|
LDADD += -ldl -lm
|
|
BIN_LDFLAGS +=
|
|
else
|
|
LDADD += -ldl -lm -lrt -lpthread
|
|
BIN_LDFLAGS += -lrt -lpthread
|
|
endif
|
|
|
|
SRC = libfaketime.c
|
|
LIBS_OBJ = libfaketime.o libfaketimeMT.o
|
|
BINS = faketime
|
|
|
|
SONAME = 1
|
|
LIBS = libfaketime.so.${SONAME} libfaketimeMT.so.${SONAME}
|
|
|
|
all: ${LIBS} ${BINS}
|
|
|
|
libfaketimeMT.o: EXTRA_FLAGS := -DPTHREAD_SINGLETHREADED_TIME
|
|
|
|
ft_sem.o: ft_sem.c ft_sem.h
|
|
${CC} -o $@ -c ${CFLAGS} ${CPPFLAGS} $<
|
|
|
|
${LIBS_OBJ}: libfaketime.c ft_sem.h
|
|
${CC} -o $@ -c ${CFLAGS} ${CPPFLAGS} ${EXTRA_FLAGS} $<
|
|
|
|
%.so.${SONAME}: %.o ft_sem.o libfaketime.map
|
|
${CC} -o $@ -Wl,-soname,$@ ${LDFLAGS} ${LIB_LDFLAGS} $< ft_sem.o ${LDADD}
|
|
|
|
${BINS}: faketime.c ft_sem.o ft_sem.h
|
|
${CC} -o $@ ${CFLAGS} ${CPPFLAGS} ${EXTRA_FLAGS} $< ft_sem.o ${LDFLAGS} ${BIN_LDFLAGS}
|
|
|
|
clean:
|
|
@rm -f ${LIBS_OBJ} ${LIBS} ${BINS} ft_sem.o
|
|
|
|
distclean: clean
|
|
@echo
|
|
|
|
install: ${LIBS} ${BINS}
|
|
@echo
|
|
@echo "Copying the faketime libraries to ${DESTDIR}${PREFIX}${LIBDIRNAME} and the faketime wrapper script to ${DESTDIR}${PREFIX}/bin ..."
|
|
$(INSTALL) -dm0755 "${DESTDIR}${PREFIX}${LIBDIRNAME}/"
|
|
$(INSTALL) -m0644 ${LIBS} "${DESTDIR}${PREFIX}${LIBDIRNAME}/"
|
|
$(INSTALL) -Dm0755 faketime "${DESTDIR}${PREFIX}/bin/faketime"
|
|
|
|
uninstall:
|
|
for f in ${LIBS}; do rm -f "${DESTDIR}${PREFIX}${LIBDIRNAME}/$$f"; done
|
|
rmdir "${DESTDIR}${PREFIX}${LIBDIRNAME}"
|
|
rm -f "${DESTDIR}${PREFIX}/bin/faketime"
|
|
|
|
.PHONY: all clean distclean install uninstall
|