cmake_minimum_required(VERSION 3.20) project(calx VERSION 0.1.0 DESCRIPTION "Modern C++23 comprehensive math library" LANGUAGES CXX ) # ============================================================================== # C++ 標準とグローバル設定 # ============================================================================== set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # ソリューションエクスプローラーでフォルダ表示を有効化 set_property(GLOBAL PROPERTY USE_FOLDERS ON) # VS "すべてリビルド" 時の generate.stamp 競合回避 # CMake が各 .vcxproj に埋め込むスタンプチェックを無効化する。 # 同一ディレクトリの全プロジェクトが同じ generate.stamp を同時に # タッチしようとしてファイルロック競合 (MSB8066) が発生するため。 # 注意: CMakeLists.txt 変更時は手動で cmake を再実行する必要がある。 set(CMAKE_SUPPRESS_REGENERATION ON) # ============================================================================== # オプション # ============================================================================== option(CALX_USE_MKL "Enable Intel MKL backend" OFF) option(CALX_BUILD_SHARED "Build calx_core as shared library (DLL)" OFF) option(BUILD_TESTING "Build tests" OFF) # ============================================================================== # コンパイラ別フラグ # ============================================================================== if(MSVC) add_compile_options( /utf-8 # 日本語コメント対応 (UTF-8 ソース + 実行文字セット) /EHsc # C++ 例外モデル /W3 # 警告レベル 3 /Zc:__cplusplus # __cplusplus マクロを実際の C++ 標準バージョンに設定 ) # x64 のみ AVX2 (ARM は除外) if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT CMAKE_SYSTEM_PROCESSOR MATCHES "ARM") add_compile_options(/arch:AVX2) endif() else() # GCC / Clang add_compile_options(-Wall) include(CheckCXXCompilerFlag) check_cxx_compiler_flag(-mavx2 COMPILER_SUPPORTS_AVX2) if(COMPILER_SUPPORTS_AVX2) add_compile_options(-mavx2) endif() endif() # ============================================================================== # MKL (オプション) # ============================================================================== if(CALX_USE_MKL) # MKLROOT 環境変数またはシステムパスから検索 find_package(MKL QUIET) if(NOT MKL_FOUND AND DEFINED ENV{MKLROOT}) set(MKL_INCLUDE_DIR "$ENV{MKLROOT}/include") set(MKL_LIB_DIR "$ENV{MKLROOT}/lib") if(EXISTS "${MKL_INCLUDE_DIR}/mkl.h") set(MKL_FOUND TRUE) message(STATUS "MKL found via MKLROOT: $ENV{MKLROOT}") endif() endif() if(NOT MKL_FOUND) message(WARNING "MKL not found. Building without MKL support.") set(CALX_USE_MKL OFF) endif() endif() # ============================================================================== # サブディレクトリ # ============================================================================== add_subdirectory(lib) add_subdirectory(examples)