xref: /aosp_15_r20/external/stg/CMakeLists.txt (revision 9e3b08ae94a55201065475453d799e8b1378bea6)
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