| # Copyright 2024 DeepMind Technologies Limited |
| # |
| # AlphaFold 3 source code is licensed under CC BY-NC-SA 4.0. To view a copy of |
| # this license, visit https://creativecommons.org/licenses/by-nc-sa/4.0/ |
| # |
| # To request access to the AlphaFold 3 model parameters, follow the process set |
| # out at https://github.com/google-deepmind/alphafold3. You may only use these |
| # if received directly from Google. Use is subject to terms of use available at |
| # https://github.com/google-deepmind/alphafold3/blob/main/WEIGHTS_TERMS_OF_USE.md |
|
|
| cmake_minimum_required(VERSION 3.24) |
| project( |
| "${SKBUILD_PROJECT_NAME}" |
| LANGUAGES CXX |
| VERSION "${SKBUILD_PROJECT_VERSION}") |
|
|
| include(FetchContent) |
| set(CMAKE_CXX_STANDARD 20) |
| set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) |
| set(ABSL_PROPAGATE_CXX_STD ON) |
|
|
| # Remove support for scan deps, which is only useful when using C++ modules. |
| unset(CMAKE_CXX_SCANDEP_SOURCE) |
|
|
| set(ENV{GIT_CONFIG_PARAMETERS} "'init.defaultRefFormat=files'") |
|
|
| if(DEFINED ENV{ALPHAFOLD3_DEP_DIR}) |
| set(DEP_BASE_DIR "$ENV{ALPHAFOLD3_DEP_DIR}") |
| endif() |
|
|
| function(declare_af3_dependency dep_name local_path_env repo_env tag_env) |
| if(DEFINED ENV{${local_path_env}} AND EXISTS "$ENV{${local_path_env}}") |
| message(STATUS "Using local dependency for ${dep_name}: $ENV{${local_path_env}}") |
| FetchContent_Declare( |
| ${dep_name} |
| SOURCE_DIR $ENV{${local_path_env}} |
| ${ARGN}) |
| else() |
| message(STATUS "Fetching remote dependency for ${dep_name}: $ENV{${repo_env}} @ $ENV{${tag_env}}") |
| FetchContent_Declare( |
| ${dep_name} |
| GIT_REPOSITORY $ENV{${repo_env}} |
| GIT_TAG $ENV{${tag_env}} |
| ${ARGN}) |
| endif() |
| endfunction() |
|
|
|
|
| declare_af3_dependency( |
| abseil-cpp |
| ABSEIL_LOCAL_PATH |
| ABSEIL_REPO |
| ABSEIL_TAG |
| EXCLUDE_FROM_ALL) |
|
|
| declare_af3_dependency( |
| pybind11 |
| PYBIND11_LOCAL_PATH |
| PYBIND11_REPO |
| PYBIND11_TAG |
| EXCLUDE_FROM_ALL) |
|
|
| declare_af3_dependency( |
| pybind11_abseil |
| PYBIND11_ABSEIL_LOCAL_PATH |
| PYBIND11_ABSEIL_REPO |
| PYBIND11_ABSEIL_TAG |
| EXCLUDE_FROM_ALL) |
|
|
| declare_af3_dependency( |
| cifpp |
| CIFPP_LOCAL_PATH |
| CIFPP_REPO |
| CIFPP_TAG) |
|
|
| declare_af3_dependency( |
| dssp |
| DSSP_LOCAL_PATH |
| DSSP_REPO |
| DSSP_TAG |
| EXCLUDE_FROM_ALL) |
|
|
| if(DEFINED ENV{ALPHAFOLD3_INSTALL_PREFIX}) |
| set(CMAKE_INSTALL_PREFIX $ENV{ALPHAFOLD3_INSTALL_PREFIX} CACHE PATH "Install prefix" FORCE) |
| message(STATUS "Setting install prefix to AlphaFold3 package directory: $ENV{ALPHAFOLD3_INSTALL_PREFIX}") |
| elseif(DEFINED ENV{CONDA_PREFIX}) |
| set(CMAKE_INSTALL_PREFIX $ENV{CONDA_PREFIX} CACHE PATH "Install prefix" FORCE) |
| message(STATUS "Setting install prefix to conda environment: $ENV{CONDA_PREFIX}") |
| endif() |
|
|
| if(DEFINED ENV{ALPHAFOLD3_CIFPP_DATA_DIR}) |
| set(CIFPP_DATA_DIR "$ENV{ALPHAFOLD3_CIFPP_DATA_DIR}" CACHE PATH "CIFPP data directory" FORCE) |
| message(STATUS "Setting CIFPP_DATA_DIR to ${CIFPP_DATA_DIR}") |
| elseif(DEFINED ENV{CONDA_PREFIX}) |
| execute_process( |
| COMMAND python -c "import site; print(site.getsitepackages()[0])" |
| OUTPUT_VARIABLE PYTHON_SITE_PACKAGES |
| OUTPUT_STRIP_TRAILING_WHITESPACE |
| ERROR_QUIET |
| ) |
|
|
| if(PYTHON_SITE_PACKAGES) |
| set(CIFPP_DATA_DIR "${PYTHON_SITE_PACKAGES}/share/libcifpp" CACHE PATH "CIFPP data directory" FORCE) |
| message(STATUS "Setting CIFPP_DATA_DIR to Python site-packages: ${CIFPP_DATA_DIR}") |
| endif() |
| endif() |
|
|
| FetchContent_MakeAvailable(pybind11 abseil-cpp pybind11_abseil cifpp dssp) |
|
|
| find_package( |
| Python3 |
| COMPONENTS Interpreter Development NumPy |
| REQUIRED) |
|
|
| message(STATUS "AF3 Python3_EXECUTABLE=${Python3_EXECUTABLE}") |
| message(STATUS "AF3 Python3_VERSION=${Python3_VERSION}") |
| message(STATUS "AF3 Python3_INCLUDE_DIRS=${Python3_INCLUDE_DIRS}") |
| message(STATUS "AF3 Python3_SITELIB=${Python3_SITELIB}") |
| message(STATUS "AF3 Python3_SITEARCH=${Python3_SITEARCH}") |
| message(STATUS "AF3 Python3_NumPy_INCLUDE_DIRS=${Python3_NumPy_INCLUDE_DIRS}") |
|
|
| include_directories(${Python3_INCLUDE_DIRS}) |
| include_directories(${Python3_NumPy_INCLUDE_DIRS}) |
| include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) |
|
|
| # Only compile AF3's own C++ sources. |
| file(GLOB_RECURSE cpp_srcs ${CMAKE_CURRENT_SOURCE_DIR}/*.cc) |
| # Drop any third-party / build-time sources such as benchmarks/tests/examples. |
| list(FILTER cpp_srcs EXCLUDE REGEX ".*/_deps/.*") |
| list(FILTER cpp_srcs EXCLUDE REGEX ".*/mirror_deps/.*") |
| list(FILTER cpp_srcs EXCLUDE REGEX ".*/CMake/install_test_project/.*") |
| list(FILTER cpp_srcs EXCLUDE REGEX "${CMAKE_CURRENT_SOURCE_DIR}/test/.*") |
| #list(FILTER cpp_srcs EXCLUDE REGEX ".*\\(_test\\|_main\\|_benchmark\\).cc$") |
| list(FILTER cpp_srcs EXCLUDE REGEX ".*(_test|_main|_benchmark)\\.cc$") |
| message(STATUS "AF3 cpp_srcs after filter: ${cpp_srcs}") |
|
|
| add_compile_definitions(NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION) |
|
|
| pybind11_add_module(cpp ${cpp_srcs}) |
|
|
|
|
|
|
| target_link_libraries( |
| cpp |
| PRIVATE absl::check |
| absl::flat_hash_map |
| absl::node_hash_map |
| absl::strings |
| absl::status |
| absl::statusor |
| absl::log |
| pybind11_abseil::absl_casters |
| Python3::NumPy |
| dssp::dssp |
| cifpp::cifpp) |
|
|
| target_compile_definitions(cpp PRIVATE VERSION_INFO=${PROJECT_VERSION}) |
| install(TARGETS cpp LIBRARY DESTINATION .) |
|
|
|
|
|
|