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:
parent
d997990ceb
commit
b7d156ea40
@ -82,17 +82,62 @@ SOURCES = \
|
||||
|
||||
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
|
||||
|
||||
COMPILE := $(CC) $(CFLAGS) $(FFTW_INC) $(NR34_INC)
|
||||
|
||||
NR34_DEPS := third_party/rnnoise/librnnoise.a \
|
||||
third_party/libspecbleach/libspecbleach.a
|
||||
NR34_DEPS := $(RNNOISE_LIB) $(SPECBLEACH_LIB)
|
||||
|
||||
# После сборки из исходников import lib называется libfftw3.dll.a → линкуем -lfftw3
|
||||
# avrt нужен т.к. comm.h включает <avrt.h> под _WIN32
|
||||
LINK_LIBS := $(NR34_DEPS) \
|
||||
-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/rnnoise/librnnoise.a:
|
||||
@echo ">>> Собираем rnnoise для Windows..."
|
||||
$(MAKE) -C third_party/rnnoise \
|
||||
CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \
|
||||
CFLAGS="$(CFLAGS) -Iinclude -Isrc"
|
||||
$(RNNOISE_LIB): $(RNNOISE_OBJS) | $(OUTDIR)
|
||||
$(AR) rv $@ $^
|
||||
$(RANLIB) $@
|
||||
|
||||
# libspecbleach/Makefile жёстко вызывает pkg-config через FFTWINCLUDE=`...`
|
||||
# и использует результат только в CFLAGS?= — переопределяем CFLAGS целиком,
|
||||
# чтобы обойти pkg-config и прописать путь к нашему FFTW вручную.
|
||||
third_party/libspecbleach/libspecbleach.a: $(FFTW_LIB_D)
|
||||
@echo ">>> Собираем libspecbleach для Windows..."
|
||||
$(MAKE) -C third_party/libspecbleach \
|
||||
CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \
|
||||
CFLAGS="$(CFLAGS) -I$(FFTW_INST)/include -Iinclude -Isrc -Isrc/shared"
|
||||
$(SPECBLEACH_LIB): $(SPECBLEACH_OBJS) | $(OUTDIR)
|
||||
$(AR) rv $@ $^
|
||||
$(RANLIB) $@
|
||||
|
||||
# % в GNU make совпадает через '/', поэтому паттерн покрывает вложенные пути
|
||||
$(OBJDIR)/rnnoise/%.o: $(RNNOISE_DIR)/%.c
|
||||
@mkdir -p $(@D)
|
||||
$(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:
|
||||
-rm -rf $(OBJDIR) $(OUTDIR)
|
||||
-$(MAKE) -C third_party/rnnoise clean
|
||||
-$(MAKE) -C third_party/libspecbleach clean
|
||||
|
||||
# distclean удаляет собранный и скачанный FFTW — при следующем запуске пересоберётся
|
||||
distclean: clean
|
||||
|
||||
Loading…
Reference in New Issue
Block a user