From d85f5958fc1574469fbcb55c9d8d25e0692f6df8 Mon Sep 17 00:00:00 2001 From: Andrew Hundt Date: Wed, 24 Jun 2026 16:57:51 -0400 Subject: [PATCH] build: fix test-runner-nosan link failure (missing lz4/zstd/nomic objects) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The test-runner-nosan target (used by `make test-leak` on macOS for `leaks --atExit`) failed to link with Undefined symbols: _LZ4_compressBound, _LZ4_compress_HC, _LZ4_decompress_safe, _suite_zstd, _cbm_artifact_import, _PRETRAINED_VECTOR_BLOB. Root cause: OBJS_VENDORED_NOSAN in Makefile.cbm omitted the LZ4/ZSTD/nomic objects that OBJS_VENDORED_TEST includes, and the test-runner-nosan target prerequisites/link line missed $(ZSTD_SRCS). Because the LZ4/ZSTD test objects are compiled with $(SANITIZE) (ASan) and ASan replaces malloc (incompatible with the `leaks` tool), add sanitizer-free NOSAN variants ($(NOSAN_DIR)/lz4.o, lz4hc.o, zstd.o) that mirror the existing NOSAN sqlite3/ts_runtime/lsp_all/ preprocessor objects, plus $(UNIXCODER_OBJ) and $(ZSTD_SRCS). Result: build/c/test-runner-nosan now links; `make test-leak` builds and runs. (A separate runtime hang at dump_verify_io_fork_crash_uncommitted_discarded under `leaks --atExit` — a fork+crash+waitpid/leaks interaction — remains and is tracked separately; it is unrelated to this link fix.) Signed-off-by: Andrew Hundt --- Makefile.cbm | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Makefile.cbm b/Makefile.cbm index affbd1a86..facc19ac5 100644 --- a/Makefile.cbm +++ b/Makefile.cbm @@ -588,7 +588,8 @@ $(NOSAN_DIR)/sqlite3.o: $(SQLITE3_SRC) | $(NOSAN_DIR) OBJS_VENDORED_NOSAN = $(MIMALLOC_OBJ_TEST) $(NOSAN_DIR)/sqlite3.o $(TRE_OBJ_TEST) \ $(GRAMMAR_OBJS_NOSAN) $(NOSAN_DIR)/ts_runtime.o \ - $(NOSAN_DIR)/lsp_all.o $(NOSAN_DIR)/preprocessor.o + $(NOSAN_DIR)/lsp_all.o $(NOSAN_DIR)/preprocessor.o \ + $(NOSAN_LZ4_OBJ) $(NOSAN_ZSTD_OBJ) $(UNIXCODER_OBJ) # Vendored LZ4 (test build) LZ4_OBJ_TEST = $(BUILD_DIR)/test_lz4.o $(BUILD_DIR)/test_lz4hc.o @@ -602,6 +603,17 @@ ZSTD_OBJ_TEST = $(BUILD_DIR)/test_zstd.o $(BUILD_DIR)/test_zstd.o: $(CBM_DIR)/vendored/zstd/zstd.c | $(BUILD_DIR) $(CC) -std=c11 -D_DEFAULT_SOURCE -g -O1 $(SANITIZE) -w -I$(CBM_DIR)/vendored/zstd -c -o $@ $< +# Vendored LZ4/zstd (NOSAN build — sanitizer-free so `leaks --atExit` can walk the +# heap on macOS; ASan replaces malloc and is incompatible with the leaks tool). +NOSAN_LZ4_OBJ = $(NOSAN_DIR)/lz4.o $(NOSAN_DIR)/lz4hc.o +NOSAN_ZSTD_OBJ = $(NOSAN_DIR)/zstd.o +$(NOSAN_DIR)/lz4.o: $(CBM_DIR)/vendored/lz4/lz4.c | $(NOSAN_DIR) + $(CC) -std=c11 -D_DEFAULT_SOURCE -g -O1 -w -I$(CBM_DIR) -c -o $@ $< +$(NOSAN_DIR)/lz4hc.o: $(CBM_DIR)/vendored/lz4/lz4hc.c | $(NOSAN_DIR) + $(CC) -std=c11 -D_DEFAULT_SOURCE -g -O1 -w -I$(CBM_DIR)/vendored/lz4 -c -o $@ $< +$(NOSAN_DIR)/zstd.o: $(CBM_DIR)/vendored/zstd/zstd.c | $(NOSAN_DIR) + $(CC) -std=c11 -D_DEFAULT_SOURCE -g -O1 -w -I$(CBM_DIR)/vendored/zstd -c -o $@ $< + # nomic-embed-code pretrained vector blob UNIXCODER_OBJ = $(BUILD_DIR)/unixcoder_blob.o $(UNIXCODER_OBJ): $(UNIXCODER_BLOB_SRC) vendored/nomic/code_vectors.bin | $(BUILD_DIR) @@ -616,10 +628,10 @@ $(BUILD_DIR)/test-runner: $(ALL_TEST_SRCS) $(PROD_SRCS) $(EXTRACTION_SRCS) $(AC_ $(OBJS_VENDORED_TEST) \ $(LDFLAGS_TEST) -$(BUILD_DIR)/test-runner-nosan: $(ALL_TEST_SRCS) $(PROD_SRCS) $(EXTRACTION_SRCS) $(AC_LZ4_SRCS) $(SQLITE_WRITER_SRC) $(OBJS_VENDORED_NOSAN) | $(BUILD_DIR) $(NOSAN_DIR) +$(BUILD_DIR)/test-runner-nosan: $(ALL_TEST_SRCS) $(PROD_SRCS) $(EXTRACTION_SRCS) $(AC_LZ4_SRCS) $(ZSTD_SRCS) $(SQLITE_WRITER_SRC) $(OBJS_VENDORED_NOSAN) | $(BUILD_DIR) $(NOSAN_DIR) $(CC) $(CFLAGS_NOSAN) -o $@ \ $(ALL_TEST_SRCS) $(PROD_SRCS) \ - $(EXTRACTION_SRCS) $(AC_LZ4_SRCS) $(SQLITE_WRITER_SRC) \ + $(EXTRACTION_SRCS) $(AC_LZ4_SRCS) $(ZSTD_SRCS) $(SQLITE_WRITER_SRC) \ $(OBJS_VENDORED_NOSAN) \ $(LDFLAGS_NOSAN)