mirror of
https://github.com/facebook/rocksdb.git
synced 2026-07-07 14:47:40 +08:00
f6fabdb64f
Summary: Local Make builds silently reuse object files even when build parameters (DEBUG_LEVEL, sanitizers, ASSERT_STATUS_CHECKED, RTTI, etc.) change, since all object files share the same paths. This leads to confusing linker errors, sanitizer false negatives, ODR violations, and "phantom" bugs that are easy to miss -- a pitfall for humans and especially for AI agents driving builds non-interactively. This change improves the Make experience on three fronts: 1. Build-parameter change detection in the Makefile. After flags are fully resolved, we hash the effective compile/link inputs (CC|CXX|CFLAGS|CXXFLAGS|LDFLAGS|EXEC_LDFLAGS) into a per-OBJ_DIR .build_signature stamp and compare against the previous build: - Default: stop with a clear error when parameters changed. This is optimized for the expert who might not intend a full rebuild, and for avoiding CI inefficiency. - AUTO_CLEAN=1: automatically run clean-rocks and proceed. - ALLOW_BUILD_PARAMETER_CHANGE=1: skip the check (e.g. intentionally mixing DEBUG_LEVEL=1 and DEBUG_LEVEL=2 objects). The check is skipped for dry runs (-n) and for non-building / self-cleaning targets (clean*, format, check-*, tags, gen-pc, check-progress, watch-log, release, coverage, the asan_*/ubsan_* variants, etc.). make_config.mk is removed only by the top-level `clean` target, not by clean-rocks, so the auto-clean does not delete the make_config.mk already included by the running make. The signature is removed last in clean-rocks so an interrupted clean keeps change detection meaningful. 3. New build_tools/rockstest.sh and build_tools/rocksptest.sh helpers that build and run unit tests in one step. They set AUTO_CLEAN=1 and build with -j<NCORES> (computed like the Makefile). rocksptest.sh runs one or more binaries under the checked-in gtest-parallel (sharing one parallel worker pool); rockstest.sh runs a single binary directly for a small number of cases. Both reject a leading-option first argument; `rockstest.sh install` writes ~/bin/rockstest and ~/bin/rocksptest shims that defer to the in-tree scripts (with a friendly message when run outside a source root). This is a big win for AI-agent workflows: one command instead of a separate `make` then test-run invocation, removing the overhead of monitoring two long commands, while avoiding serial builds and serial test execution. 4. CLAUDE.md guidance updated to recommend AUTO_CLEAN=1 for manual make invocations and the rocks(p)test.sh helpers for running tests Although there might be drive to consolidate around the BUCK build for internal use, I'll note that last I checked it was around ~20 minutes to run all the unit tests under buck and ~2 minutes under `make check`. Bonus: the first revision of this had copyright/license mistakes, and this change corrects similar errors elsewhere, with CLAUDE.md advice updated. Pull Request resolved: https://github.com/facebook/rocksdb/pull/14883 Test Plan: Manual verification of the Makefile change detection: - Confirmed the resolved-flags hash is deterministic across runs for the same goal, and differs between configs (e.g. default/shared vs static_lib, and with/without ASSERT_STATUS_CHECKED). - Unchanged parameters: rebuild does not error. - Changed parameters: errors by default; AUTO_CLEAN=1 runs clean-rocks and proceeds; ALLOW_BUILD_PARAMETER_CHANGE=1 bypasses the check. - Dry runs (make -n) and exempt targets (e.g. `make check-progress`, list_all_tests, gen-pc) do not trip the check and leave the stamp untouched. - Reproduced the ASSERT_STATUS_CHECKED=1 auto-clean path end to end and confirmed it no longer fails with "No rule to make target 'make_config.mk'"; verified `make clean` removes make_config.mk while `clean-rocks` does not, and that the signature is deleted as the final clean-rocks step. Manual verification of the helper scripts: - shellcheck-clean and `bash -n` pass for both scripts. - Usage/guard behavior: missing argument and leading-option first argument are rejected with a clear message. - `rockstest.sh install` (validated against a temp HOME) generates both shims; running a shim outside a source root prints "(Not in a rocksdb source root directory?)" and exits non-zero. - rocksptest.sh argument splitting verified for single binary, multiple binaries, and binaries followed by gtest-parallel/test args. - .gitignore patterns verified with `git check-ignore` for .build_signature (root and jl/jls) and build_tools/__pycache__/. Reviewed By: xingbowang Differential Revision: D109713512 Pulled By: pdillinger fbshipit-source-id: a801d29afa91f53a2dce717db9fe5e5d485cc154
117 lines
1.3 KiB
Plaintext
117 lines
1.3 KiB
Plaintext
make_config.mk
|
|
rocksdb.pc
|
|
.build_signature
|
|
build_tools/__pycache__/
|
|
|
|
*.a
|
|
*.arc
|
|
*.d
|
|
*.dylib*
|
|
*.gcda
|
|
*.gcno
|
|
*.o
|
|
*.o.tmp
|
|
*.so
|
|
*.so.*
|
|
*_test
|
|
*_bench
|
|
*_stress
|
|
*.out
|
|
*.class
|
|
*.jar
|
|
*.*jnilib*
|
|
*.d-e
|
|
*.o-*
|
|
*.swp
|
|
*~
|
|
*.vcxproj
|
|
*.vcxproj.filters
|
|
*.sln
|
|
*.cmake
|
|
.watchmanconfig
|
|
CMakeCache.txt
|
|
CMakeFiles/
|
|
build/
|
|
|
|
ldb
|
|
manifest_dump
|
|
sst_dump
|
|
blob_dump
|
|
block_cache_trace_analyzer
|
|
tools/block_cache_analyzer/*.pyc
|
|
column_aware_encoding_exp
|
|
util/build_version.cc
|
|
build_tools/VALGRIND_LOGS/
|
|
coverage/COVERAGE_REPORT
|
|
.gdbhistory
|
|
.gdb_history
|
|
package/
|
|
unity.a
|
|
tags
|
|
etags
|
|
GPATH
|
|
GRTAGS
|
|
GTAGS
|
|
rocksdb_dump
|
|
rocksdb_undump
|
|
db_etc2_test
|
|
trace_analyzer
|
|
block_cache_trace_analyzer
|
|
io_tracer_parser
|
|
.DS_Store
|
|
.vs
|
|
.vscode
|
|
.clangd
|
|
|
|
java/out
|
|
java/target
|
|
java/test-libs
|
|
java/*.log
|
|
java/include/org_rocksdb_*.h
|
|
|
|
.idea/
|
|
*.iml
|
|
|
|
rocksdb.cc
|
|
rocksdb.h
|
|
unity.cc
|
|
java/crossbuild/.vagrant
|
|
.vagrant/
|
|
java/**/*.asc
|
|
java/javadoc
|
|
|
|
scan_build_report/
|
|
t
|
|
LOG
|
|
|
|
db_logs/
|
|
tp2/
|
|
fbcode/
|
|
fbcode
|
|
buckifier/*.pyc
|
|
buckifier/__pycache__
|
|
tools/__pycache__/
|
|
tools/c_api_gen/__pycache__/
|
|
.arcconfig
|
|
|
|
compile_commands.json
|
|
meta_gen_cpp_compile_commands.json
|
|
clang-format-diff.py
|
|
.py3/
|
|
|
|
fuzz/proto/gen/
|
|
fuzz/crash-*
|
|
|
|
cmake-build-*
|
|
third-party/folly/
|
|
.cache
|
|
*.sublime-*
|
|
|
|
# Claude Code local settings
|
|
.claude/settings.local.json
|
|
|
|
tools/__pycache__/
|
|
# Keep documentation trackable even if broader ignores match names like "*_test".
|
|
!docs/
|
|
!docs/**
|