mirror of
https://github.com/mborgerding/kissfft.git
synced 2025-05-25 12:10:27 -04:00
189 lines
4.9 KiB
Makefile
189 lines
4.9 KiB
Makefile
#
|
|
# Warnings
|
|
#
|
|
|
|
WARNINGS = -W -Wall -Wstrict-prototypes -Wmissing-prototypes \
|
|
-Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad-function-cast \
|
|
-Wwrite-strings
|
|
|
|
#
|
|
# Compile-time definitions
|
|
#
|
|
|
|
CFLAGS = -O3 -I.. -I../tools $(WARNINGS)
|
|
CFLAGS += -ffast-math -fomit-frame-pointer
|
|
#CFLAGS += -funroll-loops
|
|
#CFLAGS += -march=prescott
|
|
#CFLAGS += -mtune=native
|
|
# TIP: try adding -openmp or -fopenmp to enable OPENMP directives and use of multiple cores
|
|
#CFLAGS += -fopenmp
|
|
CFLAGS += $(CFLAGADD)
|
|
|
|
CXXFLAGS = -O3 -ffast-math -fomit-frame-pointer -I.. -W -Wall -march=native -mtune=native
|
|
|
|
#
|
|
# Count of FFT runs tested
|
|
#
|
|
|
|
ifeq "$(NFFT)" ""
|
|
NFFT = 1800
|
|
endif
|
|
ifeq "$(NUMFFTS)" ""
|
|
NUMFFTS = 10000
|
|
endif
|
|
|
|
#
|
|
# Test binary executable names
|
|
#
|
|
|
|
SELFTESTSRC = twotonetest.c
|
|
|
|
ifneq ($(KISSFFT_OPENMP),1)
|
|
BENCHKISS = bm-kiss-$(KISSFFT_DATATYPE)
|
|
BENCHFFTW = bm-fftw-$(KISSFFT_DATATYPE)
|
|
SELFTEST = st-$(KISSFFT_DATATYPE)
|
|
TESTREAL = tr-$(KISSFFT_DATATYPE)
|
|
TESTKFC = tkfc-$(KISSFFT_DATATYPE)
|
|
TESTFASTFILT = fastfilt-$(KISSFFT_DATATYPE)
|
|
TESTCPP = testcpp-$(KISSFFT_DATATYPE)
|
|
TESTSIMD = testsimd
|
|
else
|
|
BENCHKISS = bm-kiss-$(KISSFFT_DATATYPE)-openmp
|
|
BENCHFFTW = bm-fftw-$(KISSFFT_DATATYPE)-openmp
|
|
SELFTEST = st-$(KISSFFT_DATATYPE)-openmp
|
|
TESTREAL = tr-$(KISSFFT_DATATYPE)-openmp
|
|
TESTKFC = tkfc-$(KISSFFT_DATATYPE)-openmp
|
|
TESTFASTFILT = fastfilt-$(KISSFFT_DATATYPE)-openmp
|
|
TESTCPP = testcpp-$(KISSFFT_DATATYPE)-openmp
|
|
TESTSIMD = testsimd-openmp
|
|
CFLAGS += -fopenmp
|
|
CXXFLAGS += -fopenmp
|
|
endif
|
|
|
|
ifeq "$(KISSFFT_DATATYPE)" "float"
|
|
# fftw needs to be built with --enable-float to build this lib
|
|
FFTWLIB = -lfftw3f
|
|
else
|
|
FFTWLIB = -lfftw3
|
|
endif
|
|
|
|
FFTWLIBDIR ?= $(ABS_LIBDIR)
|
|
ABS_FFTWLIBDIR = $(abspath $(FFTWLIBDIR))
|
|
|
|
#
|
|
# Check missing external libraries
|
|
#
|
|
|
|
ifneq ($(MAKECMDGOALS),clean)
|
|
LIBFFTW_MISSING = $(shell echo "int main(){return 0;}" > _test_library_dummy.c; \
|
|
$(CC) -o _test_library_dummy _test_library_dummy.c $(FFTWLIB) -L$(ABS_FFTWLIBDIR); \
|
|
echo $$?; \
|
|
rm -f _test_library_dummy.c _test_library_dummy)
|
|
endif
|
|
|
|
#
|
|
# Find Python interpreter
|
|
#
|
|
|
|
ifneq ($(MAKECMDGOALS),clean)
|
|
PYTHON_INTERPRETER = $(shell python --version)
|
|
ifeq ($(PYTHON_INTERPRETER), )
|
|
PYTHON_INTERPRETER = $(shell python2 --version)
|
|
ifeq ($(PYTHON_INTERPRETER), )
|
|
PYTHON_INTERPRETER = $(shell python3 --version)
|
|
ifeq ($(PYTHON_INTERPRETER), )
|
|
$(error ERROR: Can not find Python interpreter!)
|
|
else
|
|
PYTHON_INTERPRETER = "python3"
|
|
endif
|
|
else
|
|
PYTHON_INTERPRETER = "python2"
|
|
endif
|
|
else
|
|
PYTHON_INTERPRETER = "python"
|
|
endif
|
|
endif
|
|
|
|
#
|
|
# Target: "make all"
|
|
#
|
|
|
|
all: $(BENCHKISS) $(SELFTEST) $(BENCHFFTW) $(TESTREAL) $(TESTKFC) $(TESTFASTFILT)
|
|
|
|
#
|
|
# Individual test make rules
|
|
#
|
|
|
|
$(SELFTEST): $(SELFTESTSRC)
|
|
$(CC) -o $@ $(CFLAGS) $(TYPEFLAGS) $< -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
|
|
|
$(TESTKFC): ../kfc.c
|
|
$(CC) -o $@ $(CFLAGS) -DKFC_TEST $(TYPEFLAGS) $^ -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
|
|
|
$(TESTREAL): test_real.c
|
|
$(CC) -o $@ $(CFLAGS) $(TYPEFLAGS) $< -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
|
|
|
$(BENCHKISS): benchkiss.c pstats.c
|
|
$(CC) -o $@ $(CFLAGS) $(TYPEFLAGS) $^ -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
|
|
|
$(TESTFASTFILT): ../tools/fftutil.c
|
|
$(CC) -o $@ $(CFLAGS) -DKFC_TEST $(TYPEFLAGS) $^ -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
|
|
|
$(BENCHFFTW): benchfftw.c pstats.c
|
|
$(warning ======attempting to build FFTW benchmark)
|
|
ifeq ($(LIBFFTW_MISSING), 0)
|
|
$(CC) -o $@ $(CFLAGS) -DDATATYPE$(KISSFFT_DATATYPE) $^ $(FFTWLIB) -L$(ABS_FFTWLIBDIR) -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
|
else
|
|
$(warning WARNING: No FFTW development files found! FFTW not available for comparison!)
|
|
endif
|
|
|
|
#
|
|
# Test SSE
|
|
#
|
|
|
|
$(TESTSIMD): test_simd.c
|
|
ifeq "$(KISSFFT_DATATYPE)" "simd"
|
|
$(CC) -o $@ -g $(CFLAGS) -DUSE_SIMD=1 -msse $< -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
|
else
|
|
$(error ERROR: This test makes sense only with KISSFFT_DATATYPE=simd)
|
|
endif
|
|
|
|
testsse: $(TESTSIMD)
|
|
LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):.." ./$(TESTSIMD)
|
|
|
|
#
|
|
# Test C++
|
|
#
|
|
|
|
$(TESTCPP): testcpp.cc ../kissfft.hh
|
|
$(CXX) -o $@ $(CXXFLAGS) testcpp.cc -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
|
|
|
|
testcpp: $(TESTCPP)
|
|
LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):.." ./$(TESTCPP)
|
|
|
|
#
|
|
# Target: "make test"
|
|
#
|
|
|
|
test: all
|
|
ifeq "$(KISSFFT_DATATYPE)" "simd"
|
|
$(MAKE) testsse
|
|
endif
|
|
@LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):.." ./$(TESTKFC)
|
|
$(warning ======1d & 2-d complex fft self test (type= $(KISSFFT_DATATYPE) ))
|
|
@LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):.." ./$(SELFTEST)
|
|
$(warning ======real FFT (type= $(KISSFFT_DATATYPE) ))
|
|
@LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):.." ./$(TESTREAL)
|
|
$(warning ======timing test (type=$(KISSFFT_DATATYPE)))
|
|
@LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):.." ./$(BENCHKISS) -x $(NUMFFTS) -n $(NFFT)
|
|
@[ -x ./$(BENCHFFTW) ] && LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):.." ./$(BENCHFFTW) -x $(NUMFFTS) -n $(NFFT) || true
|
|
$(warning ======higher dimensions (type=$(KISSFFT_DATATYPE)))
|
|
@LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):.." $(PYTHON_INTERPRETER) ./testkiss.py
|
|
|
|
#
|
|
# Target: "make clean"
|
|
#
|
|
|
|
clean:
|
|
rm -f *~ bm-* st-* tr-* kf-* tkfc-* ff-* fastfilt-* *.pyc *.pyo *.dat testcpp-* testsimd testsimd-* _test_library_dummy _test_library_dummy.c
|