Skip to content

Commit 58fe653

Browse files
committed
Add REMILL_FETCH_SLEIGH option to allow find_package(sleigh)
1 parent 2bdc972 commit 58fe653

1 file changed

Lines changed: 52 additions & 36 deletions

File tree

CMakeLists.txt

Lines changed: 52 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -88,29 +88,35 @@ find_package(glog CONFIG REQUIRED)
8888
set(GFLAGS_USE_TARGET_NAMESPACE ON)
8989
find_package(gflags CONFIG REQUIRED)
9090

91+
option(REMILL_FETCH_SLEIGH "Fetch and build sleigh as part of remill" ON)
92+
9193
# Sleigh
92-
file(GLOB sleigh_patches "${CMAKE_CURRENT_SOURCE_DIR}/patches/sleigh/*.patch")
93-
set(sleigh_ADDITIONAL_PATCHES "${sleigh_patches}" CACHE STRING "" FORCE)
94-
set(sleigh_ENABLE_TESTS OFF CACHE BOOL "" FORCE)
95-
set(sleigh_RELEASE_TYPE "HEAD" CACHE STRING "" FORCE)
96-
set(sleigh_BUILD_SUPPORT ON CACHE BOOL "" FORCE)
97-
set(sleigh_BUILD_SLEIGHSPECS ON CACHE BOOL "" FORCE)
98-
99-
# Verbose fetch content updates
100-
set(FETCHCONTENT_QUIET OFF)
101-
102-
# This version of sleigh (HEAD) pins Ghidra somewhere between Ghidra v10.2.3 and v10.3
103-
# https://github.com/lifting-bits/sleigh/blob/7c6b742/src/setup-ghidra-source.cmake#L55-L66
104-
FetchContent_Declare(sleigh
105-
GIT_REPOSITORY https://github.com/lifting-bits/sleigh.git
106-
GIT_TAG 7c6b742
107-
)
108-
FetchContent_MakeAvailable(sleigh)
94+
if(REMILL_FETCH_SLEIGH)
95+
file(GLOB sleigh_patches "${CMAKE_CURRENT_SOURCE_DIR}/patches/sleigh/*.patch")
96+
set(sleigh_ADDITIONAL_PATCHES "${sleigh_patches}" CACHE STRING "" FORCE)
97+
set(sleigh_ENABLE_TESTS OFF CACHE BOOL "" FORCE)
98+
set(sleigh_RELEASE_TYPE "HEAD" CACHE STRING "" FORCE)
99+
set(sleigh_BUILD_SUPPORT ON CACHE BOOL "" FORCE)
100+
set(sleigh_BUILD_SLEIGHSPECS ON CACHE BOOL "" FORCE)
101+
102+
# Verbose fetch content updates
103+
set(FETCHCONTENT_QUIET OFF)
104+
105+
# This version of sleigh (HEAD) pins Ghidra somewhere between Ghidra v10.2.3 and v10.3
106+
# https://github.com/lifting-bits/sleigh/blob/7c6b742/src/setup-ghidra-source.cmake#L55-L66
107+
FetchContent_Declare(sleigh
108+
GIT_REPOSITORY https://github.com/lifting-bits/sleigh.git
109+
GIT_TAG 7c6b742
110+
)
111+
FetchContent_MakeAvailable(sleigh)
109112

110-
# Get the Ghidra source directory from FetchContent's internal tracking
111-
FetchContent_GetProperties(GhidraSource)
112-
if(NOT ghidrasource_POPULATED)
113-
message(FATAL_ERROR "Expected sleigh to populate GhidraSource")
113+
# Get the Ghidra source directory from FetchContent's internal tracking
114+
FetchContent_GetProperties(GhidraSource)
115+
if(NOT ghidrasource_POPULATED)
116+
message(FATAL_ERROR "Expected sleigh to populate GhidraSource")
117+
endif()
118+
else()
119+
find_package(sleigh CONFIG REQUIRED COMPONENTS Support Specs)
114120
endif()
115121

116122
# For Linux builds, group LLVM libraries into a single group
@@ -219,22 +225,32 @@ target_compile_definitions(remill_settings INTERFACE
219225
"REMILL_BUILD_SEMANTICS_DIR_PPC64_32ADDR=\"${REMILL_BUILD_SEMANTICS_DIR_PPC64_32ADDR}\""
220226
)
221227

222-
if(SLEIGH_EXECUTABLE)
223-
set(sleigh_compiler "${SLEIGH_EXECUTABLE}")
224-
else()
225-
set(sleigh_compiler "$<TARGET_FILE:sleigh::sleigh>")
226-
endif()
228+
if(REMILL_FETCH_SLEIGH)
229+
if(SLEIGH_EXECUTABLE)
230+
set(sleigh_compiler "${SLEIGH_EXECUTABLE}")
231+
else()
232+
set(sleigh_compiler "$<TARGET_FILE:sleigh::sleigh>")
233+
endif()
227234

228-
sleigh_compile(
229-
TARGET ppc_e200_spec
230-
COMPILER "${sleigh_compiler}"
231-
SLASPEC "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.slaspec"
232-
LOG_FILE "${sleigh_BINARY_DIR}/sleighspecs/spec_build_logs/ppc_32_e200_be.sla.log"
233-
OUT_FILE "${sleigh_BINARY_DIR}/specfiles/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla"
234-
)
235+
set(REMILL_PPC_E200_SLA_SOURCE "${sleigh_BINARY_DIR}/specfiles/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla")
236+
237+
sleigh_compile(
238+
TARGET ppc_e200_spec
239+
COMPILER "${sleigh_compiler}"
240+
SLASPEC "${ghidrasource_SOURCE_DIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.slaspec"
241+
LOG_FILE "${sleigh_BINARY_DIR}/sleighspecs/spec_build_logs/ppc_32_e200_be.sla.log"
242+
OUT_FILE "${REMILL_PPC_E200_SLA_SOURCE}"
243+
)
235244

236-
add_custom_target(sleigh_custom_specs)
237-
add_dependencies(sleigh_custom_specs ppc_e200_spec)
245+
add_custom_target(sleigh_custom_specs)
246+
add_dependencies(sleigh_custom_specs ppc_e200_spec)
247+
else()
248+
set(REMILL_PPC_E200_SLA_SOURCE "${sleigh_INSTALL_SPECDIR}/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla")
249+
if(NOT EXISTS "${REMILL_PPC_E200_SLA_SOURCE}")
250+
message(FATAL_ERROR "Installed sleigh spec not found: ${REMILL_PPC_E200_SLA_SOURCE}")
251+
endif()
252+
add_custom_target(sleigh_custom_specs)
253+
endif()
238254

239255
target_link_libraries(remill_settings INTERFACE
240256
${llvm_libs}
@@ -295,7 +311,7 @@ if(REMILL_ENABLE_INSTALL_TARGET)
295311
EXPORT remillTargets
296312
)
297313

298-
install(FILES "${sleigh_BINARY_DIR}/specfiles/Ghidra/Processors/PowerPC/data/languages/ppc_32_e200_be.sla" DESTINATION "${CMAKE_INSTALL_DATADIR}/sleigh/specfiles/Ghidra/Processors/PowerPC/data/languages/")
314+
install(FILES "${REMILL_PPC_E200_SLA_SOURCE}" DESTINATION "${CMAKE_INSTALL_DATADIR}/sleigh/specfiles/Ghidra/Processors/PowerPC/data/languages/")
299315

300316
configure_file(
301317
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/remillConfig.cmake.in"

0 commit comments

Comments
 (0)