Skip to content

Commit 6dd8b10

Browse files
committed
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
1 parent cf47f4a commit 6dd8b10

File tree

13 files changed

+348
-121
lines changed

13 files changed

+348
-121
lines changed

CMakeLists.txt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -537,11 +537,7 @@ endif()
537537
# Examples
538538
# ========
539539
if(LIEF_EXAMPLES)
540-
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/examples/cpp")
541-
542-
if (LIEF_C_API)
543-
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/examples/c")
544-
endif()
540+
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/examples")
545541
endif()
546542

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

597+
install(
598+
FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/FindLIEF.cmake
599+
DESTINATION share/LIEF/cmake
600+
COMPONENT CMakeScripts
601+
)
602+
601603
# Package
602604
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/package")

doc/CMakeLists.txt

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,57 @@ else()
3030
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static
3131
)
3232

33+
###################
34+
# FIND PACKAGE
35+
####################
36+
37+
file(
38+
COPY ${CMAKE_SOURCE_DIR}/examples/cmake/find_package/CMakeLists.txt
39+
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/
40+
)
41+
42+
file(
43+
RENAME ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/CMakeLists.txt
44+
${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/CMakeFindPackage.cmake
45+
)
46+
47+
# Find Package Readme
48+
file(
49+
COPY ${CMAKE_SOURCE_DIR}/examples/cmake/find_package/README.rst
50+
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/
51+
)
52+
53+
file(
54+
RENAME ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/README.rst
55+
${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/ReadmeFindPackage.rst
56+
)
57+
58+
####################
59+
# EXTERNAL PROJECT
60+
####################
61+
62+
file(
63+
COPY ${CMAKE_SOURCE_DIR}/examples/cmake/external_project/CMakeLists.txt
64+
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/
65+
)
66+
67+
file(
68+
RENAME ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/CMakeLists.txt
69+
${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/CMakeExternalProject.cmake
70+
)
71+
72+
file(
73+
COPY ${CMAKE_SOURCE_DIR}/examples/cmake/external_project/README.rst
74+
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/
75+
)
76+
77+
file(
78+
RENAME ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/README.rst
79+
${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static/ReadmeExternalProject.rst
80+
)
81+
82+
####################
83+
3384
file(
3485
COPY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/
3586
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen/html
@@ -80,14 +131,14 @@ else()
80131
DIRECTORY
81132
${CMAKE_CURRENT_BINARY_DIR}/doxygen/html/
82133
DESTINATION
83-
share/doc/lief/doxygen
134+
share/LIEF/doc/doxygen
84135
COMPONENT doc)
85136

86137
install(
87138
DIRECTORY
88139
${CMAKE_CURRENT_BINARY_DIR}/sphinx-doc/
89140
DESTINATION
90-
share/doc/lief/sphinx
141+
share/LIEF/doc/sphinx
91142
COMPONENT doc)
92143

93144
endif()

doc/sphinx/installation.rst

Lines changed: 33 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -151,81 +151,49 @@ and run it:
151151
CMake Integration
152152
-----------------
153153

154-
By using `CMake External Project <https://cmake.org/cmake/help/v3.0/module/ExternalProject.html>`_, integration of LIEF is quiet simple.
155-
156-
This script setup LIEF as an *external project*
157-
158-
.. code-block:: cmake
159-
160-
set(LIEF_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/LIEF")
161-
set(LIEF_INSTALL_DIR "${LIEF_PREFIX}")
162-
set(LIEF_INCLUDE_DIRS "${LIEF_PREFIX}/include")
163-
164-
# LIEF static library
165-
set(LIB_LIEF_STATIC
166-
"${LIEF_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}LIEF${CMAKE_STATIC_LIBRARY_SUFFIX}")
167-
168-
# URL of the LIEF repo (Can be your fork)
169-
set(LIEF_GIT_URL "https://github.com/lief-project/LIEF.git")
170-
171-
# LIEF's version to be used (can be 'master')
172-
set(LIEF_VERSION 0.7.0)
173-
174-
# LIEF compilation config
175-
set(LIEF_CMAKE_ARGS
176-
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
177-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
178-
-DLIEF_DOC=off
179-
-DLIEF_PYTHON_API=off
180-
-DLIEF_EXAMPLES=off
181-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
182-
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
183-
)
184-
185-
ExternalProject_Add(LIEF
186-
PREFIX "${LIEF_PREFIX}"
187-
GIT_REPOSITORY ${LIEF_GIT_URL}
188-
GIT_TAG ${LIEF_VERSION}
189-
INSTALL_DIR ${LIEF_INSTALL_DIR}
190-
CMAKE_ARGS ${LIEF_CMAKE_ARGS}
191-
BUILD_BYPRODUCTS ${LIEF_LIBRARIES}
192-
UPDATE_COMMAND ""
193-
)
154+
155+
External Project
156+
****************
157+
158+
Using `CMake External Project <https://cmake.org/cmake/help/v3.0/module/ExternalProject.html>`_:
159+
160+
.. literalinclude:: _static/CMakeExternalProject.cmake
161+
:language: cmake
162+
:lines: 1-42
194163

195164
And now, to be integrated within a project:
196165

197-
.. code-block:: cmake
166+
.. literalinclude:: _static/CMakeExternalProject.cmake
167+
:language: cmake
168+
:lines: 47-
198169

199-
add_executable(HelloLIEF main.cpp)
170+
For the compilation:
200171

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

207-
# Setup the LIEF include directory
208-
target_include_directories(HelloLIEF
209-
PUBLIC
210-
${LIEF_INCLUDE_DIRS}
211-
)
176+
A *full* example is available in the ``examples/cmake/external_project`` directory.
212177

213-
# Enable C++11
214-
set_property(TARGET HelloLIEF PROPERTY CXX_STANDARD 11)
215-
set_property(TARGET HelloLIEF PROPERTY CXX_STANDARD_REQUIRED ON)
216178

217-
# Link the executable with LIEF
218-
target_link_libraries(HelloLIEF PUBLIC ${LIB_LIEF_STATIC})
179+
find_package()
180+
**************
219181

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

222-
For the compilation:
184+
.. literalinclude:: _static/CMakeFindPackage.cmake
185+
:language: cmake
186+
:lines: 5-19
223187

224-
.. code-block:: console
188+
And now, to be integrated within a project:
189+
190+
.. literalinclude:: _static/CMakeFindPackage.cmake
191+
:language: cmake
192+
:lines: 20-
193+
194+
For the compilation:
225195

226-
$ mkdir build
227-
$ cd build
228-
$ cmake ..
229-
$ make -j3 # and wait...
196+
.. literalinclude:: _static/ReadmeFindPackage.rst
197+
:language: rst
230198

231-
A *full* example is available in the ``examples/cmake`` directory.
199+
A *full* example is available in the ``examples/cmake/find_package`` directory.

examples/CMakeLists.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/cpp")
3+
4+
if (LIEF_C_API)
5+
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/c")
6+
endif()
7+
8+
9+
install(
10+
DIRECTORY python
11+
DESTINATION share/LIEF/examples
12+
COMPONENT examples
13+
)
14+
15+
install(
16+
DIRECTORY cmake
17+
DESTINATION share/LIEF/examples
18+
COMPONENT examples
19+
)
20+
21+
22+

examples/c/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,11 @@ foreach(example ${LIEF_C_EXAMPLES})
7373
endforeach()
7474
endif()
7575

76+
77+
install(
78+
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
79+
DESTINATION share/LIEF/examples/c
80+
COMPONENT examples
81+
FILES_MATCHING REGEX "(.*).(hpp|h|c)$"
82+
)
83+

examples/cmake/README.rst renamed to examples/cmake/external_project/README.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
LIEF CMake Integration Example
2-
==============================
1+
LIEF CMake Integration Example - ExternalProject
2+
================================================
33

44

55
.. code-block:: console
File renamed without changes.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
cmake_minimum_required(VERSION 3.1)
2+
3+
project(CMakeLIEF)
4+
5+
# Use LIEF with 'find_package()'
6+
# ==============================
7+
8+
# Custom path to the LIEF install directory
9+
set(LIEF_ROOT CACHE PATH ${CMAKE_INSTALL_PREFIX})
10+
11+
# Directory to 'FindLIEF.cmake'
12+
list(APPEND CMAKE_MODULE_PATH ${LIEF_ROOT}/share/LIEF/cmake)
13+
14+
# include 'FindLIEF.cmake'
15+
include(FindLIEF)
16+
17+
# Find LIEF
18+
find_package(LIEF REQUIRED COMPONENTS STATIC) # COMPONENTS: <SHARED | STATIC> - Default: STATIC
19+
20+
# Add our executable
21+
# ==================
22+
add_executable(HelloLIEF main.cpp)
23+
24+
if (MSVC)
25+
# Used for the 'and', 'or' ... keywords - See: http://www.cplusplus.com/reference/ciso646/
26+
target_compile_options(HelloLIEF PUBLIC /FIiso646.h)
27+
set_property(TARGET HelloLIEF PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
28+
endif()
29+
30+
# Setup the LIEF include directory
31+
target_include_directories(HelloLIEF
32+
PUBLIC
33+
${LIEF_INCLUDE_DIRS}
34+
)
35+
36+
# Enable C++11
37+
set_property(TARGET HelloLIEF PROPERTY CXX_STANDARD 11)
38+
set_property(TARGET HelloLIEF PROPERTY CXX_STANDARD_REQUIRED ON)
39+
40+
# Link the executable with LIEF
41+
target_link_libraries(HelloLIEF PUBLIC ${LIEF_LIBRARIES})
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
LIEF CMake Integration Example - find_package()
2+
===============================================
3+
4+
5+
.. code-block:: console
6+
7+
$ mkdir build
8+
$ cd build
9+
$ cmake -DLIEF_ROOT=<PATH_TO_LIEF_INSTALL_DIR> .. # By default, LIEF_ROOT=CMAKE_INSTALL_PREFIX
10+
$ make
11+
$ HelloLIEF /bin/ls # or explorer.exe or whatever
12+

examples/cmake/find_package/main.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include <iostream>
2+
#include <LIEF/LIEF.hpp>
3+
4+
int main(int argc, char** argv) {
5+
if (argc != 2) {
6+
std::cerr << "Usage: " << argv[0] << " <binary>" << std::endl;
7+
return 1;
8+
}
9+
10+
LIEF::Binary* binary = LIEF::Parser::parse(argv[1]);
11+
std::cout << *binary << std::endl;
12+
delete binary;
13+
}

examples/cpp/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,11 @@ foreach(example ${LIEF_CPP_EXAMPLES})
7474
target_link_libraries("${output_name}_shared" PUBLIC LIB_LIEF_SHARED)
7575
endforeach()
7676

77+
78+
install(
79+
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
80+
DESTINATION share/LIEF/examples/cpp
81+
COMPONENT examples
82+
FILES_MATCHING REGEX "(.*).(hpp|h|cpp)$"
83+
)
84+

0 commit comments

Comments
 (0)