mirror of
https://github.com/lifting-bits/sleigh
synced 2026-06-21 13:56:12 +00:00
cmake: Add CMake build
This commit is contained in:
+2
-2
@@ -1,3 +1,3 @@
|
||||
[submodule "ghidra"]
|
||||
path = ghidra
|
||||
[submodule "src/ghidra"]
|
||||
path = src/ghidra
|
||||
url = git@github.com:NationalSecurityAgency/ghidra.git
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# Copyright (c) 2021-present Trail of Bits, Inc.
|
||||
|
||||
cmake_minimum_required(VERSION 3.18)
|
||||
|
||||
project(sleigh
|
||||
LANGUAGES CXX C
|
||||
DESCRIPTION "A machine language translation and dissassembly engine")
|
||||
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||
|
||||
include(prevent_in_source_builds)
|
||||
include(GNUInstallDirs)
|
||||
include(project_settings)
|
||||
|
||||
# Sleigh build settings
|
||||
add_library(sleigh_settings INTERFACE)
|
||||
|
||||
target_include_directories(sleigh_settings INTERFACE
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
|
||||
$<INSTALL_INTERFACE:include>
|
||||
)
|
||||
|
||||
include(compiler_warnings)
|
||||
set_project_warnings(sleigh_settings)
|
||||
|
||||
include(sanitizers)
|
||||
enable_sanitizers(sleigh_settings)
|
||||
|
||||
include(static_analyzers)
|
||||
|
||||
# Sleigh library
|
||||
add_subdirectory(src)
|
||||
|
||||
if(DEFINED WIN32)
|
||||
set(install_folder "${CMAKE_INSTALL_PREFIX}/sleigh")
|
||||
else()
|
||||
set(install_folder "${CMAKE_INSTALL_PREFIX}")
|
||||
endif()
|
||||
|
||||
install(
|
||||
TARGETS sleigh
|
||||
RUNTIME DESTINATION "${install_folder}/bin"
|
||||
)
|
||||
|
||||
install(
|
||||
TARGETS libsleigh
|
||||
RUNTIME DESTINATION "${install_folder}/lib"
|
||||
)
|
||||
|
||||
install(
|
||||
DIRECTORY "${SLEIGH_SOURCE_DIR}/"
|
||||
DESTINATION "${install_folder}/include/sleigh"
|
||||
FILES_MATCHING PATTERN "*.hh"
|
||||
)
|
||||
@@ -0,0 +1,93 @@
|
||||
# from here:
|
||||
#
|
||||
# https://github.com/lefticus/cppbestpractices/blob/master/02-Use_the_Tools_Avai
|
||||
# lable.md
|
||||
|
||||
function(set_project_warnings project_name)
|
||||
option(WARNINGS_AS_ERRORS "Treat compiler warnings as errors" TRUE)
|
||||
|
||||
set(MSVC_WARNINGS
|
||||
/W4 # Baseline reasonable warnings
|
||||
/w14242 # 'identifier': conversion from 'type1' to 'type1', possible loss
|
||||
# of data
|
||||
/w14254 # 'operator': conversion from 'type1:field_bits' to
|
||||
# 'type2:field_bits', possible loss of data
|
||||
/w14263 # 'function': member function does not override any base class
|
||||
# virtual member function
|
||||
/w14265 # 'classname': class has virtual functions, but destructor is not
|
||||
# virtual instances of this class may not be destructed correctly
|
||||
/w14287 # 'operator': unsigned/negative constant mismatch
|
||||
/we4289 # nonstandard extension used: 'variable': loop control variable
|
||||
# declared in the for-loop is used outside the for-loop scope
|
||||
/w14296 # 'operator': expression is always 'boolean_value'
|
||||
/w14311 # 'variable': pointer truncation from 'type1' to 'type2'
|
||||
/w14545 # expression before comma evaluates to a function which is missing
|
||||
# an argument list
|
||||
/w14546 # function call before comma missing argument list
|
||||
/w14547 # 'operator': operator before comma has no effect; expected
|
||||
# operator with side-effect
|
||||
/w14549 # 'operator': operator before comma has no effect; did you intend
|
||||
# 'operator'?
|
||||
/w14555 # expression has no effect; expected expression with side- effect
|
||||
/w14619 # pragma warning: there is no warning number 'number'
|
||||
/w14640 # Enable warning on thread un-safe static member initialization
|
||||
/w14826 # Conversion from 'type1' to 'type_2' is sign-extended. This may
|
||||
# cause unexpected runtime behavior.
|
||||
/w14905 # wide string literal cast to 'LPSTR'
|
||||
/w14906 # string literal cast to 'LPWSTR'
|
||||
/w14928 # illegal copy-initialization; more than one user-defined
|
||||
# conversion has been implicitly applied
|
||||
/permissive- # standards conformance mode for MSVC compiler.
|
||||
)
|
||||
|
||||
set(CLANG_WARNINGS
|
||||
-Wall
|
||||
-Wextra # reasonable and standard
|
||||
-Wshadow # warn the user if a variable declaration shadows one from a
|
||||
# parent context
|
||||
-Wnon-virtual-dtor # warn the user if a class with virtual functions has a
|
||||
# non-virtual destructor. This helps catch hard to
|
||||
# track down memory errors
|
||||
-Wold-style-cast # warn for c-style casts
|
||||
-Wcast-align # warn for potential performance problem casts
|
||||
-Wunused # warn on anything being unused
|
||||
-Woverloaded-virtual # warn if you overload (not override) a virtual
|
||||
# function
|
||||
-Wpedantic # warn if non-standard C++ is used
|
||||
-Wconversion # warn on type conversions that may lose data
|
||||
-Wsign-conversion # warn on sign conversions
|
||||
-Wnull-dereference # warn if a null dereference is detected
|
||||
-Wdouble-promotion # warn if float is implicit promoted to double
|
||||
-Wformat=2 # warn on security issues around functions that format output
|
||||
# (ie printf)
|
||||
)
|
||||
|
||||
if (WARNINGS_AS_ERRORS)
|
||||
set(CLANG_WARNINGS ${CLANG_WARNINGS} -Werror)
|
||||
set(MSVC_WARNINGS ${MSVC_WARNINGS} /WX)
|
||||
endif()
|
||||
|
||||
set(GCC_WARNINGS
|
||||
${CLANG_WARNINGS}
|
||||
-Wmisleading-indentation # warn if indentation implies blocks where blocks
|
||||
# do not exist
|
||||
-Wduplicated-cond # warn if if / else chain has duplicated conditions
|
||||
-Wduplicated-branches # warn if if / else branches have duplicated code
|
||||
-Wlogical-op # warn about logical operations being used where bitwise were
|
||||
# probably wanted
|
||||
-Wuseless-cast # warn if you perform a cast to the same type
|
||||
)
|
||||
|
||||
if(MSVC)
|
||||
set(PROJECT_WARNINGS ${MSVC_WARNINGS})
|
||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
|
||||
set(PROJECT_WARNINGS ${CLANG_WARNINGS})
|
||||
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
set(PROJECT_WARNINGS ${GCC_WARNINGS})
|
||||
else()
|
||||
message(AUTHOR_WARNING "No compiler warnings set for '${CMAKE_CXX_COMPILER_ID}' compiler.")
|
||||
endif()
|
||||
|
||||
target_compile_options(${project_name} INTERFACE ${PROJECT_WARNINGS})
|
||||
|
||||
endfunction()
|
||||
@@ -0,0 +1,17 @@
|
||||
# This function will prevent in-source builds
|
||||
function(AssureOutOfSourceBuilds)
|
||||
# make sure the user doesn't play dirty with symlinks
|
||||
get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH)
|
||||
get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH)
|
||||
|
||||
# disallow in-source builds
|
||||
if("${srcdir}" STREQUAL "${bindir}")
|
||||
message("######################################################")
|
||||
message("Warning: in-source builds are disabled")
|
||||
message("Please create a separate build directory and run cmake from there")
|
||||
message("######################################################")
|
||||
message(FATAL_ERROR "Quitting configuration")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
AssureOutOfSourceBuilds()
|
||||
@@ -0,0 +1,35 @@
|
||||
# Set a default build type if none was specified
|
||||
if( NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES )
|
||||
message( STATUS "Setting build type to 'RelWithDebInfo' as none was specified." )
|
||||
set(CMAKE_BUILD_TYPE
|
||||
RelWithDebInfo
|
||||
CACHE STRING "Choose the type of build." FORCE)
|
||||
# Set the possible values of build type for cmake-gui, ccmake
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
|
||||
"MinSizeRel" "RelWithDebInfo")
|
||||
endif()
|
||||
|
||||
find_program( CCACHE ccache )
|
||||
if ( CCACHE )
|
||||
message( STATUS "Using ccache" )
|
||||
set( CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE} )
|
||||
else()
|
||||
message( WARNING "CCache was not found." )
|
||||
endif()
|
||||
|
||||
# Generate compile_commands.json to make it easier to work with clang based tools
|
||||
set( CMAKE_EXPORT_COMPILE_COMMANDS ON )
|
||||
|
||||
option( ENABLE_IPO
|
||||
"Enable Interprocedural Optimization, aka Link Time Optimization (LTO)" OFF
|
||||
)
|
||||
|
||||
if( ENABLE_IPO )
|
||||
include( CheckIPOSupported )
|
||||
check_ipo_supported( RESULT result OUTPUT output )
|
||||
if( result )
|
||||
set( CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE )
|
||||
else()
|
||||
message( SEND_ERROR "IPO is not supported: ${output}" )
|
||||
endif()
|
||||
endif()
|
||||
@@ -0,0 +1,48 @@
|
||||
function( enable_sanitizers project_name )
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES
|
||||
".*Clang")
|
||||
option(ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" FALSE)
|
||||
|
||||
if(ENABLE_COVERAGE)
|
||||
target_compile_options( eqsat_project_options INTERFACE --coverage -O0 -g)
|
||||
target_link_libraries( eqsat_project_options INTERFACE --coverage)
|
||||
endif()
|
||||
|
||||
set(SANITIZERS "")
|
||||
|
||||
option(ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" ON)
|
||||
if(ENABLE_SANITIZER_ADDRESS)
|
||||
list(APPEND SANITIZERS "address")
|
||||
endif()
|
||||
|
||||
option(ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" OFF)
|
||||
if(ENABLE_SANITIZER_MEMORY)
|
||||
list(APPEND SANITIZERS "memory")
|
||||
endif()
|
||||
|
||||
option(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR
|
||||
"Enable undefined behavior sanitizer" ON)
|
||||
if(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR)
|
||||
list(APPEND SANITIZERS "undefined")
|
||||
endif()
|
||||
|
||||
option(ENABLE_SANITIZER_THREAD "Enable thread sanitizer" OFF)
|
||||
if(ENABLE_SANITIZER_THREAD)
|
||||
list(APPEND SANITIZERS "thread")
|
||||
endif()
|
||||
|
||||
list(JOIN SANITIZERS "," LIST_OF_SANITIZERS)
|
||||
|
||||
endif()
|
||||
|
||||
if(LIST_OF_SANITIZERS)
|
||||
if(NOT "${LIST_OF_SANITIZERS}" STREQUAL "")
|
||||
target_compile_options(${project_name}
|
||||
INTERFACE -fsanitize=${LIST_OF_SANITIZERS})
|
||||
target_link_libraries(${project_name}
|
||||
INTERFACE -fsanitize=${LIST_OF_SANITIZERS})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
endfunction()
|
||||
@@ -0,0 +1,31 @@
|
||||
option(ENABLE_CPPCHECK "Enable static analysis with cppcheck" OFF)
|
||||
option(ENABLE_CLANG_TIDY "Enable static analysis with clang-tidy" OFF)
|
||||
option(ENABLE_INCLUDE_WHAT_YOU_USE "Enable static analysis with include-what-you-use" OFF)
|
||||
|
||||
if(ENABLE_CPPCHECK)
|
||||
find_program(CPPCHECK cppcheck)
|
||||
if(CPPCHECK)
|
||||
set(CMAKE_CXX_CPPCHECK ${CPPCHECK}
|
||||
--suppress=missingInclude --enable=all --inconclusive)
|
||||
else()
|
||||
message(SEND_ERROR "cppcheck requested but executable not found")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(ENABLE_CLANG_TIDY)
|
||||
find_program(CLANGTIDY clang-tidy)
|
||||
if(CLANGTIDY)
|
||||
set(CMAKE_CXX_CLANG_TIDY ${CLANGTIDY} -extra-arg=-Wno-unknown-warning-option)
|
||||
else()
|
||||
message(SEND_ERROR "clang-tidy requested but executable not found")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(ENABLE_INCLUDE_WHAT_YOU_USE)
|
||||
find_program(INCLUDE_WHAT_YOU_USE include-what-you-use)
|
||||
if(INCLUDE_WHAT_YOU_USE)
|
||||
set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE ${INCLUDE_WHAT_YOU_USE})
|
||||
else()
|
||||
message(SEND_ERROR "include-what-you-use requested but executable not found")
|
||||
endif()
|
||||
endif()
|
||||
-1
Submodule ghidra deleted from 5b07797cb8
@@ -0,0 +1,37 @@
|
||||
# Copyright (c) 2021-present Trail of Bits, Inc.
|
||||
|
||||
set(SLEIGH_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ghidra/Ghidra/Features/Decompiler/src/decompile/cpp")
|
||||
set(SLEIGH_SOURCE_DIR ${SLEIGH_SOURCE_DIR} PARENT_SCOPE)
|
||||
|
||||
set(SLEIGH_CORE
|
||||
${SLEIGH_SOURCE_DIR}/address.cc
|
||||
${SLEIGH_SOURCE_DIR}/context.cc
|
||||
${SLEIGH_SOURCE_DIR}/float.cc
|
||||
${SLEIGH_SOURCE_DIR}/globalcontext.cc
|
||||
${SLEIGH_SOURCE_DIR}/opcodes.cc
|
||||
${SLEIGH_SOURCE_DIR}/pcodecompile.cc
|
||||
${SLEIGH_SOURCE_DIR}/pcodeparse.cc
|
||||
${SLEIGH_SOURCE_DIR}/pcoderaw.cc
|
||||
${SLEIGH_SOURCE_DIR}/semantics.cc
|
||||
${SLEIGH_SOURCE_DIR}/sleigh.cc
|
||||
${SLEIGH_SOURCE_DIR}/sleighbase.cc
|
||||
${SLEIGH_SOURCE_DIR}/slghpatexpress.cc
|
||||
${SLEIGH_SOURCE_DIR}/slghpattern.cc
|
||||
${SLEIGH_SOURCE_DIR}/slghsymbol.cc
|
||||
${SLEIGH_SOURCE_DIR}/space.cc
|
||||
${SLEIGH_SOURCE_DIR}/translate.cc
|
||||
${SLEIGH_SOURCE_DIR}/xml.cc
|
||||
)
|
||||
|
||||
add_library(libsleigh
|
||||
${SLEIGH_CORE}
|
||||
)
|
||||
set_target_properties(libsleigh PROPERTIES PREFIX "")
|
||||
|
||||
add_executable(sleigh
|
||||
${SLEIGH_SOURCE_DIR}/filemanage.cc
|
||||
${SLEIGH_SOURCE_DIR}/slgh_compile.cc
|
||||
${SLEIGH_SOURCE_DIR}/slghparse.cc
|
||||
${SLEIGH_SOURCE_DIR}/slghscan.cc
|
||||
)
|
||||
target_link_libraries(sleigh libsleigh)
|
||||
Submodule
+1
Submodule src/ghidra added at 32ebac6048
Reference in New Issue
Block a user