diff --git a/Makefile.windows b/Makefile.windows index 30dc5bd..2e73b73 100644 --- a/Makefile.windows +++ b/Makefile.windows @@ -6,31 +6,55 @@ # 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 -CC := $(MINGW_PREFIX)-gcc -AR := $(MINGW_PREFIX)-ar -RANLIB := $(MINGW_PREFIX)-ranlib -DLLTOOL := $(MINGW_PREFIX)-dlltool +CC := $(MINGW_PREFIX)-gcc +AR := $(MINGW_PREFIX)-ar +RANLIB := $(MINGW_PREFIX)-ranlib 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) +NR34_INC := -I third_party/rnnoise/include -I third_party/libspecbleach/include +FFTW_INC := -I$(FFTW_INST)/include -COMPILE := $(CC) $(CFLAGS) $(FFTW_INC) $(NR34_INC) +COMPILE := $(CC) $(CFLAGS) $(FFTW_INC) $(NR34_INC) -NR34_DEPS := third_party/rnnoise/librnnoise.a \ - third_party/libspecbleach/libspecbleach.a +NR34_DEPS := third_party/rnnoise/librnnoise.a \ + third_party/libspecbleach/libspecbleach.a -# avrt нужен т.к. comm.h включает под _WIN32; fftw3f нужен libspecbleach -LINK_LIBS := $(NR34_DEPS) \ - -L$(FFTW_ABS) -lfftw3-3 -lfftw3f-3 \ - -lavrt -lm +# После сборки из исходников import lib называется libfftw3.dll.a → линкуем -lfftw3 +# avrt нужен т.к. comm.h включает под _WIN32 +LINK_LIBS := $(NR34_DEPS) \ + -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) diff --git a/README.md b/README.md index 4c56398..861af64 100644 --- a/README.md +++ b/README.md @@ -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`.