Skip to content
Permalink
Browse files
Provide 'FindLIEF.cmake' to be easily integrated with CMake
  * Now examples are provided in packages (SDK)
  * Add an examples in the doc to use 'find_packges()' with LIEF
  • Loading branch information
romainthomas committed Jul 19, 2017
1 parent cf47f4a commit 6dd8b10
Show file tree
Hide file tree
Showing 13 changed files with 348 additions and 121 deletions.
@@ -537,11 +537,7 @@ endif()
# Examples
# ========
if(LIEF_EXAMPLES)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/examples/cpp")

if (LIEF_C_API)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/examples/c")
endif()
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/examples")
endif()

# Tests
@@ -598,5 +594,11 @@ install(
COMPONENT headers
FILES_MATCHING REGEX "(.*).(hpp|h|def)$")

install(
FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/FindLIEF.cmake
DESTINATION share/LIEF/cmake
COMPONENT CMakeScripts
)

# Package
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/package")
@@ -30,6 +30,57 @@ else()
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static
)

###################
# FIND PACKAGE
####################

file(
COPY ${CMAKE_SOURCE_DIR}/examples/cmake/find_package/CMakeLists.txt
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/
)

file(
RENAME ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/CMakeLists.txt
${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/CMakeFindPackage.cmake
)

# Find Package Readme
file(
COPY ${CMAKE_SOURCE_DIR}/examples/cmake/find_package/README.rst
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/
)

file(
RENAME ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/README.rst
${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/ReadmeFindPackage.rst
)

####################
# EXTERNAL PROJECT
####################

file(
COPY ${CMAKE_SOURCE_DIR}/examples/cmake/external_project/CMakeLists.txt
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/
)

file(
RENAME ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/CMakeLists.txt
${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/CMakeExternalProject.cmake
)

file(
COPY ${CMAKE_SOURCE_DIR}/examples/cmake/external_project/README.rst
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/
)

file(
RENAME ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/README.rst
${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/ReadmeExternalProject.rst
)

####################

file(
COPY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen/html
@@ -80,14 +131,14 @@ else()
DIRECTORY
${CMAKE_CURRENT_BINARY_DIR}/doxygen/html/
DESTINATION
share/doc/lief/doxygen
share/LIEF/doc/doxygen
COMPONENT doc)

install(
DIRECTORY
${CMAKE_CURRENT_BINARY_DIR}/sphinx-doc/
DESTINATION
share/doc/lief/sphinx
share/LIEF/doc/sphinx
COMPONENT doc)

endif()
@@ -151,81 +151,49 @@ and run it:
CMake Integration
-----------------

By using `CMake External Project <https://cmake.org/cmake/help/v3.0/module/ExternalProject.html>`_, integration of LIEF is quiet simple.

This script setup LIEF as an *external project*

.. code-block:: cmake
set(LIEF_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/LIEF")
set(LIEF_INSTALL_DIR "${LIEF_PREFIX}")
set(LIEF_INCLUDE_DIRS "${LIEF_PREFIX}/include")
# LIEF static library
set(LIB_LIEF_STATIC
"${LIEF_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}LIEF${CMAKE_STATIC_LIBRARY_SUFFIX}")
# URL of the LIEF repo (Can be your fork)
set(LIEF_GIT_URL "https://github.com/lief-project/LIEF.git")
# LIEF's version to be used (can be 'master')
set(LIEF_VERSION 0.7.0)
# LIEF compilation config
set(LIEF_CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DLIEF_DOC=off
-DLIEF_PYTHON_API=off
-DLIEF_EXAMPLES=off
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
)
ExternalProject_Add(LIEF
PREFIX "${LIEF_PREFIX}"
GIT_REPOSITORY ${LIEF_GIT_URL}
GIT_TAG ${LIEF_VERSION}
INSTALL_DIR ${LIEF_INSTALL_DIR}
CMAKE_ARGS ${LIEF_CMAKE_ARGS}
BUILD_BYPRODUCTS ${LIEF_LIBRARIES}
UPDATE_COMMAND ""
)

External Project
****************

Using `CMake External Project <https://cmake.org/cmake/help/v3.0/module/ExternalProject.html>`_:

.. literalinclude:: _static/CMakeExternalProject.cmake
:language: cmake
:lines: 1-42

And now, to be integrated within a project:

.. code-block:: cmake
.. literalinclude:: _static/CMakeExternalProject.cmake
:language: cmake
:lines: 47-

add_executable(HelloLIEF main.cpp)
For the compilation:

if (MSVC)
# Used for the 'and', 'or' ... keywords - See: http://www.cplusplus.com/reference/ciso646/
target_compile_options(HelloLIEF PUBLIC /FIiso646.h)
set_property(TARGET HelloLIEF PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
endif()
.. literalinclude:: _static/ReadmeExternalProject.rst
:language: rst
:lines: 1-42

# Setup the LIEF include directory
target_include_directories(HelloLIEF
PUBLIC
${LIEF_INCLUDE_DIRS}
)
A *full* example is available in the ``examples/cmake/external_project`` directory.

# Enable C++11
set_property(TARGET HelloLIEF PROPERTY CXX_STANDARD 11)
set_property(TARGET HelloLIEF PROPERTY CXX_STANDARD_REQUIRED ON)

# Link the executable with LIEF
target_link_libraries(HelloLIEF PUBLIC ${LIB_LIEF_STATIC})
find_package()
**************

add_dependencies(HelloLIEF LIEF)
Using `CMake find_package() <https://cmake.org/cmake/help/v3.0/command/find_package.html>`_:

For the compilation:
.. literalinclude:: _static/CMakeFindPackage.cmake
:language: cmake
:lines: 5-19

.. code-block:: console
And now, to be integrated within a project:

.. literalinclude:: _static/CMakeFindPackage.cmake
:language: cmake
:lines: 20-

For the compilation:

$ mkdir build
$ cd build
$ cmake ..
$ make -j3 # and wait...
.. literalinclude:: _static/ReadmeFindPackage.rst
:language: rst

A *full* example is available in the ``examples/cmake`` directory.
A *full* example is available in the ``examples/cmake/find_package`` directory.
@@ -0,0 +1,22 @@

add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/cpp")

if (LIEF_C_API)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/c")
endif()


install(
DIRECTORY python
DESTINATION share/LIEF/examples
COMPONENT examples
)

install(
DIRECTORY cmake
DESTINATION share/LIEF/examples
COMPONENT examples
)



@@ -73,3 +73,11 @@ foreach(example ${LIEF_C_EXAMPLES})
endforeach()
endif()


install(
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
DESTINATION share/LIEF/examples/c
COMPONENT examples
FILES_MATCHING REGEX "(.*).(hpp|h|c)$"
)

File renamed without changes.
@@ -1,5 +1,5 @@
LIEF CMake Integration Example
==============================
LIEF CMake Integration Example - ExternalProject
================================================


.. code-block:: console
File renamed without changes.
@@ -0,0 +1,41 @@
cmake_minimum_required(VERSION 3.1)

project(CMakeLIEF)

# Use LIEF with 'find_package()'
# ==============================

# Custom path to the LIEF install directory
set(LIEF_ROOT CACHE PATH ${CMAKE_INSTALL_PREFIX})

# Directory to 'FindLIEF.cmake'
list(APPEND CMAKE_MODULE_PATH ${LIEF_ROOT}/share/LIEF/cmake)

# include 'FindLIEF.cmake'
include(FindLIEF)

# Find LIEF
find_package(LIEF REQUIRED COMPONENTS STATIC) # COMPONENTS: <SHARED | STATIC> - Default: STATIC

# Add our executable
# ==================
add_executable(HelloLIEF main.cpp)

if (MSVC)
# Used for the 'and', 'or' ... keywords - See: http://www.cplusplus.com/reference/ciso646/
target_compile_options(HelloLIEF PUBLIC /FIiso646.h)
set_property(TARGET HelloLIEF PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
endif()

# Setup the LIEF include directory
target_include_directories(HelloLIEF
PUBLIC
${LIEF_INCLUDE_DIRS}
)

# Enable C++11
set_property(TARGET HelloLIEF PROPERTY CXX_STANDARD 11)
set_property(TARGET HelloLIEF PROPERTY CXX_STANDARD_REQUIRED ON)

# Link the executable with LIEF
target_link_libraries(HelloLIEF PUBLIC ${LIEF_LIBRARIES})
@@ -0,0 +1,12 @@
LIEF CMake Integration Example - find_package()
===============================================


.. code-block:: console
$ mkdir build
$ cd build
$ cmake -DLIEF_ROOT=<PATH_TO_LIEF_INSTALL_DIR> .. # By default, LIEF_ROOT=CMAKE_INSTALL_PREFIX
$ make
$ HelloLIEF /bin/ls # or explorer.exe or whatever
@@ -0,0 +1,13 @@
#include <iostream>
#include <LIEF/LIEF.hpp>

int main(int argc, char** argv) {
if (argc != 2) {
std::cerr << "Usage: " << argv[0] << " <binary>" << std::endl;
return 1;
}

LIEF::Binary* binary = LIEF::Parser::parse(argv[1]);
std::cout << *binary << std::endl;
delete binary;
}
@@ -74,3 +74,11 @@ foreach(example ${LIEF_CPP_EXAMPLES})
target_link_libraries("${output_name}_shared" PUBLIC LIB_LIEF_SHARED)
endforeach()


install(
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
DESTINATION share/LIEF/examples/cpp
COMPONENT examples
FILES_MATCHING REGEX "(.*).(hpp|h|cpp)$"
)

0 comments on commit 6dd8b10

Please sign in to comment.