# CMakeLists.txt # # This file is part of NEST. # # Copyright (C) 2004 The NEST Initiative # # NEST is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # NEST is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with NEST. If not, see cmake_minimum_required( VERSION 3.1 ) # add cmake modules: for all `include(...)` first look here list( APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) project( nest CXX C ) set( NEST_USER_EMAIL "nest_user@nest-initiative.org" ) ################################################################################ ################## All User Defined options ################## ################################################################################ # set NEST defaults set( tics_per_ms "1000.0" CACHE STRING "Specify elementary unit of time. [default 1000.0]" ) set( tics_per_step "100" CACHE STRING "Specify resolution. [default 100]" ) set( connector_cutoff "3" CACHE STRING "Specify when to truncate the recursive instantiation of the connector. [default 3]" ) option( with-ps-arrays "Use PS array construction semantics. [default=ON]" ON ) # add user modules set( external-modules OFF CACHE STRING "External NEST modules to be linked in, separated by ';'. [default=OFF]" ) # connect NEST with external projects set( with-libneurosim OFF CACHE STRING "Request the use of libneurosim. Optionally give the directory, where libneurosim is installed. [default=OFF]" ) set( with-music OFF CACHE STRING "Request the use of MUSIC. Optionally give the directory, where MUSIC is installed. [default=OFF]" ) set( with-boost OFF CACHE STRING "Request compilation with Boost, required for C++ testsuite. Optionally give directory with Boost installation. [default=OFF]" ) # set parallelization scheme set( with-mpi OFF CACHE STRING "Request compilation with MPI. Optionally give directory with MPI installation. [default=OFF]" ) set( with-openmp ON CACHE BOOL "Enable OpenMP multithreading. Optional: set OMP flag. [default=ON]" ) # define default libraries set( with-gsl ON CACHE STRING "Find a gsl library. To set a specific gsl installation, set install path. [default=ON]" ) set( with-readline ON CACHE STRING "Find a readline library. To set a specific readline, set install path. [default=ON]" ) set( with-ltdl ON CACHE STRING "Find a ltdl library. To set a specific ltdl, set install path. [default=ON]" ) set( with-python ON CACHE STRING "Build PyNEST. To set a specific Python, set install path. [default=ON]" ) option( cythonize-pynest "Use Cython to cythonize pynestkernel.pyx. If OFF, PyNEST has to be build from a pre-cythonized pynestkernel.pyx. [default=ON]" ON ) # Whether to build a 'mostly' static executable and static libraries. option( static-libraries "Build static executable and libraries. [default=OFF]" OFF ) # additional compile flags set( with-optimize ON CACHE STRING "Enable user defined optimizations. [default ON, when ON, defaults to '-O2']" ) set( with-warning ON CACHE STRING "Enable user defined warnings. [default ON, when ON, defaults to '-Wall']" ) set( with-debug OFF CACHE STRING "Enable user defined debug flags. [default OFF, when ON, defaults to '-g']" ) set( with-intel-compiler-flags OFF CACHE STRING "User defined flags for the Intel compiler. [defaults to '-fp-model strict']" ) set( with-libraries OFF CACHE STRING "Link additional libraries. Give full path. Separate multiple libraries by ';'. [default OFF]" ) set( with-includes OFF CACHE STRING "Add additional include paths. Give full path without '-I'. Separate multiple include paths by ';'. [default OFF]" ) set( with-defines OFF CACHE STRING "Additional defines, e.g. '-DXYZ=1'. Separate multiple defines by ';'. [default OFF]" ) set( with-version-suffix "" CACHE STRING "Set a user defined version suffix. [default '']" ) # cross-compiling # should be set via toolchain files set( enable-bluegene OFF CACHE STRING "Configure for BlueGene." ) option( k-computer "Enable K computer." OFF ) set( disable-timing OFF CACHE BOOL "Disable measurements via Stopwatches. [default OFF]" ) set( disable-counts ON CACHE BOOL "Disable measurements of call counts. [default ON]" ) set( target-bits-split "standard" CACHE STRING "Split of the 64-bit target neuron identifier type. 'standard' is recommended for most users. If running on more than 262144 MPI processes or more than 512 threads, change to 'hpc'. [default standard]" ) ################################################################################ ################## Project Directory variables ################## ################################################################################ # In general use the CMAKE_INSTALL_ and CMAKE_INSTALL_FULL_ vars from # GNUInstallDirs, but the CMAKE_INSTALL_DATADIR is usually just CMAKE_INSTALL_DATAROOTDIR # and we want it to be CMAKE_INSTALL_DATAROOTDIR/PROJECT_NAME set( CMAKE_INSTALL_DATADIR "share/${PROJECT_NAME}" CACHE STRING "Relative directory, where NEST installs its data (share/nest)" ) include( GNUInstallDirs ) ################################################################################ ################# Do not install into /usr/local ################# ################################################################################ get_filename_component(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") # If CMAKE_INSTALL_PREFIX is omitted CMake will set the installation prefix to its default '/usr/local'. # This is not desired. A subdirectory is allowed, e.g. 'usr/local/nest'. if ( "${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr/local" ) message( FATAL_ERROR "Do not install into '${CMAKE_INSTALL_PREFIX}'. Please set -DCMAKE_INSTALL_PREFIX:PATH=." ) endif () ################################################################################ ################## Find utility programs ################## ################################################################################ # needed for pynest test suite if ( ${with-python} STREQUAL "ON" OR ${with-python} STREQUAL "2" OR ${with-python} STREQUAL "3" ) find_program( NOSETESTS NAMES nosetests ) endif () # needed for target doc and fulldoc find_package( Doxygen ) find_program( SED NAMES sed gsed ) ################################################################################ ################## Load includes ################## ################################################################################ # This include checks the symbols, etc. include( CheckIncludesSymbols ) # These includes publish function names. include( ProcessOptions ) include( WriteStaticModules_h ) include( CheckExtraCompilerFeatures ) include( ConfigureSummary ) include( GetTriple ) include( DefaultCompilerFlags ) # get triples arch-vendor-os get_host_triple( NEST_HOST_TRIPLE NEST_HOST_ARCH NEST_HOST_VENDOR NEST_HOST_OS ) get_target_triple( NEST_TARGET_TRIPLE NEST_TARGET_ARCH NEST_TARGET_VENDOR NEST_TARGET_OS ) # set default compiler flags nest_set_default_compiler_flags() # Process the command line arguments nest_process_with_optimize() nest_process_with_debug() nest_process_with_intel_compiler_flags() nest_process_with_warning() nest_process_with_libraries() nest_process_with_includes() nest_process_with_defines() nest_process_k_computer() nest_process_enable_bluegene() nest_process_static_libraries() nest_process_external_modules() nest_process_tics_per_ms() nest_process_tics_per_step() nest_process_with_ps_array() nest_process_with_libltdl() nest_process_with_readline() nest_process_with_gsl() nest_process_with_python() nest_process_with_openmp() nest_process_with_mpi() nest_process_with_libneurosim() nest_process_with_music() nest_process_with_boost() nest_process_target_bits_split() nest_process_version_suffix() nest_get_color_flags() set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NEST_C_COLOR_FLAGS}" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${NEST_CXX_COLOR_FLAGS}" ) # requires HAVE_LIBNEUROSIM nest_default_modules() nest_write_static_module_header( "${PROJECT_BINARY_DIR}/nest/static_modules.h" ) # check additionals nest_check_exitcode_abort() nest_check_exitcode_segfault() nest_check_have_cmath_makros_ignored() nest_check_have_alpha_cxx_std_bug() nest_check_have_sigusr_ignored() nest_check_have_static_template_declaration_fail() nest_check_have_stl_vector_capacity_base_unity() nest_check_have_stl_vector_capacity_doubling() nest_check_have_xlc_ice_on_using() nest_check_have_std_nan() nest_check_have_std_isnan() ################################################################################ ################## Create version string ################## ################################################################################ include( NestVersionInfo ) get_version_info() message("-- NEST version: ${NEST_VERSION_STRING}") ################################################################################ ################## Enable Testing Targets ################## ################################################################################ enable_testing() set( TEST_LOGFILE ${PROJECT_BINARY_DIR}/reports/installcheck.log ) file( MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/reports/ ) if ( HAVE_PYTHON ) add_custom_target( installcheck COMMAND ${CMAKE_COMMAND} -E env NEST_PATH="${CMAKE_INSTALL_FULL_BINDIR}" PYTHON="${PYTHON}" NEST_PYTHONPATH="${CMAKE_INSTALL_PREFIX}/${PYEXECDIR}" ${CMAKE_INSTALL_FULL_DATADIR}/extras/do_tests.sh --test-pynest WORKING_DIRECTORY "${PROJECT_BINARY_DIR}" COMMENT "Execute NEST's testsuite...." ) else () add_custom_target( installcheck COMMAND ${CMAKE_COMMAND} -E env NEST_PATH="${CMAKE_INSTALL_FULL_BINDIR}" ${CMAKE_INSTALL_FULL_DATADIR}/extras/do_tests.sh WORKING_DIRECTORY "${PROJECT_BINARY_DIR}" COMMENT "Execute NEST's testsuite...." ) endif () ################################################################################ ################## Define Subdirectories here ################## ################################################################################ if ( HAVE_LIBNEUROSIM ) add_subdirectory( conngen ) endif () add_subdirectory( doc ) add_subdirectory( examples ) add_subdirectory( extras ) add_subdirectory( lib ) add_subdirectory( libnestutil ) add_subdirectory( librandom ) add_subdirectory( models ) add_subdirectory( sli ) add_subdirectory( nest ) add_subdirectory( nestkernel ) add_subdirectory( precise ) add_subdirectory( testsuite ) add_subdirectory( topology ) if ( HAVE_PYTHON ) add_subdirectory( pynest ) endif () ################################################################################ ################## Summary of flags ################## ################################################################################ # used in nest-config # all compiler flags if ( NOT CMAKE_BUILD_TYPE OR "${CMAKE_BUILD_TYPE}" STREQUAL "None" ) set( ALL_CFLAGS "${CMAKE_C_FLAGS}" ) set( ALL_CXXFLAGS "${CMAKE_CXX_FLAGS}" ) elseif ( ${CMAKE_BUILD_TYPE} STREQUAL "Debug" ) set( ALL_CFLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG}" ) set( ALL_CXXFLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}" ) elseif ( ${CMAKE_BUILD_TYPE} STREQUAL "Release" ) set( ALL_CFLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_RELEASE}" ) set( ALL_CXXFLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}" ) elseif ( ${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo" ) set( ALL_CFLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_RELWITHDEBINFO}" ) set( ALL_CXXFLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" ) elseif ( ${CMAKE_BUILD_TYPE} STREQUAL "MinSizeRel" ) set( ALL_CFLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_MINSIZEREL}" ) set( ALL_CXXFLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_MINSIZEREL}" ) else () message( FATAL_ERROR "Unknown build type: '${CMAKE_BUILD_TYPE}'" ) endif () if ( with-defines ) foreach ( def ${with-defines} ) set( ALL_CFLAGS "${def} ${ALL_CFLAGS}" ) set( ALL_CXXFLAGS "${def} ${ALL_CXXFLAGS}" ) endforeach () endif () # all libraries set( ALL_LIBS "-lnestutil" "-lnest" "-lrandom" "-lsli" "-lnestkernel" "-ltopology" "${OpenMP_CXX_FLAGS}" "${LTDL_LIBRARIES}" "${READLINE_LIBRARIES}" "${GSL_LIBRARIES}" "${LIBNEUROSIM_LIBRARIES}" "${MUSIC_LIBRARIES}" "${MPI_CXX_LIBRARIES}" ) if ( with-libraries ) set( ALL_LIBS "${ALL_LIBS};${with-libraries}" ) endif () string( REPLACE ";" " " ALL_LIBS "${ALL_LIBS}" ) # all includes set( ALL_INCLUDES_tmp "${CMAKE_INSTALL_FULL_INCLUDEDIR}/nest" "${LTDL_INCLUDE_DIRS}" "${READLINE_INCLUDE_DIRS}" "${GSL_INCLUDE_DIRS}" "${LIBNEUROSIM_INCLUDE_DIRS}" "${MUSIC_INCLUDE_DIRS}" "${MPI_CXX_INCLUDE_PATH}" ) set( ALL_INCLUDES "" ) foreach ( INC ${ALL_INCLUDES_tmp} ${with-includes} ) if ( INC AND NOT INC STREQUAL "" ) set( ALL_INCLUDES "${ALL_INCLUDES} -I${INC}" ) endif () endforeach () if ( HAVE_LIBNEUROSIM ) set( ALL_LIBS "-lconngen ${ALL_LIBS}" ) set( ALL_INCLUDES "-I${PROJECT_SOURCE_DIR}/conngen ${ALL_INCLUDES}" ) endif () ################################################################################ ################## File generation here ################## ################################################################################ configure_file( "${PROJECT_SOURCE_DIR}/libnestutil/config.h.in" "${PROJECT_BINARY_DIR}/libnestutil/config.h" @ONLY ) configure_file( "${PROJECT_SOURCE_DIR}/pynest/setup.py.in" "${PROJECT_BINARY_DIR}/pynest/setup.py" @ONLY ) configure_file( "${PROJECT_SOURCE_DIR}/pynest/do_tests.py.in" "${PROJECT_BINARY_DIR}/pynest/do_tests.py" @ONLY ) configure_file( "${PROJECT_SOURCE_DIR}/topology/setup.py.in" "${PROJECT_BINARY_DIR}/topology/setup.py" @ONLY ) configure_file( "${PROJECT_SOURCE_DIR}/testsuite/do_tests.sh.in" "${PROJECT_BINARY_DIR}/testsuite/do_tests.sh" @ONLY ) configure_file( "${PROJECT_SOURCE_DIR}/extras/nest-config.in" "${PROJECT_BINARY_DIR}/extras/nest-config" @ONLY ) configure_file( "${PROJECT_SOURCE_DIR}/extras/nest_vars.sh.in" "${PROJECT_BINARY_DIR}/extras/nest_vars.sh" @ONLY ) configure_file( "${PROJECT_SOURCE_DIR}/doc/normaldoc.conf.in" "${PROJECT_BINARY_DIR}/doc/normaldoc.conf" @ONLY ) configure_file( "${PROJECT_SOURCE_DIR}/doc/fulldoc.conf.in" "${PROJECT_BINARY_DIR}/doc/fulldoc.conf" @ONLY ) ################################################################################ ################## Install Extra Files ################## ################################################################################ install( FILES LICENSE README.md DESTINATION ${CMAKE_INSTALL_DOCDIR} ) add_custom_target( install-nodoc COMMAND make NEST_INSTALL_NODOC=true install ) nest_print_config_summary()