diff --git a/cmake/Modules/ExternalCMakeProject.cmake b/cmake/Modules/ExternalCMakeProject.cmake new file mode 100644 index 0000000000..d8138f9088 --- /dev/null +++ b/cmake/Modules/ExternalCMakeProject.cmake @@ -0,0 +1,35 @@ +# 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) + # change settings locally + set(BUILD_SHARED_LIBS OFF) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + if(CMAKE_VERSION VERSION_LESS 3.14) + 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) + add_subdirectory("${CMAKE_BINARY_DIR}/_deps/${target}-src/${cmakedir}" + "${CMAKE_BINARY_DIR}/_deps/${target}-build") + else() + include(FetchContent) + message(STATUS "Downloading ${url}") + FetchContent_Declare(${target} URL ${url} URL_HASH MD5=${hash} SOURCE_SUBDIR ${cmakedir}) + message(STATUS "Unpacking and configuring ${archive}") + FetchContent_MakeAvailable(${target}) + endif() +endfunction(ExternalCMakeProject) diff --git a/cmake/Modules/Packages/MSCG.cmake b/cmake/Modules/Packages/MSCG.cmake index 1bfd123dd0..dbfe437f67 100644 --- a/cmake/Modules/Packages/MSCG.cmake +++ b/cmake/Modules/Packages/MSCG.cmake @@ -12,47 +12,11 @@ if(DOWNLOAD_MSCG) mark_as_advanced(MSCG_URL) mark_as_advanced(MSCG_MD5) - # always compile a static lib but with position independent code - # make a copy of current settings for later use - set(OLD_SHARED_LIBS ${BUILD_SHARED_LIBS}) - set(OLD_POSITION_INDEPENDENT_CODE ${CMAKE_POSITION_INDEPENDENT_CODE}) - set(BUILD_SHARED_LIBS OFF) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - - if(CMAKE_VERSION VERSION_LESS 3.14) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) - file(DOWNLOAD ${MSCG_URL} ${CMAKE_BINARY_DIR}/_deps/mscg.tar.gz EXPECTED_HASH MD5=${MSCG_MD5}) - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/mscg.tar.gz - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) - - file(GLOB MSCG_SOURCE "${CMAKE_BINARY_DIR}/_deps/MSCG-release-*") - # sanity check. do not allow to have multiple downloaded and extracted versions of the source - list(LENGTH MSCG_SOURCE _num) - if(_num GREATER 1) - message(FATAL_ERROR "Inconsistent MSCG library sources. Please delete ${CMAKE_BINARY_DIR}/_deps and re-run cmake") - endif() - add_subdirectory(${MSCG_SOURCE}/src/CMake ${CMAKE_BINARY_DIR}/_deps/mscg-build) - else() - include(FetchContent) - FetchContent_Declare(mscg URL ${MSCG_URL} URL_HASH MD5=${MSCG_MD5} SOURCE_SUBDIR src/CMake) - FetchContent_MakeAvailable(mscg) - set(MSCG_SOURCE ${CMAKE_BINARY_DIR}/_deps/mscg-src) - endif() - - # restore previous settings - if(OLD_POSITION_INDEPENDENT_CODE) - set(CMAKE_POSITON_INDEPENDENT_CODE ${OLD_POSITION_INDEPENDENT_CODE}) - else() - unset(CMAKE_POSITION_INDEPENDENT_CODE) - endif() - if (OLD_SHARED_LIBS) - set(BUILD_SHARED_LIBS ${OLD_SHARED_LIBS}) - else() - unset(BUILD_SHARED_LIBS) - endif() + include(ExternalCMakeProject) + ExternalCMakeProject(mscg ${MSCG_URL} ${MSCG_MD5} MSCG-release src/CMake) # set include and link library - target_include_directories(lammps PRIVATE "${MSCG_SOURCE}/src") + target_include_directories(lammps PRIVATE "${CMAKE_BINARY_DIR}/_deps/mscg-src/src") target_link_libraries(lammps PRIVATE mscg) else() find_package(MSCG) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index a61d50af45..119e514207 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -11,24 +11,8 @@ mark_as_advanced(GTEST_URL) mark_as_advanced(GTEST_MD5) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -# workaround for older CMake versions (tested on Ubuntu 18.04 with CMake 3.10) -if(CMAKE_VERSION VERSION_LESS 3.14) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) - file(DOWNLOAD ${GTEST_URL} ${CMAKE_BINARY_DIR}/_deps/googletest.tar.gz EXPECTED_HASH MD5=${GTEST_MD5}) - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/googletest.tar.gz - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps) - file(GLOB GTEST_SOURCE "${CMAKE_BINARY_DIR}/_deps/googletest-*") - # sanity check. do not allow to have multiple downloaded and extracted versions of the source - list(LENGTH GTEST_SOURCE _num) - if(_num GREATER 1) - message(FATAL_ERROR "Inconsistent googletest sources. Please delete ${CMAKE_BINARY_DIR}/_deps and re-run cmake") - endif() - add_subdirectory(${GTEST_SOURCE} ${CMAKE_BINARY_DIR}/googletest) -else() - include(FetchContent) - FetchContent_Declare(googletest URL ${GTEST_URL} URL_HASH MD5=${GTEST_MD5}) - FetchContent_MakeAvailable(googletest) -endif() +include(ExternalCMakeProject) +ExternalCMakeProject(googletest ${GTEST_URL} ${GTEST_MD5} googletest .) ######################################## # General tests using the LAMMPS executable itself