cmake_minimum_required(VERSION 3.12)
project(pycdecompile CXX)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ---------------------------------------------------------------------------
# 这个目录是随仓库分发的 Decompyle++ 内核（原 pycdc-master）。
#
# 推荐用项目根目录的 `python build.py` 构建：它不需要 CMake，会把动态库
# 直接写到 <项目根>/build/，Python 包就是在那里找库的。
# 本文件是等价的 CMake 版本，方便在 Linux / macOS / IDE 里构建。
# ---------------------------------------------------------------------------

# 产物与 build.py 保持一致，放 <项目根>/build
set(PYCDC_OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../build")

option(ENABLE_BLOCK_DEBUG "Enable block debugging" OFF)
option(ENABLE_STACK_DEBUG "Enable stack debugging" OFF)

if(ENABLE_BLOCK_DEBUG)
    add_definitions(-DBLOCK_DEBUG)
endif()
if(ENABLE_STACK_DEBUG)
    add_definitions(-DSTACK_DEBUG)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
    add_compile_options(-Wall -Wextra)
elseif(MSVC)
    add_definitions(-D_CRT_SECURE_NO_WARNINGS)
    add_compile_options(/W3)
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR})

# bytes/python_X_Y.cpp 是各版本的 opcode 映射表，全部编进来
file(GLOB PYCDC_VERSION_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/bytes/python_*.cpp")

add_library(pycxx STATIC
    bytecode.cpp
    data.cpp
    pyc_code.cpp
    pyc_module.cpp
    pyc_numeric.cpp
    pyc_object.cpp
    pyc_sequence.cpp
    pyc_string.cpp
    ASTree.cpp
    ASTNode.cpp
    pycdecompile_log.cpp
    ${PYCDC_VERSION_SOURCES}
)
set_property(TARGET pycxx PROPERTY POSITION_INDEPENDENT_CODE ON)

# 供 Python / 其它语言通过 C ABI 调用的动态库。
# pycdas.cpp 里的 output_object() 被导出层的反汇编复用，因此一并编入。
add_library(pycdecompile SHARED pycdecompile_api.cpp pycdas.cpp)
target_link_libraries(pycdecompile pycxx)
set_target_properties(pycdecompile PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY "${PYCDC_OUTPUT_DIR}"
    RUNTIME_OUTPUT_DIRECTORY "${PYCDC_OUTPUT_DIR}")

# 上游自带的两个命令行工具
add_executable(pycdas pycdas.cpp)
target_link_libraries(pycdas pycxx)

add_executable(pycdc pycdc.cpp)
target_link_libraries(pycdc pycxx)

# 回归：项目自带的官方口径测试（跑仓库里预编译的 191 个 pyc）
find_package(Python3 3.6 COMPONENTS Interpreter)
if(Python3_FOUND)
    add_custom_target(check
        COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/../tools/official_test.py" --compiled
        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.."
        USES_TERMINAL)
endif()
