building a pass with cmake

Dear all,

I want to build an LLVM pass by using CMake.

After reading the ralevant part of the documentation (http://llvm.org/releases/3.1/docs/CMake.html#passdev),
I copied the files in the llvm/lib/Transforms/Hello to another folder in order to give a try.
Then I renamed the folder as Hello2.
Then I have changed CMakeLists.txt as following:

cmake_minimum_required(VERSION 2.8)

A convenience variable:

set(LLVM_ROOT “…/llvm_cmake_build” CACHE PATH “Root of LLVM install.”)

A bit of a sanity check:

if( NOT EXISTS ${LLVM_ROOT}/include/llvm )
message(FATAL_ERROR “LLVM_ROOT (${LLVM_ROOT}) is not a valid LLVM install”)
endif()

We incorporate the CMake features provided by LLVM:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} “${LLVM_ROOT}/share/llvm/cmake”)
include(LLVMConfig)

find_package(LLVM)

if( NOT LLVM_FOUND )
message(FATAL_ERROR “LLVM package can’t be found. Set CMAKE_PREFIX_PATH variable to LLVM’s installation prefix.”)
endif()

Define add_llvm_* macro’s.

include(AddLLVM)

add_definitions(${LLVM_DEFINITIONS})
include_directories(${LLVM_INCLUDE_DIRS})
link_directories(${LLVM_LIBRARY_DIRS})

add_llvm_loadable_module( LLVMHello
Hello.cpp
)

Furthermore, I created a separate build and install directories in order to build and install my pass.
cd Hello2_build
cmake …/Hello2 -DCMAKE_INSTALL_PREFIX=…/Hello2_install/

– The C compiler identification is GNU
– The CXX compiler identification is GNU
– Check for working C compiler: /usr/bin/gcc
– Check for working C compiler: /usr/bin/gcc – works
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Check for working CXX compiler: /usr/bin/c++
– Check for working CXX compiler: /usr/bin/c++ – works
– Detecting CXX compiler ABI info
– Detecting CXX compiler ABI info - done
– Configuring done
– Generating done

It seems that cmake is ok. When I run make install, it gives errors (see below) and i think the reason is that it can not find the directory to llvm header files.
I could not figure it out which variable to set and how to use it in order to point the required directory ?
( as in the make pass build which requires LLVM_SRC_ROOT LLVM_OBJ_ROOT variables to be set)

Hello2/Hello.cpp:17:23: error: llvm/Pass.h: No such file or directory
Hello2/Hello.cpp:18:27: error: llvm/Function.h: No such file or directory
Hello2/Hello.cpp:19:38: error: llvm/Support/raw_ostream.h: No such file or directory
Hello2/Hello.cpp:20:32: error: llvm/ADT/Statistic.h: No such file or directory
Hello2/Hello.cpp:21: error: ‘llvm’ is not a namespace-name

Your feedback is very welcome.
Thanks.

erkan diken <erkandiken@gmail.com> writes:

[snip]

It seems that cmake is ok. When I run make install, it gives errors (see
below) and i think the reason is that it can not find the directory to llvm
header files.
I could not figure it out which variable to set and how to use it in order
to point the required directory ?
( as in the make pass build which requires LLVM_SRC_ROOT LLVM_OBJ_ROOT
variables to be set)

Hello2/Hello.cpp:17:23: error: llvm/Pass.h: No such file or directory
Hello2/Hello.cpp:18:27: error: llvm/Function.h: No such file or directory
Hello2/Hello.cpp:19:38: error: llvm/Support/raw_ostream.h: No such file or
directory
Hello2/Hello.cpp:20:32: error: llvm/ADT/Statistic.h: No such file or
directory
Hello2/Hello.cpp:21: error: ‘llvm’ is not a namespace-name
...

Your feedback is very welcome.

I think this is the same problem that was reported here a few weeks
ago. IIRC LLVM_INCLUDE_DIRS and LLVM_LIBRARY_DIRS are wrong after
install. Try with

include_directories( ${LLVM_ROOT}/include )
link_directories( ${LLVM_ROOT}/lib )

Yes, it works. Thanks Oscar.