Compile rnnoise and libspecbleach directly into obj_win/ for Windows

Sub-make of third_party/ reported 'up to date' when Linux ELF objects
were present from a prior host build, causing the linker to receive
ELF archives instead of PE/COFF and producing undefined reference errors.

Fix: compile rnnoise and libspecbleach sources directly into obj_win/
with explicit pattern rules, producing lib_win/librnnoise.a and
lib_win/libspecbleach.a. These are fully isolated from third_party/
and never conflict with the Linux build artifacts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Uladzimir Karpenka 2026-06-02 13:17:32 +03:00
parent d997990ceb
commit b7d156ea40

View File

@ -82,17 +82,62 @@ SOURCES = \
OBJS := $(addprefix $(OBJDIR)/, $(SOURCES:.c=.o)) OBJS := $(addprefix $(OBJDIR)/, $(SOURCES:.c=.o))
# ── NR3/NR4: исходники third-party ────────────────────────────────────────────
#
# Компилируем rnnoise и libspecbleach напрямую в obj_win/, минуя их sub-make.
# Это исключает конфликт с Linux-сборкой: third_party/*.a содержат ELF-объекты,
# и если они "свежее" исходников, sub-make считает их up-to-date и не пересобирает.
RNNOISE_DIR := third_party/rnnoise
SPECBLEACH_DIR := third_party/libspecbleach
RNNOISE_SRCS := \
src/denoise.c src/celt_lpc.c src/kiss_fft.c src/nnet.c \
src/nnet_default.c src/parse_lpcnet_weights.c src/pitch.c \
src/rnn.c src/rnnoise_data.c \
src/rnnoise_data_1.c src/rnnoise_data_2.c src/rnnoise_data_3.c \
src/rnnoise_data_4.c src/rnnoise_data_5.c src/rnnoise_data_6.c \
src/rnnoise_tables.c
SPECBLEACH_SRCS := \
src/processors/specbleach_adenoiser.c \
src/processors/specbleach_denoiser.c \
src/processors/adaptivedenoiser/adaptive_denoiser.c \
src/shared/gain_estimation/gain_estimators.c \
src/shared/noise_estimation/adaptive_noise_estimator.c \
src/shared/pre_estimation/absolute_hearing_thresholds.c \
src/shared/pre_estimation/critical_bands.c \
src/shared/pre_estimation/masking_estimator.c \
src/shared/pre_estimation/noise_scaling_criterias.c \
src/shared/pre_estimation/spectral_smoother.c \
src/shared/pre_estimation/transient_detector.c \
src/shared/post_estimation/noise_floor_manager.c \
src/shared/post_estimation/postfilter.c \
src/shared/post_estimation/spectral_whitening.c \
src/shared/utils/denoise_mixer.c \
src/shared/utils/general_utils.c \
src/shared/utils/spectral_features.c \
src/shared/utils/spectral_utils.c \
src/shared/stft/stft_processor.c \
src/shared/stft/fft_transform.c \
src/shared/stft/stft_buffer.c \
src/shared/stft/stft_windows.c
RNNOISE_OBJS := $(addprefix $(OBJDIR)/rnnoise/, $(RNNOISE_SRCS:.c=.o))
SPECBLEACH_OBJS := $(addprefix $(OBJDIR)/specbleach/, $(SPECBLEACH_SRCS:.c=.o))
RNNOISE_LIB := $(OUTDIR)/librnnoise.a
SPECBLEACH_LIB := $(OUTDIR)/libspecbleach.a
# ── Флаги компиляции ────────────────────────────────────────────────────────── # ── Флаги компиляции ──────────────────────────────────────────────────────────
NR34_INC := -I third_party/rnnoise/include -I third_party/libspecbleach/include NR34_INC := -I$(RNNOISE_DIR)/include -I$(SPECBLEACH_DIR)/include
FFTW_INC := -I$(FFTW_INST)/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 \ NR34_DEPS := $(RNNOISE_LIB) $(SPECBLEACH_LIB)
third_party/libspecbleach/libspecbleach.a
# После сборки из исходников import lib называется libfftw3.dll.a → линкуем -lfftw3
# avrt нужен т.к. comm.h включает <avrt.h> под _WIN32 # avrt нужен т.к. comm.h включает <avrt.h> под _WIN32
LINK_LIBS := $(NR34_DEPS) \ LINK_LIBS := $(NR34_DEPS) \
-L$(FFTW_INST)/lib -lfftw3 -lfftw3f \ -L$(FFTW_INST)/lib -lfftw3 -lfftw3f \
@ -177,20 +222,24 @@ $(FFTW_LIB_F): $(FFTW_BUILD_F)/Makefile $(FFTW_LIB_D)
third-party: $(NR34_DEPS) third-party: $(NR34_DEPS)
third_party/rnnoise/librnnoise.a: $(RNNOISE_LIB): $(RNNOISE_OBJS) | $(OUTDIR)
@echo ">>> Собираем rnnoise для Windows..." $(AR) rv $@ $^
$(MAKE) -C third_party/rnnoise \ $(RANLIB) $@
CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \
CFLAGS="$(CFLAGS) -Iinclude -Isrc"
# libspecbleach/Makefile жёстко вызывает pkg-config через FFTWINCLUDE=`...` $(SPECBLEACH_LIB): $(SPECBLEACH_OBJS) | $(OUTDIR)
# и использует результат только в CFLAGS?= — переопределяем CFLAGS целиком, $(AR) rv $@ $^
# чтобы обойти pkg-config и прописать путь к нашему FFTW вручную. $(RANLIB) $@
third_party/libspecbleach/libspecbleach.a: $(FFTW_LIB_D)
@echo ">>> Собираем libspecbleach для Windows..." # % в GNU make совпадает через '/', поэтому паттерн покрывает вложенные пути
$(MAKE) -C third_party/libspecbleach \ $(OBJDIR)/rnnoise/%.o: $(RNNOISE_DIR)/%.c
CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \ @mkdir -p $(@D)
CFLAGS="$(CFLAGS) -I$(FFTW_INST)/include -Iinclude -Isrc -Isrc/shared" $(CC) $(CFLAGS) -I$(RNNOISE_DIR)/include -I$(RNNOISE_DIR)/src -c -o $@ $<
$(OBJDIR)/specbleach/%.o: $(SPECBLEACH_DIR)/%.c | $(FFTW_LIB_D)
@mkdir -p $(@D)
$(CC) $(CFLAGS) -I$(FFTW_INST)/include \
-I$(SPECBLEACH_DIR)/include -I$(SPECBLEACH_DIR)/src -I$(SPECBLEACH_DIR)/src/shared \
-c -o $@ $<
# ── Основная библиотека ─────────────────────────────────────────────────────── # ── Основная библиотека ───────────────────────────────────────────────────────
@ -231,8 +280,6 @@ $(OBJDIR)/%.o: %.c | $(OBJDIR) $(FFTW_LIB_D)
clean: clean:
-rm -rf $(OBJDIR) $(OUTDIR) -rm -rf $(OBJDIR) $(OUTDIR)
-$(MAKE) -C third_party/rnnoise clean
-$(MAKE) -C third_party/libspecbleach clean
# distclean удаляет собранный и скачанный FFTW — при следующем запуске пересоберётся # distclean удаляет собранный и скачанный FFTW — при следующем запуске пересоберётся
distclean: clean distclean: clean