Sto usando LLVM/Clang nel mio progetto C++. Posso costruire ed eseguire tutto bene con un Makefile.Aggiunta di LLVM al mio progetto Cmake: Perché ci sono percorsi codificati nel file Cmake di LLVM?
Ora sto cercando di passare a Cmake e non riesco a far funzionare le cose. Lascia che ti spieghi cosa ho fatto.
Sto seguendo questo tutorial:
http://llvm.org/docs/CMake.html#embedding
Un frammento di pertinenza da tale pagina web è:
From LLVM 3.5 onwards both the CMake and autoconf/Makefile build systems export LLVM libraries as importable CMake targets.
Grande! Vado a scaricare LLVM 3.5 e dovrei essere a posto. Sono andato alla pagina di download:
http://llvm.org/releases/download.html
e scaricato i binari precompilati per Clang per Ubuntu 14.04 Linux.
Poi, ho aggiunto il seguente al mio CMakeLists.txt
lima:
find_path (LLVM_DIR LLVM-Config.cmake
/home/dev/Downloads/clang+llvm-3.5.0-x86_64-linux-gnu/share/llvm/cmake
)
message(STATUS "LLVM_DIR = ${LLVM_DIR}")
find_package(LLVM REQUIRED CONFIG)
(Questo è lo stesso come il tutorial, tranne che ho impostato LLVM_DIR
dal momento che è attualmente in una posizione non-standard.)
Quando eseguo cmake
, ottengo il seguente errore:
[[email protected]:/path/to/project/build (develop)] $ cmake ..
-- LLVM_DIR = /home/dev/Downloads/clang+llvm-3.5.0-x86_64-linux-gnu/share/llvm/cmake
CMake Error at /home/dev/Downloads/clang+llvm-3.5.0-x86_64-linux-gnu/share/llvm/cmake/LLVMConfig.cmake:50 (include):
include could not find load file:
/home/ben/development/llvm/3.5/final/Phase3/Release/llvmCore-3.5.0-final.install/share/llvm/cmake/LLVMExports.cmake
Call Stack (most recent call first):
CMakeLists.txt:14 (find_package)
CMake Error at /home/dev/Downloads/clang+llvm-3.5.0-x86_64-linux-gnu/share/llvm/cmake/LLVMConfig.cmake:53 (include):
include could not find load file:
/home/ben/development/llvm/3.5/final/Phase3/Release/llvmCore-3.5.0-final.install/share/llvm/cmake/LLVM-Config.cmake
Call Stack (most recent call first):
CMakeLists.txt:14 (find_package)
Così cmake sembra trovare il file cmake di LLVM, ma cmake si lamenta di un percorso che inizia con /home/ben/
.
Infatti, sembra che il file LLVMConfig.cmake
di LLVM presenti alcuni percorsi assoluti che non sono rilevanti per la mia macchina. Per esempio:
[[email protected]:~/Downloads/clang+llvm-3.5.0-x86_64-linux-gnu ] $ head ./share/llvm/cmake/LLVMConfig.cmake
# This file provides information and services to the final user.
set(LLVM_INSTALL_PREFIX "/home/ben/development/llvm/3.5/final/Phase3/Release/llvmCore-3.5.0-final.install")
set(LLVM_VERSION_MAJOR 3)
set(LLVM_VERSION_MINOR 5)
set(LLVM_VERSION_PATCH 0)
set(LLVM_PACKAGE_VERSION 3.5.0)
set(LLVM_COMMON_DEPENDS)
Chi è ben
e che cosa sta facendo in questo file? Si presenta in pochi altri posti:
[[email protected]:~/Downloads/clang+llvm-3.5.0-x86_64-linux-gnu ] $ grep ben ./share/llvm/cmake/LLVMConfig.cmake
set(LLVM_INSTALL_PREFIX "/home/ben/development/llvm/3.5/final/Phase3/Release/llvmCore-3.5.0-final.install")
set(LLVM_INCLUDE_DIRS "/home/ben/development/llvm/3.5/final/Phase3/Release/llvmCore-3.5.0-final.install/include")
set(LLVM_LIBRARY_DIRS "/home/ben/development/llvm/3.5/final/Phase3/Release/llvmCore-3.5.0-final.install/lib")
set(LLVM_CMAKE_DIR "/home/ben/development/llvm/3.5/final/Phase3/Release/llvmCore-3.5.0-final.install/share/llvm/cmake")
set(LLVM_TOOLS_BINARY_DIR "/home/ben/development/llvm/3.5/final/Phase3/Release/llvmCore-3.5.0-final.install/bin")
Inutile dire che questi percorsi non esistono sulla mia macchina. Sono confuso sul motivo per cui questi file hanno questi percorsi in loro? Devo eseguire uno strumento o qualcosa per cambiare questi percorsi per la mia macchina? O devo cambiarli tutti manualmente?
EDIT: Per curiosità, ho cambiato manualmente tutti quei percorsi per puntare a percorsi sulla mia macchina:
[[email protected]:~/Downloads/clang+llvm-3.5.0-x86_64-linux-gnu/share/llvm/cmake ] $ sed -i -e's/.home.ben.development.llvm.3.5.final.Phase3.Release.llvmCore-3.5.0-final.install/\/home\/dev\/Downloads\/clang+llvm-3.5.0-x86_64-linux-gnu/g' *
Dopo di che, cmake non è più lamentato e la mia generazione ha proceduto.
Vorrei ancora sapere perché ho avuto bisogno di farlo.
credo che scrivere un FindLlvm.cmake basato su 'llvm-config' per un out-of-source dovrebbe andare bene; e l'unica preoccupazione è che dovresti passare il percorso di 'llvm-config' –