Source: liggghts
Version: 3.8.0+repack1-4
Tags: patch upstream
User: [email protected]
Usertags: ftcbfs
liggghts uses MPI and it uses it via FindMPI.cmake, which presently
detects MPI using compiler wrappers such as mpicc. During cross
compilation these wrappers will not work and they will be unsupported on
Debian. Beyond breaking cross compilation, such wrappers break when you
need two of them (e.g. ccache/distcc/mpicc). For MPI, a good solution is
using pkg-config and doing so is well supported by all major
implementations. I'm working on a patch for FindMPI.cmake to make it
work with pkg-config. However that'll result in MPI_C_COMPILER and
MPI_CXX_COMPILER being unusable. Unfortunately, liggghts uses them.
FindMPI.cmake also provides the relevant compiler and linker flags via
other cmake variables, so you can stop using MPI_*_COMPILER today and
thus enable cross building once FindMPI.cmake gains support for it.
Please consider applying the attached patch. Doing so early helps with
developing the cmake patch. I'm attaching my current draft for
reference.
Helmut
--- liggghts-3.8.0+repack1.orig/CMakeLists.txt
+++ liggghts-3.8.0+repack1/CMakeLists.txt
@@ -58,7 +58,12 @@
#=======================================
INCLUDE(FindMPI)
-IF(MPI_C_FOUND AND MPI_CXX_FOUND)
+IF(MPI_C_FOUND AND MPI_CXX_FOUND AND MPI_C_LIB_NAMES AND MPI_CXX_LIB_NAMES)
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MPI_C_COMPILE_OPTIONS}")
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MPI_CXX_COMPILE_OPTIONS}")
+ INCLUDE_DIRECTORIES(${MPI_C_INCLUDE_PATHS})
+ INCLUDE_DIRECTORIES(${MPI_CXX_INCLUDE_PATHS})
+ELSEIF(MPI_C_FOUND AND MPI_CXX_FOUND)
SET(CMAKE_C_COMPILER ${MPI_C_COMPILER})
SET(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER})
ELSE(MPI_C_FOUND AND MPI_CXX_FOUND)
--- liggghts-3.8.0+repack1.orig/src/CMakeLists.txt
+++ liggghts-3.8.0+repack1/src/CMakeLists.txt
@@ -40,6 +40,13 @@
ENDIF(${VTK_MAJOR_VERSION} EQUAL 6)
ENDIF(VTK_FOUND)
+IF(MPI_C_LIB_NAMES)
+ TARGET_LINK_LIBRARIES(libliggghts ${MPI_C_LIB_NAMES})
+ENDIF(MPI_C_LIB_NAMES)
+IF(MPI_CXX_LIB_NAMES)
+ TARGET_LINK_LIBRARIES(libliggghts ${MPI_CXX_LIB_NAMES})
+ENDIF(MPI_CXX_LIB_NAMES)
+
INSTALL(TARGETS libliggghts DESTINATION "${CMAKE_INSTALL_LIBDIR}/")
#======================================================
--- cmake-3.13.4.orig/Modules/FindMPI.cmake
+++ cmake-3.13.4/Modules/FindMPI.cmake
@@ -247,6 +247,7 @@
cmake_policy(SET CMP0057 NEW) # if IN_LIST
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/FindPkgConfig.cmake)
# Generic compiler names
set(_MPI_C_GENERIC_COMPILER_NAMES mpicc mpcc mpicc_r mpcc_r)
@@ -1459,7 +1460,40 @@
if(NOT MPI_PINNED_COMPILER AND NOT MPI_${LANG}_WRAPPER_FOUND)
# If MPI_PINNED_COMPILER wasn't given, and the MPI compiler we potentially found didn't work, we withdraw it.
set(MPI_${LANG}_COMPILER "MPI_${LANG}_COMPILER-NOTFOUND" CACHE FILEPATH "MPI compiler for ${LANG}" FORCE)
- if(NOT MPI_SKIP_GUESSING)
+
+ if(LANG STREQUAL "C")
+ set(_MPI_PKG "mpi-c")
+ elseif(LANG STREQUAL "CXX")
+ set(_MPI_PKG "mpi-cxx")
+ elseif(LANG STREQUAL "Fortran")
+ set(_MPI_PKG "mpi-fort")
+ else()
+ set(_MPI_PKG "")
+ endif()
+ if(_MPI_PKG)
+ pkg_check_modules("MPI_${LANG}_PKG" "${_MPI_PKG}")
+ if("${MPI_${LANG}_PKG_FOUND}")
+ set(MPI_${LANG}_COMPILE_OPTIONS ${MPI_${LANG}_PKG_CFLAGS} CACHE STRING "MPI ${LANG} compilation options" FORCE)
+ set(MPI_${LANG}_INCLUDE_PATH ${MPI_${LANG}_PKG_INCLUDE_DIRS} CACHE STRING "MPI ${LANG} include directories" FORCE)
+ set(MPI_${LANG}_LINK_FLAGS ${MPI_${LANG}_PKG_LDFLAGS} CACHE STRING "MPI ${LANG} linker flags" FORCE)
+ set(MPI_${LANG}_LIB_NAMES ${MPI_${LANG}_PKG_LIBRARIES} CACHE STRING "MPI ${LANG} libraries to link against" FORCE)
+ foreach(_MPI_LIB IN LISTS MPI_${LANG}_LIB_NAMES)
+ if(_MPI_LIB)
+ get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB}" NAME_WE)
+ get_filename_component(_MPI_LIB_NAME "${_MPI_LIB}" NAME)
+ get_filename_component(_MPI_LIB_DIR "${_MPI_LIB}" DIRECTORY)
+ find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY
+ NAMES "${_MPI_LIB_NAME}" "lib${_MPI_LIB_NAME}"
+ HINTS ${_MPI_LIB_DIR}
+ DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI"
+ )
+ mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY)
+ endif()
+ endforeach()
+ endif()
+ endif()
+
+ if(NOT MPI_SKIP_GUESSING AND NOT "${MPI_${LANG}_PKG_FOUND}")
# For C++, we may use the settings for C. Should a given compiler wrapper for C++ not exist, but one for C does, we copy over the
# settings for C. An MPI distribution that is in this situation would be IBM Platform MPI.
if("${LANG}" STREQUAL "CXX" AND MPI_C_WRAPPER_FOUND)