include_guard(GLOBAL)

include(DyninstLibrary)

configure_file(${PROJECT_SOURCE_DIR}/cmake/dyninstversion.h.in
               ${CMAKE_CURRENT_SOURCE_DIR}/h/dyninstversion.h)

set(_public_headers
    h/Annotatable.h
    h/Architecture.h
    h/Buffer.h
    h/compiler_annotations.h
    h/compiler_diagnostics.h
    h/concurrent.h
    h/DynAST.h
    h/dyn_regs.h
    h/dyn_syscalls.h
    h/dyntypes.h
    h/Edge.h
    h/entryIDs.h
    h/Graph.h
    h/IBSTree-fast.h
    h/IBSTree.h
    h/MachSyscall.h
    h/mnemonics/aarch64_entryIDs.h
    h/mnemonics/ppc_entryIDs.h
    h/mnemonics/x86_entryIDs.h
    h/mnemonics/AMDGPU/gfx908_entryIDs.h
    h/mnemonics/AMDGPU/gfx90a_entryIDs.h
    h/mnemonics/AMDGPU/gfx940_entryIDs.h
    h/mnemonics/IntelGPU/generic_entryIDs.h
    h/mnemonics/NVIDIA/generic_entryIDs.h
    h/Node.h
    h/ProcReader.h
    h/registers/MachRegister.h
    h/registers/aarch64_regs.h
    h/registers/abstract_regs.h
    h/registers/AMDGPU/amdgpu_gfx908_regs.h
    h/registers/AMDGPU/amdgpu_gfx90a_regs.h
    h/registers/AMDGPU/amdgpu_gfx940_regs.h
    h/registers/cuda_regs.h
    h/registers/MachRegister.h
    h/registers/ppc32_regs.h
    h/registers/ppc64_regs.h
    h/registers/reg_def.h
    h/registers/x86_64_regs.h
    h/registers/x86_regs.h
    h/SymReader.h
    h/unaligned_memory_access.h
    h/util.h
    h/VariableLocation.h
    h/dyninstversion.h # generated by cmake/version.h.in at config time
    )

set(_private_headers
    src/addrtranslate.h
    src/addrtranslate-sysv.h
    src/arch-aarch64.h
    src/arch.h
    src/arch-power.h
    src/arch-x86.h
    src/debug_common.h
    src/dthread.h
    src/dyn_register.h
    src/freebsdHeaders.h
    src/freebsdKludges.h
    src/headers.h
    src/ia32_locations.h
    src/IntervalTree.h
    src/linuxHeaders.h
    src/linuxKludges.h
    src/lprintf.h
    src/lru_cache.h
    src/MappedFile.h
    src/NodeIterator.h
    src/ntHeaders.h
    src/parseauxv.h
    src/pathName.h
    src/pool_allocators.h
    src/registers/MachRegister.C
    src/sha1.h
    src/singleton_object_pool.h
    src/stats.h
    src/symbolDemangle.h
    src/symbolDemangleWithCache.h
    src/Timer.h
    src/vgannotations.h
    src/vm_maps.h)

set(_sources
    src/pfq-rwlock.C
    src/concurrent.C
    src/Timer.C
    src/lprintf.C
    src/pathName.C
    src/stats.C
    src/Annotatable.C
    src/MappedFile.C
    src/sha1.C
    src/util.C
    src/Node.C
    src/Graph.C
    src/Edge.C
    src/DOT.C
    src/dyn_regs.C
    src/AST.C
    src/addrtranslate.C
    src/arch-x86.C
    src/arch-power.C
    src/arch-aarch64.C
    src/debug_common.C
    src/VariableLocation.C
    src/Buffer.C
    src/MachSyscall.C)

if(DYNINST_OS_UNIX)
  list(APPEND _sources src/addrtranslate-sysv.C src/symbolDemangleWithCache.C
       src/symbolDemangle.c)
endif()

if(DYNINST_OS_FreeBSD)
  list(APPEND _sources src/freebsdKludges.C src/addrtranslate-freebsd.C)
elseif(DYNINST_OS_Linux)
  list(APPEND _sources src/linuxKludges.C src/parseauxv.C src/addrtranslate-auxv.C
       src/addrtranslate-linux.C)
elseif(DYNINST_OS_Windows)
  list(APPEND _sources src/ntKludges.C src/addrtranslate-win.C)
endif()

if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
  if(${CMAKE_CXX_COMPILER_VERSION} MATCHES "^[789](\.|$)")
    # Disable var-tracking-assignments for arch-x86.C for gcc 7, 8, & 9. The default
    # max size for these compilers is too small so it fails, adjusting it using
    #
    # PROPERTIES COMPILE_FLAGS "--param=max-vartrack-size=600000000"
    #
    # succeeds, but just disable it.
    set_source_files_properties(src/arch-x86.C PROPERTIES COMPILE_FLAGS
                                                          "-fno-var-tracking-assignments")
  endif()
endif()

# adjust warning threshold if set in cmake/warnings.cmake
if(debugMaxFrameSizeOverrideSyscallInformation)
  set_source_files_properties(
    src/MachSyscall.C
    PROPERTIES
      COMPILE_FLAGS
      $<$<CONFIG:DEBUG>:-Wframe-larger-than=${debugMaxFrameSizeOverrideSyscallInformation}>
    )
endif()
if(nonDebugMaxFrameSizeOverrideSyscallInformation)
  set_source_files_properties(
    src/MachSyscall.C
    PROPERTIES
      COMPILE_FLAGS
      $<$<NOT:$<CONFIG:DEBUG>>:-Wframe-larger-than=${nonDebugMaxFrameSizeOverrideSyscallInformation}>
    )
endif()

# cmake-format: off
dyninst_library(
  common
  PUBLIC_HEADER_FILES ${_public_headers}
  PRIVATE_HEADER_FILES ${_private_headers}
  SOURCE_FILES ${_sources}
  DEFINES COMMON_LIB
  PUBLIC_DEPS Dyninst::TBB Dyninst::Boost
  PRIVATE_DEPS Dyninst::LibIberty OpenMP::OpenMP_CXX Dyninst::Valgrind Threads::Threads
)
# cmake-format: on

if(DYNINST_OS_Windows)
  foreach(t ${common_TARGETS})
    target_compile_definitions(${t} PRIVATE "WIN32" "_WIN32_WINNT=0x500")
    target_link_libraries(${t} PRIVATE Psapi WS2_32 dbghelp)
  endforeach()
endif()
