Compare commits

..

No commits in common. "02926b36cef2969ad942081f628127b4e8e0118a" and "ec93fbfcbb5446406ca1ccec84458e8cbaf194e9" have entirely different histories.

3 changed files with 86 additions and 124 deletions

View File

@ -5,8 +5,9 @@
# 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"
# #
# FFTW source is downloaded and extracted automatically. # Requires FFTW source in third_party/fftw/
# Override FFTW_SRC to use an existing directory. # Download from https://www.fftw.org/download.html and extract so that
# 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
@ -23,10 +24,7 @@ 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_VERSION := 3.3.11 FFTW_SRC ?= third_party/fftw
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 \
@ -150,9 +148,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 distclean java-classes .PHONY: all clean java-classes check-fftw-src
all: $(FFTW_SRC)/configure \ all: check-fftw-src \
$(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 \
@ -160,21 +158,15 @@ all: $(FFTW_SRC)/configure \
$(ANDROID_LIB_ROOT)/$(abi)/libwdspj.so) \ $(ANDROID_LIB_ROOT)/$(abi)/libwdspj.so) \
java-classes java-classes
# ── Автоматическое получение FFTW ──────────────────────────────────────────── check-fftw-src:
@test -f $(FFTW_SRC)/configure || { \
third_party/$(FFTW_TAR): echo ""; \
mkdir -p third_party echo "ERROR: FFTW source not found at $(FFTW_SRC)/configure"; \
@echo ">>> Скачиваем FFTW $(FFTW_VERSION)..." echo "Download and extract FFTW from https://www.fftw.org/download.html"; \
@if command -v wget >/dev/null 2>&1; then \ echo "so that $(FFTW_SRC)/configure exists."; \
wget -q --show-progress -O $@ "$(FFTW_URL)"; \ echo ""; \
else \ exit 1; \
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
@ -234,7 +226,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): $(FFTW_SRC)/configure $$(ABI_$(1)_FFTW_STAMP):
@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 \
@ -248,7 +240,7 @@ $$(ABI_$(1)_FFTW_STAMP): $(FFTW_SRC)/configure
@touch $$@ @touch $$@
# --- Build fftw3f (float/single) --- # --- Build fftw3f (float/single) ---
$$(ABI_$(1)_FFTWF_STAMP): $(FFTW_SRC)/configure $$(ABI_$(1)_FFTWF_STAMP):
@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 \
@ -319,6 +311,3 @@ 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

@ -6,55 +6,31 @@
# make -f Makefile.windows dll # только DLL # make -f Makefile.windows dll # только DLL
# make -f Makefile.windows static # только статическая библиотека # make -f Makefile.windows static # только статическая библиотека
# make -f Makefile.windows clean # удалить артефакты сборки # make -f Makefile.windows clean # удалить артефакты сборки
# make -f Makefile.windows distclean # + удалить собранный и скачанный FFTW # make -f Makefile.windows distclean # + удалить скачанный FFTW
# #
# Зависимости (установить до запуска): # Зависимости (установить до запуска):
# Arch: sudo pacman -S mingw-w64-gcc # Arch: sudo pacman -S mingw-w64-gcc unzip
# Debian: sudo apt install gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 # Debian: sudo apt install gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 unzip
# Fedora: sudo dnf install mingw64-gcc mingw64-binutils # Fedora: sudo dnf install mingw64-gcc mingw64-binutils unzip
# + wget или curl, tar # + wget или curl
# #
MINGW_PREFIX ?= x86_64-w64-mingw32 MINGW_PREFIX ?= x86_64-w64-mingw32
CC := $(MINGW_PREFIX)-gcc CC := $(MINGW_PREFIX)-gcc
AR := $(MINGW_PREFIX)-ar AR := $(MINGW_PREFIX)-ar
RANLIB := $(MINGW_PREFIX)-ranlib RANLIB := $(MINGW_PREFIX)-ranlib
DLLTOOL := $(MINGW_PREFIX)-dlltool
CFLAGS ?= -O3 -Wno-parentheses CFLAGS ?= -O3 -Wno-parentheses
LDFLAGS ?= LDFLAGS ?=
# ── FFTW: сборка из исходников ──────────────────────────────────────────────── # ── FFTW Windows binaries ─────────────────────────────────────────────────────
FFTW_VERSION := 3.3.11 FFTW_VERSION := 3.3.11
FFTW_TAR := fftw-$(FFTW_VERSION).tar.gz FFTW_ZIP := fftw-$(FFTW_VERSION)-dll64.zip
FFTW_URL := https://fftw.org/pub/fftw/$(FFTW_TAR) FFTW_URL := https://fftw.org/pub/fftw/$(FFTW_ZIP)
FFTW_DIR := third_party/fftw-win64
# Абсолютные пути — нужны для configure --prefix и sub-make -C
FFTW_SRC := $(CURDIR)/third_party/fftw-$(FFTW_VERSION)
FFTW_INST := $(CURDIR)/third_party/fftw-win64
# Раздельные build-директории для double и float precision
FFTW_BUILD_D := $(FFTW_INST)/build-double
FFTW_BUILD_F := $(FFTW_INST)/build-float
FFTW_CONF_COMMON = \
--host=$(MINGW_PREFIX) \
--prefix=$(FFTW_INST) \
--enable-shared \
--disable-static \
--with-our-malloc \
--enable-sse2 \
--enable-avx \
--disable-fortran \
--quiet
# Sentinel-файлы для отслеживания готовности FFTW
FFTW_HEADER := $(FFTW_INST)/include/fftw3.h
FFTW_LIB_D := $(FFTW_INST)/lib/libfftw3.dll.a
FFTW_LIB_F := $(FFTW_INST)/lib/libfftw3f.dll.a
FFTW_DLL_D := $(FFTW_INST)/bin/libfftw3-3.dll
FFTW_DLL_F := $(FFTW_INST)/bin/libfftw3f-3.dll
# ── Выходные директории и файлы ─────────────────────────────────────────────── # ── Выходные директории и файлы ───────────────────────────────────────────────
@ -83,23 +59,24 @@ OBJS := $(addprefix $(OBJDIR)/, $(SOURCES:.c=.o))
# ── Флаги компиляции ────────────────────────────────────────────────────────── # ── Флаги компиляции ──────────────────────────────────────────────────────────
NR34_INC := -I third_party/rnnoise/include -I third_party/libspecbleach/include # Абсолютные пути, т.к. используются в sub-make из других директорий
FFTW_INC := -I$(FFTW_INST)/include FFTW_ABS := $(CURDIR)/$(FFTW_DIR)
NR34_INC := -I third_party/rnnoise/include -I third_party/libspecbleach/include
FFTW_INC := -I$(FFTW_ABS)
COMPILE := $(CC) $(CFLAGS) $(FFTW_INC) $(NR34_INC) COMPILE := $(CC) $(CFLAGS) $(FFTW_INC) $(NR34_INC)
NR34_DEPS := third_party/rnnoise/librnnoise.a \ NR34_DEPS := third_party/rnnoise/librnnoise.a \
third_party/libspecbleach/libspecbleach.a third_party/libspecbleach/libspecbleach.a
# После сборки из исходников import lib называется libfftw3.dll.a → линкуем -lfftw3 # avrt нужен т.к. comm.h включает <avrt.h> под _WIN32; fftw3f нужен libspecbleach
# avrt нужен т.к. comm.h включает <avrt.h> под _WIN32 LINK_LIBS := $(NR34_DEPS) \
LINK_LIBS := $(NR34_DEPS) \ -L$(FFTW_ABS) -lfftw3-3 -lfftw3f-3 \
-L$(FFTW_INST)/lib -lfftw3 -lfftw3f \ -lavrt -lm
-lavrt -lm
# ── Цели ────────────────────────────────────────────────────────────────────── # ── Цели ──────────────────────────────────────────────────────────────────────
.PHONY: all dll static fftw fftw-double fftw-float third-party check-tools clean distclean .PHONY: all dll static fftw third-party check-tools clean distclean
all: dll static all: dll static
@ -116,53 +93,43 @@ check-tools:
echo " Debian: sudo apt install gcc-mingw-w64-x86-64"; \ echo " Debian: sudo apt install gcc-mingw-w64-x86-64"; \
echo " Fedora: sudo dnf install mingw64-gcc"; \ echo " Fedora: sudo dnf install mingw64-gcc"; \
echo ""; exit 1; } echo ""; exit 1; }
@command -v $(DLLTOOL) >/dev/null 2>&1 || { \
echo "ОШИБКА: $(DLLTOOL) не найден"; exit 1; }
@(command -v wget >/dev/null 2>&1 || command -v curl >/dev/null 2>&1) || { \ @(command -v wget >/dev/null 2>&1 || command -v curl >/dev/null 2>&1) || { \
echo "ОШИБКА: требуется wget или curl"; exit 1; } echo "ОШИБКА: требуется wget или curl"; exit 1; }
@command -v unzip >/dev/null 2>&1 || { \
echo "ОШИБКА: требуется unzip"; exit 1; }
# ── FFTW: скачать исходники → собрать double → собрать float ────────────────── # ── FFTW: скачать → распаковать → сгенерировать import-библиотеки ─────────────
fftw: fftw-double fftw-float fftw: $(FFTW_DIR)/libfftw3-3.dll.a $(FFTW_DIR)/libfftw3f-3.dll.a
# Шаг 1: скачать tarball $(FFTW_DIR)/$(FFTW_ZIP):
third_party/$(FFTW_TAR): mkdir -p $(FFTW_DIR)
mkdir -p third_party @echo ">>> Скачиваем FFTW $(FFTW_VERSION) (Windows 64-bit)..."
@echo ">>> Скачиваем FFTW $(FFTW_VERSION)..."
@if command -v wget >/dev/null 2>&1; then \ @if command -v wget >/dev/null 2>&1; then \
wget -q --show-progress -O $@ "$(FFTW_URL)"; \ wget -q --show-progress -O $@ "$(FFTW_URL)"; \
else \ else \
curl -L --progress-bar -o $@ "$(FFTW_URL)"; \ curl -L --progress-bar -o $@ "$(FFTW_URL)"; \
fi fi
# Шаг 2: распаковать $(FFTW_DIR)/fftw3.h: $(FFTW_DIR)/$(FFTW_ZIP)
$(FFTW_SRC)/configure: third_party/$(FFTW_TAR) @echo ">>> Распаковываем $(FFTW_ZIP)..."
@echo ">>> Распаковываем FFTW..." unzip -o -q -d $(FFTW_DIR) $<
tar xf $< -C third_party/
@touch $@ @touch $@
# Шаг 3a: configure для double precision # MinGW ld ищет libfoo.dll.a при -lfoo, поэтому такое имя
$(FFTW_BUILD_D)/Makefile: $(FFTW_SRC)/configure $(FFTW_DIR)/libfftw3-3.dll.a: $(FFTW_DIR)/fftw3.h
mkdir -p $(FFTW_BUILD_D) @echo ">>> Генерируем import lib: libfftw3-3.dll.a"
@echo ">>> Конфигурируем FFTW (double)..." $(DLLTOOL) --input-def $(FFTW_DIR)/libfftw3-3.def \
cd $(FFTW_BUILD_D) && $(FFTW_SRC)/configure $(FFTW_CONF_COMMON) --dllname libfftw3-3.dll \
--output-lib $@
# Шаг 4a: сборка и установка double precision $(FFTW_DIR)/libfftw3f-3.dll.a: $(FFTW_DIR)/fftw3.h
fftw-double: $(FFTW_LIB_D) @echo ">>> Генерируем import lib: libfftw3f-3.dll.a"
$(FFTW_LIB_D): $(FFTW_BUILD_D)/Makefile $(DLLTOOL) --input-def $(FFTW_DIR)/libfftw3f-3.def \
@echo ">>> Собираем FFTW (double)..." --dllname libfftw3f-3.dll \
$(MAKE) -C $(FFTW_BUILD_D) install --output-lib $@
# Шаг 3b: configure для float precision (--enable-float)
$(FFTW_BUILD_F)/Makefile: $(FFTW_SRC)/configure
mkdir -p $(FFTW_BUILD_F)
@echo ">>> Конфигурируем FFTW (float)..."
cd $(FFTW_BUILD_F) && $(FFTW_SRC)/configure $(FFTW_CONF_COMMON) --enable-float
# Шаг 4b: сборка и установка float precision
# Зависит от fftw-double чтобы install-шаги не конкурировали за prefix
fftw-float: $(FFTW_LIB_F)
$(FFTW_LIB_F): $(FFTW_BUILD_F)/Makefile $(FFTW_LIB_D)
@echo ">>> Собираем FFTW (float)..."
$(MAKE) -C $(FFTW_BUILD_F) install
# ── Third-party библиотеки (кросс-компиляция) ───────────────────────────────── # ── Third-party библиотеки (кросс-компиляция) ─────────────────────────────────
@ -177,11 +144,11 @@ third_party/rnnoise/librnnoise.a:
# libspecbleach/Makefile жёстко вызывает pkg-config через FFTWINCLUDE=`...` # libspecbleach/Makefile жёстко вызывает pkg-config через FFTWINCLUDE=`...`
# и использует результат только в CFLAGS?= — переопределяем CFLAGS целиком, # и использует результат только в CFLAGS?= — переопределяем CFLAGS целиком,
# чтобы обойти pkg-config и прописать путь к нашему FFTW вручную. # чтобы обойти pkg-config и прописать путь к нашему FFTW вручную.
third_party/libspecbleach/libspecbleach.a: $(FFTW_HEADER) third_party/libspecbleach/libspecbleach.a: $(FFTW_DIR)/fftw3.h
@echo ">>> Собираем libspecbleach для Windows..." @echo ">>> Собираем libspecbleach для Windows..."
$(MAKE) -C third_party/libspecbleach \ $(MAKE) -C third_party/libspecbleach \
CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \ CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \
CFLAGS="$(CFLAGS) -I$(FFTW_INST)/include -Iinclude -Isrc -Isrc/shared" CFLAGS="$(CFLAGS) -I$(FFTW_ABS) -Iinclude -Isrc -Isrc/shared"
# ── Основная библиотека ─────────────────────────────────────────────────────── # ── Основная библиотека ───────────────────────────────────────────────────────
@ -195,7 +162,7 @@ $(DLL): $(OBJS) $(NR34_DEPS) | $(OUTDIR)
$(LDFLAGS) \ $(LDFLAGS) \
-o $@ \ -o $@ \
$(OBJS) $(LINK_LIBS) $(OBJS) $(LINK_LIBS)
@cp $(FFTW_DLL_D) $(FFTW_DLL_F) $(OUTDIR)/ @cp $(FFTW_DIR)/libfftw3-3.dll $(FFTW_DIR)/libfftw3f-3.dll $(OUTDIR)/
@echo "" @echo ""
@echo "=== Готово ===" @echo "=== Готово ==="
@echo " DLL: $(DLL)" @echo " DLL: $(DLL)"
@ -213,7 +180,7 @@ $(STATIC_LIB): $(OBJS) | $(OUTDIR)
@echo " Статическая: $(STATIC_LIB)" @echo " Статическая: $(STATIC_LIB)"
@echo " Линкуйте приложение с:" @echo " Линкуйте приложение с:"
@echo " $(STATIC_LIB) $(NR34_DEPS)" @echo " $(STATIC_LIB) $(NR34_DEPS)"
@echo " -L$(FFTW_INST)/lib -lfftw3 -lfftw3f -lavrt -lm" @echo " -L$(FFTW_ABS) -lfftw3-3 -lfftw3f-3 -lavrt -lm"
$(OBJDIR)/%.o: %.c | $(OBJDIR) $(OBJDIR)/%.o: %.c | $(OBJDIR)
$(COMPILE) -c -o $@ $< $(COMPILE) -c -o $@ $<
@ -225,6 +192,6 @@ clean:
-$(MAKE) -C third_party/rnnoise clean -$(MAKE) -C third_party/rnnoise clean
-$(MAKE) -C third_party/libspecbleach clean -$(MAKE) -C third_party/libspecbleach clean
# distclean удаляет собранный и скачанный FFTW — при следующем запуске пересоберётся # distclean удаляет и скачанный FFTW — при следующем запуске скачается заново
distclean: clean distclean: clean
-rm -rf $(FFTW_INST) $(FFTW_SRC) third_party/$(FFTW_TAR) -rm -rf $(FFTW_DIR)

View File

@ -17,7 +17,7 @@ wdsp/
├── java/ ├── java/
│ └── org/openhpsdr/dsp/Wdsp.java │ └── org/openhpsdr/dsp/Wdsp.java
├── third_party/ ├── third_party/
│ ├── fftw-3.3.11/ — FFTW source (downloaded automatically) │ ├── fftw/ — FFTW source (download manually, Android only)
│ ├── 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
@ -87,19 +87,19 @@ make clean
## Windows build (кросс-компиляция с Linux) ## Windows build (кросс-компиляция с Linux)
Сборка выполняется на Linux с помощью MinGW-w64. FFTW скачивается и собирается из исходников автоматически. Сборка выполняется на Linux с помощью MinGW-w64. FFTW скачивается автоматически.
### Зависимости ### Зависимости
```bash ```bash
# Arch # Arch
sudo pacman -S mingw-w64-gcc sudo pacman -S mingw-w64-gcc unzip
# Debian / Ubuntu # Debian / Ubuntu
sudo apt install gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 sudo apt install gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 unzip
# Fedora # Fedora
sudo dnf install mingw64-gcc mingw64-binutils sudo dnf install mingw64-gcc mingw64-binutils unzip
``` ```
Также нужен `wget` или `curl`. Также нужен `wget` или `curl`.
@ -169,9 +169,15 @@ make -f Makefile.windows distclean # + удалить скачанный FFTW
### Prerequisites ### Prerequisites
1. **Android NDK** r23 or newer 1. **Android NDK** r23 or newer
2. **Java compiler** — for building the `.class` file (Android Studio's JBR or any JDK) 2. **FFTW source** — download and extract into `third_party/fftw/`:
FFTW 3.3.11 скачивается и собирается автоматически. Чтобы использовать уже скачанный исходник, передайте `FFTW_SRC=/path/to/fftw-3.3.11`. ```bash
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
@ -221,8 +227,8 @@ make -f Makefile.android \
### Clean ### Clean
```bash ```bash
make -f Makefile.android clean # удаляет obj/android/ и lib/android/ make -f Makefile.android clean
make -f Makefile.android distclean # + удаляет скачанный FFTW # removes obj/android/ and lib/android/
``` ```
--- ---