diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 71070aff450fa41a03a759746d2bc7187255d24c..d7fb090e4ab977cc907d3b624dcbed62ae3fbfeb 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -4,7 +4,7 @@ # Created by Christoph Junghans and Richard Berger cmake_minimum_required(VERSION 3.1) -project(lammps) +project(lammps LANGUAGES CXX) set(SOVERSION 0) set(LAMMPS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../src) set(LAMMPS_LIB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../lib) @@ -23,14 +23,22 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS) set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE) endif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS) -# remove any style headers in the src dir -file(GLOB SRC_STYLE_FILES ${LAMMPS_SOURCE_DIR}/style_*.h) -if(SRC_STYLE_FILES) - file(REMOVE ${SRC_STYLE_FILES}) +file(GLOB SRC_FILES ${LAMMPS_SOURCE_DIR}/*.cpp) +list(SORT SRC_FILES) +# check for files installed by make-based buildsystem +# only run this time consuming check if there are new files +if(NOT SRC_FILES STREQUAL SRC_FILES_CACHED) + file(GLOB SRC_PKG_FILES ${LAMMPS_SOURCE_DIR}/*/*.cpp) + message(STATUS "Running check for installed package (this might take a while)") + foreach(_SRC SRC_PKG_FILES) + get_filename_component(FILENAME "${_SRC}" NAME) + if(EXISTS ${LAMMPS_SOURCE_DIR}/${FILENAME}) + message(FATAL_ERROR "Found packages installed by the make-based buildsystem, please run 'make -C ${LAMMPS_SOURCE_DIR} no-all purge'") + endif() + endforeach() + set(SRC_FILES_CACHED "${SRC_FILES}" CACHE INTERNAL "List of file in LAMMPS_SOURCE_DIR" FORCE) endif() -enable_language(CXX) - ###################################################################### # compiler tests # these need ot be done early (before further tests). @@ -53,16 +61,19 @@ include(GNUInstallDirs) set(LAMMPS_LINK_LIBS) set(LAMMPS_DEPS) set(LAMMPS_API_DEFINES) -option(ENABLE_MPI "Build MPI version" OFF) -if(ENABLE_MPI) + +find_package(MPI QUIET) +option(BUILD_MPI "Build MPI version" ${MPI_FOUND}) +if(BUILD_MPI) find_package(MPI REQUIRED) - include_directories(${MPI_C_INCLUDE_PATH}) + include_directories(${MPI_CXX_INCLUDE_PATH}) list(APPEND LAMMPS_LINK_LIBS ${MPI_CXX_LIBRARIES}) option(LAMMPS_LONGLONG_TO_LONG "Workaround if your system or MPI version does not recognize 'long long' data types" OFF) if(LAMMPS_LONGLONG_TO_LONG) add_definitions(-DLAMMPS_LONGLONG_TO_LONG) endif() else() + enable_language(C) file(GLOB MPI_SOURCES ${LAMMPS_SOURCE_DIR}/STUBS/mpi.c) add_library(mpi_stubs STATIC ${MPI_SOURCES}) include_directories(${LAMMPS_SOURCE_DIR}/STUBS) @@ -108,14 +119,14 @@ set(OTHER_PACKAGES KIM PYTHON MSCG MPIIO VORONOI POEMS LATTE USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-VTK USER-QUIP USER-QMMM) set(ACCEL_PACKAGES USER-OMP KOKKOS OPT USER-INTEL GPU) foreach(PKG ${DEFAULT_PACKAGES}) - option(ENABLE_${PKG} "Build ${PKG} Package" ${ENABLE_ALL}) + option(PKG_${PKG} "Build ${PKG} Package" ${ENABLE_ALL}) endforeach() foreach(PKG ${ACCEL_PACKAGES} ${OTHER_PACKAGES}) - option(ENABLE_${PKG} "Build ${PKG} Package" OFF) + option(PKG_${PKG} "Build ${PKG} Package" OFF) endforeach() macro(pkg_depends PKG1 PKG2) - if(ENABLE_${PKG1} AND NOT ENABLE_${PKG2}) + if(PKG_${PKG1} AND NOT PKG_${PKG2}) message(FATAL_ERROR "${PKG1} package needs LAMMPS to be build with ${PKG2}") endif() endmacro() @@ -131,31 +142,50 @@ pkg_depends(USER-PHONON KSPACE) ###################################################### # packages with special compiler needs or external libs ###################################################### -if(ENABLE_REAX OR ENABLE_MEAM OR ENABLE_USER-QUIP OR ENABLE_USER-QMMM OR ENABLE_LATTE) +if(PKG_REAX OR PKG_MEAM OR PKG_USER-QUIP OR PKG_USER-QMMM OR PKG_LATTE) enable_language(Fortran) - include(CheckFortranCompilerFlag) - check_Fortran_compiler_flag("-fno-second-underscore" FC_HAS_NO_SECOND_UNDERSCORE) endif() -if(ENABLE_KOKKOS OR ENABLE_MSCG) +if(PKG_MEAM) + enable_language(C) +endif() + +if(PKG_KOKKOS OR PKG_MSCG) # starting with CMake 3.1 this is all you have to do to enforce C++11 set(CMAKE_CXX_STANDARD 11) # C++11... set(CMAKE_CXX_STANDARD_REQUIRED ON) #...is required... set(CMAKE_CXX_EXTENSIONS OFF) #...without compiler extensions like gnu++11 endif() -if(ENABLE_USER-OMP OR ENABLE_KOKKOS OR ENABLE_USER-INTEL) +find_package(OpenMP QUIET) +option(BUILD_OMP "Build with OpenMP support" ${OpenMP_FOUND}) +if(BUILD_OMP OR PKG_USER-OMP OR PKG_KOKKOS OR PKG_USER-INTEL) find_package(OpenMP REQUIRED) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") endif() -if(ENABLE_KSPACE) - set(FFT "KISSFFT" CACHE STRING "FFT library for KSPACE package") - set_property(CACHE FFT PROPERTY STRINGS KISSFFT FFTW3 MKL FFTW2) +if(PKG_KSPACE) + option(FFT_SINGLE "Use single precision FFT instead of double" OFF) + set(FFTW "FFTW3") + if(FFT_SINGLE) + set(FFTW "FFTW3F") + add_definitions(-DFFT_SINGLE) + endif() + find_package(${FFTW} QUIET) + if(${FFTW}_FOUND) + set(FFT "${FFTW}" CACHE STRING "FFT library for KSPACE package") + else() + set(FFT "KISSFFT" CACHE STRING "FFT library for KSPACE package") + endif() + set_property(CACHE FFT PROPERTY STRINGS KISSFFT ${FFTW} MKL) if(NOT FFT STREQUAL "KISSFFT") find_package(${FFT} REQUIRED) - add_definitions(-DFFT_${FFT}) + if(NOT FFT STREQUAL "FFTW3F") + add_definitions(-DFFT_FFTW) + else() + add_definitions(-DFFT_${FFT}) + endif() include_directories(${${FFT}_INCLUDE_DIRS}) list(APPEND LAMMPS_LINK_LIBS ${${FFT}_LIBRARIES}) endif() @@ -166,22 +196,17 @@ if(ENABLE_KSPACE) endif() endif() -if(ENABLE_MSCG OR ENABLE_USER-ATC OR ENABLE_USER-AWPMD OR ENABLE_USER-QUIP OR ENABLE_LATTE) +if(PKG_MSCG OR PKG_USER-ATC OR PKG_USER-AWPMD OR PKG_USER-QUIP OR PKG_LATTE) find_package(LAPACK) if(NOT LAPACK_FOUND) enable_language(Fortran) file(GLOB LAPACK_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/linalg/*.f) add_library(linalg STATIC ${LAPACK_SOURCES}) - include(CheckFortranCompilerFlag) - check_Fortran_compiler_flag("-fno-second-underscore" FC_HAS_NO_SECOND_UNDERSCORE) - if(FC_HAS_NO_SECOND_UNDERSCORE) - target_compile_options(linalg PRIVATE -fno-second-underscore) - endif() set(LAPACK_LIBRARIES linalg) endif() endif() -if(ENABLE_PYTHON) +if(PKG_PYTHON) find_package(PythonInterp REQUIRED) find_package(PythonLibs REQUIRED) add_definitions(-DLMP_PYTHON) @@ -197,16 +222,25 @@ if(ENABLE_PYTHON) endif() endif() -find_package(JPEG) -if(JPEG_FOUND) +find_package(JPEG QUIET) +option(WITH_JPEG "Enable JPEG support" ${JPEG_FOUND}) +if(WITH_JPEG) + find_package(JPEG REQUIRED) add_definitions(-DLAMMPS_JPEG) include_directories(${JPEG_INCLUDE_DIR}) list(APPEND LAMMPS_LINK_LIBS ${JPEG_LIBRARIES}) endif() -find_package(PNG) -find_package(ZLIB) +find_package(PNG QUIET) +find_package(ZLIB QUIET) if(PNG_FOUND AND ZLIB_FOUND) + option(WITH_PNG "Enable PNG support" ON) +else() + option(WITH_PNG "Enable PNG support" OFF) +endif() +if(WITH_PNG) + find_package(PNG REQUIRED) + find_package(ZLIB REQUIRED) include_directories(${PNG_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS}) list(APPEND LAMMPS_LINK_LIBS ${PNG_LIBRARIES} ${ZLIB_LIBRARIES}) add_definitions(-DLAMMPS_PNG) @@ -214,25 +248,50 @@ endif() find_program(GZIP_EXECUTABLE gzip) find_package_handle_standard_args(GZIP REQUIRED_VARS GZIP_EXECUTABLE) -if(GZIP_FOUND) +option(WITH_GZIP "Enable GZIP support" ${GZIP_FOUND}) +if(WITH_GZIP) + if(NOT GZIP_FOUND) + message(FATAL_ERROR "gzip executable not found") + endif() add_definitions(-DLAMMPS_GZIP) endif() find_program(FFMPEG_EXECUTABLE ffmpeg) find_package_handle_standard_args(FFMPEG REQUIRED_VARS FFMPEG_EXECUTABLE) -if(FFMPEG_FOUND) +option(WITH_FFMPEG "Enable FFMPEG support" ${FFMPEG_FOUND}) +if(WITH_FFMPEG) + if(NOT FFMPEG_FOUND) + message(FATAL_ERROR "ffmpeg executable not found") + endif() add_definitions(-DLAMMPS_FFMPEG) endif() -if(ENABLE_VORONOI) - find_package(VORO REQUIRED) #some distros +if(PKG_VORONOI) + option(DOWNLOAD_VORO "Download voro++ (instead of using the system's one)" OFF) + if(DOWNLOAD_VORO) + include(ExternalProject) + ExternalProject_Add(voro_build + URL http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz + URL_MD5 2338b824c3b7b25590e18e8df5d68af9 + CONFIGURE_COMMAND "" BUILD_IN_SOURCE 1 INSTALL_COMMAND "" + ) + ExternalProject_get_property(voro_build SOURCE_DIR) + set(VORO_LIBRARIES ${SOURCE_DIR}/src/libvoro++.a) + set(VORO_INCLUDE_DIRS ${SOURCE_DIR}/src) + list(APPEND LAMMPS_DEPS voro_build) + else() + find_package(VORO) + if(NOT VORO_FOUND) + message(FATAL_ERROR "VORO not found, help CMake to find it by setting VORO_LIBRARY and VORO_INCLUDE_DIR, or set DOWNLOAD_VORO=ON to download it") + endif() + endif() include_directories(${VORO_INCLUDE_DIRS}) list(APPEND LAMMPS_LINK_LIBS ${VORO_LIBRARIES}) endif() -if(ENABLE_LATTE) - find_package(LATTE QUIET) - if(NOT LATTE_FOUND) +if(PKG_LATTE) + option(DOWNLOAD_LATTE "Download latte (instead of using the system's one)" OFF) + if(DOWNLOAD_LATTE) message(STATUS "LATTE not found - we will build our own") include(ExternalProject) ExternalProject_Add(latte_build @@ -244,48 +303,73 @@ if(ENABLE_LATTE) ExternalProject_get_property(latte_build INSTALL_DIR) set(LATTE_LIBRARIES ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/liblatte.a) list(APPEND LAMMPS_DEPS latte_build) + else() + find_package(LATTE) + if(NOT LATTE_FOUND) + message(FATAL_ERROR "LATTE not found, help CMake to find it by setting LATTE_LIBRARY, or set DOWNLOAD_LATTE=ON to download it") + endif() endif() list(APPEND LAMMPS_LINK_LIBS ${LATTE_LIBRARIES} ${LAPACK_LIBRARIES} ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) endif() -if(ENABLE_USER-MOLFILE) +if(PKG_USER-MOLFILE) add_library(molfile INTERFACE) target_include_directories(molfile INTERFACE ${LAMMPS_LIB_SOURCE_DIR}/molfile) target_link_libraries(molfile INTERFACE ${CMAKE_DL_LIBS}) list(APPEND LAMMPS_LINK_LIBS molfile) endif() -if(ENABLE_USER-NETCDF) +if(PKG_USER-NETCDF) find_package(NetCDF REQUIRED) include_directories(NETCDF_INCLUDE_DIR) list(APPEND LAMMPS_LINK_LIBS ${NETCDF_LIBRARY}) add_definitions(-DLMP_HAS_NETCDF -DNC_64BIT_DATA=0x0020) endif() -if(ENABLE_USER-SMD) - find_package(Eigen3 REQUIRED) +if(PKG_USER-SMD) + option(DOWNLOAD_Eigen3 "Download Eigen3 (instead of using the system's one)" OFF) + if(DOWNLOAD_Eigen3) + include(ExternalProject) + ExternalProject_Add(Eigen3_build + URL http://bitbucket.org/eigen/eigen/get/3.3.4.tar.gz + URL_MD5 1a47e78efe365a97de0c022d127607c3 + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DEIGEN_TEST_NOQT=ON + -DCMAKE_DISABLE_FIND_PACKAGE_LAPACK=ON -DCMAKE_DISABLE_FIND_PACKAGE_Cholmod=ON -DCMAKE_DISABLE_FIND_PACKAGE_Umfpack=ON -DCMAKE_DISABLE_FIND_PACKAGE_SuperLU=ON + -DCMAKE_DISABLE_FIND_PACKAGE_PASTIX=ON -DCMAKE_DISABLE_FIND_PACKAGE_SPQR=ON -DCMAKE_DISABLE_FIND_PACKAGE_Boost=ON -DCMAKE_DISABLE_FIND_PACKAGE_CUDA=ON + -DCMAKE_DISABLE_FIND_PACKAGE_FFTW=ON -DCMAKE_DISABLE_FIND_PACKAGE_MPFR=ON -DCMAKE_DISABLE_FIND_PACKAGE_OpenGL=ON + ) + ExternalProject_get_property(Eigen3_build INSTALL_DIR) + set(EIGEN3_INCLUDE_DIR ${INSTALL_DIR}/include/eigen3) + list(APPEND LAMMPS_DEPS Eigen3_build) + else() + find_package(Eigen3) + if(NOT Eigen3_FOUND) + message(FATAL_ERROR "Eigen3 not found, help CMake to find it by setting EIGEN3_INCLUDE_DIR, or set DOWNLOAD_Eigen3=ON to download it") + endif() + endif() include_directories(${EIGEN3_INCLUDE_DIR}) endif() -if(ENABLE_USER-QUIP) +if(PKG_USER-QUIP) find_package(QUIP REQUIRED) list(APPEND LAMMPS_LINK_LIBS ${QUIP_LIBRARIES} ${LAPACK_LIBRARIES} ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) endif() -if(ENABLE_USER-QMMM) +if(PKG_USER-QMMM) + message(WARNING "Building QMMM with CMake is still experimental") find_package(QE REQUIRED) include_directories(${QE_INCLUDE_DIRS}) list(APPEND LAMMPS_LINK_LIBS ${QE_LIBRARIES} ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) endif() -if(ENABLE_USER-VTK) +if(PKG_USER-VTK) find_package(VTK REQUIRED NO_MODULE) include(${VTK_USE_FILE}) add_definitions(-DLAMMPS_VTK) list(APPEND LAMMPS_LINK_LIBS ${VTK_LIBRARIES}) endif() -if(ENABLE_KIM) +if(PKG_KIM) find_package(KIM QUIET) if(NOT KIM_FOUND) message(STATUS "KIM not found - we will build our own") @@ -305,7 +389,7 @@ if(ENABLE_KIM) include_directories(${KIM_INCLUDE_DIRS}) endif() -if(ENABLE_MSCG) +if(PKG_MSCG) find_package(GSL REQUIRED) set(LAMMPS_LIB_MSCG_BIN_DIR ${LAMMPS_LIB_BINARY_DIR}/mscg) set(MSCG_TARBALL ${LAMMPS_LIB_MSCG_BIN_DIR}/MS-CG-master.zip) @@ -329,12 +413,18 @@ if(ENABLE_MSCG) target_link_libraries(mscg ${GSL_LIBRARIES} ${LAPACK_LIBRARIES}) endif() +if(PKG_COMPRESS) + find_package(ZLIB REQUIRED) + include_directories(${ZLIB_INCLUDE_DIRS}) + list(APPEND LAMMPS_LINK_LIBS ${ZLIB_LIBRARIES}) +endif() + ######################################################################## # Basic system tests (standard libraries, headers, functions, types) # ######################################################################## -include(CheckIncludeFile) +include(CheckIncludeFileCXX) foreach(HEADER math.h) - check_include_file(${HEADER} FOUND_${HEADER}) + check_include_file_cxx(${HEADER} FOUND_${HEADER}) if(NOT FOUND_${HEADER}) message(FATAL_ERROR "Could not find needed header - ${HEADER}") endif(NOT FOUND_${HEADER}) @@ -378,7 +468,7 @@ foreach(PKG ${DEFAULT_PACKAGES} ${OTHER_PACKAGES}) DetectAndRemovePackageHeader(${LAMMPS_SOURCE_DIR}/${FNAME}) endforeach() - if(ENABLE_${PKG}) + if(PKG_${PKG}) # detects styles in package and adds them to global list RegisterStyles(${${PKG}_SOURCES_DIR}) @@ -392,7 +482,7 @@ endforeach() ############################################ foreach(SIMPLE_LIB REAX MEAM POEMS USER-ATC USER-AWPMD USER-COLVARS USER-H5MD USER-QMMM) - if(ENABLE_${SIMPLE_LIB}) + if(PKG_${SIMPLE_LIB}) string(REGEX REPLACE "^USER-" "" PKG_LIB "${SIMPLE_LIB}") string(TOLOWER "${PKG_LIB}" PKG_LIB) file(GLOB_RECURSE ${PKG_LIB}_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/${PKG_LIB}/*.F @@ -413,40 +503,26 @@ foreach(SIMPLE_LIB REAX MEAM POEMS USER-ATC USER-AWPMD USER-COLVARS USER-H5MD endif() endforeach() -if(ENABLE_USER-AWPMD) +if(PKG_USER-AWPMD) target_link_libraries(awpmd ${LAPACK_LIBRARIES}) endif() -if(ENABLE_USER-ATC) +if(PKG_USER-ATC) target_link_libraries(atc ${LAPACK_LIBRARIES}) endif() -if(ENABLE_USER-H5MD) +if(PKG_USER-H5MD) find_package(HDF5 REQUIRED) target_link_libraries(h5md ${HDF5_LIBRARIES}) target_include_directories(h5md PRIVATE ${HDF5_INCLUDE_DIRS}) endif() -if(ENABLE_MEAM AND FC_HAS_NO_SECOND_UNDERSCORE) - foreach(FSRC ${meam_SOURCES}) - string(REGEX REPLACE "^.*\\." "" FEXT "${FSRC}") - list(FIND CMAKE_Fortran_SOURCE_FILE_EXTENSIONS "${FEXT}" FINDEX) - if(FINDEX GREATER -1) - set_property(SOURCE ${FSRC} APPEND PROPERTY COMPILE_FLAGS "-fno-second-underscore") - endif() - endforeach() -endif() - -if(ENABLE_REAX AND FC_HAS_NO_SECOND_UNDERSCORE) - target_compile_options(reax PRIVATE -fno-second-underscore) -endif() - ###################################################################### # packages which selectively include variants based on enabled styles # e.g. accelerator packages ###################################################################### -if(ENABLE_USER-OMP) +if(PKG_USER-OMP) set(USER-OMP_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/USER-OMP) set(USER-OMP_SOURCES ${USER-OMP_SOURCES_DIR}/thr_data.cpp ${USER-OMP_SOURCES_DIR}/thr_omp.cpp @@ -463,7 +539,7 @@ if(ENABLE_USER-OMP) include_directories(${USER-OMP_SOURCES_DIR}) endif() -if(ENABLE_KOKKOS) +if(PKG_KOKKOS) set(LAMMPS_LIB_KOKKOS_SRC_DIR ${LAMMPS_LIB_SOURCE_DIR}/kokkos) set(LAMMPS_LIB_KOKKOS_BIN_DIR ${LAMMPS_LIB_BINARY_DIR}/kokkos) add_definitions(-DLMP_KOKKOS) @@ -499,7 +575,7 @@ if(ENABLE_KOKKOS) RegisterNBinStyle(${KOKKOS_PKG_SOURCES_DIR}/nbin_kokkos.h) RegisterNPairStyle(${KOKKOS_PKG_SOURCES_DIR}/npair_kokkos.h) - if(ENABLE_USER-DPD) + if(PKG_USER-DPD) get_property(KOKKOS_PKG_SOURCES GLOBAL PROPERTY KOKKOS_PKG_SOURCES) list(APPEND KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/npair_ssa_kokkos.cpp) RegisterNPairStyle(${KOKKOS_PKG_SOURCES_DIR}/npair_ssa_kokkos.h) @@ -512,7 +588,7 @@ if(ENABLE_KOKKOS) include_directories(${KOKKOS_PKG_SOURCES_DIR}) endif() -if(ENABLE_OPT) +if(PKG_OPT) set(OPT_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/OPT) set(OPT_SOURCES) set_property(GLOBAL PROPERTY "OPT_SOURCES" "${OPT_SOURCES}") @@ -526,7 +602,7 @@ if(ENABLE_OPT) include_directories(${OPT_SOURCES_DIR}) endif() -if(ENABLE_USER-INTEL) +if(PKG_USER-INTEL) set(USER-INTEL_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/USER-INTEL) set(USER-INTEL_SOURCES ${USER-INTEL_SOURCES_DIR}/intel_preprocess.h ${USER-INTEL_SOURCES_DIR}/intel_buffers.h @@ -550,7 +626,7 @@ if(ENABLE_USER-INTEL) include_directories(${USER-INTEL_SOURCES_DIR}) endif() -if(ENABLE_GPU) +if(PKG_GPU) set(GPU_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/GPU) set(GPU_SOURCES ${GPU_SOURCES_DIR}/gpu_extra.h ${GPU_SOURCES_DIR}/fix_gpu.h @@ -687,6 +763,7 @@ include_directories(${LAMMPS_STYLE_HEADERS_DIR}) # Actually add executable and lib to build ############################################ add_library(lammps ${LIB_SOURCES}) +list(REMOVE_DUPLICATES LAMMPS_LINK_LIBS) target_link_libraries(lammps ${LAMMPS_LINK_LIBS}) if(LAMMPS_DEPS) add_dependencies(lammps ${LAMMPS_DEPS}) @@ -712,31 +789,60 @@ endif() # Print package summary ################################## foreach(PKG ${DEFAULT_PACKAGES} ${OTHER_PACKAGES} ${ACCEL_PACKAGES}) - if(ENABLE_${PKG}) + if(PKG_${PKG}) message(STATUS "Building package: ${PKG}") endif() endforeach() string(TOUPPER "${CMAKE_BUILD_TYPE}" BTYPE) +get_directory_property(CPPFLAGS DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS) +include(FeatureSummary) +feature_summary(INCLUDE_QUIET_PACKAGES WHAT ALL) message(STATUS "<<< Build configuration >>> Build type ${CMAKE_BUILD_TYPE} Install path ${CMAKE_INSTALL_PREFIX} Compilers and Flags: C++ Compiler ${CMAKE_CXX_COMPILER} Type ${CMAKE_CXX_COMPILER_ID} - C++ Flags ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BTYPE}}") + Version ${CMAKE_CXX_COMPILER_VERSION} + C++ Flags ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BTYPE}} + Defines ${CPPFLAGS}") get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) -if(LANGUAGES MATCHES ".*Fortran.*") +list (FIND LANGUAGES "Fortran" _index) +if (${_index} GREATER -1) message(STATUS "Fortran Compiler ${CMAKE_Fortran_COMPILER} Type ${CMAKE_Fortran_COMPILER_ID} + Version ${CMAKE_Fortran_COMPILER_VERSION} Fortran Flags ${CMAKE_Fortran_FLAGS} ${CMAKE_Fortran_FLAGS_${BTYPE}}") endif() -message(STATUS "Linker flags: +list (FIND LANGUAGES "C" _index) +if (${_index} GREATER -1) + message(STATUS "C Compiler ${CMAKE_C_COMPILER} + Type ${CMAKE_C_COMPILER_ID} + Version ${CMAKE_C_COMPILER_VERSION} + C Flags ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BTYPE}}") +endif() +if(CMAKE_EXE_LINKER_FLAGS) + message(STATUS "Linker flags: Executable ${CMAKE_EXE_LINKER_FLAGS}") + endif() if(BUILD_SHARED_LIBS) - message(STATUS "Shared libries ${CMAKE_SHARED_LINKER_FLAGS}") + message(STATUS "Shared libraries ${CMAKE_SHARED_LINKER_FLAGS}") else() - message(STATUS "Static libries ${CMAKE_STATIC_LINKER_FLAGS}") + message(STATUS "Static libraries ${CMAKE_STATIC_LINKER_FLAGS}") endif() message(STATUS "Link libraries: ${LAMMPS_LINK_LIBS}") - +if(BUILD_MPI) + message(STATUS "Using mpi with headers in ${MPI_CXX_INCLUDE_PATH} and ${MPI_CXX_LIBRARIES}") +endif() +if(ENABLED_GPU) + message(STATUS "GPU Api: ${GPU_API}") + if(GPU_API STREQUAL "CUDA") + message(STATUS "GPU Arch: ${GPU_ARCH}") + elseif(GPU_API STREQUAL "OpenCL") + message(STATUS "OCL Tune: ${OCL_TUNE}") + endif() +endif() +if(PKG_KSPACE) + message(STATUS "Using ${FFT} as FFT") +endif() diff --git a/cmake/Modules/FindFFTW2.cmake b/cmake/Modules/FindFFTW2.cmake deleted file mode 100644 index c77e6cf8e9d126d5ebb4223e6e7cf53ef25b60b2..0000000000000000000000000000000000000000 --- a/cmake/Modules/FindFFTW2.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# - Find fftw2 -# Find the native FFTW2 headers and libraries. -# -# FFTW2_INCLUDE_DIRS - where to find fftw2.h, etc. -# FFTW2_LIBRARIES - List of libraries when using fftw2. -# FFTW2_FOUND - True if fftw2 found. -# - -find_path(FFTW2_INCLUDE_DIR fftw.h) - -find_library(FFTW2_LIBRARY NAMES fftw) - -set(FFTW2_LIBRARIES ${FFTW2_LIBRARY}) -set(FFTW2_INCLUDE_DIRS ${FFTW2_INCLUDE_DIR}) - -include(FindPackageHandleStandardArgs) -# handle the QUIETLY and REQUIRED arguments and set FFTW2_FOUND to TRUE -# if all listed variables are TRUE - -find_package_handle_standard_args(FFTW2 DEFAULT_MSG FFTW2_LIBRARY FFTW2_INCLUDE_DIR) - -mark_as_advanced(FFTW2_INCLUDE_DIR FFTW2_LIBRARY ) diff --git a/cmake/Modules/FindFFTW3F.cmake b/cmake/Modules/FindFFTW3F.cmake new file mode 100644 index 0000000000000000000000000000000000000000..92d1e85e791ec362a15909bd09dccdc046efc2a5 --- /dev/null +++ b/cmake/Modules/FindFFTW3F.cmake @@ -0,0 +1,25 @@ +# - Find fftw3f +# Find the native FFTW3F headers and libraries. +# +# FFTW3F_INCLUDE_DIRS - where to find fftw3f.h, etc. +# FFTW3F_LIBRARIES - List of libraries when using fftw3f. +# FFTW3F_FOUND - True if fftw3f found. +# + +find_package(PkgConfig) + +pkg_check_modules(PC_FFTW3F fftw3f) +find_path(FFTW3F_INCLUDE_DIR fftw3.h HINTS ${PC_FFTW3F_INCLUDE_DIRS}) + +find_library(FFTW3F_LIBRARY NAMES fftw3f HINTS ${PC_FFTW3F_LIBRARY_DIRS}) + +set(FFTW3F_LIBRARIES ${FFTW3F_LIBRARY}) +set(FFTW3F_INCLUDE_DIRS ${FFTW3F_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set FFTW3F_FOUND to TRUE +# if all listed variables are TRUE + +find_package_handle_standard_args(FFTW3F DEFAULT_MSG FFTW3F_LIBRARY FFTW3F_INCLUDE_DIR) + +mark_as_advanced(FFTW3F_INCLUDE_DIR FFTW3F_LIBRARY ) diff --git a/src/error.cpp b/src/error.cpp index 3c8d8bb34cda52a888342a6165f7a19424f91991..2ab816c992ac910fd0a2dd789a1c08d3f9da2576 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -21,6 +21,20 @@ using namespace LAMMPS_NS; +// helper function to truncate a string to a segment starting with "src/"; + +static const char *truncpath(const char *path) +{ + if (path) { + int len = strlen(path); + for (int i = len-4; i > 0; --i) { + if (strncmp("src/",path+i,4) == 0) + return path+i; + } + } + return path; +} + /* ---------------------------------------------------------------------- */ Error::Error(LAMMPS *lmp) : Pointers(lmp) { @@ -42,9 +56,9 @@ void Error::universe_all(const char *file, int line, const char *str) if (universe->me == 0) { if (universe->uscreen) fprintf(universe->uscreen, - "ERROR: %s (%s:%d)\n",str,file,line); + "ERROR: %s (%s:%d)\n",str,truncpath(file),line); if (universe->ulogfile) fprintf(universe->ulogfile, - "ERROR: %s (%s:%d)\n",str,file,line); + "ERROR: %s (%s:%d)\n",str,truncpath(file),line); } if (output) delete output; @@ -73,7 +87,7 @@ void Error::universe_one(const char *file, int line, const char *str) { if (universe->uscreen) fprintf(universe->uscreen,"ERROR on proc %d: %s (%s:%d)\n", - universe->me,str,file,line); + universe->me,str,truncpath(file),line); #ifdef LAMMPS_EXCEPTIONS char msg[100]; @@ -93,7 +107,7 @@ void Error::universe_warn(const char *file, int line, const char *str) { if (universe->uscreen) fprintf(universe->uscreen,"WARNING on proc %d: %s (%s:%d)\n", - universe->me,str,file,line); + universe->me,str,truncpath(file),line); } /* ---------------------------------------------------------------------- @@ -116,10 +130,10 @@ void Error::all(const char *file, int line, const char *str) if (input && input->line) lastcmd = input->line; if (screen) fprintf(screen,"ERROR: %s (%s:%d)\n" "Last command: %s\n", - str,file,line,lastcmd); + str,truncpath(file),line,lastcmd); if (logfile) fprintf(logfile,"ERROR: %s (%s:%d)\n" "Last command: %s\n", - str,file,line,lastcmd); + str,truncpath(file),line,lastcmd); } #ifdef LAMMPS_EXCEPTIONS @@ -158,15 +172,15 @@ void Error::one(const char *file, int line, const char *str) if (input && input->line) lastcmd = input->line; if (screen) fprintf(screen,"ERROR on proc %d: %s (%s:%d)\n" "Last command: %s\n", - me,str,file,line,lastcmd); + me,str,truncpath(file),line,lastcmd); if (logfile) fprintf(logfile,"ERROR on proc %d: %s (%s:%d)\n" "Last command: %s\n", - me,str,file,line,lastcmd); + me,str,truncpath(file),line,lastcmd); if (universe->nworlds > 1) if (universe->uscreen) fprintf(universe->uscreen,"ERROR on proc %d: %s (%s:%d)\n", - universe->me,str,file,line); + universe->me,str,truncpath(file),line); #ifdef LAMMPS_EXCEPTIONS char msg[100]; @@ -184,9 +198,9 @@ void Error::one(const char *file, int line, const char *str) void Error::warning(const char *file, int line, const char *str, int logflag) { - if (screen) fprintf(screen,"WARNING: %s (%s:%d)\n",str,file,line); + if (screen) fprintf(screen,"WARNING: %s (%s:%d)\n",str,truncpath(file),line); if (logflag && logfile) fprintf(logfile,"WARNING: %s (%s:%d)\n", - str,file,line); + str,truncpath(file),line); } /* ---------------------------------------------------------------------- @@ -196,8 +210,8 @@ void Error::warning(const char *file, int line, const char *str, int logflag) void Error::message(const char *file, int line, const char *str, int logflag) { - if (screen) fprintf(screen,"%s (%s:%d)\n",str,file,line); - if (logflag && logfile) fprintf(logfile,"%s (%s:%d)\n",str,file,line); + if (screen) fprintf(screen,"%s (%s:%d)\n",str,truncpath(file),line); + if (logflag && logfile) fprintf(logfile,"%s (%s:%d)\n",str,truncpath(file),line); } /* ----------------------------------------------------------------------