cmake: Add CMake build

This commit is contained in:
Alex Cameron
2021-10-07 14:49:49 +11:00
parent 9ebf45fbf2
commit 69dde8dccf
10 changed files with 320 additions and 3 deletions
+2 -2
View File
@@ -1,3 +1,3 @@
[submodule "ghidra"]
path = ghidra
[submodule "src/ghidra"]
path = src/ghidra
url = git@github.com:NationalSecurityAgency/ghidra.git
+56
View File
@@ -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"
)
+93
View File
@@ -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()
+17
View File
@@ -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()
+35
View File
@@ -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()
+48
View File
@@ -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()
+31
View File
@@ -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()
Submodule ghidra deleted from 5b07797cb8
+37
View File
@@ -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