wdsp/Makefile.windows
Uladzimir Karpenka ec93fbfcbb Add Windows cross-compilation support via MinGW-w64
Makefile.windows builds libwdsp.dll and libwdsp.a for 64-bit Windows
on Linux. FFTW 3.3.11 Windows binaries are downloaded automatically
from fftw.org and import libraries are generated with dlltool.
README updated with Windows build instructions and FFTW version bump.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 10:46:51 +03:00

198 lines
8.5 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#
# Makefile.windows — кросс-компиляция WDSP для 64-bit Windows на Linux (MinGW-w64)
#
# Использование:
# make -f Makefile.windows # DLL + статическая библиотека
# make -f Makefile.windows dll # только DLL
# make -f Makefile.windows static # только статическая библиотека
# make -f Makefile.windows clean # удалить артефакты сборки
# 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
#
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_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
# ── Выходные директории и файлы ───────────────────────────────────────────────
OBJDIR := obj_win
OUTDIR := lib_win
DLL := $(OUTDIR)/libwdsp.dll
IMPLIB := $(OUTDIR)/libwdsp.dll.a
STATIC_LIB := $(OUTDIR)/libwdsp.a
# ── Исходники (копия из основного Makefile) ───────────────────────────────────
SOURCES = \
amd.c ammod.c amsq.c analyzer.c anf.c anr.c apfshadow.c \
bandpass.c calcc.c calculus.c cblock.c cfcomp.c cfir.c \
channel.c cmath.c compress.c delay.c dexp.c div.c doublepole.c \
eer.c emnr.c emph.c eq.c fcurve.c FDnoiseIQ.c fir.c firmin.c \
fmd.c fmmod.c fmsq.c gain.c gaussian.c gen.c icfir.c iir.c \
impulse_cache.c iobuffs.c iqc.c linux_port.c lmath.c main.c \
matchedCW.c meter.c meterlog10.c nbp.c nob.c nobII.c osctrl.c \
patchpanel.c resample.c rmatch.c rnnr.c RXA.c sbnr.c sender.c \
shift.c siphon.c slew.c snb.c ssql.c syncbuffs.c TXA.c \
utilities.c varsamp.c version.c wcpAGC.c wisdom.c zetaHat.c
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)
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
LINK_LIBS := $(NR34_DEPS) \
-L$(FFTW_ABS) -lfftw3-3 -lfftw3f-3 \
-lavrt -lm
# ── Цели ──────────────────────────────────────────────────────────────────────
.PHONY: all dll static fftw third-party check-tools clean distclean
all: dll static
dll: check-tools fftw third-party $(DLL)
static: check-tools fftw third-party $(STATIC_LIB)
# ── Проверка инструментов ─────────────────────────────────────────────────────
check-tools:
@command -v $(CC) >/dev/null 2>&1 || { \
echo ""; \
echo "ОШИБКА: $(CC) не найден. Установите mingw-w64:"; \
echo " Arch: sudo pacman -S mingw-w64-gcc"; \
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: $(FFTW_DIR)/libfftw3-3.dll.a $(FFTW_DIR)/libfftw3f-3.dll.a
$(FFTW_DIR)/$(FFTW_ZIP):
mkdir -p $(FFTW_DIR)
@echo ">>> Скачиваем FFTW $(FFTW_VERSION) (Windows 64-bit)..."
@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) $<
@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 $@
$(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 $@
# ── Third-party библиотеки (кросс-компиляция) ─────────────────────────────────
third-party: $(NR34_DEPS)
third_party/rnnoise/librnnoise.a:
@echo ">>> Собираем rnnoise для Windows..."
$(MAKE) -C third_party/rnnoise \
CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \
CFLAGS="$(CFLAGS) -Iinclude -Isrc"
# libspecbleach/Makefile жёстко вызывает pkg-config через FFTWINCLUDE=`...`
# и использует результат только в CFLAGS?= — переопределяем CFLAGS целиком,
# чтобы обойти pkg-config и прописать путь к нашему FFTW вручную.
third_party/libspecbleach/libspecbleach.a: $(FFTW_DIR)/fftw3.h
@echo ">>> Собираем libspecbleach для Windows..."
$(MAKE) -C third_party/libspecbleach \
CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \
CFLAGS="$(CFLAGS) -I$(FFTW_ABS) -Iinclude -Isrc -Isrc/shared"
# ── Основная библиотека ───────────────────────────────────────────────────────
$(OUTDIR) $(OBJDIR):
mkdir -p $@
$(DLL): $(OBJS) $(NR34_DEPS) | $(OUTDIR)
@echo ">>> Линкуем $@..."
$(CC) -shared \
-Wl,--out-implib,$(IMPLIB) \
$(LDFLAGS) \
-o $@ \
$(OBJS) $(LINK_LIBS)
@cp $(FFTW_DIR)/libfftw3-3.dll $(FFTW_DIR)/libfftw3f-3.dll $(OUTDIR)/
@echo ""
@echo "=== Готово ==="
@echo " DLL: $(DLL)"
@echo " Import lib: $(IMPLIB)"
@echo " Заголовок: wdsp.h"
@echo ""
@echo " FFTW DLL скопированы в $(OUTDIR)/ — включите их в дистрибутив"
@echo " рядом с libwdsp.dll."
$(STATIC_LIB): $(OBJS) | $(OUTDIR)
$(AR) rv $@ $(OBJS)
$(RANLIB) $@
@echo ""
@echo "=== Готово ==="
@echo " Статическая: $(STATIC_LIB)"
@echo " Линкуйте приложение с:"
@echo " $(STATIC_LIB) $(NR34_DEPS)"
@echo " -L$(FFTW_ABS) -lfftw3-3 -lfftw3f-3 -lavrt -lm"
$(OBJDIR)/%.o: %.c | $(OBJDIR)
$(COMPILE) -c -o $@ $<
# ── Очистка ───────────────────────────────────────────────────────────────────
clean:
-rm -rf $(OBJDIR) $(OUTDIR)
-$(MAKE) -C third_party/rnnoise clean
-$(MAKE) -C third_party/libspecbleach clean
# distclean удаляет и скачанный FFTW — при следующем запуске скачается заново
distclean: clean
-rm -rf $(FFTW_DIR)