cmake_minimum_required(VERSION 3.15)
project(yaneuraou)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(DEPLOYMENT_TARGET "13.0")

set (SRC
    ../src/ios_main.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/book/makebook.cpp
    ../../YaneuraOu/source/book/makebook2015.cpp
    ../../YaneuraOu/source/book/makebook2023.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/unit_test.cpp
    ../../YaneuraOu/source/testcmd/mate_test_cmd.cpp
    ../../YaneuraOu/source/testcmd/normal_test_cmd.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/evaluate_nnue_learner.cpp
    ../../YaneuraOu/source/eval/nnue/nnue_test_command.cpp
    ../../YaneuraOu/source/eval/nnue/features/k.cpp
    ../../YaneuraOu/source/eval/nnue/features/p.cpp
    ../../YaneuraOu/source/eval/nnue/features/half_kp.cpp
    ../../YaneuraOu/source/eval/nnue/features/half_kp_vm.cpp
    ../../YaneuraOu/source/eval/nnue/features/half_relative_kp.cpp
    ../../YaneuraOu/source/eval/nnue/features/half_kpe9.cpp
    ../../YaneuraOu/source/eval/nnue/features/pe9.cpp
)
add_library(yaneuraou SHARED ${SRC})

# フレームワークとして設定
set_target_properties(yaneuraou PROPERTIES
    FRAMEWORK TRUE
    FRAMEWORK_VERSION A
    MACOSX_FRAMEWORK_IDENTIFIER com.yaneuraou.engine
    VERSION 1.0.0
    SOVERSION 1.0.0
    PUBLIC_HEADER "../include/yaneuraou_if.h"
)

# ARM64実機用のコンパイラオプション（NEON命令を有効化）
# パフォーマンス最適化: Clang/LLVM用に最適化（実行速度最大化 + バイナリサイズ削減）
target_compile_options(yaneuraou PUBLIC 
    -std=c++17 
    -fno-exceptions 
    -fno-rtti 
    -Wextra 
    -MMD 
    -MP 
    -fpermissive 
    -O3
    -ffast-math 
    -funroll-loops
    -fomit-frame-pointer
    -march=armv8.2-a+fp16+rcpc+dotprod+crypto
    -mtune=native
    -fvectorize
    -fslp-vectorize
    -finline-functions
    -fmerge-all-constants
    -ffunction-sections
    -fdata-sections
    -fvisibility=default
    -DNDEBUG 
    -D_LINUX 
    -DUNICODE 
    -DNO_EXCEPTIONS 
    -DIS_64BIT 
    -DUSE_NEON
    -DYANEURAOU_ENGINE 
    -DYANEURAOU_ENGINE_NNUE 
    -DEVAL_NNUE_HALFKP256
)

# リンカーオプションも最適化（未使用コード削除でサイズ削減）
# 注: ダイナミックライブラリでは-gc-sectionsと-strip-allは使用不可
target_link_options(yaneuraou PUBLIC
    -Wl,-dead_strip
    -Wl,-no_compact_unwind
)
