diff --git a/CMakeLists.txt b/CMakeLists.txt index 94ebb8def..26f05685b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -133,6 +133,20 @@ file(WRITE ${CMAKE_BINARY_DIR}/generated/hrx_archs.h "static const char* const kHrxGgufArchs[] = {\n${_onebit_archs}};\n") set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/registry/architectures.json) set_target_properties(onebit PROPERTIES OUTPUT_NAME 1bit) + +# engine#1993: `1bit` is the OUTPUT NAME, not a target -- the target is `onebit`. With the MAKEFILE generator (CMake's +# default) the output file `1bit` in the build directory makes `--target 1bit` a satisfied FILE rule, so the command prints +# nothing, exits 0 and builds nothing while a stale binary keeps its old timestamp: a typo that succeeds, which is the +# failure this fleet pays for most. Ninja errors on that command already (`unknown target '1bit'`), because it has no file +# rules -- so this refusal is added ONLY for the Makefile generator: a custom target with that name is a second rule for an +# output `onebit` already produces, which ninja rejects outright ("multiple rules generate 1bit") and Makefile absorbs as a +# phony. Deliberately not an alias: an alias that built `onebit` would keep the wrong name in everyone's fingers and logs. +if(CMAKE_GENERATOR MATCHES "Makefiles") + add_custom_target(1bit + COMMAND ${CMAKE_COMMAND} -E echo "error: the build target is onebit; 1bit is only its output file name. Nothing was built. Use: cmake --build --target onebit" + COMMAND ${CMAKE_COMMAND} -E false + VERBATIM) +endif() target_link_libraries(onebit PRIVATE nlohmann_json::nlohmann_json httplib::httplib Threads::Threads) # ── The chat-template renderer (engine #963, docs/npu-chat-template.md) ──────