본문 바로가기
기타 공부

[BitNet빌드]BitNet Ninja Build Error 증상 및 해결방법

by 으노으뇨 2026. 3. 22.
728x90
SMALL

안녕하세요 남들은 라즈베리 파이같은 것에 설치를 할때 갤럭시 A35를 이용해서 AI 머신으로

그리고 엣지 AI 등등을 하기위해 터뮤즈를 이용하여 BitNet cpp 를 Ninja를 이용하여 빌드하는 도중

오류가 발생하여 공유 드리고자 합니다.


1. 사건발달

  • A35 에서 이런저런 셋팅을 완료하고 빌드중 오류발생

ninja
-- The C compiler identification is Clang 21.1.8
-- The CXX compiler identification is Clang 21.1.8
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /data/data/com.termux/files/usr/bin/clang - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /data/data/com.termux/files/usr/bin/clang++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE
-- Found Git: /data/data/com.termux/files/usr/bin/git (found version "2.53.0")
-- Found OpenMP_C: -fopenmp=libomp (found version "5.1")
-- Found OpenMP_CXX: -fopenmp=libomp (found version "5.1")
-- Found OpenMP: TRUE (found version "5.1")
-- OpenMP found
-- Using llamafile
-- Warning: ccache not found - consider installing it for faster compilation or disable this warning with GGML_CCACHE=OFF
-- CMAKE_SYSTEM_PROCESSOR: aarch64
-- ARM detected
-- Performing Test COMPILER_SUPPORTS_FP16_FORMAT_I3E
-- Performing Test COMPILER_SUPPORTS_FP16_FORMAT_I3E - Failed
-- Performing Test GGML_COMPILER_SUPPORT_DOTPROD
-- Performing Test GGML_COMPILER_SUPPORT_DOTPROD - Failed
-- Performing Test COMPILER_SUPPORTS_ARMV82_DOTPROD
-- Performing Test COMPILER_SUPPORTS_ARMV82_DOTPROD - Success
-- Configuring done (15.5s)
CMake Error at 3rdparty/llama.cpp/ggml/src/CMakeLists.txt:1335 (add_library):
  Cannot find source file:

    ../../../../include/bitnet-lut-kernels.h

  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .ixx .cppm
  .ccm .cxxm .c++m .h .hh .h++ .hm .hpp .hxx .in .txx .f .F .for .f77 .f90
  .f95 .f03 .hip .ispc


CMake Error at 3rdparty/llama.cpp/ggml/src/CMakeLists.txt:1335 (add_library):
  No SOURCES given to target: ggml


CMake Generate step failed.  Build files cannot be regenerated correctly.
ninja: error: loading 'build.ninja': No such file or directory

2. 원인 

빌드중 bitnet-lut-kernels.h이 파일에 대해서 없다고 뜨는 오류다.

정확한 원인: spm-headers/bitnet-lut-kernels.h는 ‘진짜 파일’이 아니라 깨진 심볼릭 링크였기 때문입니다.

실제 파일이 아니라, 다음과 같은 symlink(링크 파일)

~/projects/BitNet $ find . -name "bitnet-lut-kernels.h" ./3rdparty/llama.cpp/spm-headers/bitnet-lut-kernels.h

~/projects/BitNet $ find . -name "bitnet-lut-kernels.h" 
(결과)./3rdparty/llama.cpp/spm-headers/bitnet-lut-kernels.h

이렇게 파일을 검색해보니 있다고 나타났다. 그래서 아그냥 저기위치에 복사해놓자! 생각을하고

~/projects/BitNet $ cp 3rdparty/llama.cpp/spm-headers/bitnet-lut-kernels.h include/

유령파일이었던것!!!

>> cp: cannot stat '3rdparty/llama.cpp/spm-headers/bitnet-lut-kernels.h': No such file or directory


find는 왜 찾았나? (겉모습만 보기 때문에)
이 명령은 파일 이름만 보면 찾습니다.
이게 진짜 regular file인지 깨진 링크인지 링크 대상이 없는지 상관없이
그냥 이름이 bitnet-lut-kernels.h인 엔트리면 표시합니다.
그래서 find에는 나왔습니다.


cp는 왜 실패했나? (링크를 따라가서 진짜 파일 내용을 복사해야 하기 때문에)

cp는 기본적으로: 링크 자체를 복사하는 게 아니라 링크가 가리키는 실제 파일의 내용을 읽어서 복사합니다.
그런데: ../../../include/bitnet-lut-kernels.h 이 진짜 파일이 없었기 때문에, cp는 링크를 따라가다 에러 낸 것입니다.
그래서 정확한 에러 메시지가
cp: cannot stat '3rdparty/llama.cpp/spm-headers/bitnet-lut-kernels.h': No such file or directory
여기서 stat 실패 = 링크가 가리키는 진짜 파일이 없음 → 깨진 링크 → 복사 불가!!


3. 해결방법!!!!

강제

#1. 오염된 지역 소각 및 재건 (Clean Start)
cd ~/projects
rm -rf BitNet  # 아예 싹 밀어버리세요. 미련 갖지 마십시오.

# 메인 레포만 먼저 받습니다.
git clone https://github.com/microsoft/BitNet.git
cd BitNet

#2. 탈영병(서브모듈) 강제 징집 (Force Submodule)
git submodule update --init --recursive

# [확인] 여기서 아래 명령어를 쳤을 때 파일들이 쫙 나와야 합니다.
ls -R 3rdparty/llama.cpp | head -n 20

#3. 설계도(헤더) 수동 이식 (Manual Surgery)
mkdir -p include

# 1) 진짜 헤더 파일들 찾아서 복사 (화살표 링크 무시하고 내용물 복사)
cp 3rdparty/llama.cpp/spm-headers/bitnet-lut-kernels.h include/ 2>/dev/null || find . -name "bitnet-lut-kernels-tl1.h" -exec cp {} include/bitnet-lut-kernels.h \;
cp 3rdparty/llama.cpp/spm-headers/ggml-bitnet.h include/ 2>/dev/null || find . -name "ggml-bitnet.h" -exec cp {} include/ \;
find 3rdparty/llama.cpp -name "gemm-config.h" -exec cp {} include/ \;

# [확인] 이 파일들이 다 있는지 보세요. 하나라도 없으면 빌드 안 됩니다.
ls -l include/bitnet-lut-kernels.h include/ggml-bitnet.h include/gemm-config.h

#4. Clang 21 및 시간 함수 패치 (독기 주입)
# Clang 21의 const 관련 발작 해결
sed -i 's/void ggml_compute_forward_get_rows_i2_s(struct ggml_compute_params/void ggml_compute_forward_get_rows_i2_s(const struct ggml_compute_params/g' 3rdparty/llama.cpp/ggml/src/ggml.c
sed -i 's/void ggml_compute_forward_mul_mat_i2_s(struct ggml_compute_params/void ggml_compute_forward_mul_mat_i2_s(const struct ggml_compute_params/g' 3rdparty/llama.cpp/ggml/src/ggml.c

# Termux 전용 시간 함수 패치
sed -i 's/std::chrono::high_resolution_clock/std::chrono::steady_clock/g' 3rdparty/llama.cpp/common/common.cpp
sed -i 's/std::chrono::high_resolution_clock/std::chrono::steady_clock/g' 3rdparty/llama.cpp/common/log.cpp

#5. 대망의 닌자 빌드 (The Final Charge)
cd ~/projects/BitNet/build

# 1. 찌꺼기 싹 비우기 (진정한 완주를 위해)
rm -rf *

# 2. 설계도 다시 그리기
cmake .. -G "Ninja" \
    -DCMAKE_C_COMPILER=clang \
    -DCMAKE_CXX_COMPILER=clang++ \
    -DBITNET_ARM_DOTPROD=ON \
    -DCMAKE_BUILD_TYPE=Release

# 3. 대망의 '노 빠꾸' 120번 완주 질주!
# 뒤에 아무것도 안 붙여야 모든 타겟을 다 빌드합니다.
echo -e "\e[1;31m[!] 엑시노스 1380 고문 모드 가동... 120번까지 멈추지 않습니다.\e[0m"
ninja

 

이럼 이제 쭈루루룩뜨면서 빌드성공합니다.!!!

 

728x90
LIST

댓글