Auto-download FFTW source for Android build

Makefile.android now downloads fftw-3.3.11.tar.gz automatically instead
of requiring the user to place sources in third_party/fftw/ manually.
The FFTW_SRC variable can still be overridden to use an existing copy.
Added distclean target. Updated README accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Uladzimir Karpenka 2026-06-02 12:15:59 +03:00
parent 5bbf9698a8
commit 02926b36ce
2 changed files with 33 additions and 28 deletions

View File

@ -5,9 +5,8 @@
# Optional overrides: # Optional overrides:
# ANDROID_NDK=/path/to/ndk ANDROID_API=24 ANDROID_ABIS="arm64-v8a x86_64" # ANDROID_NDK=/path/to/ndk ANDROID_API=24 ANDROID_ABIS="arm64-v8a x86_64"
# #
# Requires FFTW source in third_party/fftw/ # FFTW source is downloaded and extracted automatically.
# Download from https://www.fftw.org/download.html and extract so that # Override FFTW_SRC to use an existing directory.
# third_party/fftw/configure exists.
ANDROID_NDK ?= /home/vladimir/Android/Sdk/ndk/29.0.14206865 ANDROID_NDK ?= /home/vladimir/Android/Sdk/ndk/29.0.14206865
ANDROID_API ?= 24 ANDROID_API ?= 24
@ -24,7 +23,10 @@ COMMON_CPPFLAGS ?= -I. -I third_party/rnnoise/include -I third_party/libspecblea
ANDROID_JNI_CFLAGS ?= -std=gnu89 -Wno-implicit-function-declaration -Wno-int-conversion \ ANDROID_JNI_CFLAGS ?= -std=gnu89 -Wno-implicit-function-declaration -Wno-int-conversion \
-Wno-incompatible-pointer-types -Wno-incompatible-pointer-types-discards-qualifiers -Wno-incompatible-pointer-types -Wno-incompatible-pointer-types-discards-qualifiers
FFTW_SRC ?= third_party/fftw FFTW_VERSION := 3.3.11
FFTW_TAR := fftw-$(FFTW_VERSION).tar.gz
FFTW_URL := https://fftw.org/pub/fftw/$(FFTW_TAR)
FFTW_SRC ?= third_party/fftw-$(FFTW_VERSION)
FFTW_MAKEJOBS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) FFTW_MAKEJOBS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
WDSP_SOURCES = amd.c \ WDSP_SOURCES = amd.c \
@ -148,9 +150,9 @@ ANDROID_OBJ_ROOT := obj/android
ANDROID_LIB_ROOT := lib/android ANDROID_LIB_ROOT := lib/android
ANDROID_JAVA_OUT := lib/android/java ANDROID_JAVA_OUT := lib/android/java
.PHONY: all clean java-classes check-fftw-src .PHONY: all clean distclean java-classes
all: check-fftw-src \ all: $(FFTW_SRC)/configure \
$(foreach abi,$(ANDROID_ABIS),\ $(foreach abi,$(ANDROID_ABIS),\
$(ANDROID_LIB_ROOT)/$(abi)/libfftw3.so \ $(ANDROID_LIB_ROOT)/$(abi)/libfftw3.so \
$(ANDROID_LIB_ROOT)/$(abi)/libfftw3f.so \ $(ANDROID_LIB_ROOT)/$(abi)/libfftw3f.so \
@ -158,15 +160,21 @@ all: check-fftw-src \
$(ANDROID_LIB_ROOT)/$(abi)/libwdspj.so) \ $(ANDROID_LIB_ROOT)/$(abi)/libwdspj.so) \
java-classes java-classes
check-fftw-src: # ── Автоматическое получение FFTW ────────────────────────────────────────────
@test -f $(FFTW_SRC)/configure || { \
echo ""; \ third_party/$(FFTW_TAR):
echo "ERROR: FFTW source not found at $(FFTW_SRC)/configure"; \ mkdir -p third_party
echo "Download and extract FFTW from https://www.fftw.org/download.html"; \ @echo ">>> Скачиваем FFTW $(FFTW_VERSION)..."
echo "so that $(FFTW_SRC)/configure exists."; \ @if command -v wget >/dev/null 2>&1; then \
echo ""; \ wget -q --show-progress -O $@ "$(FFTW_URL)"; \
exit 1; \ else \
} curl -L --progress-bar -o $@ "$(FFTW_URL)"; \
fi
$(FFTW_SRC)/configure: third_party/$(FFTW_TAR)
@echo ">>> Распаковываем FFTW..."
tar xf $< -C third_party/
@touch $@
# abi_target: compiler triple for NDK clang wrapper # abi_target: compiler triple for NDK clang wrapper
define abi_target define abi_target
@ -226,7 +234,7 @@ ABI_$(1)_WDSP_OBJS := $$(patsubst %.c,$$(ABI_$(1)_OBJDIR)/%.o,$$(ALL_C_SOURCES))
ABI_$(1)_JNI_OBJ := $$(ABI_$(1)_OBJDIR)/$(JNI_SOURCE:.c=.o) ABI_$(1)_JNI_OBJ := $$(ABI_$(1)_OBJDIR)/$(JNI_SOURCE:.c=.o)
# --- Build fftw3 (double) --- # --- Build fftw3 (double) ---
$$(ABI_$(1)_FFTW_STAMP): $$(ABI_$(1)_FFTW_STAMP): $(FFTW_SRC)/configure
@mkdir -p $$(ABI_$(1)_OBJDIR)/fftw-build $$(ABI_$(1)_FFTW_PREFIX) @mkdir -p $$(ABI_$(1)_OBJDIR)/fftw-build $$(ABI_$(1)_FFTW_PREFIX)
cd $$(ABI_$(1)_OBJDIR)/fftw-build && \ cd $$(ABI_$(1)_OBJDIR)/fftw-build && \
$(abspath $(FFTW_SRC))/configure \ $(abspath $(FFTW_SRC))/configure \
@ -240,7 +248,7 @@ $$(ABI_$(1)_FFTW_STAMP):
@touch $$@ @touch $$@
# --- Build fftw3f (float/single) --- # --- Build fftw3f (float/single) ---
$$(ABI_$(1)_FFTWF_STAMP): $$(ABI_$(1)_FFTWF_STAMP): $(FFTW_SRC)/configure
@mkdir -p $$(ABI_$(1)_OBJDIR)/fftwf-build $$(ABI_$(1)_FFTWF_PREFIX) @mkdir -p $$(ABI_$(1)_OBJDIR)/fftwf-build $$(ABI_$(1)_FFTWF_PREFIX)
cd $$(ABI_$(1)_OBJDIR)/fftwf-build && \ cd $$(ABI_$(1)_OBJDIR)/fftwf-build && \
$(abspath $(FFTW_SRC))/configure \ $(abspath $(FFTW_SRC))/configure \
@ -311,3 +319,6 @@ java-classes: $(JAVA_SOURCE)
clean: clean:
rm -rf $(ANDROID_OBJ_ROOT) $(ANDROID_LIB_ROOT) rm -rf $(ANDROID_OBJ_ROOT) $(ANDROID_LIB_ROOT)
distclean: clean
-rm -rf $(FFTW_SRC) third_party/$(FFTW_TAR)

View File

@ -17,7 +17,7 @@ wdsp/
├── java/ ├── java/
│ └── org/openhpsdr/dsp/Wdsp.java │ └── org/openhpsdr/dsp/Wdsp.java
├── third_party/ ├── third_party/
│ ├── fftw/ — FFTW source (download manually, Android only) │ ├── fftw-3.3.11/ — FFTW source (downloaded automatically)
│ ├── fftw-win64/ — FFTW Windows binaries (downloaded automatically) │ ├── fftw-win64/ — FFTW Windows binaries (downloaded automatically)
│ ├── rnnoise/ — RNNoise noise suppression │ ├── rnnoise/ — RNNoise noise suppression
│ └── libspecbleach/ — spectral noise reduction │ └── libspecbleach/ — spectral noise reduction
@ -169,15 +169,9 @@ make -f Makefile.windows distclean # + удалить скачанный FFTW
### Prerequisites ### Prerequisites
1. **Android NDK** r23 or newer 1. **Android NDK** r23 or newer
2. **FFTW source** — download and extract into `third_party/fftw/`: 2. **Java compiler** — for building the `.class` file (Android Studio's JBR or any JDK)
```bash FFTW 3.3.11 скачивается и собирается автоматически. Чтобы использовать уже скачанный исходник, передайте `FFTW_SRC=/path/to/fftw-3.3.11`.
wget https://www.fftw.org/fftw-3.3.11.tar.gz
tar xf fftw-3.3.11.tar.gz
mv fftw-3.3.11 third_party/fftw
```
3. **Java compiler** — for building the `.class` file (Android Studio's JBR or any JDK)
### Build ### Build
@ -227,8 +221,8 @@ make -f Makefile.android \
### Clean ### Clean
```bash ```bash
make -f Makefile.android clean make -f Makefile.android clean # удаляет obj/android/ и lib/android/
# removes obj/android/ and lib/android/ make -f Makefile.android distclean # + удаляет скачанный FFTW
``` ```
--- ---