cmake_minimum_required(VERSION 3.20)
project(a2comp VERSION 0.9.8 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(PkgConfig REQUIRED)
pkg_check_modules(LV2 REQUIRED lv2)
pkg_check_modules(CAIRO REQUIRED cairo)
find_package(xsimd REQUIRED)

add_library(${PROJECT_NAME} MODULE
    src/a2comp.cpp
    src/ui/inline_display.cpp
)

set_target_properties(${PROJECT_NAME} PROPERTIES
    PREFIX ""
    SUFFIX ".so"
    INTERPROCEDURAL_OPTIMIZATION TRUE
)

target_compile_options(${PROJECT_NAME} PRIVATE
    -O3
    -march=native
    -mtune=native
    -ffast-math
    -fno-math-errno
    -funroll-loops
    -fomit-frame-pointer
    -fno-exceptions
    -fno-rtti
    -fvisibility=hidden
    -Wall -Wextra
)

target_compile_options(${PROJECT_NAME} PRIVATE -mavx2 -mfma)

target_link_options(${PROJECT_NAME} PRIVATE
    -Wl,-O1
    -Wl,--as-needed
    -Wl,--strip-all
)

target_include_directories(${PROJECT_NAME} PRIVATE
    ${LV2_INCLUDE_DIRS}
    ${CAIRO_INCLUDE_DIRS}
    ${xsimd_INCLUDE_DIRS}
)

target_link_libraries(${PROJECT_NAME} PRIVATE
    ${CAIRO_LIBRARIES}
)

set(LV2_INSTALL_DIR "$ENV{HOME}/.lv2/${PROJECT_NAME}.lv2")

install(TARGETS ${PROJECT_NAME}
    LIBRARY DESTINATION ${LV2_INSTALL_DIR}
)

install(FILES
    ttl/manifest.ttl
    ttl/a2comp.ttl
    DESTINATION ${LV2_INSTALL_DIR}
)

add_custom_target(build_and_install
    DEPENDS ${PROJECT_NAME}
    COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR}
    COMMENT "Building and installing ${PROJECT_NAME}.lv2 to ${LV2_INSTALL_DIR}"
)
