Compare commits
2 Commits
ec93fbfcbb
...
02926b36ce
| Author | SHA1 | Date | |
|---|---|---|---|
| 02926b36ce | |||
| 5bbf9698a8 |
@ -5,9 +5,8 @@
|
||||
# Optional overrides:
|
||||
# ANDROID_NDK=/path/to/ndk ANDROID_API=24 ANDROID_ABIS="arm64-v8a x86_64"
|
||||
#
|
||||
# Requires FFTW source in third_party/fftw/
|
||||
# Download from https://www.fftw.org/download.html and extract so that
|
||||
# third_party/fftw/configure exists.
|
||||
# FFTW source is downloaded and extracted automatically.
|
||||
# Override FFTW_SRC to use an existing directory.
|
||||
|
||||
ANDROID_NDK ?= /home/vladimir/Android/Sdk/ndk/29.0.14206865
|
||||
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 \
|
||||
-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)
|
||||
|
||||
WDSP_SOURCES = amd.c \
|
||||
@ -148,9 +150,9 @@ ANDROID_OBJ_ROOT := obj/android
|
||||
ANDROID_LIB_ROOT := lib/android
|
||||
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),\
|
||||
$(ANDROID_LIB_ROOT)/$(abi)/libfftw3.so \
|
||||
$(ANDROID_LIB_ROOT)/$(abi)/libfftw3f.so \
|
||||
@ -158,15 +160,21 @@ all: check-fftw-src \
|
||||
$(ANDROID_LIB_ROOT)/$(abi)/libwdspj.so) \
|
||||
java-classes
|
||||
|
||||
check-fftw-src:
|
||||
@test -f $(FFTW_SRC)/configure || { \
|
||||
echo ""; \
|
||||
echo "ERROR: FFTW source not found at $(FFTW_SRC)/configure"; \
|
||||
echo "Download and extract FFTW from https://www.fftw.org/download.html"; \
|
||||
echo "so that $(FFTW_SRC)/configure exists."; \
|
||||
echo ""; \
|
||||
exit 1; \
|
||||
}
|
||||
# ── Автоматическое получение FFTW ────────────────────────────────────────────
|
||||
|
||||
third_party/$(FFTW_TAR):
|
||||
mkdir -p third_party
|
||||
@echo ">>> Скачиваем FFTW $(FFTW_VERSION)..."
|
||||
@if command -v wget >/dev/null 2>&1; then \
|
||||
wget -q --show-progress -O $@ "$(FFTW_URL)"; \
|
||||
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
|
||||
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)
|
||||
|
||||
# --- 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)
|
||||
cd $$(ABI_$(1)_OBJDIR)/fftw-build && \
|
||||
$(abspath $(FFTW_SRC))/configure \
|
||||
@ -240,7 +248,7 @@ $$(ABI_$(1)_FFTW_STAMP):
|
||||
@touch $$@
|
||||
|
||||
# --- 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)
|
||||
cd $$(ABI_$(1)_OBJDIR)/fftwf-build && \
|
||||
$(abspath $(FFTW_SRC))/configure \
|
||||
@ -311,3 +319,6 @@ java-classes: $(JAVA_SOURCE)
|
||||
|
||||
clean:
|
||||
rm -rf $(ANDROID_OBJ_ROOT) $(ANDROID_LIB_ROOT)
|
||||
|
||||
distclean: clean
|
||||
-rm -rf $(FFTW_SRC) third_party/$(FFTW_TAR)
|
||||
|
||||
123
Makefile.windows
123
Makefile.windows
@ -6,13 +6,13 @@
|
||||
# make -f Makefile.windows dll # только DLL
|
||||
# make -f Makefile.windows static # только статическая библиотека
|
||||
# make -f Makefile.windows clean # удалить артефакты сборки
|
||||
# make -f Makefile.windows distclean # + удалить скачанный FFTW
|
||||
# make -f Makefile.windows distclean # + удалить собранный и скачанный FFTW
|
||||
#
|
||||
# Зависимости (установить до запуска):
|
||||
# Arch: sudo pacman -S mingw-w64-gcc unzip
|
||||
# Debian: sudo apt install gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 unzip
|
||||
# Fedora: sudo dnf install mingw64-gcc mingw64-binutils unzip
|
||||
# + wget или curl
|
||||
# Arch: sudo pacman -S mingw-w64-gcc
|
||||
# Debian: sudo apt install gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64
|
||||
# Fedora: sudo dnf install mingw64-gcc mingw64-binutils
|
||||
# + wget или curl, tar
|
||||
#
|
||||
|
||||
MINGW_PREFIX ?= x86_64-w64-mingw32
|
||||
@ -20,17 +20,41 @@ MINGW_PREFIX ?= x86_64-w64-mingw32
|
||||
CC := $(MINGW_PREFIX)-gcc
|
||||
AR := $(MINGW_PREFIX)-ar
|
||||
RANLIB := $(MINGW_PREFIX)-ranlib
|
||||
DLLTOOL := $(MINGW_PREFIX)-dlltool
|
||||
|
||||
CFLAGS ?= -O3 -Wno-parentheses
|
||||
LDFLAGS ?=
|
||||
|
||||
# ── FFTW Windows binaries ─────────────────────────────────────────────────────
|
||||
# ── FFTW: сборка из исходников ────────────────────────────────────────────────
|
||||
|
||||
FFTW_VERSION := 3.3.11
|
||||
FFTW_ZIP := fftw-$(FFTW_VERSION)-dll64.zip
|
||||
FFTW_URL := https://fftw.org/pub/fftw/$(FFTW_ZIP)
|
||||
FFTW_DIR := third_party/fftw-win64
|
||||
FFTW_TAR := fftw-$(FFTW_VERSION).tar.gz
|
||||
FFTW_URL := https://fftw.org/pub/fftw/$(FFTW_TAR)
|
||||
|
||||
# Абсолютные пути — нужны для 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
|
||||
|
||||
# ── Выходные директории и файлы ───────────────────────────────────────────────
|
||||
|
||||
@ -59,24 +83,23 @@ OBJS := $(addprefix $(OBJDIR)/, $(SOURCES:.c=.o))
|
||||
|
||||
# ── Флаги компиляции ──────────────────────────────────────────────────────────
|
||||
|
||||
# Абсолютные пути, т.к. используются в sub-make из других директорий
|
||||
FFTW_ABS := $(CURDIR)/$(FFTW_DIR)
|
||||
NR34_INC := -I third_party/rnnoise/include -I third_party/libspecbleach/include
|
||||
FFTW_INC := -I$(FFTW_ABS)
|
||||
FFTW_INC := -I$(FFTW_INST)/include
|
||||
|
||||
COMPILE := $(CC) $(CFLAGS) $(FFTW_INC) $(NR34_INC)
|
||||
|
||||
NR34_DEPS := third_party/rnnoise/librnnoise.a \
|
||||
third_party/libspecbleach/libspecbleach.a
|
||||
|
||||
# avrt нужен т.к. comm.h включает <avrt.h> под _WIN32; fftw3f нужен libspecbleach
|
||||
# После сборки из исходников import lib называется libfftw3.dll.a → линкуем -lfftw3
|
||||
# avrt нужен т.к. comm.h включает <avrt.h> под _WIN32
|
||||
LINK_LIBS := $(NR34_DEPS) \
|
||||
-L$(FFTW_ABS) -lfftw3-3 -lfftw3f-3 \
|
||||
-L$(FFTW_INST)/lib -lfftw3 -lfftw3f \
|
||||
-lavrt -lm
|
||||
|
||||
# ── Цели ──────────────────────────────────────────────────────────────────────
|
||||
|
||||
.PHONY: all dll static fftw third-party check-tools clean distclean
|
||||
.PHONY: all dll static fftw fftw-double fftw-float third-party check-tools clean distclean
|
||||
|
||||
all: dll static
|
||||
|
||||
@ -93,43 +116,53 @@ check-tools:
|
||||
echo " Debian: sudo apt install gcc-mingw-w64-x86-64"; \
|
||||
echo " Fedora: sudo dnf install mingw64-gcc"; \
|
||||
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) || { \
|
||||
echo "ОШИБКА: требуется wget или curl"; exit 1; }
|
||||
@command -v unzip >/dev/null 2>&1 || { \
|
||||
echo "ОШИБКА: требуется unzip"; exit 1; }
|
||||
|
||||
# ── FFTW: скачать → распаковать → сгенерировать import-библиотеки ─────────────
|
||||
# ── FFTW: скачать исходники → собрать double → собрать float ──────────────────
|
||||
|
||||
fftw: $(FFTW_DIR)/libfftw3-3.dll.a $(FFTW_DIR)/libfftw3f-3.dll.a
|
||||
fftw: fftw-double fftw-float
|
||||
|
||||
$(FFTW_DIR)/$(FFTW_ZIP):
|
||||
mkdir -p $(FFTW_DIR)
|
||||
@echo ">>> Скачиваем FFTW $(FFTW_VERSION) (Windows 64-bit)..."
|
||||
# Шаг 1: скачать tarball
|
||||
third_party/$(FFTW_TAR):
|
||||
mkdir -p third_party
|
||||
@echo ">>> Скачиваем FFTW $(FFTW_VERSION)..."
|
||||
@if command -v wget >/dev/null 2>&1; then \
|
||||
wget -q --show-progress -O $@ "$(FFTW_URL)"; \
|
||||
else \
|
||||
curl -L --progress-bar -o $@ "$(FFTW_URL)"; \
|
||||
fi
|
||||
|
||||
$(FFTW_DIR)/fftw3.h: $(FFTW_DIR)/$(FFTW_ZIP)
|
||||
@echo ">>> Распаковываем $(FFTW_ZIP)..."
|
||||
unzip -o -q -d $(FFTW_DIR) $<
|
||||
# Шаг 2: распаковать
|
||||
$(FFTW_SRC)/configure: third_party/$(FFTW_TAR)
|
||||
@echo ">>> Распаковываем FFTW..."
|
||||
tar xf $< -C third_party/
|
||||
@touch $@
|
||||
|
||||
# MinGW ld ищет libfoo.dll.a при -lfoo, поэтому такое имя
|
||||
$(FFTW_DIR)/libfftw3-3.dll.a: $(FFTW_DIR)/fftw3.h
|
||||
@echo ">>> Генерируем import lib: libfftw3-3.dll.a"
|
||||
$(DLLTOOL) --input-def $(FFTW_DIR)/libfftw3-3.def \
|
||||
--dllname libfftw3-3.dll \
|
||||
--output-lib $@
|
||||
# Шаг 3a: configure для double precision
|
||||
$(FFTW_BUILD_D)/Makefile: $(FFTW_SRC)/configure
|
||||
mkdir -p $(FFTW_BUILD_D)
|
||||
@echo ">>> Конфигурируем FFTW (double)..."
|
||||
cd $(FFTW_BUILD_D) && $(FFTW_SRC)/configure $(FFTW_CONF_COMMON)
|
||||
|
||||
$(FFTW_DIR)/libfftw3f-3.dll.a: $(FFTW_DIR)/fftw3.h
|
||||
@echo ">>> Генерируем import lib: libfftw3f-3.dll.a"
|
||||
$(DLLTOOL) --input-def $(FFTW_DIR)/libfftw3f-3.def \
|
||||
--dllname libfftw3f-3.dll \
|
||||
--output-lib $@
|
||||
# Шаг 4a: сборка и установка double precision
|
||||
fftw-double: $(FFTW_LIB_D)
|
||||
$(FFTW_LIB_D): $(FFTW_BUILD_D)/Makefile
|
||||
@echo ">>> Собираем FFTW (double)..."
|
||||
$(MAKE) -C $(FFTW_BUILD_D) install
|
||||
|
||||
# Шаг 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 библиотеки (кросс-компиляция) ─────────────────────────────────
|
||||
|
||||
@ -144,11 +177,11 @@ third_party/rnnoise/librnnoise.a:
|
||||
# libspecbleach/Makefile жёстко вызывает pkg-config через FFTWINCLUDE=`...`
|
||||
# и использует результат только в CFLAGS?= — переопределяем CFLAGS целиком,
|
||||
# чтобы обойти pkg-config и прописать путь к нашему FFTW вручную.
|
||||
third_party/libspecbleach/libspecbleach.a: $(FFTW_DIR)/fftw3.h
|
||||
third_party/libspecbleach/libspecbleach.a: $(FFTW_HEADER)
|
||||
@echo ">>> Собираем libspecbleach для Windows..."
|
||||
$(MAKE) -C third_party/libspecbleach \
|
||||
CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \
|
||||
CFLAGS="$(CFLAGS) -I$(FFTW_ABS) -Iinclude -Isrc -Isrc/shared"
|
||||
CFLAGS="$(CFLAGS) -I$(FFTW_INST)/include -Iinclude -Isrc -Isrc/shared"
|
||||
|
||||
# ── Основная библиотека ───────────────────────────────────────────────────────
|
||||
|
||||
@ -162,7 +195,7 @@ $(DLL): $(OBJS) $(NR34_DEPS) | $(OUTDIR)
|
||||
$(LDFLAGS) \
|
||||
-o $@ \
|
||||
$(OBJS) $(LINK_LIBS)
|
||||
@cp $(FFTW_DIR)/libfftw3-3.dll $(FFTW_DIR)/libfftw3f-3.dll $(OUTDIR)/
|
||||
@cp $(FFTW_DLL_D) $(FFTW_DLL_F) $(OUTDIR)/
|
||||
@echo ""
|
||||
@echo "=== Готово ==="
|
||||
@echo " DLL: $(DLL)"
|
||||
@ -180,7 +213,7 @@ $(STATIC_LIB): $(OBJS) | $(OUTDIR)
|
||||
@echo " Статическая: $(STATIC_LIB)"
|
||||
@echo " Линкуйте приложение с:"
|
||||
@echo " $(STATIC_LIB) $(NR34_DEPS)"
|
||||
@echo " -L$(FFTW_ABS) -lfftw3-3 -lfftw3f-3 -lavrt -lm"
|
||||
@echo " -L$(FFTW_INST)/lib -lfftw3 -lfftw3f -lavrt -lm"
|
||||
|
||||
$(OBJDIR)/%.o: %.c | $(OBJDIR)
|
||||
$(COMPILE) -c -o $@ $<
|
||||
@ -192,6 +225,6 @@ clean:
|
||||
-$(MAKE) -C third_party/rnnoise clean
|
||||
-$(MAKE) -C third_party/libspecbleach clean
|
||||
|
||||
# distclean удаляет и скачанный FFTW — при следующем запуске скачается заново
|
||||
# distclean удаляет собранный и скачанный FFTW — при следующем запуске пересоберётся
|
||||
distclean: clean
|
||||
-rm -rf $(FFTW_DIR)
|
||||
-rm -rf $(FFTW_INST) $(FFTW_SRC) third_party/$(FFTW_TAR)
|
||||
|
||||
24
README.md
24
README.md
@ -17,7 +17,7 @@ wdsp/
|
||||
├── java/
|
||||
│ └── org/openhpsdr/dsp/Wdsp.java
|
||||
├── third_party/
|
||||
│ ├── fftw/ — FFTW source (download manually, Android only)
|
||||
│ ├── fftw-3.3.11/ — FFTW source (downloaded automatically)
|
||||
│ ├── fftw-win64/ — FFTW Windows binaries (downloaded automatically)
|
||||
│ ├── rnnoise/ — RNNoise noise suppression
|
||||
│ └── libspecbleach/ — spectral noise reduction
|
||||
@ -87,19 +87,19 @@ make clean
|
||||
|
||||
## Windows build (кросс-компиляция с Linux)
|
||||
|
||||
Сборка выполняется на Linux с помощью MinGW-w64. FFTW скачивается автоматически.
|
||||
Сборка выполняется на Linux с помощью MinGW-w64. FFTW скачивается и собирается из исходников автоматически.
|
||||
|
||||
### Зависимости
|
||||
|
||||
```bash
|
||||
# Arch
|
||||
sudo pacman -S mingw-w64-gcc unzip
|
||||
sudo pacman -S mingw-w64-gcc
|
||||
|
||||
# Debian / Ubuntu
|
||||
sudo apt install gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 unzip
|
||||
sudo apt install gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64
|
||||
|
||||
# Fedora
|
||||
sudo dnf install mingw64-gcc mingw64-binutils unzip
|
||||
sudo dnf install mingw64-gcc mingw64-binutils
|
||||
```
|
||||
|
||||
Также нужен `wget` или `curl`.
|
||||
@ -169,15 +169,9 @@ make -f Makefile.windows distclean # + удалить скачанный FFTW
|
||||
### Prerequisites
|
||||
|
||||
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
|
||||
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)
|
||||
FFTW 3.3.11 скачивается и собирается автоматически. Чтобы использовать уже скачанный исходник, передайте `FFTW_SRC=/path/to/fftw-3.3.11`.
|
||||
|
||||
### Build
|
||||
|
||||
@ -227,8 +221,8 @@ make -f Makefile.android \
|
||||
### Clean
|
||||
|
||||
```bash
|
||||
make -f Makefile.android clean
|
||||
# removes obj/android/ and lib/android/
|
||||
make -f Makefile.android clean # удаляет obj/android/ и lib/android/
|
||||
make -f Makefile.android distclean # + удаляет скачанный FFTW
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Loading…
Reference in New Issue
Block a user