cmake_minimum_required(VERSION 3.15)
project(ShogibanEngineCore)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# アプリ本体の最低対応 OS (iOS 17.0) に整合させる
set(DEPLOYMENT_TARGET "17.0")

# コンパイル対象はアプリから実際に呼ばれるものだけに剪定している。
# 除外済み: makebook 系 (makebook.cpp / makebook2015.cpp / makebook2023.cpp)、
#           学習器 (evaluate_nnue_learner.cpp)、
#           テストコマンド (unit_test.cpp / mate_test_cmd.cpp / normal_test_cmd.cpp /
#                           nnue_test_command.cpp)、
#           未使用 NNUE 特徴量 (k.cpp / p.cpp / half_kp_vm.cpp / half_relative_kp.cpp /
#                               half_kpe9.cpp / pe9.cpp — 使用は HalfKP256 のみ)。
# usi.cpp 等が参照する除外分のシンボルは ../src/pruned_stubs.cpp が no-op で提供する。
# benchmark.cpp はベンチ基盤 (docs/bench) 用に残す。
set (SRC
    ../src/sae_engine.cpp
    ../src/pruned_stubs.cpp
    # not including main.cpp
    ../../YaneuraOu/source/types.cpp
    ../../YaneuraOu/source/bitboard.cpp
    ../../YaneuraOu/source/misc.cpp
    ../../YaneuraOu/source/memory.cpp
    ../../YaneuraOu/source/movegen.cpp
    ../../YaneuraOu/source/position.cpp
    ../../YaneuraOu/source/usi.cpp
    ../../YaneuraOu/source/usi_option.cpp
    ../../YaneuraOu/source/thread.cpp
    ../../YaneuraOu/source/tt.cpp
    ../../YaneuraOu/source/movepick.cpp
    ../../YaneuraOu/source/timeman.cpp
    ../../YaneuraOu/source/book/book.cpp
    ../../YaneuraOu/source/book/apery_book.cpp
    ../../YaneuraOu/source/extra/bitop.cpp
    ../../YaneuraOu/source/extra/long_effect.cpp
    ../../YaneuraOu/source/extra/sfen_packer.cpp
    ../../YaneuraOu/source/extra/super_sort.cpp
    ../../YaneuraOu/source/mate/mate.cpp
    ../../YaneuraOu/source/mate/mate1ply_without_effect.cpp
    ../../YaneuraOu/source/mate/mate1ply_with_effect.cpp
    ../../YaneuraOu/source/mate/mate_solver.cpp
    ../../YaneuraOu/source/eval/evaluate_bona_piece.cpp
    ../../YaneuraOu/source/eval/evaluate.cpp
    ../../YaneuraOu/source/eval/evaluate_io.cpp
    ../../YaneuraOu/source/eval/evaluate_mir_inv_tools.cpp
    ../../YaneuraOu/source/eval/material/evaluate_material.cpp
    ../../YaneuraOu/source/testcmd/benchmark.cpp
    ../../YaneuraOu/source/engine/yaneuraou-engine/yaneuraou-search.cpp
# NNUE
    ../../YaneuraOu/source/eval/nnue/evaluate_nnue.cpp
    ../../YaneuraOu/source/eval/nnue/features/half_kp.cpp
)
# 静的ライブラリとしてビルドし、アプリ本体に直接リンクする。
# (dyld ロード消滅・モジュール境界を越えた dead-strip / LTO を有効にするため)
add_library(ShogibanEngineCore STATIC ${SRC})

set_target_properties(ShogibanEngineCore PROPERTIES
    XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf"
    XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS "YES"
)

# ARM64実機用のコンパイラオプション（NEON命令を有効化）
# パフォーマンス最適化: Clang/LLVM用に最適化（実行速度最大化 + バイナリサイズ削減）
# -mcpu=apple-a12: 最低対応 OS iOS 17.0 の最古チップ A12 に合わせて明示
#                  (クロスコンパイルで無意味な -mtune=native は廃止)
# -fvisibility=hidden: 内部シンボルを非公開化。公開 API (sae_* 9 シンボル、
#                      ../exported_symbols_sae.txt 参照) を持つ sae_engine.cpp
#                      のみ下の set_source_files_properties で default に戻す。
# -flto=thin: ThinLTO。最終的なコード生成はアプリのリンク時に行われる。
target_compile_options(ShogibanEngineCore PUBLIC
    -std=c++17
    -fno-exceptions
    -fno-rtti
    -Wextra
    -MMD
    -MP
    -fpermissive
    -O3
    -ffast-math
    -funroll-loops
    -fomit-frame-pointer
    -mcpu=apple-a12
    -fvectorize
    -fslp-vectorize
    -finline-functions
    -fmerge-all-constants
    -ffunction-sections
    -fdata-sections
    -fvisibility=hidden
    -fvisibility-inlines-hidden
    -flto=thin
    -DNDEBUG
    -D_LINUX
    -DUNICODE
    -DNO_EXCEPTIONS
    -DIS_64BIT
    -DUSE_NEON
    -DYANEURAOU_ENGINE
    -DYANEURAOU_ENGINE_NNUE
    -DEVAL_NNUE_HALFKP256
)

# 公開 C API (sae_* 9 シンボル) を定義する翻訳単位のみ default visibility。
# エクスポート集合の正本は ../exported_symbols_sae.txt。
set_source_files_properties(../src/sae_engine.cpp PROPERTIES
    COMPILE_OPTIONS "-fvisibility=default"
)
