btstack/3rd-party/kissfft/Makefile
2022-02-23 18:17:21 +01:00

324 lines
8.4 KiB
Makefile

#
# Semantic versioning
#
# KFVER_MAJOR denotes the ABI version.
#
# - It must be bumped only if API public members are removed or
# changed in the incompatible
#
# KFVER_MINOR denotes the minor version within a compatible ABI.
#
# - It should be bumped if new API public members are added
# (but not removed!) so programs linked against the same library
# version continue operating properly
#
# KFVER_PATCH denotes bugfix count since the last minor update.
#
# - It should be bumped whenever a bug fix is pushed.
#
export KFVER_MAJOR = 131
export KFVER_MINOR = 1
export KFVER_PATCH = 0
#
# Data type (float / int16_t / int32_t / simd)
#
export KISSFFT_DATATYPE ?= float
#
# Default options
#
export KISSFFT_OPENMP ?= 0
export KISSFFT_STATIC ?= 0
export KISSFFT_TOOLS ?= 1
export KISSFFT_USE_ALLOCA ?= 0
#
# Installation directories
#
PREFIX ?= /usr/local
export ABS_PREFIX = $(abspath $(PREFIX))
BINDIR ?= $(ABS_PREFIX)/bin
export ABS_BINDIR = $(abspath $(BINDIR))
INCLUDEDIR ?= $(ABS_PREFIX)/include
export ABS_INCLUDEDIR = $(abspath $(INCLUDEDIR))
export ABS_PKGINCLUDEDIR = $(ABS_INCLUDEDIR)/kissfft
#
# Override LIBDIR with lib64 following CMake's
# GNUInstallDirs logic:
#
CANDIDATE_LIBDIR_NAME = lib
ifneq ($(MAKECMDGOALS),clean)
ifeq ($(shell uname -s),Linux)
_UNAME_ARCH = $(shell uname -i)
ifeq (,$(_UNAME_ARCH))
_UNAME_ARCH = $(shell uname -m)
ifeq (,$(_UNAME_ARCH))
$(warning WARNING: Can not detect system architecture!)
endif
endif
ifeq ($(_UNAME_ARCH),x86_64)
CANDIDATE_LIBDIR_NAME = lib64
endif
endif
endif
CANDIDATE_LIBDIR = $(PREFIX)/$(CANDIDATE_LIBDIR_NAME)
LIBDIR ?= $(CANDIDATE_LIBDIR)
export ABS_LIBDIR = $(abspath $(LIBDIR))
export INSTALL ?= install
#
# Library name and version
#
ifeq ($(KISSFFT_OPENMP), 1)
KISSFFTLIB_SHORTNAME = kissfft-$(KISSFFT_DATATYPE)-openmp
KISSFFT_PKGCONFIG = kissfft-$(KISSFFT_DATATYPE)-openmp.pc
KISSFFTLIB_FLAGS = -fopenmp
TYPEFLAGS = -fopenmp
PKGCONFIG_OPENMP = -fopenmp
else
KISSFFTLIB_SHORTNAME = kissfft-$(KISSFFT_DATATYPE)
KISSFFT_PKGCONFIG = kissfft-$(KISSFFT_DATATYPE).pc
TYPEFLAGS =
PKGCONFIG_OPENMP =
endif
ifeq ($(KISSFFT_STATIC), 1)
KISSFFTLIB_NAME = lib$(KISSFFTLIB_SHORTNAME).a
KISSFFTLIB_FLAGS += -static
else ifeq ($(shell uname -s),Darwin)
KISSFFTLIB_NAME = lib$(KISSFFTLIB_SHORTNAME).dylib
KISSFFTLIB_FLAGS += -shared -Wl,-install_name,$(KISSFFTLIB_NAME)
else
KISSFFTLIB_SODEVELNAME = lib$(KISSFFTLIB_SHORTNAME).so
KISSFFTLIB_SONAME = $(KISSFFTLIB_SODEVELNAME).$(KFVER_MAJOR)
KISSFFTLIB_NAME = $(KISSFFTLIB_SONAME).$(KFVER_MINOR).$(KFVER_PATCH)
KISSFFTLIB_FLAGS += -shared -Wl,-soname,$(KISSFFTLIB_SONAME)
endif
export KISSFFTLIB_SHORTNAME
#
# Compile-time definitions by datatype
#
#
# Note: -DKISS_FFT_BUILD and -DKISS_FFT_SHARED control
# C symbol visibility.
#
ifeq "$(KISSFFT_DATATYPE)" "int32_t"
TYPEFLAGS += -DFIXED_POINT=32
else ifeq "$(KISSFFT_DATATYPE)" "int16_t"
TYPEFLAGS += -DFIXED_POINT=16
else ifeq "$(KISSFFT_DATATYPE)" "simd"
TYPEFLAGS += -DUSE_SIMD=1 -msse
else ifeq "$(KISSFFT_DATATYPE)" "float"
TYPEFLAGS += -Dkiss_fft_scalar=$(KISSFFT_DATATYPE)
else ifeq "$(KISSFFT_DATATYPE)" "double"
TYPEFLAGS += -Dkiss_fft_scalar=$(KISSFFT_DATATYPE)
else
$(error ERROR: KISSFFT_DATATYPE must be one of: float double int16_t int32_t simd)
endif
ifneq ($(KISSFFT_STATIC), 1)
TYPEFLAGS += -DKISS_FFT_SHARED
endif
ifeq ($(KISSFFT_USE_ALLOCA), 1)
TYPEFLAGS += -DKISS_FFT_USE_ALLOCA=1
endif
#
# Compile-time definitions
#
#
# Save pkgconfig variables before appending
# -DKISS_FFT_BUILD to TYPEFLAGS
#
ifneq ($(shell uname -s),Darwin)
PKGCONFIG_KISSFFT_VERSION = $(KFVER_MAJOR).$(KFVER_MINOR).$(KFVER_PATCH)
PKGCONFIG_KISSFFT_OUTPUT_NAME = $(KISSFFTLIB_SHORTNAME)
PKGCONFIG_PKG_KISSFFT_DEFS = $(TYPEFLAGS)
PKGCONFIG_KISSFFT_PREFIX = $(ABS_PREFIX)
ifeq ($(ABS_INCLUDEDIR),$(ABS_PREFIX)/include)
PKGCONFIG_KISSFFT_INCLUDEDIR = $${prefix}/include
else
PKGCONFIG_KISSFFT_INCLUDEDIR = $(ABS_INCLUDEDIR)
endif
ifeq ($(ABS_LIBDIR),$(ABS_PREFIX)/$(CANDIDATE_LIBDIR_NAME))
PKGCONFIG_KISSFFT_LIBDIR = $${prefix}/$(CANDIDATE_LIBDIR_NAME)
else
PKGCONFIG_KISSFFT_LIBDIR = $(ABS_LIBDIR)
endif
PKGCONFIG_KISSFFT_PKGINCLUDEDIR = $${includedir}/kissfft
endif
export TYPEFLAGS
# Compile .c into .o
#
#
# -DKISS_FFT_BUILD is used for library artifacts, so
# consumer executable in 'test' and 'tools' do _NOT_
# need it. pkg-config output does not need it either.
#
%.c.o: %.c
$(CC) -Wall -fPIC \
-o $@ \
$(CFLAGS) $(TYPEFLAGS) -DKISS_FFT_BUILD \
-c $<
#
# Target: "make all"
#
all: kfc.c.o kiss_fft.c.o kiss_fftnd.c.o kiss_fftndr.c.o kiss_fftr.c.o
ifneq ($(KISSFFT_STATIC), 1)
$(CC) $(KISSFFTLIB_FLAGS) -o $(KISSFFTLIB_NAME) $^
ifneq ($(shell uname -s),Darwin)
ln -sf $(KISSFFTLIB_NAME) $(KISSFFTLIB_SONAME)
ln -sf $(KISSFFTLIB_NAME) $(KISSFFTLIB_SODEVELNAME)
endif
else
$(AR) crus $(KISSFFTLIB_NAME) $^
endif
ifneq ($(KISSFFT_TOOLS), 0)
make -C tools CFLAGADD="$(CFLAGADD)" all
endif
#
# Target: "make install"
#
install: all
$(INSTALL) -Dt $(ABS_PKGINCLUDEDIR) -m 644 \
kiss_fft.h \
kissfft.hh \
kiss_fftnd.h \
kiss_fftndr.h \
kiss_fftr.h
$(INSTALL) -Dt $(ABS_LIBDIR) -m 644 $(KISSFFTLIB_NAME)
ifneq ($(KISSFFT_STATIC), 1)
ifneq ($(shell uname -s),Darwin)
cd $(LIBDIR) && \
ln -sf $(KISSFFTLIB_NAME) $(KISSFFTLIB_SONAME) && \
ln -sf $(KISSFFTLIB_NAME) $(KISSFFTLIB_SODEVELNAME)
endif
endif
ifneq ($(shell uname -s),Darwin)
mkdir "$(ABS_LIBDIR)/pkgconfig"
sed \
-e 's+@PKGCONFIG_KISSFFT_VERSION@+$(PKGCONFIG_KISSFFT_VERSION)+' \
-e 's+@KISSFFT_OUTPUT_NAME@+$(PKGCONFIG_KISSFFT_OUTPUT_NAME)+' \
-e 's+@PKG_KISSFFT_DEFS@+$(PKGCONFIG_PKG_KISSFFT_DEFS)+' \
-e 's+@PKG_OPENMP@+$(PKGCONFIG_OPENMP)+' \
-e 's+@PKGCONFIG_KISSFFT_PREFIX@+$(PKGCONFIG_KISSFFT_PREFIX)+' \
-e 's+@PKGCONFIG_KISSFFT_INCLUDEDIR@+$(PKGCONFIG_KISSFFT_INCLUDEDIR)+' \
-e 's+@PKGCONFIG_KISSFFT_LIBDIR@+$(PKGCONFIG_KISSFFT_LIBDIR)+' \
-e 's+@PKGCONFIG_KISSFFT_PKGINCLUDEDIR@+$(PKGCONFIG_KISSFFT_PKGINCLUDEDIR)+' \
kissfft.pc.in 1>"$(ABS_LIBDIR)/pkgconfig/$(KISSFFT_PKGCONFIG)"
endif
ifneq ($(KISSFFT_TOOLS), 0)
make -C tools install
endif
#
# Target: "make doc"
#
doc:
$(warning Start by reading the README file. If you want to build and test lots of stuff, do a 'make testall')
$(warning but be aware that 'make testall' has dependencies that the basic kissfft software does not.)
$(warning It is generally unneeded to run these tests yourself, unless you plan on changing the inner workings)
$(warning of kissfft and would like to make use of its regression tests.)
#
# Target: "make testsingle"
#
testsingle:
make clean
make all
make -C test CFLAGADD="$(CFLAGADD)" test testcpp
#
# Target: "make testall"
#
testall:
# Shared libraries
make KISSFFT_DATATYPE=double testsingle
make KISSFFT_DATATYPE=float testsingle
make KISSFFT_DATATYPE=int16_t testsingle
# The simd and int32_t types may or may not work on your machine
make KISSFFT_DATATYPE=int32_t testsingle
make KISSFFT_DATATYPE=simd testsingle
# Static libraries
make KISSFFT_DATATYPE=double KISSFFT_STATIC=1 testsingle
make KISSFFT_DATATYPE=float KISSFFT_STATIC=1 testsingle
make KISSFFT_DATATYPE=int16_t KISSFFT_STATIC=1 testsingle
# The simd and int32_t types may or may not work on your machine
make KISSFFT_DATATYPE=int32_t KISSFFT_STATIC=1 testsingle
make KISSFFT_DATATYPE=simd KISSFFT_STATIC=1 testsingle
# OpenMP libraries
make KISSFFT_DATATYPE=double KISSFFT_OPENMP=1 testsingle
make KISSFFT_DATATYPE=float KISSFFT_OPENMP=1 testsingle
make KISSFFT_DATATYPE=int16_t KISSFFT_OPENMP=1 testsingle
# The simd and int32_t types may or may not work on your machine
make KISSFFT_DATATYPE=int32_t KISSFFT_OPENMP=1 testsingle
make KISSFFT_DATATYPE=simd KISSFFT_OPENMP=1 testsingle
$(warning All tests passed!)
#
# Target: "make tarball"
#
tarball: clean
git archive --prefix=kissfft/ -o kissfft$(KFVER).tar.gz v$(KFVER)
git archive --prefix=kissfft/ -o kissfft$(KFVER).zip v$(KFVER)
#
# Target: "make clean"
#
clean:
rm -f *.o *.a *.so *.so.*
cd test && make clean
cd tools && make clean
rm -f kiss_fft*.tar.gz *~ *.pyc kiss_fft*.zip
#
# Target: "make asm"
#
asm: kiss_fft.s
# TODO: Sort out if we should add kfc / other C headers
kiss_fft.s: kiss_fft.c kiss_fft.h _kiss_fft_guts.h
[ -e kiss_fft.s ] && mv kiss_fft.s kiss_fft.s~ || true
$(CC) -S kiss_fft.c -O3 -mtune=native -ffast-math -fomit-frame-pointer -unroll-loops -dA -fverbose-asm
$(CC) -o kiss_fft_short.s -S kiss_fft.c -O3 -mtune=native -ffast-math -fomit-frame-pointer -dA -fverbose-asm -DFIXED_POINT
[ -e kiss_fft.s~ ] && diff kiss_fft.s~ kiss_fft.s || true