#
# Master Atomese OpenCL GPU Bridge CMake file.
#
# General organization:
# -- check for different compilers, OS'es
# -- search for various required & optional libraries/tools
# -- decide what to build based on above results.
# -- configure various config files.
# -- print pretty summary
#
# cogutils already requires 3.12, so may as well ask for that.
CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
# These must be explicitly set, as otherwise warnings are printed.
# cmake --help-policy CMP0003
CMAKE_POLICY(SET CMP0003 NEW)
CMAKE_POLICY(SET CMP0037 NEW)
CMAKE_POLICY(SET CMP0045 NEW)
IF(CMAKE_VERSION VERSION_GREATER 3.31)
CMAKE_POLICY(SET CMP0177 NEW)
ENDIF(CMAKE_VERSION VERSION_GREATER 3.31)
PROJECT(atomese-simd)
# ----------------------------------------------------------
# User-modifiable options. Feel free to change these!
#
# Uncomment to be in Release mode [default].
# SET(CMAKE_BUILD_TYPE Release)
# Uncomment to build in debug mode.
# SET(CMAKE_BUILD_TYPE Debug)
# Uncomment to be in coverage testing mode.
# SET(CMAKE_BUILD_TYPE Coverage)
# Uncomment to build in profile mode.
# SET(CMAKE_BUILD_TYPE Profile)
# Uncomment to build in release mode with debug information.
# SET(CMAKE_BUILD_TYPE RelWithDebInfo)
# default build type
IF (CMAKE_BUILD_TYPE STREQUAL "")
SET(CMAKE_BUILD_TYPE Release)
ENDIF (CMAKE_BUILD_TYPE STREQUAL "")
MESSAGE(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
ADD_DEFINITIONS(-DPROJECT_SOURCE_DIR="${CMAKE_SOURCE_DIR}"
-DPROJECT_BINARY_DIR="${CMAKE_BINARY_DIR}")
# ===============================================================
# Check for existence of various required, optional packages.
# Listed in alphabetical order, more or less.
# CogUtil must come first, because it supplies various FindXXX macros.
# Add the 'lib' dir to cmake's module search path
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/lib/")
# Cogutil
FIND_PACKAGE(CogUtil 2.0.1 CONFIG REQUIRED)
IF (COGUTIL_FOUND)
MESSAGE(STATUS "CogUtil version ${COGUTIL_VERSION} found.")
ADD_DEFINITIONS(-DHAVE_COGUTIL)
SET(HAVE_COGUTIL 1)
ELSE (COGUTIL_FOUND)
MESSAGE(FATAL_ERROR "CogUtil missing: it is needed!")
ENDIF (COGUTIL_FOUND)
# add the 'cmake' directory from cogutil to search path
list(APPEND CMAKE_MODULE_PATH ${COGUTIL_DATA_DIR}/cmake)
include(OpenCogGccOptions)
include(OpenCogLibOptions)
include(OpenCogInstallOptions)
include(Summary)
# ===================================================================
# Check for existence of various required, optional packages.
# AtomSpace
FIND_PACKAGE(AtomSpace 5.0.3 CONFIG REQUIRED)
IF (ATOMSPACE_FOUND)
MESSAGE(STATUS "AtomSpace found.")
ADD_DEFINITIONS(-DHAVE_ATOMSPACE)
SET(HAVE_ATOMSPACE 1)
ELSE (ATOMSPACE_FOUND)
MESSAGE(FATAL_ERROR "AtomSpace missing: it is needed!")
ENDIF (ATOMSPACE_FOUND)
# Sensory
FIND_PACKAGE(Sensory CONFIG REQUIRED)
IF (SENSORY_FOUND)
MESSAGE(STATUS "Sensory found.")
ADD_DEFINITIONS(-DHAVE_SENSORY)
SET(HAVE_SENSORY 1)
ELSE (SENSORY_FOUND)
MESSAGE(FATAL_ERROR "Sensory missing: it is needed!")
ENDIF (SENSORY_FOUND)
# ----------------------------------------------------------
# Unit tests
INCLUDE(OpenCogTestOptions)
# ----------------------------------------------------------
# Guile Python and Cython
include(OpenCogFindGuile)
include(OpenCogFindPython)
# ----------------------------------------------------------
# Find OpenCL. Optional.
FIND_PACKAGE(OpenCL)
IF (OPENCL_FOUND)
MESSAGE(STATUS "OpenCL found.")
MESSAGE(STATUS "OpenCL includes: ${OpenCL_INCLUDE_DIRS}")
MESSAGE(STATUS "OpenCL libraries: ${OpenCL_LIBRARIES}")
INCLUDE_DIRECTORIES(${OpenCL_INCLUDE_DIRS})
ADD_DEFINITIONS(-DHAVE_OPENCL)
SET(HAVE_OPENCL 1)
ELSE (OPENCL_FOUND)
MESSAGE(STATUS "OpenCL NOT found.")
ENDIF (OPENCL_FOUND)
# ----------------------------------------------------------
# Clang and llvm-spirv. Optional; for doing "offline" compiling
# of OpenCL kernels.
FIND_PROGRAM(CLANG clang)
IF (CLANG STREQUAL "CLANG-NOTFOUND")
MESSAGE(STATUS "clang not found; offline compile will not be done.")
ELSE (CLANG STREQUAL "CLANG-NOTFOUND")
MESSAGE(STATUS "clang found: ${CLANG}")
ADD_DEFINITIONS(-DHAVE_CLANG)
SET(HAVE_CLANG 1)
# Look for version of llvm-spirv that matches clang.
# Bit of a mess, but whatever.
execute_process(
COMMAND ${CLANG} --version
OUTPUT_VARIABLE CLANG_VERSION_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(REGEX MATCH "[0-9]+" CLANG_MAJOR_VERSION "${CLANG_VERSION_OUTPUT}")
message(STATUS "Clang major version: ${CLANG_MAJOR_VERSION}")
FIND_PROGRAM(LLVM_SPIRV llvm-spirv-${CLANG_MAJOR_VERSION})
IF (LLVM_SPIRV STREQUAL "LLVM_SPIRV-NOTFOUND")
MESSAGE(STATUS "llvm-spirv not found; offline compile will not be done.")
ELSE (LLVM_SPIRV STREQUAL "LLVM_SPIRV-NOTFOUND")
MESSAGE(STATUS "llvm-spirv found: ${LLVM_SPIRV}")
ADD_DEFINITIONS(-DHAVE_LLVM_SPIRV)
SET(HAVE_LLVM_SPIRV 1)
ENDIF (LLVM_SPIRV STREQUAL "LLVM_SPIRV-NOTFOUND")
ENDIF (CLANG STREQUAL "CLANG-NOTFOUND")
# ----------------------------------------------------------
# Find CUDA (optional; for experimental prototyping.)
INCLUDE(CheckLanguage)
CHECK_LANGUAGE(CUDA)
IF (CMAKE_CUDA_COMPILER)
MESSAGE(STATUS "CUDA found.")
ADD_DEFINITIONS(-DHAVE_CUDA)
SET(HAVE_CUDA 1)
ENABLE_LANGUAGE(CUDA)
CMAKE_POLICY(SET CMP0104 NEW)
ENDIF (CMAKE_CUDA_COMPILER)
IF (NOT HAVE_OPENCL AND NOT HAVE_CUDA)
MESSAGE(FATAL_ERROR
"Expecting to find either OpenCL or CUDA (or both)!")
ENDIF (NOT HAVE_OPENCL AND NOT HAVE_CUDA)
# ===================================================================
# Include configuration.
# Set default include paths.
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}
${COGUTIL_INCLUDE_DIR} ${ATOMSPACE_INCLUDE_DIR})
# Macros that define how atom types get declared.
IF (NOT DEFINED ATOMSPACE_DATA_DIR)
SET (ATOMSPACE_DATA_DIR "${COGUTIL_DATA_DIR}")
ENDIF (NOT DEFINED ATOMSPACE_DATA_DIR)
INCLUDE("${ATOMSPACE_DATA_DIR}/cmake/OpenCogMacros.cmake")
INCLUDE("${ATOMSPACE_DATA_DIR}/cmake/OpenCogGuile.cmake")
INCLUDE("${ATOMSPACE_DATA_DIR}/cmake/OpenCogCython.cmake")
# ==========================================================
# Decide what to build, based on the packages found.
# ADD_SUBDIRECTORY(lib)
ADD_SUBDIRECTORY(opencog)
OPENCOG_SETUP_TESTING()
ADD_CUSTOM_TARGET(cscope
COMMAND find opencog examples tests -name '*.cc' -o -name '*.h' -o -name '*.cxxtest' -o -name '*.scm' > ${CMAKE_SOURCE_DIR}/cscope.files
COMMAND cscope -b
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMENT "Generating CScope database"
)
# ===================================================================
# Packaging
# XXX FIXME. Packging below is stale/wrong/broken.
## Architecture the package is for.
## TODO: Will give error on non debian distros, fix it.
EXECUTE_PROCESS(COMMAND dpkg --print-architecture
OUTPUT_VARIABLE PACKAGE_ARCHITECTURE
OUTPUT_STRIP_TRAILING_WHITESPACE)
STRING(TIMESTAMP UTC_DATE %Y%m%d UTC)
# If 'sudo make install' is run before 'make package', then install_manifest.txt
# will be owned by root. Creating the file during configuration stage ensures
# that it is owned by the builder thus avoiding 'Permission denied' error when
# packaging.
FILE(WRITE "${PROJECT_BINARY_DIR}/install_manifest.txt")
## It doesn't have a header-file declaring the version similar to cogutil and
## atomspace.
# SEMANTIC_VERSION is set in `lib/AtomSpaceRocksConfig.cmake.in`
# SET(SEMANTIC_VERSION 1.3.0)
## Cpack configuration
SET(CPACK_GENERATOR "DEB")
SET(CPACK_PACKAGE_CONTACT "opencog@googlegroups.com")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
SET(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/packages")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The AtomSpace RocksDB Storage Backend")
SET(CPACK_PACKAGE_NAME "atomspace-rocks-dev")
SET(CPACK_PACKAGE_VENDOR "opencog.org")
SET(CPACK_PACKAGE_VERSION "${SEMANTIC_VERSION}-${UTC_DATE}")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
SET(CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_${PACKAGE_ARCHITECTURE}")
SET(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local")
## Debian specific configurations
SET(DEPENDENCY_LIST
"guile-3.0-dev (>= 3.0.0)"
"libstdc++6 (>= 7.0)"
"libcogutil-dev (>= 2.0.2)"
"atomspace-dev (>= 5.0.3)"
)
STRING(REPLACE ";" ", " MAIN_DEPENDENCIES "${DEPENDENCY_LIST}")
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "${MAIN_DEPENDENCIES}")
SET(CPACK_DEBIAN_PACKAGE_SECTION "libdevel")
SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "http://opencog.org")
INCLUDE(CPack)
# ===================================================================
# Documentation.
FIND_PACKAGE(Doxygen)
# ADD_SUBDIRECTORY(doc EXCLUDE_FROM_ALL)
# ===================================================================
# Show a summary of what we found, what we will do.
SUMMARY_ADD("Atomese-OpenCL" "Atomese OpenCL GPU interfaces"
HAVE_ATOMSPACE AND HAVE_SENSORY AND HAVE_OPENCL)
SUMMARY_ADD("Offline compile" "OpenCL offline compile of kernels"
HAVE_CLANG AND HAVE_LLVM_SPIRV)
SUMMARY_ADD("Atomese-CUDA" "Atomese CUDA GPU interfaces" HAVE_CUDA)
# SUMMARY_ADD("Cython" "Cython (python) bindings" HAVE_CYTHON)
SUMMARY_ADD("Doxygen" "Code documentation" DOXYGEN_FOUND)
SUMMARY_ADD("Unit tests" "Unit tests" CXXTEST_FOUND)
SUMMARY_SHOW()