project(unwindstack LANGUAGES C CXX ASM)
cmake_minimum_required(VERSION 3.10)

set(UNWINDSTACK_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../)

include_directories(${UNWINDSTACK_ROOT} ${UNWINDSTACK_ROOT}/include)

set(ANDROID_SOURCES
    ${UNWINDSTACK_ROOT}/android-base/errno_restorer.h
    ${UNWINDSTACK_ROOT}/android-base/file.cpp
    ${UNWINDSTACK_ROOT}/android-base/file.h
    ${UNWINDSTACK_ROOT}/android-base/log_main.h
    ${UNWINDSTACK_ROOT}/android-base/logging.h
    ${UNWINDSTACK_ROOT}/android-base/macros.h
    ${UNWINDSTACK_ROOT}/android-base/off64_t.h
    ${UNWINDSTACK_ROOT}/android-base/parseint.h
    ${UNWINDSTACK_ROOT}/android-base/stringprintf.cpp
    ${UNWINDSTACK_ROOT}/android-base/stringprintf.h
    ${UNWINDSTACK_ROOT}/android-base/strings.cpp
    ${UNWINDSTACK_ROOT}/android-base/strings.h
    ${UNWINDSTACK_ROOT}/android-base/threads.h
    ${UNWINDSTACK_ROOT}/android-base/unique_fd.h
    ${UNWINDSTACK_ROOT}/android-base/utf8.h
    ${UNWINDSTACK_ROOT}/procinfo/process_map.h
    ${UNWINDSTACK_ROOT}/procinfo/process.h
)

set(UNWINDSTACK_SOURCES
    ${UNWINDSTACK_ROOT}/ArmExidx.cpp
    ${UNWINDSTACK_ROOT}/ArmExidx.h
    ${UNWINDSTACK_ROOT}/Check.h
    ${UNWINDSTACK_ROOT}/DexFiles.cpp
    ${UNWINDSTACK_ROOT}/DwarfCfa.cpp
    ${UNWINDSTACK_ROOT}/DwarfCfa.h
    ${UNWINDSTACK_ROOT}/DwarfDebugFrame.h
    ${UNWINDSTACK_ROOT}/DwarfEhFrame.h
    ${UNWINDSTACK_ROOT}/DwarfEhFrameWithHdr.cpp
    ${UNWINDSTACK_ROOT}/DwarfEhFrameWithHdr.h
    ${UNWINDSTACK_ROOT}/DwarfEncoding.h
    ${UNWINDSTACK_ROOT}/DwarfMemory.cpp
    ${UNWINDSTACK_ROOT}/DwarfOp.cpp
    ${UNWINDSTACK_ROOT}/DwarfOp.h
    ${UNWINDSTACK_ROOT}/DwarfSection.cpp
    ${UNWINDSTACK_ROOT}/Elf.cpp
    ${UNWINDSTACK_ROOT}/ElfInterface.cpp
    ${UNWINDSTACK_ROOT}/ElfInterfaceArm.cpp
    ${UNWINDSTACK_ROOT}/ElfInterfaceArm.h
    ${UNWINDSTACK_ROOT}/Global.cpp
    ${UNWINDSTACK_ROOT}/JitDebug.cpp
    ${UNWINDSTACK_ROOT}/GlobalDebugImpl.h
    ${UNWINDSTACK_ROOT}/LogAndroid.cpp
    ${UNWINDSTACK_ROOT}/LogStdout.cpp
    ${UNWINDSTACK_ROOT}/MapInfo.cpp
    ${UNWINDSTACK_ROOT}/Maps.cpp
    ${UNWINDSTACK_ROOT}/Memory.cpp
    ${UNWINDSTACK_ROOT}/MemoryBuffer.h
    ${UNWINDSTACK_ROOT}/MemoryCache.h
    ${UNWINDSTACK_ROOT}/MemoryFileAtOffset.h
    ${UNWINDSTACK_ROOT}/MemoryLocal.h
    ${UNWINDSTACK_ROOT}/MemoryMte.cpp
    ${UNWINDSTACK_ROOT}/MemoryOffline.h
    ${UNWINDSTACK_ROOT}/MemoryOfflineBuffer.h
    ${UNWINDSTACK_ROOT}/MemoryRange.h
    ${UNWINDSTACK_ROOT}/MemoryRemote.h
    ${UNWINDSTACK_ROOT}/Regs.cpp
    ${UNWINDSTACK_ROOT}/RegsArm.cpp
    ${UNWINDSTACK_ROOT}/RegsArm64.cpp
    ${UNWINDSTACK_ROOT}/RegsInfo.h
    ${UNWINDSTACK_ROOT}/RegsX86_64.cpp
    ${UNWINDSTACK_ROOT}/RegsX86.cpp
    ${UNWINDSTACK_ROOT}/Symbols.cpp
    ${UNWINDSTACK_ROOT}/Symbols.h
    ${UNWINDSTACK_ROOT}/ThreadEntry.cpp
    ${UNWINDSTACK_ROOT}/ThreadEntry.h
    ${UNWINDSTACK_ROOT}/ThreadUnwinder.cpp
    ${UNWINDSTACK_ROOT}/unistdfix.h
    ${UNWINDSTACK_ROOT}/Unwinder.cpp
)

if(${CMAKE_SYSTEM_PROCESSOR} MATCHES arm)
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "amd64.*|x86_64.*|AMD64.*")
    set(UNWINDSTACK_SOURCES_GETREG
        ${UNWINDSTACK_ROOT}/AsmGetRegsX86_64.S
    )
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686.*|i386.*|x86.*")
    set(UNWINDSTACK_SOURCES_GETREG
        ${UNWINDSTACK_ROOT}/AsmGetRegsX86.S
    )
else()
    add_definitions(-DEM_ARM=40)
endif()

add_library(unwindstack STATIC
    ${ANDROID_SOURCES}
    ${UNWINDSTACK_SOURCES}
    ${UNWINDSTACK_SOURCES_GETREG}
)
target_link_libraries(unwindstack log)
set_property(TARGET unwindstack PROPERTY CXX_STANDARD 17)

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    target_compile_options(unwindstack PRIVATE $<BUILD_INTERFACE:-Wno-unknown-attributes>)
endif()
