2017-12-07 29 views
1

우분투 16.04에 LLVM 6을 구축하고 있습니다. lld도 필요합니다. 하지만 내가 무엇을 하든지간에 lld은 빌드/설치하지 않습니다.LLVM 6 트렁크 우분투 빌드 16.04 빌드하지 않음

here에서 다음 지시 사항을 따르십시오. 는 아직도 문서를 읽으 제 1 및 제 2 :

  1. 을 통해 선별.

  2. 설명서를 읽으십시오.

  3. 문서를 읽는 것에 대해 두 번 경고했음을 기억하십시오.

    특히 지정된 상대 경로가 중요합니다.

  4. 체크 아웃 LLVM :

    cd where-you-want-llvm-to-live 
    svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm 
    
  5. 체크 아웃 연타 :

    cd where-you-want-llvm-to-live 
    cd llvm/tools 
    svn co http://llvm.org/svn/llvm-project/cfe/trunk clang 
    
  6. 체크 아웃 추가 연타 도구 [선택] :

    cd where-you-want-llvm-to-live 
    cd llvm/tools/clang/tools 
    svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra 
    
  7. 체크 아웃 LLD 링커 [선택] :

    cd where-you-want-llvm-to-live 
    cd llvm/tools 
    svn co http://llvm.org/svn/llvm-project/lld/trunk lld 
    

다른 옵션 패키지를 다운로드하지 않았습니다. svn 다운로드가 제대로 작동하지 않아 (svn: E000104: Error running context: Connection reset by peer), 자신의 github 미러에서 LLVM, Clang, clang-extralld에 대해 각각 zip을 다운로드했습니다. 이후, 나는 svn을 사용하지 않았다. 예를 들어, clang-tools-extra-master에서 extra으로 폴더의 이름을 변경해야했다.

그런

$ mkdir build; cd build 
$ cmake ../llvm 
$ make 

8시간 대기 후, llvm 소스 폴더의 상위 폴더로 보내고 cd 후, 다음을 실행, 내가 얻을 모든 프로그램 (clang, lli, llc 등) lld 제외. 폴더 build/bin에 나타날 것으로 예상됩니다.

나는 또한 cmake -DLLVM_ENABLE_PROJECTS=llvm/tools/lld ../llvm 옵션을 시도했습니다. (-DLLVM_ENABLE_PROJECTS=lld 양식이 작동하지 않아 동일한 활성화 문제에 대해 장소에서 논의한 곳이 있습니다.)

나는 이미 세 번 조정 해 보았습니다. 컴파일에 너무 많은 시간이 걸리므로, 나는 당신의 도움을 받기로 결정했습니다.

별도의 문제 : 건물에서 링크 단계는 노트북에 12GB RAM + 8.8GB 스왑 공간이 필요합니다. LLVM 빌딩에 실제로 20GB 이상의 RAM이 필요합니까? (나는 다른 모든 전경 앱을 닫았습니다. 특히 firefox)

더 많은 정보가 필요하면 알려주십시오.

+2

링크 단계의 RAM 사용 관련 : 디버그 정보 및 정적 연결 때문입니다. 문제를 완화하기위한 여러 가지 방법에 대한 답변을 참조하십시오. https://stackoverflow.com/a/44808601 – PaulR

+0

@ Paul 링크에 대한 감사 . 내가 다음에 만들 때마다 시도해 볼거야. 나는'make -j 2'를 사용했음을 언급하는 것을 잊었 기 때문에 병렬 링크는 링크가 나타내는 다른 범인이 될 수 있습니다. – codeman48

+1

이제 생각해 보니, 게시물에 언급 된 LLVM_PARALLEL_LINK_JOBS은 닌자와 만 작동 할 것입니다. 하지만 닌자는 그렇지 않으면 잘 작동하므로 시도해볼 수 있습니다. – PaulR

답변

1

우선 평면 소스 디렉토리 레이아웃을 사용하는 경우 LLVM_ENABLE_PROJECTS 옵션이 유용하다고 생각합니다. 귀하가 작성한대로 체크 아웃을 수행하면 귀하의 경우별로 유용하지 않습니다.

또한 @PaulR이 ninja을 사용하는 것에 대해 작성한 것은 매우 좋은 제안입니다. 빌드를 다시 시작할 때 더 빠르고 매우 유용하며 명시 적으로 지정할 필요없이 nproc에 따라 가능한 한 많은 개별 컴파일 작업을 동시에 생성합니다.

빌드 시간이 짧고 링크 시간이 짧으면 BUILD_SHARED_LIBS 옵션을 사용하여 공유 라이브러리 사용 가능 빌드를 사용하도록 설정하는 것이 좋습니다. clang (부트 스트랩 또는 2 단계 구축)를 구축하는

  1. 사용 clang :

    일부 일반적으로 좋은 조언

    는 다음과 같이 요약 할 수있다 here을 찾을 수 있습니다.
  2. 더 빠른 연결 시간은 ld 대신 gold 링커를 사용하십시오.
  3. 은 공유 라이브러리를 생성하는 빌드를 선호합니다.

(당신이 시스템의 패키지 관리자에서 초기 llvm/clang를 설치할 수 있지만) 당신은 지금 점 하나를 건너 뛸 수 있습니다

마지막으로, 당신은 당신이 현재 LLVM_TARGETS_TO_BUILD 옵션을 사용하여 필요한 특정 대상 백엔드 컴파일을 제한 할 수 .

나는이 cmake 구성 trunk 최근 (lld 포함) 구축했습니다 :

[...] 
-DLLVM_ENABLE_LIBCXX=On \ 
-DLIBCXX_ENABLE_EXCEPTIONS=On \ 
-DLIBCXX_ENABLE_RTTI=On \ 
[...] 

을 부트 스트랩 빌드의 경우 : libcxx를 구축해야하는 경우

CC=gcc CXX=g++ \ 
cmake -G Ninja \ 
    -DCMAKE_EXPORT_COMPILE_COMMANDS=On \ 
    -DBUILD_SHARED_LIBS=On \ 

    -DLLVM_ENABLE_ASSERTIONS=On \ 
    -DLLVM_TARGETS_TO_BUILD="X86" \ 
    -DLLVM_ENABLE_SPHINX=Off \ 
    -DLLVM_ENABLE_THREADS=On \ 
    -DLLVM_INSTALL_UTILS=On \ 

    -DCMAKE_BUILD_TYPE=Debug \ 
    [path-to-source-root-dir] 

는 다음과 같은 플래그를 추가 할 수 있습니다 llvm/clanglibc++을 사용하면 위의 명령을 다음과 같이 보완 할 수 있습니다 ($PATHclang이 있음). 환경 변수) :

LLVM_TOOLCHAIN_LIB_DIR=$(llvm-config --libdir) 

LD_FLAGS="" 
LD_FLAGS="${LD_FLAGS} -Wl,-L ${LLVM_TOOLCHAIN_LIB_DIR}" 
LD_FLAGS="${LD_FLAGS} -Wl,-rpath-link ${LLVM_TOOLCHAIN_LIB_DIR}" 
LD_FLAGS="${LD_FLAGS} -lc++ -lc++abi" 

CXX_FLAGS="" 
CXX_FLAGS="${CXX_FLAGS} -stdlib=libc++ -pthread" 

CC=clang CXX=clang++ \ 
cmake -G Ninja \ 
    -DCMAKE_EXPORT_COMPILE_COMMANDS=On \ 
    -DBUILD_SHARED_LIBS=On \ 
    -DLLVM_ENABLE_LIBCXX=On \ 
    -DLLVM_ENABLE_ASSERTIONS=On \ 
    -DLLVM_TARGETS_TO_BUILD="X86" \ 
    -DLLVM_ENABLE_SPHINX=Off \ 
    -DLLVM_ENABLE_THREADS=On \ 
    -DLLVM_INSTALL_UTILS=On \ 
    -DLIBCXX_ENABLE_EXCEPTIONS=On \ 
    -DLIBCXX_ENABLE_RTTI=On \ 
    -DCMAKE_BUILD_TYPE=Debug \ 
    -DCMAKE_CXX_FLAGS="${CXX_FLAGS}" \ 
    -DCMAKE_SHARED_LINKER_FLAGS="${LD_FLAGS}" \ 
    -DCMAKE_MODULE_LINKER_FLAGS="${LD_FLAGS}" \ 
    -DCMAKE_EXE_LINKER_FLAGS="${LD_FLAGS}" \ 
    -DCMAKE_POLICY_DEFAULT_CMP0056=NEW \ 
    -DCMAKE_POLICY_DEFAULT_CMP0058=NEW \ 
    [path-to-source-root-dir] 

또한, 관심의 또 다른 관련 SO 질문은 here를 찾을 수 있습니다.

작성한대로 설명서를 읽은 후 다시 실험하고 설명서를 읽는 것이 좋습니다.

+0

신선한 빌드 폴더에서 (libcxx에 대한 플래그없이) 첫 번째 cmake 구성을 시도했지만 링커 오류가 계속 발생합니다. 무수한 시간에'닌자 (ninja) '를 실행하려고 시도했지만 (각 호출이 일부 파일을 연결 했으므로) [2/200] 표시를 넘지 않습니다.오류는 다음과 같습니다 :'/home/codeman/mydata/local/packages-live/clang-llvm6/llvm/include/llvm/Analysis/DominanceFrontier.h:122 : 'llvm :: DominanceFrontierBase :: DominanceFrontierBase() ' collect2 : 오류 : ld가 1 종료 상태를 반환했습니다. – codeman48

+2

트렁크 작업을 할 때 상황이 때때로 중단됩니다. 'LLVM' 5.0.0을 사용해 볼 의향이 있습니까? 내가 마지막으로 빌드했을 때의 git refs를 찾으려고 노력할 것이다. – compor

+0

이 명령은 clang, clang-extra 및 lld와 함께 LLVM 5.0.0 릴리스에서 작동했습니다! 닌자로 모든 것이 2 시간 만에 완성되었습니다! ('make -j 4 '와 곧 비교할 것이다). @compor 당신은 맞았습니다. LLVM 트렁크는이 시점에서 버그가 있어야합니다. 나는 같은 단계를 밟았고, 그것이 필요한 곳에서 'lld'를 얻었다. 감사! – codeman48