1*9e3b08aeSAndroid Build Coastguard Worker# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 2*9e3b08aeSAndroid Build Coastguard Worker# 3*9e3b08aeSAndroid Build Coastguard Worker# Copyright 2023 Google LLC 4*9e3b08aeSAndroid Build Coastguard Worker# 5*9e3b08aeSAndroid Build Coastguard Worker# Licensed under the Apache License v2.0 with LLVM Exceptions (the 6*9e3b08aeSAndroid Build Coastguard Worker# "License"); you may not use this file except in compliance with the 7*9e3b08aeSAndroid Build Coastguard Worker# License. You may obtain a copy of the License at 8*9e3b08aeSAndroid Build Coastguard Worker# 9*9e3b08aeSAndroid Build Coastguard Worker# https://llvm.org/LICENSE.txt 10*9e3b08aeSAndroid Build Coastguard Worker# 11*9e3b08aeSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*9e3b08aeSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*9e3b08aeSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*9e3b08aeSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*9e3b08aeSAndroid Build Coastguard Worker# limitations under the License. 16*9e3b08aeSAndroid Build Coastguard Worker# 17*9e3b08aeSAndroid Build Coastguard Worker# Author: Aleksei Vetrov 18*9e3b08aeSAndroid Build Coastguard Worker 19*9e3b08aeSAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.14) 20*9e3b08aeSAndroid Build Coastguard Worker 21*9e3b08aeSAndroid Build Coastguard Workerproject( 22*9e3b08aeSAndroid Build Coastguard Worker stg 23*9e3b08aeSAndroid Build Coastguard Worker VERSION 0.0.1 24*9e3b08aeSAndroid Build Coastguard Worker LANGUAGES CXX) 25*9e3b08aeSAndroid Build Coastguard Worker 26*9e3b08aeSAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD 20) 27*9e3b08aeSAndroid Build Coastguard Worker 28*9e3b08aeSAndroid Build Coastguard Workeradd_compile_options(-fstrict-enums -Wall -Wextra) 29*9e3b08aeSAndroid Build Coastguard Worker 30*9e3b08aeSAndroid Build Coastguard Workerset(MINIMUM_GNU_VERSION 11) 31*9e3b08aeSAndroid Build Coastguard Workerset(MINIMUM_Clang_VERSION 15) 32*9e3b08aeSAndroid Build Coastguard Worker 33*9e3b08aeSAndroid Build Coastguard Worker# Note, the quotes around the variable are significant. If we use a compiler 34*9e3b08aeSAndroid Build Coastguard Worker# that does not resolve to a definition above, the empty string corresponds to 35*9e3b08aeSAndroid Build Coastguard Worker# a version where all components are omitted and hence treated as zero. 36*9e3b08aeSAndroid Build Coastguard Workerif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "${MINIMUM_${CMAKE_CXX_COMPILER_ID}_VERSION}") 37*9e3b08aeSAndroid Build Coastguard Worker message(FATAL_ERROR "Unsupported Compiler Version!\n" 38*9e3b08aeSAndroid Build Coastguard Worker "Need at least ${CMAKE_CXX_COMPILER_ID} ${MINIMUM_${CMAKE_CXX_COMPILER_ID}_VERSION}") 39*9e3b08aeSAndroid Build Coastguard Workerendif() 40*9e3b08aeSAndroid Build Coastguard Worker 41*9e3b08aeSAndroid Build Coastguard Workerif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 42*9e3b08aeSAndroid Build Coastguard Worker # GCC has problems detecting "no-return" switches and destructors. 43*9e3b08aeSAndroid Build Coastguard Worker add_compile_options(-Wno-return-type) 44*9e3b08aeSAndroid Build Coastguard Workerendif() 45*9e3b08aeSAndroid Build Coastguard Worker 46*9e3b08aeSAndroid Build Coastguard Worker# Enable LTO for release builds 47*9e3b08aeSAndroid Build Coastguard Workerset(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) 48*9e3b08aeSAndroid Build Coastguard Workerset(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) 49*9e3b08aeSAndroid Build Coastguard Worker 50*9e3b08aeSAndroid Build Coastguard Workerlist(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) 51*9e3b08aeSAndroid Build Coastguard Worker 52*9e3b08aeSAndroid Build Coastguard Workerfind_package(LibElf 0.189 REQUIRED) 53*9e3b08aeSAndroid Build Coastguard Workerfind_package(LibDw 0.189 REQUIRED) 54*9e3b08aeSAndroid Build Coastguard Workerfind_package(LibXml2 2.9 REQUIRED) 55*9e3b08aeSAndroid Build Coastguard Workerfind_package(LinuxUAPI 5.19 REQUIRED) 56*9e3b08aeSAndroid Build Coastguard Workerfind_package(Protobuf 3.19 REQUIRED) 57*9e3b08aeSAndroid Build Coastguard Worker 58*9e3b08aeSAndroid Build Coastguard Workerif(NOT Protobuf_PROTOC_EXECUTABLE) 59*9e3b08aeSAndroid Build Coastguard Worker message(FATAL_ERROR "Could NOT find protobuf::protoc. 60*9e3b08aeSAndroid Build Coastguard WorkerPlease install protobuf-compiler or set Protobuf_PROTOC_EXECUTABLE to the location of the \"protoc\" binary.") 61*9e3b08aeSAndroid Build Coastguard Workerendif() 62*9e3b08aeSAndroid Build Coastguard Worker 63*9e3b08aeSAndroid Build Coastguard Workerset(COMMON_LIBRARIES 64*9e3b08aeSAndroid Build Coastguard Worker LibElf::LibElf 65*9e3b08aeSAndroid Build Coastguard Worker LibDw::LibDw 66*9e3b08aeSAndroid Build Coastguard Worker LibXml2::LibXml2 67*9e3b08aeSAndroid Build Coastguard Worker protobuf::libprotobuf) 68*9e3b08aeSAndroid Build Coastguard Worker 69*9e3b08aeSAndroid Build Coastguard Workerif(NOT Jemalloc_DISABLE) 70*9e3b08aeSAndroid Build Coastguard Worker find_package(Jemalloc 5) 71*9e3b08aeSAndroid Build Coastguard Worker if(Jemalloc_FOUND) 72*9e3b08aeSAndroid Build Coastguard Worker list(APPEND COMMON_LIBRARIES Jemalloc::Jemalloc) 73*9e3b08aeSAndroid Build Coastguard Worker else() 74*9e3b08aeSAndroid Build Coastguard Worker message(WARNING "jemalloc significantly improves performance, but is not functionally required to build STG. 75*9e3b08aeSAndroid Build Coastguard WorkerUse -DJemalloc_DISABLE=TRUE to disable jemalloc and suppress this warning.") 76*9e3b08aeSAndroid Build Coastguard Worker endif() 77*9e3b08aeSAndroid Build Coastguard Workerendif() 78*9e3b08aeSAndroid Build Coastguard Worker 79*9e3b08aeSAndroid Build Coastguard Workerprotobuf_generate_cpp(PROTO_SRCS PROTO_HDRS stg.proto) 80*9e3b08aeSAndroid Build Coastguard Worker 81*9e3b08aeSAndroid Build Coastguard Workeradd_library(libstg OBJECT 82*9e3b08aeSAndroid Build Coastguard Worker abigail_reader.cc 83*9e3b08aeSAndroid Build Coastguard Worker btf_reader.cc 84*9e3b08aeSAndroid Build Coastguard Worker comparison.cc 85*9e3b08aeSAndroid Build Coastguard Worker deduplication.cc 86*9e3b08aeSAndroid Build Coastguard Worker dwarf_processor.cc 87*9e3b08aeSAndroid Build Coastguard Worker dwarf_wrappers.cc 88*9e3b08aeSAndroid Build Coastguard Worker elf_dwarf_handle.cc 89*9e3b08aeSAndroid Build Coastguard Worker elf_loader.cc 90*9e3b08aeSAndroid Build Coastguard Worker elf_reader.cc 91*9e3b08aeSAndroid Build Coastguard Worker fidelity.cc 92*9e3b08aeSAndroid Build Coastguard Worker file_descriptor.cc 93*9e3b08aeSAndroid Build Coastguard Worker filter.cc 94*9e3b08aeSAndroid Build Coastguard Worker fingerprint.cc 95*9e3b08aeSAndroid Build Coastguard Worker graph.cc 96*9e3b08aeSAndroid Build Coastguard Worker input.cc 97*9e3b08aeSAndroid Build Coastguard Worker naming.cc 98*9e3b08aeSAndroid Build Coastguard Worker post_processing.cc 99*9e3b08aeSAndroid Build Coastguard Worker proto_reader.cc 100*9e3b08aeSAndroid Build Coastguard Worker proto_writer.cc 101*9e3b08aeSAndroid Build Coastguard Worker reporting.cc 102*9e3b08aeSAndroid Build Coastguard Worker runtime.cc 103*9e3b08aeSAndroid Build Coastguard Worker stable_hash.cc 104*9e3b08aeSAndroid Build Coastguard Worker type_normalisation.cc 105*9e3b08aeSAndroid Build Coastguard Worker type_resolution.cc 106*9e3b08aeSAndroid Build Coastguard Worker unification.cc 107*9e3b08aeSAndroid Build Coastguard Worker ${PROTO_SRCS} 108*9e3b08aeSAndroid Build Coastguard Worker ${PROTO_HDRS}) 109*9e3b08aeSAndroid Build Coastguard Worker# Needed for generated .pb.h files 110*9e3b08aeSAndroid Build Coastguard Workertarget_include_directories(libstg PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) 111*9e3b08aeSAndroid Build Coastguard Workertarget_link_libraries(libstg PUBLIC ${COMMON_LIBRARIES}) 112*9e3b08aeSAndroid Build Coastguard Worker 113*9e3b08aeSAndroid Build Coastguard Workerset(STG_EXECUTABLE_TARGETS stg stgdiff) 114*9e3b08aeSAndroid Build Coastguard Worker 115*9e3b08aeSAndroid Build Coastguard Workerforeach(TARGET IN LISTS STG_EXECUTABLE_TARGETS) 116*9e3b08aeSAndroid Build Coastguard Worker add_executable("${TARGET}" "${TARGET}.cc") 117*9e3b08aeSAndroid Build Coastguard Worker target_link_libraries("${TARGET}" PRIVATE libstg) 118*9e3b08aeSAndroid Build Coastguard Workerendforeach() 119*9e3b08aeSAndroid Build Coastguard Worker 120*9e3b08aeSAndroid Build Coastguard Worker# Testing 121*9e3b08aeSAndroid Build Coastguard Worker 122*9e3b08aeSAndroid Build Coastguard Workerfind_package(Catch2 2 QUIET) 123*9e3b08aeSAndroid Build Coastguard Worker 124*9e3b08aeSAndroid Build Coastguard Workerif(NOT Catch2_FOUND) 125*9e3b08aeSAndroid Build Coastguard Worker 126*9e3b08aeSAndroid Build Coastguard Worker message(NOTICE "Catch2 v2 testing framework not found. Disabling tests.") 127*9e3b08aeSAndroid Build Coastguard Worker 128*9e3b08aeSAndroid Build Coastguard Workerelse() 129*9e3b08aeSAndroid Build Coastguard Worker enable_testing() 130*9e3b08aeSAndroid Build Coastguard Worker 131*9e3b08aeSAndroid Build Coastguard Worker add_custom_command(OUTPUT testdata 132*9e3b08aeSAndroid Build Coastguard Worker COMMAND ${CMAKE_COMMAND} -E create_symlink 133*9e3b08aeSAndroid Build Coastguard Worker ${CMAKE_SOURCE_DIR}/testdata/ 134*9e3b08aeSAndroid Build Coastguard Worker ${CMAKE_BINARY_DIR}/testdata 135*9e3b08aeSAndroid Build Coastguard Worker ) 136*9e3b08aeSAndroid Build Coastguard Worker add_custom_target(testdata_symlink DEPENDS testdata) 137*9e3b08aeSAndroid Build Coastguard Worker 138*9e3b08aeSAndroid Build Coastguard Worker set(TEST_FILES 139*9e3b08aeSAndroid Build Coastguard Worker abigail_reader_test 140*9e3b08aeSAndroid Build Coastguard Worker elf_reader_test 141*9e3b08aeSAndroid Build Coastguard Worker error_test 142*9e3b08aeSAndroid Build Coastguard Worker file_descriptor_test 143*9e3b08aeSAndroid Build Coastguard Worker filter_test 144*9e3b08aeSAndroid Build Coastguard Worker hex_test 145*9e3b08aeSAndroid Build Coastguard Worker order_test 146*9e3b08aeSAndroid Build Coastguard Worker reporting_test 147*9e3b08aeSAndroid Build Coastguard Worker runtime_test 148*9e3b08aeSAndroid Build Coastguard Worker scc_test 149*9e3b08aeSAndroid Build Coastguard Worker scope_test 150*9e3b08aeSAndroid Build Coastguard Worker stgdiff_test 151*9e3b08aeSAndroid Build Coastguard Worker ) 152*9e3b08aeSAndroid Build Coastguard Worker 153*9e3b08aeSAndroid Build Coastguard Worker foreach(test_file ${TEST_FILES}) 154*9e3b08aeSAndroid Build Coastguard Worker add_executable(${test_file} ${test_file}.cc) 155*9e3b08aeSAndroid Build Coastguard Worker target_link_libraries(${test_file} Catch2::Catch2WithMain libstg) 156*9e3b08aeSAndroid Build Coastguard Worker add_test(NAME ${test_file} COMMAND ${test_file}) 157*9e3b08aeSAndroid Build Coastguard Worker add_dependencies(${test_file} testdata_symlink) 158*9e3b08aeSAndroid Build Coastguard Worker endforeach() 159*9e3b08aeSAndroid Build Coastguard Worker 160*9e3b08aeSAndroid Build Coastguard Workerendif() # Catch2_FOUND 161*9e3b08aeSAndroid Build Coastguard Worker 162*9e3b08aeSAndroid Build Coastguard Worker# Installation and packaging 163*9e3b08aeSAndroid Build Coastguard Worker 164*9e3b08aeSAndroid Build Coastguard Workerinclude(GNUInstallDirs) 165*9e3b08aeSAndroid Build Coastguard Worker 166*9e3b08aeSAndroid Build Coastguard Workerinstall( 167*9e3b08aeSAndroid Build Coastguard Worker TARGETS ${STG_EXECUTABLE_TARGETS} 168*9e3b08aeSAndroid Build Coastguard Worker COMPONENT Binaries 169*9e3b08aeSAndroid Build Coastguard Worker RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") 170