Skip to content

Commit 55998c8

Browse files
committed
Preliminary addition of external libyaml build.
1 parent 446750f commit 55998c8

File tree

5 files changed

+103
-28
lines changed

5 files changed

+103
-28
lines changed

BUILDING.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,9 @@ QEMU_LD_PREFIX=/usr/s390x-redhat-linux/sys-root/fc40/usr/ qemu-s390x-static ./bu
140140
`cstest` is build together with Capstone by adding the flag `-DCAPSTONE_BUILD_CSTEST`.
141141

142142
The build requires `libyaml`. It is a fairly common package and should be provided by your package manager.
143+
If not present it will attempt to build it from source.
143144

144-
_Note:_ Currently `cstest` us only supported on Linux.
145+
_Note:_ Currently `cstest` is only tested on Linux.
145146

146147
If you run another operation system, please install `cstest_py`.
147148
See `bindings/python/BUILDING.md` for instructions.

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ if(CAPSTONE_BUILD_STATIC_MSVC_RUNTIME)
177177
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
178178
endif()
179179

180+
# The directory for external project patches.
181+
set(EXTERNAL_PROJ_PATCH_DIR ${PROJECT_SOURCE_DIR}/ext_patches/)
182+
180183
## sources
181184
set(SOURCES_ENGINE
182185
cs.c

ext_patches/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Patches for external build dependencies.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
project(libcyaml VERSION 1.4.2 LANGUAGES C)
3+
4+
# Version defines
5+
add_compile_definitions(
6+
VERSION_MAJOR=1
7+
VERSION_MINOR=4
8+
VERSION_PATCH=2
9+
)
10+
11+
# Set output directories
12+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
13+
14+
# Source files
15+
set(LIBCYAML_SRC
16+
${CMAKE_SOURCE_DIR}/src/mem.c
17+
${CMAKE_SOURCE_DIR}/src/free.c
18+
${CMAKE_SOURCE_DIR}/src/load.c
19+
${CMAKE_SOURCE_DIR}/src/save.c
20+
${CMAKE_SOURCE_DIR}/src/util.c
21+
${CMAKE_SOURCE_DIR}/src/utf8.c
22+
)
23+
24+
# Include directories
25+
include_directories(include)
26+
27+
# Find libyaml
28+
if (NOT USE_BUILT_LIBYAML)
29+
find_library(libyaml NAMES libyaml yaml REQUIRED)
30+
endif()
31+
include_directories(${LIBYAML_INCLUDE_DIRS})
32+
link_directories(${LIBYAML_LIBRARY_DIRS})
33+
34+
add_library(cyaml_static STATIC ${LIBCYAML_SRC})

suite/cstest/CMakeLists.txt

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,90 +8,126 @@ endif()
88
include(ExternalProject)
99
set(CMOCKA_LIB_FILE "${CMAKE_CURRENT_BINARY_DIR}/extern/src/cmocka_ext-build/src/libcmocka.a")
1010

11+
# CMocka is the unit testing library we use.
1112
ExternalProject_Add(cmocka_ext
1213
PREFIX extern
1314
URL "https://cmocka.org/files/1.1/cmocka-1.1.7.tar.xz"
1415
URL_HASH SHA256=810570eb0b8d64804331f82b29ff47c790ce9cd6b163e98d47a4807047ecad82
15-
CONFIGURE_COMMAND cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} ../cmocka_ext/
16-
BUILD_COMMAND cmake --build . --config Release
16+
CMAKE_ARGS
17+
-DBUILD_SHARED_LIBS=OFF
18+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
19+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
1720
BUILD_BYPRODUCTS "${CMOCKA_LIB_FILE}"
1821
INSTALL_COMMAND ""
1922
)
23+
set(CMOCKA_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/extern/src/cmocka_ext/include)
24+
add_library(cmocka STATIC IMPORTED)
25+
set_target_properties(cmocka PROPERTIES IMPORTED_LOCATION "${CMOCKA_LIB_FILE}")
2026

21-
set(use_built_libyaml false)
27+
# libyaml is used to parse the test files.
28+
# Normally it can be installed via the package managers,
29+
# but Windows and cross-compile targets might not have it.
30+
# So it builds it optionally as well.
31+
set(USE_BUILT_LIBYAML false)
2232
find_library(libyaml NAMES libyaml yaml)
23-
2433
if (NOT libyaml)
2534
# Build libyaml
26-
set(use_built_libyaml true)
35+
set(USE_BUILT_LIBYAML true)
2736
message("System libyaml: NO - Building it.")
28-
set(LIBYAML_LIB_FILE "${CMAKE_CURRENT_BINARY_DIR}/extern/src/libyaml_ext/src/.libs/libyaml.a")
37+
set(LIBYAML_LIB_FILE "${CMAKE_CURRENT_BINARY_DIR}/extern/src/libyaml_ext-build/libyaml.a")
38+
set(LIBYAML_LIBRARY_DIRS "${CMAKE_CURRENT_BINARY_DIR}/extern/src/libyaml_ext-build/")
39+
set(LIBYAML_INCLUDE_DIRS "${CMAKE_CURRENT_BINARY_DIR}/extern/src/libyaml_ext/include")
2940
ExternalProject_Add(libyaml_ext
3041
PREFIX extern
3142
URL "https://github.com/yaml/libyaml/archive/refs/tags/0.2.5.tar.gz"
3243
URL_HASH SHA256=fa240dbf262be053f3898006d502d514936c818e422afdcf33921c63bed9bf2e
33-
CMAKE_ARGS -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DBUILD_TESTING=OFF
44+
# URL "https://github.com/yaml/libyaml/archive/refs/tags/0.1.7.tar.gz"
45+
# URL_HASH SHA256=e1884d0fa1eec8cf869ac6bebbf25391e81956aa2970267f974a9fa5e0b968e2
46+
CMAKE_ARGS
47+
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
48+
-DBUILD_TESTING=OFF
49+
-DBUILD_SHARED_LIBS=OFF
50+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
51+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
3452
BUILD_BYPRODUCTS "${LIBYAML_LIB_FILE}"
35-
BUILD_IN_SOURCE true
3653
INSTALL_COMMAND ""
3754
)
38-
set(LIBYAML_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/extern/src/libyaml_ext/include)
3955
add_library(libyaml_built STATIC IMPORTED)
4056
set_target_properties(libyaml_built PROPERTIES IMPORTED_LOCATION "${LIBYAML_LIB_FILE}")
57+
set_target_properties(libyaml_built PROPERTIES INCLUDE_DIRECTORIES "${LIBYAML_INCLUDE_DIRS}")
58+
set_target_properties(libyaml_built PROPERTIES LIBRARY_DIRECTORIES "${LIBYAML_LIB_DIR}")
4159
else()
4260
message("System libyaml: YES")
4361
endif()
4462

45-
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
46-
set(LIBCYAML_VARIANT "debug")
47-
else()
48-
set(LIBCYAML_VARIANT "release")
49-
endif()
63+
# Libcyaml is a wrapper library around libyaml.
64+
# It parses the yaml files so we don't have to.
65+
# Sadly it has no CMakeLists.txt. So we patch it into.
66+
set(LIBCYAML_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/extern/src/libcyaml_ext/include")
5067

51-
set(LIBCYAML_LIB_FILE "${CMAKE_CURRENT_BINARY_DIR}/extern/src/libcyaml_ext/build/${LIBCYAML_VARIANT}/libcyaml.a")
68+
set(LIBCYAML_LIB_FILE "${CMAKE_CURRENT_BINARY_DIR}/extern/src/libcyaml_ext-build/lib/libcyaml_static.a")
69+
set(LIBCYAML_LIBRARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/extern/src/libcyaml_ext-build/lib/")
70+
set(LIBCYAML_SRC_DIR "${CMAKE_CURRENT_BINARY_DIR}/extern/src/libcyaml_ext/")
5271
ExternalProject_Add(libcyaml_ext
5372
PREFIX extern
5473
URL "https://github.com/tlsa/libcyaml/archive/refs/tags/v1.4.2.tar.gz"
5574
URL_HASH SHA256=3211b2a0589ebfe02c563c96adce9246c0787be2af30353becbbd362998d16dc
56-
CONFIGURE_COMMAND ""
57-
BUILD_COMMAND make VARIANT=${LIBCYAML_VARIANT} PKG_CONFIG=pkg-config
75+
PATCH_COMMAND cmake -E copy_if_different ${EXTERNAL_PROJ_PATCH_DIR}/libcyaml/CMakeLists.txt ${LIBCYAML_SRC_DIR}
76+
CMAKE_ARGS
77+
-DUSE_BUILT_LIBYAML=${USE_BUILT_LIBYAML}
78+
-DLIBYAML_INCLUDE_DIRS=${LIBYAML_INCLUDE_DIRS}
79+
-DLIBYAML_LIBRARY_DIRS=${LIBYAML_LIBRARY_DIRS}
80+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
81+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
5882
BUILD_BYPRODUCTS "${LIBCYAML_LIB_FILE}"
59-
BUILD_IN_SOURCE true
6083
INSTALL_COMMAND ""
6184
)
62-
set(CMOCKA_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/extern/src/cmocka_ext/include)
63-
set(LIBCYAML_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/extern/src/libcyaml_ext/include)
64-
add_library(cmocka STATIC IMPORTED)
85+
6586
add_library(libcyaml STATIC IMPORTED)
66-
set_target_properties(cmocka PROPERTIES IMPORTED_LOCATION "${CMOCKA_LIB_FILE}")
6787
set_target_properties(libcyaml PROPERTIES IMPORTED_LOCATION "${LIBCYAML_LIB_FILE}")
88+
set_target_properties(libcyaml PROPERTIES INCLUDE_DIRECTORIES "${LIBCYAML_INCLUDE_DIR}")
89+
set_target_properties(libcyaml PROPERTIES LIBRARY_DIRECTORIES "${LIBCYAML_LIBRARY_DIR}")
90+
if (USE_BUILT_LIBYAML)
91+
add_dependencies(libcyaml libyaml_ext)
92+
add_dependencies(libcyaml ${libyaml_built})
93+
target_link_libraries(libcyaml PUBLIC ${libyaml_built})
94+
else()
95+
add_dependencies(libcyaml ${libyaml})
96+
target_link_libraries(libcyaml PUBLIC ${libyaml})
97+
endif()
6898

99+
# The final cstest binary and library.
69100
set(CSTEST_INCLUDE_DIR ${CSTEST_DIR}/include)
70101
file(GLOB CSTEST_SRC ${CSTEST_DIR}/src/*.c)
71102
add_executable(cstest ${CSTEST_SRC})
72103
add_library(libcstest STATIC ${CSTEST_SRC})
104+
73105
add_dependencies(cstest cmocka_ext)
74106
add_dependencies(cstest libcyaml_ext)
75-
if (use_built_libyaml)
76-
target_link_libraries(cstest PUBLIC capstone cmocka libcyaml ${libyaml_built})
77-
target_link_libraries(libcstest PUBLIC capstone cmocka libcyaml ${libyaml_built})
107+
add_dependencies(libcstest cmocka_ext)
108+
add_dependencies(libcstest libcyaml_ext)
109+
110+
if (USE_BUILT_LIBYAML)
111+
target_link_libraries(cstest PUBLIC capstone cmocka libcyaml libyaml_built)
112+
target_link_libraries(libcstest PUBLIC capstone cmocka libcyaml libyaml_built)
78113
else()
79114
target_link_libraries(cstest PUBLIC capstone cmocka libcyaml ${libyaml})
80115
target_link_libraries(libcstest PUBLIC capstone cmocka libcyaml ${libyaml})
81116
endif()
117+
82118
target_include_directories(cstest PRIVATE
83119
${PROJECT_SOURCE_DIR}/include>
84120
${CSTEST_INCLUDE_DIR}
85121
${CMOCKA_INCLUDE_DIR}
86122
${LIBCYAML_INCLUDE_DIR}
87-
${LIBYAML_INCLUDE_DIR}
123+
${LIBYAML_INCLUDE_DIRS}
88124
)
89125
target_include_directories(libcstest PRIVATE
90126
${PROJECT_SOURCE_DIR}/include>
91127
${CSTEST_INCLUDE_DIR}
92128
${CMOCKA_INCLUDE_DIR}
93129
${LIBCYAML_INCLUDE_DIR}
94-
${LIBYAML_INCLUDE_DIR}
130+
${LIBYAML_INCLUDE_DIRS}
95131
)
96132

97133
# Unit tests for cstest

0 commit comments

Comments
 (0)