diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 00a254197d..bc79d68c54 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -133,10 +133,7 @@ endif() set(LAMMPS_BINARY lmp${LAMMPS_MACHINE}) option(BUILD_SHARED_LIBS "Build shared library" OFF) -if(BUILD_SHARED_LIBS) # for all pkg libs, mpi_stubs and linalg - set(CMAKE_POSITION_INDEPENDENT_CODE ON) -endif() - +option(CMAKE_POSITION_INDEPENDENT_CODE "Create object compatible with shared libraries" ON) option(BUILD_TOOLS "Build and install LAMMPS tools (msi2lmp, binary2txt, chain)" OFF) option(BUILD_LAMMPS_SHELL "Build and install the LAMMPS shell" OFF) @@ -303,10 +300,12 @@ else() target_link_libraries(lmp PRIVATE mpi_stubs) target_include_directories(lmp INTERFACE $) target_compile_definitions(lmp INTERFACE $) - endif(MSVC) + endif() target_include_directories(lammps INTERFACE $) target_compile_definitions(lammps INTERFACE $) else() + target_include_directories(lammps INTERFACE $) + target_compile_definitions(lammps INTERFACE $) target_link_libraries(lammps PUBLIC mpi_stubs) endif() add_library(MPI::MPI_CXX ALIAS mpi_stubs) @@ -809,11 +808,17 @@ if(ClangFormat_FOUND) endif() get_target_property(DEFINES lammps COMPILE_DEFINITIONS) +get_property(BUILD_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(BUILD_IS_MULTI_CONFIG) + set(LAMMPS_BUILD_TYPE "Multi-Config") +else() + set(LAMMPS_BUILD_TYPE ${CMAKE_BUILD_TYPE}) +endif() include(FeatureSummary) feature_summary(DESCRIPTION "The following tools and libraries have been found and configured:" WHAT PACKAGES_FOUND) message(STATUS "<<< Build configuration >>> Operating System: ${CMAKE_SYSTEM_NAME} ${CMAKE_LINUX_DISTRO} ${CMAKE_DISTRO_VERSION} - Build type: ${CMAKE_BUILD_TYPE} + Build type: ${LAMMPS_BUILD_TYPE} Install path: ${CMAKE_INSTALL_PREFIX} Generator: ${CMAKE_GENERATOR} using ${CMAKE_MAKE_PROGRAM}") ############################################################################### diff --git a/cmake/CMakeSettings.json b/cmake/CMakeSettings.json index dada2f6752..ee4b3c46d5 100644 --- a/cmake/CMakeSettings.json +++ b/cmake/CMakeSettings.json @@ -1,55 +1,111 @@ { - "configurations": [ + "configurations": [ + { + "name": "x64-Debug-MSVC", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${workspaceRoot}\\build\\${name}", + "installRoot": "${workspaceRoot}\\install\\${name}", + "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DENABLE_TESTING=on", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [ { - "name": "x64-Debug-MSVC", - "generator": "Ninja", - "configurationType": "Debug", - "buildRoot": "${workspaceRoot}\\build\\${name}", - "installRoot": "${workspaceRoot}\\install\\${name}", - "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [ - { - "name": "BUILD_SHARED_LIBS", - "value": "True", - "type": "BOOL" - }, - { - "name": "BUILD_TOOLS", - "value": "True", - "type": "BOOL" - }, - { - "name": "LAMMPS_EXCEPTIONS", - "value": "True", - "type": "BOOL" - } - ] + "name": "BUILD_SHARED_LIBS", + "value": "True", + "type": "BOOL" }, { - "name": "x64-Debug-Clang", - "generator": "Ninja", - "configurationType": "Debug", - "buildRoot": "${workspaceRoot}\\build\\${name}", - "installRoot": "${workspaceRoot}\\install\\${name}", - "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "clang_cl_x64" ], - "variables": [ - { - "name": "BUILD_TOOLS", - "value": "True", - "type": "BOOL" - }, - { - "name": "LAMMPS_EXCEPTIONS", - "value": "True", - "type": "BOOL" - } - ] + "name": "BUILD_TOOLS", + "value": "True", + "type": "BOOL" + }, + { + "name": "LAMMPS_EXCEPTIONS", + "value": "True", + "type": "BOOL" } - ] + ] + }, + { + "name": "x64-Debug-Clang", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${workspaceRoot}\\build\\${name}", + "installRoot": "${workspaceRoot}\\install\\${name}", + "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DENABLE_TESTING=on", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "clang_cl_x64" ], + "variables": [ + { + "name": "BUILD_TOOLS", + "value": "True", + "type": "BOOL" + }, + { + "name": "LAMMPS_EXCEPTIONS", + "value": "True", + "type": "BOOL" + } + ] + }, + { + "name": "x64-Debug-OneAPI", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${workspaceRoot}\\build\\${name}", + "installRoot": "${workspaceRoot}\\install\\${name}", + "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DENABLE_TESTING=on -DCMAKE_CXX_COMPILER=icx -DCMAKE_C_COMPILER=icx -DBUILD_MPI=off", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [ + { + "name": "BUILD_SHARED_LIBS", + "value": "True", + "type": "BOOL" + }, + { + "name": "BUILD_TOOLS", + "value": "True", + "type": "BOOL" + }, + { + "name": "LAMMPS_EXCEPTIONS", + "value": "True", + "type": "BOOL" + } + ] + }, + { + "name": "x64-Debug-Intel", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${workspaceRoot}\\build\\${name}", + "installRoot": "${workspaceRoot}\\install\\${name}", + "cmakeCommandArgs": "-S ${workspaceRoot}\\cmake -C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DENABLE_TESTING=off -DCMAKE_CXX_COMPILER=icl -DCMAKE_C_COMPILER=icl -DCMAKE_Fortran_COMPILER=ifort -DBUILD_MPI=off", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [ + { + "name": "BUILD_SHARED_LIBS", + "value": "True", + "type": "BOOL" + }, + { + "name": "BUILD_TOOLS", + "value": "True", + "type": "BOOL" + }, + { + "name": "LAMMPS_EXCEPTIONS", + "value": "True", + "type": "BOOL" + } + ] + } + ] } \ No newline at end of file diff --git a/cmake/Modules/ExternalCMakeProject.cmake b/cmake/Modules/ExternalCMakeProject.cmake new file mode 100644 index 0000000000..855ce254c9 --- /dev/null +++ b/cmake/Modules/ExternalCMakeProject.cmake @@ -0,0 +1,33 @@ +# Build a CMake based external library as subdirectory. +# The sources will be unpacked to ${CMAKE_BINARY_DIR}/_deps/${target}-src +# The binaries will be built in ${CMAKE_BINARY_DIR}/_deps/${target}-build +# +function(ExternalCMakeProject target url hash basedir cmakedir cmakefile) + # change settings locally + set(BUILD_SHARED_LIBS OFF) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + get_filename_component(archive ${url} NAME) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) + message(STATUS "Downloading ${url}") + file(DOWNLOAD ${url} ${CMAKE_BINARY_DIR}/_deps/${archive} EXPECTED_HASH MD5=${hash} SHOW_PROGRESS) + message(STATUS "Unpacking and configuring ${archive}") + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/${archive} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) + file(GLOB TARGET_SOURCE "${CMAKE_BINARY_DIR}/_deps/src/${basedir}*") + list(LENGTH TARGET_SOURCE _num) + if(_num GREATER 1) + message(FATAL_ERROR "Inconsistent ${target} library sources. " + "Please delete ${CMAKE_BINARY_DIR}/_deps/src and re-run cmake") + endif() + file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${target}-src) + file(RENAME ${TARGET_SOURCE} ${CMAKE_BINARY_DIR}/_deps/${target}-src) + if(NOT (cmakefile STREQUAL "")) + file(COPY ${cmakefile} DESTINATION ${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/) + get_filename_component(_cmakefile ${cmakefile} NAME) + file(RENAME "${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/${_cmakefile}" + "${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}/CMakeLists.txt") + endif() + add_subdirectory("${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}" + "${CMAKE_BINARY_DIR}/_deps/${target}-build") +endfunction(ExternalCMakeProject) diff --git a/cmake/Modules/GTest.cmake b/cmake/Modules/GTest.cmake deleted file mode 100644 index e012e61ea9..0000000000 --- a/cmake/Modules/GTest.cmake +++ /dev/null @@ -1,81 +0,0 @@ -message(STATUS "Downloading and building Google Test library") - -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(GTEST_LIB_POSTFIX d) -else() - set(GTEST_LIB_POSTFIX) -endif() - -include(ExternalProject) -set(GTEST_URL "https://github.com/google/googletest/archive/release-1.11.0.tar.gz" CACHE STRING "URL of googletest source") -set(GTEST_MD5 "e8a8df240b6938bb6384155d4c37d937" CACHE STRING "MD5 sum for googletest source") -mark_as_advanced(GTEST_URL) -mark_as_advanced(GTEST_MD5) -ExternalProject_Add(googletest - URL ${GTEST_URL} - URL_MD5 ${GTEST_MD5} - SOURCE_DIR "${CMAKE_BINARY_DIR}/gtest-src" - BINARY_DIR "${CMAKE_BINARY_DIR}/gtest-build" - CMAKE_ARGS ${CMAKE_REQUEST_PIC} ${CMAKE_EXTRA_GTEST_OPTS} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_INSTALL_PREFIX= - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - BUILD_BYPRODUCTS /lib/libgtest${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX} - /lib/libgmock${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX} - /lib/libgtest_main${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX} - /lib/libgmock_main${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX} - LOG_DOWNLOAD ON - LOG_CONFIGURE ON - LOG_BUILD ON - INSTALL_COMMAND "" - TEST_COMMAND "") - -ExternalProject_Get_Property(googletest SOURCE_DIR) -set(GTEST_INCLUDE_DIR ${SOURCE_DIR}/googletest/include) -set(GMOCK_INCLUDE_DIR ${SOURCE_DIR}/googlemock/include) - -# workaround for CMake 3.10 on ubuntu 18.04 -file(MAKE_DIRECTORY ${GTEST_INCLUDE_DIR}) -file(MAKE_DIRECTORY ${GMOCK_INCLUDE_DIR}) - -ExternalProject_Get_Property(googletest BINARY_DIR) -set(GTEST_LIBRARY_PATH ${BINARY_DIR}/lib/libgtest${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) -set(GMOCK_LIBRARY_PATH ${BINARY_DIR}/lib/libgmock${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) -set(GTEST_MAIN_LIBRARY_PATH ${BINARY_DIR}/lib/libgtest_main${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) -set(GMOCK_MAIN_LIBRARY_PATH ${BINARY_DIR}/lib/libgmock_main${GTEST_LIB_POSTFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) - -# Prevent GoogleTest from overriding our compiler/linker options -# when building with Visual Studio -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - -find_package(Threads QUIET) - -add_library(GTest::GTest UNKNOWN IMPORTED) -set_target_properties(GTest::GTest PROPERTIES - IMPORTED_LOCATION ${GTEST_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIR} - INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") -add_dependencies(GTest::GTest googletest) - -add_library(GTest::GMock UNKNOWN IMPORTED) -set_target_properties(GTest::GMock PROPERTIES - IMPORTED_LOCATION ${GMOCK_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${GMOCK_INCLUDE_DIR} - INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") -add_dependencies(GTest::GMock googletest) - -add_library(GTest::GTestMain UNKNOWN IMPORTED) -set_target_properties(GTest::GTestMain PROPERTIES - IMPORTED_LOCATION ${GTEST_MAIN_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIR} - INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") -add_dependencies(GTest::GTestMain googletest) - -add_library(GTest::GMockMain UNKNOWN IMPORTED) -set_target_properties(GTest::GMockMain PROPERTIES - IMPORTED_LOCATION ${GMOCK_MAIN_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${GMOCK_INCLUDE_DIR} - INTERFACE_LINK_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") -add_dependencies(GTest::GMockMain googletest) diff --git a/cmake/Modules/Packages/MSCG.cmake b/cmake/Modules/Packages/MSCG.cmake index cf3d506c82..e4260e059e 100644 --- a/cmake/Modules/Packages/MSCG.cmake +++ b/cmake/Modules/Packages/MSCG.cmake @@ -12,41 +12,12 @@ if(DOWNLOAD_MSCG) mark_as_advanced(MSCG_URL) mark_as_advanced(MSCG_MD5) - # CMake cannot pass BLAS or LAPACK library variable to external project if they are a list - list(LENGTH BLAS_LIBRARIES} NUM_BLAS) - list(LENGTH LAPACK_LIBRARIES NUM_LAPACK) - if((NUM_BLAS GREATER 1) OR (NUM_LAPACK GREATER 1)) - message(FATAL_ERROR "Cannot compile downloaded MSCG library due to a technical limitation") - endif() + include(ExternalCMakeProject) + ExternalCMakeProject(mscg ${MSCG_URL} ${MSCG_MD5} MSCG-release src/CMake "") - include(ExternalProject) - ExternalProject_Add(mscg_build - URL ${MSCG_URL} - URL_MD5 ${MSCG_MD5} - SOURCE_SUBDIR src/CMake - CMAKE_ARGS ${CMAKE_REQUEST_PIC} ${EXTRA_MSCG_OPTS} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} - -DBLAS_LIBRARIES=${BLAS_LIBRARIES} -DLAPACK_LIBRARIES=${LAPACK_LIBRARIES} - -DCMAKE_INSTALL_PREFIX= - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - BUILD_COMMAND ${CMAKE_COMMAND} --build . --target mscg - INSTALL_COMMAND "" - BUILD_BYPRODUCTS /libmscg.a - ) - ExternalProject_get_property(mscg_build BINARY_DIR) - ExternalProject_get_property(mscg_build SOURCE_DIR) - file(MAKE_DIRECTORY ${SOURCE_DIR}/src) - add_library(LAMMPS::MSCG UNKNOWN IMPORTED) - set_target_properties(LAMMPS::MSCG PROPERTIES - IMPORTED_LOCATION "${BINARY_DIR}/libmscg.a" - INTERFACE_INCLUDE_DIRECTORIES "${SOURCE_DIR}/src" - INTERFACE_LINK_LIBRARIES "${LAPACK_LIBRARIES}") - target_link_libraries(lammps PRIVATE LAMMPS::MSCG) - add_dependencies(LAMMPS::MSCG mscg_build) + # set include and link library + target_include_directories(lammps PRIVATE "${CMAKE_BINARY_DIR}/_deps/mscg-src/src") + target_link_libraries(lammps PRIVATE mscg) else() find_package(MSCG) if(NOT MSCG_FOUND) diff --git a/cmake/Modules/YAML.cmake b/cmake/Modules/YAML.cmake deleted file mode 100644 index 77ee804111..0000000000 --- a/cmake/Modules/YAML.cmake +++ /dev/null @@ -1,47 +0,0 @@ -message(STATUS "Downloading and building YAML library") - -include(ExternalProject) -set(YAML_URL "https://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz" CACHE STRING "URL for libyaml tarball") -set(YAML_MD5 "bb15429d8fb787e7d3f1c83ae129a999" CACHE STRING "MD5 checksum of libyaml tarball") -mark_as_advanced(YAML_URL) -mark_as_advanced(YAML_MD5) - -# support cross-compilation to windows -if(CMAKE_CROSSCOMPILING AND (CMAKE_SYSTEM_NAME STREQUAL "Windows")) - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") - set(YAML_CROSS_HOST --host=i686-mingw64) - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - set(YAML_CROSS_HOST --host=x86_64-mingw64) - else() - message(FATAL_ERROR "Unsupported cross-compilation " - " for ${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}" - " on ${CMAKE_HOST_SYSTEM}/${CMAKE_HOST_SYSTEM_PROCESSOR}") - endif() -endif() - -ExternalProject_Add(libyaml - URL ${YAML_URL} - URL_MD5 ${YAML_MD5} - SOURCE_DIR "${CMAKE_BINARY_DIR}/yaml-src" - BINARY_DIR "${CMAKE_BINARY_DIR}/yaml-build" - CONFIGURE_COMMAND /configure ${CONFIGURE_REQUEST_PIC} - CXX=${CMAKE_CXX_COMPILER} CC=${CMAKE_C_COMPILER} - --prefix= --disable-shared ${YAML_CROSS_HOST} - BUILD_BYPRODUCTS /lib/libyaml${CMAKE_STATIC_LIBRARY_SUFFIX} - TEST_COMMAND "") - -ExternalProject_Get_Property(libyaml INSTALL_DIR) -set(YAML_INCLUDE_DIR ${INSTALL_DIR}/include) -set(YAML_LIBRARY_DIR ${INSTALL_DIR}/lib) - -# workaround for CMake 3.10 on ubuntu 18.04 -file(MAKE_DIRECTORY ${YAML_INCLUDE_DIR}) -file(MAKE_DIRECTORY ${YAML_LIBRARY_DIR}) - -set(YAML_LIBRARY_PATH ${INSTALL_DIR}/lib/libyaml${CMAKE_STATIC_LIBRARY_SUFFIX}) - -add_library(Yaml::Yaml UNKNOWN IMPORTED) -set_target_properties(Yaml::Yaml PROPERTIES - IMPORTED_LOCATION ${YAML_LIBRARY_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${YAML_INCLUDE_DIR}) -add_dependencies(Yaml::Yaml libyaml) diff --git a/doc/src/Build_cmake.rst b/doc/src/Build_cmake.rst index 2a64bc3240..9bee18146c 100644 --- a/doc/src/Build_cmake.rst +++ b/doc/src/Build_cmake.rst @@ -150,6 +150,42 @@ for IDEs like Eclipse, CodeBlocks, or Kate can be selected using the *-G* command line flag. A list of available generator settings for your specific CMake version is given when running ``cmake --help``. +.. _cmake_multiconfig: + +Multi-configuration build systems +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Throughout this manual it is mostly assumed that LAMMPS is being built +on a Unix-like operating system with "make" as the underlying "builder", +since this is the most common case. In this case the build "configuration" +is chose using ``-D CMAKE_BUILD_TYPE=`` with ```` +being one of "Release", "Debug", "RelWithDebInfo", or "MinSizeRel". +Some build tools, however, can also use or even require to have a so-called +multi-configuration build system setup. For those the built type (or +configuration) is chosen at compile time using the same build files. E.g. +with: + +.. code-block:: bash + + cmake --build build-multi --config Release + +In that case the resulting binaries are not in the build folder directly +but in sub-directories corresponding to the build type (i.e. Release in +the example from above). Similarly, for running unit tests the +configuration is selected with the *-C* flag: + +.. code-block:: bash + + ctest -C Debug + +The CMake scripts in LAMMPS have basic support for being compiled using a +multi-config build system, but not all of it has been ported. This is in +particular applicable to compiling packages that require additional libraries +that would be downloaded and compiled by CMake. The "windows" preset file +tries to keep track of which packages can be compiled natively with the +MSVC compilers out-of-the box. Not all of those external libraries are +portable to Windows either. + Installing CMake ^^^^^^^^^^^^^^^^ diff --git a/doc/src/Build_windows.rst b/doc/src/Build_windows.rst index fa2296d302..4bb5cfec27 100644 --- a/doc/src/Build_windows.rst +++ b/doc/src/Build_windows.rst @@ -89,6 +89,11 @@ miss the correct master ``CMakeLists.txt``. Try to open the starting point. It is also possible to configure and compile LAMMPS from the command line with a CMake binary from `cmake.org `_. +Please note, that for either approach CMake will create a so-called +:ref:`"multi-configuration" build environment `, and +the command lines for building and testing LAMMPS must be adjusted +accordingly. + To support running in parallel you can compile with OpenMP enabled using the OPENMP package or install Microsoft MPI (including the SDK) and compile LAMMPS with MPI enabled. diff --git a/doc/src/Developer_platform.rst b/doc/src/Developer_platform.rst index c9ecd30cec..cdc4bb6770 100644 --- a/doc/src/Developer_platform.rst +++ b/doc/src/Developer_platform.rst @@ -118,6 +118,9 @@ Environment variable functions .. doxygenfunction:: putenv :project: progguide +.. doxygenfunction:: unsetenv + :project: progguide + .. doxygenfunction:: list_pathenv :project: progguide diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index d295767519..77e9df5a82 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1995,6 +1995,7 @@ minimizer minimizers minneigh minorder +MinSizeRel minSteps mintcream Mintmire @@ -2784,6 +2785,7 @@ relink relres relTol relu +RelWithDebInfo remappings remd Ren diff --git a/examples/plugins/CMakeLists.txt b/examples/plugins/CMakeLists.txt index 0ca2c025e2..8bef055ad3 100644 --- a/examples/plugins/CMakeLists.txt +++ b/examples/plugins/CMakeLists.txt @@ -14,26 +14,29 @@ endif() project(plugins VERSION 1.0 LANGUAGES CXX) -# ugly hacks for MSVC which by default always reports an old C++ standard in the __cplusplus macro -# and prints lots of pointless warnings about "unsafe" functions -if(MSVC) - add_compile_options(/Zc:__cplusplus) - add_compile_options(/wd4244) - add_compile_options(/wd4267) - add_compile_definitions(_CRT_SECURE_NO_WARNINGS) -endif() - -# NOTE: the next line should be commented out when used outside of the LAMMPS package -get_filename_component(LAMMPS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../src ABSOLUTE) -set(LAMMPS_HEADER_DIR ${LAMMPS_SOURCE_DIR} CACHE PATH "Location of LAMMPS headers") -if(NOT LAMMPS_HEADER_DIR) - message(FATAL_ERROR "Must set LAMMPS_HEADER_DIR") -endif() - -# by default, install into $HOME/.local (not /usr/local), -# so that no root access (and sudo) is needed -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Default install path" FORCE) +# when this file is included as subdirectory in the LAMMPS build, many settings are directly imported +if(LAMMPS_DIR) + set(LAMMPS_HEADER_DIR ${LAMMPS_SOURCE_DIR}) +else() + # NOTE: the next line should be commented out when used outside of the LAMMPS package + get_filename_component(LAMMPS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../src ABSOLUTE) + set(LAMMPS_HEADER_DIR ${LAMMPS_SOURCE_DIR} CACHE PATH "Location of LAMMPS headers") + if(NOT LAMMPS_HEADER_DIR) + message(FATAL_ERROR "Must set LAMMPS_HEADER_DIR") + endif() + # by default, install into $HOME/.local (not /usr/local), + # so that no root access (and sudo) is needed + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Default install path" FORCE) + endif() + # ugly hacks for MSVC which by default always reports an old C++ standard in the __cplusplus macro + # and prints lots of pointless warnings about "unsafe" functions + if(MSVC) + add_compile_options(/Zc:__cplusplus) + add_compile_options(/wd4244) + add_compile_options(/wd4267) + add_compile_definitions(_CRT_SECURE_NO_WARNINGS) + endif() endif() # C++11 is required @@ -45,9 +48,11 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -restrict") endif() -set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}) +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) include(CheckIncludeFileCXX) -include(LAMMPSInterfaceCXX) +if(NOT LAMMPS_DIR) + include(LAMMPSInterfaceCXX) +endif() ########################## # building the plugins @@ -66,7 +71,7 @@ add_library(zero2plugin MODULE zero2plugin.cpp pair_zero2.cpp bond_zero2.cpp angle_zero2.cpp dihedral_zero2.cpp improper_zero2.cpp) target_link_libraries(zero2plugin PRIVATE lammps) -set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin PROPERTIES PREFIX "") +set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin PROPERTIES PREFIX "" SUFFIX ".so") # MacOS seems to need this if(CMAKE_SYSTEM_NAME STREQUAL Darwin) @@ -84,3 +89,6 @@ else() set_target_properties(morse2plugin nve2plugin helloplugin zero2plugin PROPERTIES LINK_FLAGS "-rdynamic") endif() + +add_custom_target(plugins ALL ${CMAKE_COMMAND} -E echo "Building Plugins" + DEPENDS morse2plugin nve2plugin helloplugin zero2plugin morse2plugin) diff --git a/src/platform.cpp b/src/platform.cpp index c701c37a80..708a42be8a 100644 --- a/src/platform.cpp +++ b/src/platform.cpp @@ -446,11 +446,11 @@ int platform::putenv(const std::string &vardef) auto found = vardef.find_first_of('='); #ifdef _WIN32 - // must assign a value to variable with _putenv() + // must assign a value to variable with _putenv_s() if (found == std::string::npos) - return _putenv(utils::strdup(vardef + "=1")); + return _putenv_s(vardef.c_str(), "1"); else - return _putenv(utils::strdup(vardef)); + return _putenv_s(vardef.substr(0, found).c_str(), vardef.substr(found+1).c_str()); #else if (found == std::string::npos) return setenv(vardef.c_str(), "", 1); @@ -460,6 +460,24 @@ int platform::putenv(const std::string &vardef) return -1; } +/* ---------------------------------------------------------------------- + unset environment variable +------------------------------------------------------------------------- */ + +int platform::unsetenv(const std::string &variable) +{ + if (variable.size() == 0) return -1; +#ifdef _WIN32 + // emulate POSIX semantics by returning -1 on trying to unset non-existing variable + const char *ptr = getenv(variable.c_str()); + if (!ptr) return -1; + // empty _putenv_s() definition deletes variable + return _putenv_s(variable.c_str(),""); +#else + return ::unsetenv(variable.c_str()); +#endif +} + /* ---------------------------------------------------------------------- split a "path" environment variable into a list ------------------------------------------------------------------------- */ diff --git a/src/platform.h b/src/platform.h index 95a0c3cc35..c079fd2cd1 100644 --- a/src/platform.h +++ b/src/platform.h @@ -125,6 +125,13 @@ namespace platform { int putenv(const std::string &vardef); + /*! Delete variable from the environment + * + * \param variable variable name + * \return -1 if failure otherwise 0 */ + + int unsetenv(const std::string &variable); + /*! Get list of entries in a path environment variable * * This provides a list of strings of the entries in an environment diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 46f1865989..be6d20c19a 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -1,4 +1,26 @@ -include(GTest) +######################################## +# CMake build for automated testing +# This file is part of LAMMPS +# Created by Axel Kohlmeyer and Richard Berger +######################################## +# download and build googletest framework +message(STATUS "Downloading and building googletest framework") +set(GTEST_URL "https://github.com/google/googletest/archive/release-1.11.0.tar.gz" CACHE STRING "URL of googletest source") +set(GTEST_MD5 "e8a8df240b6938bb6384155d4c37d937" CACHE STRING "MD5 sum for googletest source") +mark_as_advanced(GTEST_URL) +mark_as_advanced(GTEST_MD5) +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + +include(ExternalCMakeProject) +ExternalCMakeProject(googletest ${GTEST_URL} ${GTEST_MD5} googletest . "") +add_library(GTest::GTest ALIAS gtest) +add_library(GTest::GMock ALIAS gmock) +add_library(GTest::GTestMain ALIAS gtest_main) +add_library(GTest::GMockMain ALIAS gmock_main) + +######################################## +# General tests using the LAMMPS executable itself +######################################## # check if we can run the compiled executable and whether it prints # the LAMMPS version header in the output for an empty input @@ -7,7 +29,7 @@ add_test(NAME RunLammps COMMAND $ -log none -echo none -in in.empty WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(RunLammps PROPERTIES - ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" + ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" PASS_REGULAR_EXPRESSION "LAMMPS \\([0-9]+ [A-Za-z]+ 2[0-9][0-9][0-9]( - Update [0-9]+)?\\)") # check if the compiled executable will print the help message @@ -15,7 +37,7 @@ add_test(NAME HelpMessage COMMAND $ -h WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(HelpMessage PROPERTIES - ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" + ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" PASS_REGULAR_EXPRESSION ".*Large-scale Atomic/Molecular Massively Parallel Simulator -.*Usage example:.*") # check if the compiled executable will error out on an invalid command line flag @@ -23,9 +45,10 @@ add_test(NAME InvalidFlag COMMAND $ -xxx WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(InvalidFlag PROPERTIES - ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" + ENVIRONMENT "TSAN_OPTIONS=ignore_noninstrumented_modules=1;HWLOC_HIDE_ERRORS=1" PASS_REGULAR_EXPRESSION "ERROR: Invalid command-line argument.*") +# convenience function for adding tests requiring to be run in parallel with MPI if(BUILD_MPI) function(add_mpi_test) set(MPI_TEST_NUM_PROCS 1) @@ -36,12 +59,18 @@ if(BUILD_MPI) set(ARGS ${MPI_TEST_COMMAND}) add_test(NAME ${MPI_TEST_NAME} WORKING_DIRECTORY ${MPI_TEST_WORKING_DIRECTORY} - COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPI_TEST_NUM_PROCS} ${MPIEXEC_PREFLAGS} - ${EXECUTABLE} ${MPIEXEC_POSTFLAGS} ${ARGS} - ) + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPI_TEST_NUM_PROCS} + ${MPIEXEC_PREFLAGS} ${EXECUTABLE} ${MPIEXEC_POSTFLAGS} ${ARGS}) + endfunction() +else() + function(add_mpi_test) + cmake_parse_arguments(MPI_TEST "" "NAME;NUM_PROCS;WORKING_DIRECTORY" "COMMAND" ${ARGN}) + message(STATUS "Skipping test ${NAME} on non-MPI compilation") endfunction() endif() +# incorporate categories of specific tests from subdirectories + add_subdirectory(utils) add_subdirectory(formats) add_subdirectory(commands) @@ -52,6 +81,8 @@ add_subdirectory(python) add_subdirectory(tools) add_subdirectory(force-styles) +# clang-format support for test sources + find_package(ClangFormat 8.0) if(ClangFormat_FOUND) diff --git a/unittest/c-library/CMakeLists.txt b/unittest/c-library/CMakeLists.txt index ee7f323c0f..3d57dbbc90 100644 --- a/unittest/c-library/CMakeLists.txt +++ b/unittest/c-library/CMakeLists.txt @@ -1,24 +1,24 @@ add_executable(test_library_open test_library_open.cpp test_main.cpp) -target_link_libraries(test_library_open PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_open PRIVATE lammps GTest::GMock) add_test(LibraryOpen test_library_open) add_executable(test_library_commands test_library_commands.cpp test_main.cpp) -target_link_libraries(test_library_commands PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_commands PRIVATE lammps GTest::GMock) add_test(LibraryCommands test_library_commands) add_executable(test_library_external test_library_external.cpp test_main.cpp) -target_link_libraries(test_library_external PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_external PRIVATE lammps GTest::GMock) add_test(LibraryExternal test_library_external) add_executable(test_library_properties test_library_properties.cpp test_main.cpp) -target_link_libraries(test_library_properties PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_properties PRIVATE lammps GTest::GMock) target_compile_definitions(test_library_properties PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) add_test(LibraryProperties test_library_properties) set_tests_properties(LibraryProperties PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_library_scatter_gather test_library_scatter_gather.cpp test_main.cpp) -target_link_libraries(test_library_scatter_gather PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_scatter_gather PRIVATE lammps GTest::GMock) target_compile_definitions(test_library_scatter_gather PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) add_test(LibraryScatterGather test_library_scatter_gather) set_tests_properties(LibraryScatterGather PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") @@ -63,13 +63,11 @@ foreach(WITH "JPEG" "PNG" "GZIP" "FFMPEG") endforeach() add_executable(test_library_config test_library_config.cpp test_main.cpp) -target_link_libraries(test_library_config PRIVATE lammps GTest::GTest GTest::GMock) +target_link_libraries(test_library_config PRIVATE lammps GTest::GMock) target_compile_definitions(test_library_config PRIVATE ${TEST_CONFIG_DEFS}) add_test(LibraryConfig test_library_config) -if(BUILD_MPI) - add_executable(test_library_mpi test_library_mpi.cpp) - target_link_libraries(test_library_mpi PRIVATE lammps GTest::GTest GTest::GMock) - target_compile_definitions(test_library_mpi PRIVATE ${TEST_CONFIG_DEFS}) - add_mpi_test(NAME LibraryMPI NUM_PROCS 4 COMMAND $) -endif() +add_executable(test_library_mpi test_library_mpi.cpp) +target_link_libraries(test_library_mpi PRIVATE lammps GTest::GMock) +target_compile_definitions(test_library_mpi PRIVATE ${TEST_CONFIG_DEFS}) +add_mpi_test(NAME LibraryMPI NUM_PROCS 4 COMMAND $) diff --git a/unittest/commands/CMakeLists.txt b/unittest/commands/CMakeLists.txt index 176e22a391..49603a8b22 100644 --- a/unittest/commands/CMakeLists.txt +++ b/unittest/commands/CMakeLists.txt @@ -1,44 +1,28 @@ -# build LAMMPS plugins, but not on Windows -if((NOT (CMAKE_SYSTEM_NAME STREQUAL "Windows")) AND PKG_PLUGIN) - ExternalProject_Add(plugins - SOURCE_DIR "${LAMMPS_DIR}/examples/plugins" - BINARY_DIR ${CMAKE_BINARY_DIR}/build-plugins - INSTALL_DIR ${CMAKE_BINARY_DIR} - CMAKE_ARGS ${CMAKE_REQUEST_PIC} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_INSTALL_PREFIX= - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - BUILD_BYPRODUCTS /morse2plugin${CMAKE_SHARED_MODULE_SUFFIX} - /nve2plugin${CMAKE_SHARED_MODULE_SUFFIX} - /helloplugin${CMAKE_SHARED_MODULE_SUFFIX} - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different - /morse2plugin${CMAKE_SHARED_MODULE_SUFFIX} - /nve2plugin${CMAKE_SHARED_MODULE_SUFFIX} - /helloplugin${CMAKE_SHARED_MODULE_SUFFIX} - ${CMAKE_CURRENT_BINARY_DIR} - TEST_COMMAND "") -endif() - add_executable(test_simple_commands test_simple_commands.cpp) -if(PKG_PLUGIN) + +# tests for the plugin command require the PLUGIN package and won't work on windows +if((NOT (CMAKE_SYSTEM_NAME STREQUAL "Windows")) AND PKG_PLUGIN) + add_subdirectory(${LAMMPS_DIR}/examples/plugins ${CMAKE_BINARY_DIR}/build-plugins) add_dependencies(test_simple_commands plugins) + target_compile_definitions(test_simple_commands PRIVATE -DLMP_PLUGIN) endif() -target_link_libraries(test_simple_commands PRIVATE lammps GTest::GMock GTest::GTest) + +target_link_libraries(test_simple_commands PRIVATE lammps GTest::GMock) add_test(NAME SimpleCommands COMMAND test_simple_commands WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +set_tests_properties(SimpleCommands PROPERTIES + ENVIRONMENT "LAMMPS_PLUGIN_BIN_DIR=${CMAKE_BINARY_DIR}/build-plugins") add_executable(test_lattice_region test_lattice_region.cpp) -target_link_libraries(test_lattice_region PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_lattice_region PRIVATE lammps GTest::GMock) add_test(NAME LatticeRegion COMMAND test_lattice_region WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_groups test_groups.cpp) -target_link_libraries(test_groups PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_groups PRIVATE lammps GTest::GMock) add_test(NAME Groups COMMAND test_groups WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_variables test_variables.cpp) -target_link_libraries(test_variables PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_variables PRIVATE lammps GTest::GMock) add_test(NAME Variables COMMAND test_variables WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_kim_commands test_kim_commands.cpp) @@ -49,17 +33,15 @@ if(KIM_EXTRA_UNITTESTS) message(FATAL_ERROR "CURL not found. Enabling KIM extra unit tests requires to have libcurl installed.") endif() endif() -target_link_libraries(test_kim_commands PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_kim_commands PRIVATE lammps GTest::GMock) add_test(NAME KimCommands COMMAND test_kim_commands WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_reset_ids test_reset_ids.cpp) target_compile_definitions(test_reset_ids PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(test_reset_ids PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_reset_ids PRIVATE lammps GTest::GMock) add_test(NAME ResetIDs COMMAND test_reset_ids WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -if(BUILD_MPI) - add_executable(test_mpi_load_balancing test_mpi_load_balancing.cpp) - target_link_libraries(test_mpi_load_balancing PRIVATE lammps GTest::GTest GTest::GMock) - target_compile_definitions(test_mpi_load_balancing PRIVATE ${TEST_CONFIG_DEFS}) - add_mpi_test(NAME MPILoadBalancing NUM_PROCS 4 COMMAND $) -endif() +add_executable(test_mpi_load_balancing test_mpi_load_balancing.cpp) +target_link_libraries(test_mpi_load_balancing PRIVATE lammps GTest::GMock) +target_compile_definitions(test_mpi_load_balancing PRIVATE ${TEST_CONFIG_DEFS}) +add_mpi_test(NAME MPILoadBalancing NUM_PROCS 4 COMMAND $) diff --git a/unittest/commands/test_simple_commands.cpp b/unittest/commands/test_simple_commands.cpp index 0ad47f4e96..1844752d33 100644 --- a/unittest/commands/test_simple_commands.cpp +++ b/unittest/commands/test_simple_commands.cpp @@ -384,7 +384,12 @@ TEST_F(SimpleCommandsTest, Units) #if defined(LMP_PLUGIN) TEST_F(SimpleCommandsTest, Plugin) { - std::string loadfmt("plugin load {}plugin.so"); + const char *bindir = getenv("LAMMPS_PLUGIN_BIN_DIR"); + const char *config = getenv("CMAKE_CONFIG_TYPE"); + if (!bindir) GTEST_SKIP(); + std::string loadfmt = platform::path_join("plugin load ", bindir); + if (config) loadfmt = platform::path_join(loadfmt, config); + loadfmt = platform::path_join(loadfmt, "{}plugin.so"); ::testing::internal::CaptureStdout(); lmp->input->one(fmt::format(loadfmt, "hello")); auto text = ::testing::internal::GetCapturedStdout(); @@ -395,7 +400,7 @@ TEST_F(SimpleCommandsTest, Plugin) lmp->input->one(fmt::format(loadfmt, "xxx")); text = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << text; - ASSERT_THAT(text, MatchesRegex(".*Open of file xxx.* failed.*")); + ASSERT_THAT(text, MatchesRegex(".*Open of file .*xxx.* failed.*")); ::testing::internal::CaptureStdout(); lmp->input->one(fmt::format(loadfmt, "nve2")); @@ -426,8 +431,7 @@ TEST_F(SimpleCommandsTest, Plugin) lmp->input->one("plugin unload pair nve2"); text = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << text; - ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of pair style nve2: " - "not loaded from a plugin.*")); + ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of pair style nve2: not from a plugin.*")); ::testing::internal::CaptureStdout(); lmp->input->one("plugin unload fix nve2"); @@ -439,8 +443,7 @@ TEST_F(SimpleCommandsTest, Plugin) lmp->input->one("plugin unload fix nve"); text = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << text; - ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of fix style nve: " - "not loaded from a plugin.*")); + ASSERT_THAT(text, MatchesRegex(".*Ignoring unload of fix style nve: not from a plugin.*")); ::testing::internal::CaptureStdout(); lmp->input->one("plugin list"); diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp index 4f603df5ac..86d880f22c 100644 --- a/unittest/commands/test_variables.cpp +++ b/unittest/commands/test_variables.cpp @@ -59,8 +59,8 @@ protected: void TearDown() override { LAMMPSTest::TearDown(); - unlink("test_variable.file"); - unlink("test_variable.atomfile"); + platform::unlink("test_variable.file"); + platform::unlink("test_variable.atomfile"); } void atomic_system() @@ -165,7 +165,7 @@ TEST_F(VariableTest, CreateDelete) fputs(" ", fp); fclose(fp); ASSERT_THAT(variable->retrieve("file"), StrEq("1")); - unlink("MYFILE"); + platform::unlink("MYFILE"); ASSERT_THAT(variable->retrieve("file"), StrEq("0")); BEGIN_HIDE_OUTPUT(); diff --git a/unittest/cplusplus/CMakeLists.txt b/unittest/cplusplus/CMakeLists.txt index b0b2550e8c..efd194b9d2 100644 --- a/unittest/cplusplus/CMakeLists.txt +++ b/unittest/cplusplus/CMakeLists.txt @@ -1,13 +1,13 @@ add_executable(test_lammps_class test_lammps_class.cpp) -target_link_libraries(test_lammps_class PRIVATE lammps GTest::GMockMain GTest::GTest GTest::GMock) +target_link_libraries(test_lammps_class PRIVATE lammps GTest::GMockMain) add_test(LammpsClass test_lammps_class) set_tests_properties(LammpsClass PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=1") add_executable(test_input_class test_input_class.cpp) -target_link_libraries(test_input_class PRIVATE lammps GTest::GTest GTest::GTestMain) +target_link_libraries(test_input_class PRIVATE lammps GTest::GTestMain) add_test(InputClass test_input_class) add_executable(test_error_class test_error_class.cpp) -target_link_libraries(test_error_class PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_error_class PRIVATE lammps GTest::GMock) add_test(ErrorClass test_error_class) diff --git a/unittest/cplusplus/test_lammps_class.cpp b/unittest/cplusplus/test_lammps_class.cpp index 663c7358d9..3a1bde51ff 100644 --- a/unittest/cplusplus/test_lammps_class.cpp +++ b/unittest/cplusplus/test_lammps_class.cpp @@ -363,11 +363,7 @@ TEST(LAMMPS_init, NoOpenMP) FILE *fp = fopen("in.lammps_class_noomp", "w"); fputs("\n", fp); fclose(fp); -#if defined(__WIN32) - _putenv("OMP_NUM_THREADS"); -#else - unsetenv("OMP_NUM_THREADS"); -#endif + platform::unsetenv("OMP_NUM_THREADS"); const char *args[] = {"LAMMPS_init", "-in", "in.lammps_class_noomp", "-log", "none", "-nocite"}; char **argv = (char **)args; diff --git a/unittest/force-styles/CMakeLists.libyaml b/unittest/force-styles/CMakeLists.libyaml new file mode 100644 index 0000000000..51e8589f7b --- /dev/null +++ b/unittest/force-styles/CMakeLists.libyaml @@ -0,0 +1,34 @@ +# Custom minimal -*- CMake -*- file for libyaml + +cmake_minimum_required(VERSION 3.10) +project(libyaml VERSION 0.2.5 + DESCRIPTION "LibYAML a YAML parser and emitter library" + LANGUAGES C + HOMEPAGE_URL https://pyyaml.org/wiki/LibYAML) + +# compilation settings and options +option(BUILD_SHARED_LIBS "Build libYAML as a shared library" OFF) +option(CMAKE_POSITION_INDEPENDENT_CODE "Create objects compatible with shared libraries" ON) + +include(GNUInstallDirs) + +add_library(yaml + src/api.c + src/dumper.c + src/emitter.c + src/loader.c + src/parser.c + src/reader.c + src/scanner.c + src/writer.c + ) + +set(YAML_VERSION_STRING "${YAML_VERSION_MAJOR}.${YAML_VERSION_MINOR}.${YAML_VERSION_PATCH}") +set(CONFIG_H_FILE "#ifndef LIBYAML_CONFIG_H\n#define LIBYAML_CONFIG_H\n") +set(CONFIG_H_FILE "${CONFIG_H_FILE}#define YAML_VERSION_MAJOR ${libyaml_VERSION_MAJOR}\n") +set(CONFIG_H_FILE "${CONFIG_H_FILE}#define YAML_VERSION_MINOR ${libyaml_VERSION_MINOR}\n") +set(CONFIG_H_FILE "${CONFIG_H_FILE}#define YAML_VERSION_PATCH ${libyaml_VERSION_PATCH}\n") +set(CONFIG_H_FILE "${CONFIG_H_FILE}#define YAML_VERSION_STRING \"${libyaml_VERSION_MAJOR}.${libyaml_VERSION_MINOR}.${libyaml_VERSION_PATCH}\"\n#endif\n") +file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/include/config.h "${CONFIG_H_FILE}") +target_compile_definitions(yaml PRIVATE YAML_DECLARE_STATIC HAVE_CONFIG_H) +target_include_directories(yaml PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 75e95c3bf0..39730e6aeb 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -1,8 +1,15 @@ find_package(YAML) if(NOT YAML_FOUND) + set(YAML_URL "https://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz" CACHE STRING "URL for libyaml tarball") + set(YAML_MD5 "bb15429d8fb787e7d3f1c83ae129a999" CACHE STRING "MD5 checksum of libyaml tarball") + mark_as_advanced(YAML_URL) + mark_as_advanced(YAML_MD5) + # download and build a local copy of libyaml - include(YAML) + include(ExternalCMakeProject) + ExternalCMakeProject(libyaml ${YAML_URL} ${YAML_MD5} yaml . CMakeLists.libyaml) + add_library(Yaml::Yaml ALIAS yaml) endif() if(CMAKE_VERSION VERSION_LESS 3.12) @@ -24,9 +31,14 @@ endif() set(TEST_INPUT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/tests) add_library(style_tests STATIC yaml_writer.cpp error_stats.cpp test_config_reader.cpp test_main.cpp) -target_compile_definitions(style_tests PRIVATE -DTEST_INPUT_FOLDER=${TEST_INPUT_FOLDER}) +if(YAML_FOUND) + target_compile_definitions(style_tests PRIVATE TEST_INPUT_FOLDER=${TEST_INPUT_FOLDER}) +else() + # we always use static linkage with local compiled libyaml + target_compile_definitions(style_tests PRIVATE TEST_INPUT_FOLDER=${TEST_INPUT_FOLDER} YAML_DECLARE_STATIC) +endif() target_include_directories(style_tests PRIVATE ${LAMMPS_SOURCE_DIR}) -target_link_libraries(style_tests PUBLIC GTest::GTest GTest::GMock Yaml::Yaml lammps) +target_link_libraries(style_tests PUBLIC gmock Yaml::Yaml lammps) if(BUILD_MPI) target_link_libraries(style_tests PUBLIC MPI::MPI_CXX) else() @@ -43,7 +55,7 @@ endif() # unit test for error stats class add_executable(test_error_stats test_error_stats.cpp) target_include_directories(test_error_stats PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LAMMPS_SOURCE_DIR}) -target_link_libraries(test_error_stats PRIVATE GTest::GTestMain GTest::GTest) +target_link_libraries(test_error_stats PRIVATE gtest_main) add_test(NAME ErrorStats COMMAND test_error_stats) # pair style tester diff --git a/unittest/force-styles/test_error_stats.cpp b/unittest/force-styles/test_error_stats.cpp index 52ba3baae3..cadb4e7f2a 100644 --- a/unittest/force-styles/test_error_stats.cpp +++ b/unittest/force-styles/test_error_stats.cpp @@ -9,6 +9,11 @@ #include "fmtlib_format.cpp" #include "fmtlib_os.cpp" +// Windows may define this as a macro +#if defined(max) +#undef max +#endif + TEST(ErrorStats, test) { ErrorStats stats; diff --git a/unittest/force-styles/tests/atomic-pair-eim.yaml b/unittest/force-styles/tests/atomic-pair-eim.yaml index 4814029a3c..e705e88614 100644 --- a/unittest/force-styles/tests/atomic-pair-eim.yaml +++ b/unittest/force-styles/tests/atomic-pair-eim.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:02 2021 -epsilon: 1e-11 +epsilon: 2e-11 prerequisites: ! | pair eim pre_commands: ! "" diff --git a/unittest/force-styles/tests/manybody-pair-meam.yaml b/unittest/force-styles/tests/manybody-pair-meam.yaml index 4237f5ffc2..fed2a060cf 100644 --- a/unittest/force-styles/tests/manybody-pair-meam.yaml +++ b/unittest/force-styles/tests/manybody-pair-meam.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:15 2021 -epsilon: 7.5e-12 +epsilon: 1e-10 prerequisites: ! | pair meam pre_commands: ! | diff --git a/unittest/formats/CMakeLists.txt b/unittest/formats/CMakeLists.txt index 93b48ac1b4..a17707fdf1 100644 --- a/unittest/formats/CMakeLists.txt +++ b/unittest/formats/CMakeLists.txt @@ -1,48 +1,48 @@ add_executable(test_atom_styles test_atom_styles.cpp) -target_link_libraries(test_atom_styles PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_atom_styles PRIVATE lammps GTest::GMock) add_test(NAME AtomStyles COMMAND test_atom_styles WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_image_flags test_image_flags.cpp) -target_link_libraries(test_image_flags PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_image_flags PRIVATE lammps GTest::GMock) add_test(NAME ImageFlags COMMAND test_image_flags WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_input_convert test_input_convert.cpp) -target_link_libraries(test_input_convert PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_input_convert PRIVATE lammps GTest::GMockMain) add_test(NAME InputConvert COMMAND test_input_convert WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_molecule_file test_molecule_file.cpp) -target_link_libraries(test_molecule_file PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_molecule_file PRIVATE lammps GTest::GMock) add_test(NAME MoleculeFile COMMAND test_molecule_file WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_pair_unit_convert test_pair_unit_convert.cpp) -target_link_libraries(test_pair_unit_convert PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_pair_unit_convert PRIVATE lammps GTest::GMock) add_test(NAME PairUnitConvert COMMAND test_pair_unit_convert WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(PairUnitConvert PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_potential_file_reader test_potential_file_reader.cpp) -target_link_libraries(test_potential_file_reader PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_potential_file_reader PRIVATE lammps GTest::GMock) add_test(NAME PotentialFileReader COMMAND test_potential_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(PotentialFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") if(PKG_MANYBODY) add_executable(test_eim_potential_file_reader test_eim_potential_file_reader.cpp) - target_link_libraries(test_eim_potential_file_reader PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_eim_potential_file_reader PRIVATE lammps GTest::GMock) add_test(NAME EIMPotentialFileReader COMMAND test_eim_potential_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(EIMPotentialFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") endif() add_executable(test_text_file_reader test_text_file_reader.cpp) -target_link_libraries(test_text_file_reader PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_text_file_reader PRIVATE lammps GTest::GMock) add_test(NAME TextFileReader COMMAND test_text_file_reader WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(TextFileReader PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_file_operations test_file_operations.cpp) -target_link_libraries(test_file_operations PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_file_operations PRIVATE lammps GTest::GMock) add_test(NAME FileOperations COMMAND test_file_operations WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_dump_atom test_dump_atom.cpp) -target_link_libraries(test_dump_atom PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_dump_atom PRIVATE lammps GTest::GMock) add_test(NAME DumpAtom COMMAND test_dump_atom WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpAtom PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") @@ -50,19 +50,19 @@ if(PKG_COMPRESS) find_program(GZIP_BINARY NAMES gzip REQUIRED) add_executable(test_dump_atom_compressed test_dump_atom_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_atom_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_atom_compressed PRIVATE lammps GTest::GMock) add_executable(test_dump_custom_compressed test_dump_custom_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_custom_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_custom_compressed PRIVATE lammps GTest::GMock) add_executable(test_dump_cfg_compressed test_dump_cfg_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_cfg_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_cfg_compressed PRIVATE lammps GTest::GMock) add_executable(test_dump_local_compressed test_dump_local_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_local_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_local_compressed PRIVATE lammps GTest::GMock) add_executable(test_dump_xyz_compressed test_dump_xyz_compressed.cpp compressed_dump_test_main.cpp) - target_link_libraries(test_dump_xyz_compressed PRIVATE lammps GTest::GMock GTest::GTest) + target_link_libraries(test_dump_xyz_compressed PRIVATE lammps GTest::GMock) add_test(NAME DumpAtomGZ COMMAND test_dump_atom_compressed gz WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpAtomGZ PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};COMPRESS_BINARY=${GZIP_BINARY}") @@ -102,17 +102,17 @@ if(PKG_COMPRESS) endif() add_executable(test_dump_custom test_dump_custom.cpp) -target_link_libraries(test_dump_custom PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_dump_custom PRIVATE lammps GTest::GMock) add_test(NAME DumpCustom COMMAND test_dump_custom WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpCustom PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_dump_cfg test_dump_cfg.cpp) -target_link_libraries(test_dump_cfg PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_dump_cfg PRIVATE lammps GTest::GMock) add_test(NAME DumpCfg COMMAND test_dump_cfg WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpCfg PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") add_executable(test_dump_local test_dump_local.cpp) -target_link_libraries(test_dump_local PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_dump_local PRIVATE lammps GTest::GMock) add_test(NAME DumpLocal COMMAND test_dump_local WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) set_tests_properties(DumpLocal PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") diff --git a/unittest/formats/test_text_file_reader.cpp b/unittest/formats/test_text_file_reader.cpp index f0f695ae54..6fcc21fb33 100644 --- a/unittest/formats/test_text_file_reader.cpp +++ b/unittest/formats/test_text_file_reader.cpp @@ -35,8 +35,8 @@ class TextFileReaderTest : public ::testing::Test { protected: void TearDown() override { - unlink("text_reader_one.file"); - unlink("text_reader_two.file"); + platform::unlink("text_reader_one.file"); + platform::unlink("text_reader_two.file"); } void test_files() @@ -65,16 +65,22 @@ TEST_F(TextFileReaderTest, nofile) FileReaderException); } +// this test cannot work on windows due to its non unix-like permission system + +#if !defined(_WIN32) TEST_F(TextFileReaderTest, permissions) { + platform::unlink("text_reader_noperms.file"); FILE *fp = fopen("text_reader_noperms.file", "w"); + ASSERT_NE(fp,nullptr); fputs("word\n", fp); fclose(fp); chmod("text_reader_noperms.file", 0); ASSERT_THROW({ TextFileReader reader("text_reader_noperms.file", "test"); }, FileReaderException); - unlink("text_reader_noperms.file"); + platform::unlink("text_reader_noperms.file"); } +#endif TEST_F(TextFileReaderTest, nofp) { diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index fc116c3c40..6e7e165018 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -25,11 +25,11 @@ if(CMAKE_Fortran_COMPILER) add_library(flammps STATIC ${LAMMPS_FORTRAN_MODULE}) add_executable(test_fortran_create wrap_create.cpp test_fortran_create.f90) - target_link_libraries(test_fortran_create PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTest GTest::GTestMain) + target_link_libraries(test_fortran_create PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(FortranOpen test_fortran_create) add_executable(test_fortran_commands wrap_commands.cpp test_fortran_commands.f90) - target_link_libraries(test_fortran_commands PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTest GTest::GTestMain) + target_link_libraries(test_fortran_commands PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(FortranCommands test_fortran_commands) else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") diff --git a/unittest/python/CMakeLists.txt b/unittest/python/CMakeLists.txt index 5d0aad2f54..f61a9c61ab 100644 --- a/unittest/python/CMakeLists.txt +++ b/unittest/python/CMakeLists.txt @@ -21,7 +21,7 @@ else() endif() add_executable(test_python_package test_python_package.cpp) -target_link_libraries(test_python_package PRIVATE lammps GTest::GMock GTest::GTest) +target_link_libraries(test_python_package PRIVATE lammps GTest::GMock) target_compile_definitions(test_python_package PRIVATE -DTEST_INPUT_FOLDER=${TEST_INPUT_FOLDER}) # this requires CMake 3.12. don't care to add backward compatibility for this. if(Python3_Development_FOUND) @@ -34,12 +34,18 @@ set_tests_properties(PythonPackage PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${L if(Python_EXECUTABLE) # prepare to augment the environment so that the LAMMPS python module and the shared library is found. set(PYTHON_TEST_ENVIRONMENT PYTHONPATH=${LAMMPS_PYTHON_DIR}:$ENV{PYTHONPATH}) + get_property(BUILD_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(BUILD_IS_MULTI_CONFIG) + set(LAMMPS_LIB_PATH ${CMAKE_BINARY_DIR}/$) + else() + set(LAMMPS_LIB_PATH ${CMAKE_BINARY_DIR}) + endif() list(APPEND PYTHON_TEST_ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") list(APPEND PYTHON_TEST_ENVIRONMENT "TEST_INPUT_DIR=${CMAKE_CURRENT_SOURCE_DIR}") if(APPLE) - list(APPEND PYTHON_TEST_ENVIRONMENT "DYLD_LIBRARY_PATH=${CMAKE_BINARY_DIR}:$ENV{DYLD_LIBRARY_PATH};LAMMPS_CMAKE_CACHE=${CMAKE_BINARY_DIR}/CMakeCache.txt") + list(APPEND PYTHON_TEST_ENVIRONMENT "DYLD_LIBRARY_PATH=${LAMMPS_LIB_PATH}:$ENV{DYLD_LIBRARY_PATH};LAMMPS_CMAKE_CACHE=${CMAKE_BINARY_DIR}/CMakeCache.txt") else() - list(APPEND PYTHON_TEST_ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}:$ENV{LD_LIBRARY_PATH};LAMMPS_CMAKE_CACHE=${CMAKE_BINARY_DIR}/CMakeCache.txt") + list(APPEND PYTHON_TEST_ENVIRONMENT "LD_LIBRARY_PATH=${LAMMPS_LIB_PATH}:$ENV{LD_LIBRARY_PATH};LAMMPS_CMAKE_CACHE=${CMAKE_BINARY_DIR}/CMakeCache.txt") endif() if(LAMMPS_MACHINE) # convert from '_machine' to 'machine' diff --git a/unittest/utils/CMakeLists.txt b/unittest/utils/CMakeLists.txt index 9f708861cc..28486048c4 100644 --- a/unittest/utils/CMakeLists.txt +++ b/unittest/utils/CMakeLists.txt @@ -1,21 +1,21 @@ add_executable(test_tokenizer test_tokenizer.cpp) -target_link_libraries(test_tokenizer PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_tokenizer PRIVATE lammps GTest::GMockMain) add_test(Tokenizer test_tokenizer) add_executable(test_mempool test_mempool.cpp) -target_link_libraries(test_mempool PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_mempool PRIVATE lammps GTest::GMockMain) add_test(MemPool test_mempool) add_executable(test_argutils test_argutils.cpp) -target_link_libraries(test_argutils PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_argutils PRIVATE lammps GTest::GMockMain) add_test(ArgUtils test_argutils) add_executable(test_utils test_utils.cpp) -target_link_libraries(test_utils PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_utils PRIVATE lammps GTest::GMockMain) add_test(Utils test_utils) add_executable(test_platform test_platform.cpp) -target_link_libraries(test_platform PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_platform PRIVATE lammps GTest::GMockMain) add_test(Platform test_platform) set_tests_properties(Utils Platform PROPERTIES @@ -34,7 +34,7 @@ if(BUILD_SHARED_LIBS) endif() add_executable(test_fmtlib test_fmtlib.cpp) -target_link_libraries(test_fmtlib PRIVATE lammps GTest::GMockMain GTest::GMock GTest::GTest) +target_link_libraries(test_fmtlib PRIVATE lammps GTest::GMockMain) add_test(FmtLib test_fmtlib) add_executable(test_math_eigen_impl test_math_eigen_impl.cpp) diff --git a/unittest/utils/test_math_eigen_impl.cpp b/unittest/utils/test_math_eigen_impl.cpp index 895a35080c..47ca8d9cca 100644 --- a/unittest/utils/test_math_eigen_impl.cpp +++ b/unittest/utils/test_math_eigen_impl.cpp @@ -48,7 +48,7 @@ inline static bool SimilarVec(Vector a, Vector b, int n, Scalar eps = 1.0e-06, Scalar ratio = 1.0e-06, Scalar ratio_denom = 1.0) { for (int i = 0; i < n; i++) - if (not Similar(a[i], b[i], eps, ratio, ratio_denom)) return false; + if (! Similar(a[i], b[i], eps, ratio, ratio_denom)) return false; return true; } @@ -61,7 +61,7 @@ inline static bool SimilarVecUnsigned(Vector a, Vector b, int n, Scalar eps = 1. return true; else { for (int i = 0; i < n; i++) - if (not Similar(a[i], -b[i], eps, ratio, ratio_denom)) return false; + if (! Similar(a[i], -b[i], eps, ratio, ratio_denom)) return false; return true; } } diff --git a/unittest/utils/test_platform.cpp b/unittest/utils/test_platform.cpp index 0f39534c31..ace546ba90 100644 --- a/unittest/utils/test_platform.cpp +++ b/unittest/utils/test_platform.cpp @@ -37,7 +37,7 @@ TEST(Platform, clock) ASSERT_GT(ct_used, 1e-4); } -TEST(Platform, putenv) +TEST(Platform, putenv_unsetenv) { const char *var = getenv("UNITTEST_VAR1"); ASSERT_EQ(var, nullptr); @@ -65,6 +65,14 @@ TEST(Platform, putenv) ASSERT_THAT(var, StrEq("one=two")); ASSERT_EQ(platform::putenv(""), -1); + + ASSERT_EQ(platform::unsetenv(""), -1); + ASSERT_EQ(platform::unsetenv("UNITTEST_VAR3=two"), -1); + var = getenv("UNITTEST_VAR1"); + ASSERT_NE(var, nullptr); + ASSERT_EQ(platform::unsetenv("UNITTEST_VAR1"), 0); + var = getenv("UNITTEST_VAR1"); + ASSERT_EQ(var, nullptr); } TEST(Platform, list_pathenv)