# Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.
# libkperf licensed under the Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#     http://license.coscl.org.cn/MulanPSL2
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
# PURPOSE.
# See the Mulan PSL v2 for more details.
# Author: Mr.Dai
# Create: 2024-04-03
# Description: Define the overall structure and behavior of the project.

if (POLICY CMP0048)
    cmake_policy(SET CMP0048 NEW)
endif (POLICY CMP0048)
set(PROJECT_TOP_DIR ${CMAKE_CURRENT_LIST_DIR})
project(libkprof)
if(NOT DEFINED CMAKE_INSTALL_PREFIX OR CMAKE_INSTALL_PREFIX STREQUAL "")
    set(CMAKE_INSTALL_PREFIX "${PROJECT_TOP_DIR}/output/" CACHE PATH "Installation directory" FORCE)
endif()
if (NOT DEFINED CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
    set(CMAKE_BUILD_TYPE Release)
endif()

cmake_minimum_required (VERSION 3.12.0)
set(CMAKE_CXX_STANDARD 11)
if (INCLUDE_TEST)
    set(CMAKE_CXX_STANDARD 14)
endif()
set(CMAKE_C_STANDARD 11)
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8.5)
    message(FATAL_ERROR "GCC 4.8.5 or newer required")
endif()

set(TOP_DIR ${PROJECT_SOURCE_DIR})

include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -funroll-loops")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops")

check_c_compiler_flag("-fno-plt" C_SUPPORTS_NO_PLT)
if(C_SUPPORTS_NO_PLT)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-plt")
endif()
check_cxx_compiler_flag("-fno-plt" CXX_SUPPORTS_NO_PLT)
if(CXX_SUPPORTS_NO_PLT)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-plt")
endif()

if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "^(arm|aarch64)")
    check_c_compiler_flag("-march=armv8.2-a" C_SUPPORTS_ARM_ARCH)
    if(C_SUPPORTS_ARM_ARCH)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8.2-a")
    endif()
    check_cxx_compiler_flag("-march=armv8.2-a" CXX_SUPPORTS_ARM_ARCH)
    if(CXX_SUPPORTS_ARM_ARCH)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8.2-a")
    endif()
endif()

message("TOP_DIR is ${TOP_DIR}")
include(${CMAKE_CURRENT_LIST_DIR}/Common.cmake)
add_subdirectory(symbol)

option(JAVA_TRACE "Enable java trace" OFF)
message(STATUS "JAVA trace support: ${JAVA_TRACE}")
if (JAVA_TRACE)
    set(JAVA_TRACE_CONFIG_H "${CMAKE_BINARY_DIR}/java_trace_config.h")
    set(JAVA_TRACE_AGENT_JAR "${LIBKPERF_JAVA_HOME}/trace_agent.jar")
    set(JAVA_TRACE_CLI_JAR "${LIBKPERF_JAVA_HOME}/trace_cli.jar")
    set(JAVA_TRACE_NATIVE_LIB "${LIBKPERF_JAVA_HOME}/libtracex_threadinfo.so")
    configure_file(
        "${PROJECT_TOP_DIR}/java/java_trace/java_trace_config.h.in"
        "${JAVA_TRACE_CONFIG_H}"
        @ONLY
    )
    message(STATUS "Generated java_trace_config.h -> ${JAVA_TRACE_CONFIG_H}")
endif()

add_subdirectory(pmu)

if (JAVA_AGENT)
    add_subdirectory(java/java_agent)
endif()

if (PYTHON)
    add_subdirectory(python)
endif()

option(BPF "Enable BPF mode" OFF)
message(STATUS "BPF support: ${BPF}")

if (GO)
    add_subdirectory(go)
endif()

if (INCLUDE_TEST)
    add_subdirectory(test)
endif()

set(CMAKE_EXPORT_COMPILE_COMMANDS True)