Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
268 changes: 268 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
###################################################################
# CMake build script for OpenCSD
# Provides core libraries, C-API wrappers, and trace packet lister.
###################################################################
cmake_minimum_required(VERSION 3.10)
project(OpenCSD VERSION 1.8.1 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

include(GNUInstallDirs)
include(CTest)

# Suppress warnings emitted by MSVC/clang-cl and enable exceptions
if(MSVC)
set(OPENCSD_COMPILER_FLAGS /EHsc /W0 /clang:-Wno-invalid-token-paste)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR
CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
set(OPENCSD_COMPILER_FLAGS -Wall -Wno-switch -Wno-deprecated-declarations -Wno-unused-variable -Wno-reorder -Wno-invalid-token-paste -fexceptions)
endif()

add_library(opencsd_options INTERFACE)
target_compile_options(opencsd_options INTERFACE ${OPENCSD_COMPILER_FLAGS})
target_include_directories(opencsd_options INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/decoder/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

# libopencsd
set(OPENCSD_SRCS
decoder/source/cs_frame_mux_data.cpp
decoder/source/ocsd_code_follower.cpp
decoder/source/ocsd_dcd_tree.cpp
decoder/source/ocsd_error.cpp
decoder/source/ocsd_error_logger.cpp
decoder/source/ocsd_gen_elem_list.cpp
decoder/source/ocsd_gen_elem_stack.cpp
decoder/source/ocsd_lib_dcd_register.cpp
decoder/source/ocsd_msg_logger.cpp
decoder/source/ocsd_version.cpp
decoder/source/trc_component.cpp
decoder/source/trc_core_arch_map.cpp
decoder/source/trc_frame_deformatter.cpp
decoder/source/trc_gen_elem.cpp
decoder/source/trc_printable_elem.cpp
decoder/source/trc_ret_stack.cpp
decoder/source/ete/trc_cmp_cfg_ete.cpp
decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp
decoder/source/etmv3/trc_pkt_decode_etmv3.cpp
decoder/source/etmv3/trc_pkt_elem_etmv3.cpp
decoder/source/etmv3/trc_pkt_proc_etmv3.cpp
decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp
decoder/source/etmv4/trc_cmp_cfg_etmv4.cpp
decoder/source/etmv4/trc_etmv4_stack_elem.cpp
decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp
decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp
decoder/source/i_dec/trc_i_decode.cpp
decoder/source/i_dec/trc_idec_arminst.cpp
decoder/source/itm/trc_pkt_decode_itm.cpp
decoder/source/itm/trc_pkt_elem_itm.cpp
decoder/source/itm/trc_pkt_proc_itm.cpp
decoder/source/mem_acc/trc_mem_acc_base.cpp
decoder/source/mem_acc/trc_mem_acc_bufptr.cpp
decoder/source/mem_acc/trc_mem_acc_cache.cpp
decoder/source/mem_acc/trc_mem_acc_cb.cpp
decoder/source/mem_acc/trc_mem_acc_file.cpp
decoder/source/mem_acc/trc_mem_acc_mapper.cpp
decoder/source/pkt_printers/gen_elem_printer.cpp
decoder/source/pkt_printers/raw_frame_printer.cpp
decoder/source/pkt_printers/trc_print_fact.cpp
decoder/source/ptm/trc_cmp_cfg_ptm.cpp
decoder/source/ptm/trc_pkt_decode_ptm.cpp
decoder/source/ptm/trc_pkt_elem_ptm.cpp
decoder/source/ptm/trc_pkt_proc_ptm.cpp
decoder/source/stm/trc_pkt_decode_stm.cpp
decoder/source/stm/trc_pkt_elem_stm.cpp
decoder/source/stm/trc_pkt_proc_stm.cpp
)

# libopencsd_c_api
set(OPENCSD_C_API_SRCS
decoder/source/c_api/ocsd_c_api.cpp
decoder/source/c_api/ocsd_c_api_custom_obj.cpp
)

if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
# For Linux, create both shared and static libraries
add_library(opencsd SHARED ${OPENCSD_SRCS})
add_library(OpenCSD::opencsd ALIAS opencsd)

add_library(opencsd_c_api SHARED ${OPENCSD_C_API_SRCS})
add_library(OpenCSD::opencsd_c_api ALIAS opencsd_c_api)
target_link_libraries(opencsd_c_api PUBLIC opencsd)

add_library(opencsd_static STATIC ${OPENCSD_SRCS})
add_library(OpenCSD::opencsd_static ALIAS opencsd_static)

add_library(opencsd_c_api_static STATIC ${OPENCSD_C_API_SRCS})
add_library(OpenCSD::opencsd_c_api_static ALIAS opencsd_c_api_static)
target_link_libraries(opencsd_c_api_static PUBLIC opencsd_static)

set_target_properties(opencsd PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
)
set_target_properties(opencsd_c_api PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
)

target_link_libraries(opencsd PUBLIC opencsd_options)
target_link_libraries(opencsd_static PUBLIC opencsd_options)
target_link_libraries(opencsd_c_api PRIVATE opencsd_options)
target_link_libraries(opencsd_c_api_static PRIVATE opencsd_options)

target_include_directories(opencsd PRIVATE decoder/source)
target_include_directories(opencsd_static PRIVATE decoder/source)
target_include_directories(opencsd_c_api PRIVATE decoder/source)
target_include_directories(opencsd_c_api_static PRIVATE decoder/source)

# Install static libraries with _static suffix on Linux
install(TARGETS opencsd_static opencsd_c_api_static
EXPORT OpenCSDTargets
COMPONENT development
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
else()
# Force static libraries on Windows to avoid linking failures due to
# unexported static class members, and on macOS to prevent runtime
# .dylib loading failures in external test suites.
add_library(opencsd STATIC ${OPENCSD_SRCS})
add_library(OpenCSD::opencsd ALIAS opencsd)

add_library(opencsd_c_api STATIC ${OPENCSD_C_API_SRCS})
add_library(OpenCSD::opencsd_c_api ALIAS opencsd_c_api)

target_link_libraries(opencsd_c_api PUBLIC opencsd)

target_link_libraries(opencsd PUBLIC opencsd_options)
target_link_libraries(opencsd_c_api PRIVATE opencsd_options)

target_include_directories(opencsd PRIVATE decoder/source)
target_include_directories(opencsd_c_api PRIVATE decoder/source)
endif()

if(BUILD_TESTING)
# snapshot_parser_lib
set(SNAPSHOT_PARSER_SRCS
decoder/tests/snapshot_parser_lib/source/device_info.cpp
decoder/tests/snapshot_parser_lib/source/device_parser.cpp
decoder/tests/snapshot_parser_lib/source/snapshot_parser.cpp
decoder/tests/snapshot_parser_lib/source/snapshot_parser_util.cpp
decoder/tests/snapshot_parser_lib/source/snapshot_reader.cpp
decoder/tests/snapshot_parser_lib/source/ss_to_dcdtree.cpp
)

add_library(snapshot_parser STATIC ${SNAPSHOT_PARSER_SRCS})
target_include_directories(snapshot_parser PRIVATE
decoder/tests/snapshot_parser_lib/include
decoder/include
)
target_compile_options(snapshot_parser PRIVATE ${OPENCSD_COMPILER_FLAGS})

# trc_pkt_lister
add_executable(trc_pkt_lister decoder/tests/source/trc_pkt_lister.cpp)
target_include_directories(trc_pkt_lister PRIVATE
decoder/tests/snapshot_parser_lib/include
decoder/tests/source
)
target_link_libraries(trc_pkt_lister PRIVATE snapshot_parser opencsd)
target_compile_options(trc_pkt_lister PRIVATE ${OPENCSD_COMPILER_FLAGS})

endif() # BUILD_TESTING

install(TARGETS opencsd opencsd_c_api opencsd_options
EXPORT OpenCSDTargets
COMPONENT development
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(BUILD_TESTING)
install(TARGETS trc_pkt_lister
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
endif()

install(FILES
decoder/include/opencsd/trc_gen_elem_types.h
decoder/include/opencsd/ocsd_if_types.h
decoder/include/opencsd/ocsd_if_version.h
decoder/include/opencsd/trc_pkt_types.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opencsd
)
install(FILES
decoder/include/opencsd/ptm/trc_pkt_types_ptm.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opencsd/ptm
)
install(FILES
decoder/include/opencsd/stm/trc_pkt_types_stm.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opencsd/stm
)
install(FILES
decoder/include/opencsd/etmv3/trc_pkt_types_etmv3.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opencsd/etmv3
)
install(FILES
decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opencsd/etmv4
)
install(FILES
decoder/include/opencsd/ete/trc_pkt_types_ete.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opencsd/ete
)
install(FILES
decoder/include/opencsd/c_api/ocsd_c_api_types.h
decoder/include/opencsd/c_api/opencsd_c_api.h
decoder/include/opencsd/c_api/ocsd_c_api_custom.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opencsd/c_api
)

# Generate the targets file (handles library paths and dependencies automatically)
install(EXPORT OpenCSDTargets
FILE OpenCSDTargets.cmake
NAMESPACE OpenCSD::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenCSD
)

# Generate the master configuration file
include(CMakePackageConfigHelpers)

configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/OpenCSDConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/OpenCSDConfig.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenCSD
)

# Generate the version file
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/OpenCSDConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)

# Install the configuration files
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/OpenCSDConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/OpenCSDConfigVersion.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenCSD
)

# Add uninstall target
if(NOT TARGET uninstall)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)

add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
endif()
5 changes: 5 additions & 0 deletions OpenCSDConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/OpenCSDTargets.cmake")

check_required_components(OpenCSD)
21 changes: 21 additions & 0 deletions cmake_uninstall.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
if(NOT EXISTS "@CMAKE_BINARY_DIR@/install_manifest.txt")
message(FATAL_ERROR "Cannot find install manifest: @CMAKE_BINARY_DIR@/install_manifest.txt")
endif()

file(READ "@CMAKE_BINARY_DIR@/install_manifest.txt" files)
string(REGEX REPLACE "\n" ";" files "${files}")
foreach(file ${files})
message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
exec_program(
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
OUTPUT_VARIABLE rm_out
RETURN_VALUE rm_retval
)
if(NOT "${rm_retval}" STREQUAL 0)
message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
endif()
else()
message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
endif()
endforeach()