[입 개발] 앗, Redis 가 빌드가 안되는 것 같아요? 의 대처법

최근에, Redis 빌드 관련 이슈가 issues 에 많이 올라오거나, 이전 스레드에 활발하게 글이 올라왔습니다.

(사실 몇개 안되지만…) 왜, 그런지와 어떻게 해결하면 되는지에 대해서 간단하게 증상과 함께 설명하고자 합니다.

1. “__sync_add_and_fetch_4” 관련 이슈

전에 한번 소개하기도 했던 해당 버그는 CFLAGS 등에 -march=i686 또는 -march=native를 추가하면 해결이 됩니다. 그런데 make 32bit 로 32bit 모드로 강제로 빌드하실려는 분들은 해당 옵션을 추가해도 같은 에러를 만나게 됩니다. 왜 그럴까요? 라고 잠시만 고민해보면 32bit 라벨은 다음과 같이 되어 있습니다.

32bit:
    @echo ""
    @echo "WARNING: if it fails under Linux you probably need to install libc6-dev-i386"
    @echo ""
    $(MAKE) CFLAGS="-m32" LDFLAGS="-m32"

 

이유는 간단합니다. 위에 CFLAGS를 덮어쓰는 코드가 보이시나요? 넵 src/Makefile에 추가한 CFLAGS가 32bit 라벨을 이용해서 빌드하면 사라지기 때문에 계속 빌드가 안되는 것입니다.  그냥 다음과 같이 바꿔주시고 make 32bit 하시면 됩니다.

32bit:
    @echo ""
    @echo "WARNING: if it fails under Linux you probably need to install libc6-dev-i386"
    @echo ""
    $(MAKE) CFLAGS="-m32 -march=i686" LDFLAGS="-m32"

2. make를 하니 jemalloc.h 헤더를 찾을 수가 없습니다. deps 폴더에서 각각 빌드를 해줘야만 제대로 빌드가 됩니다.

해당 버그는 redis에서 Make 실행시에 .make-prerequisites 과 .make-setting 을 만들어두기 때문에 발생합니다. 정상적으로 최초에 빌드가 되면 아무 문제가 없는데, 어떤 이유든 make도중에 실패하게 되면(사용자의 강제 종료 포함), 해당 파일이 생기고, deps 에 있는 실제 파일들을 빌드하려고 재시도를 하지 않는게 해당 이유입니다. 간단하게 해당 파일들을 지워주고 make를 하셔도 되고 make distclean 이라는 옵션이 이미 있어서 이걸 이용하셔도 됩니다.

 


make distclean