diff --git a/CMakeLists.txt b/CMakeLists.txt index 607fb8b..bd45360 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,52 +1,34 @@ -cmake_minimum_required(VERSION 3.15) -project(mpistub LANGUAGES C CXX Fortran) +cmake_minimum_required(VERSION 3.5.0...4.1.0) +project(mpi-abi-stubs VERSION 5.0 LANGUAGES C) -# Source files -set(MPI_STUB_SOURCES src/mpi.c src/mpi.f90) +option(BUILD_SHARED_LIBS "Build libraries as SHARED" TRUE) +add_library(mpi_abi mpi.c) +set_target_properties(mpi_abi PROPERTIES VERSION 0) +set_target_properties(mpi_abi PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS 1) # Tell CMake where to put the generated .mod file during build and install set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod) -# Build as a shared library -add_library(mpistub SHARED ${MPI_STUB_SOURCES}) - -# Force the output name to "mpi" to generate libmpi.so -set_target_properties(mpistub PROPERTIES - OUTPUT_NAME "mpi" - VERSION "1.0.0" - SOVERSION "12" - C_STANDARD 11 - C_STANDARD_REQUIRED YES -) - -# Setup include directories -target_include_directories(mpistub PUBLIC - $ - $ -) - # Create standard CMake namespace aliases -add_library(MPI::MPI_C ALIAS mpistub) -add_library(MPI::MPI_CXX ALIAS mpistub) +add_library(MPI::MPI_C ALIAS mpi_abi) +add_library(MPI::MPI_CXX ALIAS mpi_abi) include(GNUInstallDirs) +install(FILES mpi.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(TARGETS mpi_abi DESTINATION ${CMAKE_INSTALL_LIBDIR}) -# ============================================================================== -# WRAPPER GENERATION -# ============================================================================== +# Generate wrappers # Use $0 to resolve the base directory at runtime so scripts are relocatable in Python wheels set(SCRIPT_BASE "#!/bin/sh\nDIR=\"$( cd \"$( dirname \"$0\" )/..\" && pwd )\"\n") -set(WRAPPER_SCRIPT_C "${SCRIPT_BASE}exec \"${CMAKE_C_COMPILER}\" -I\"$DIR/${CMAKE_INSTALL_INCLUDEDIR}\" \"$@\" -L\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -Wl,-rpath,\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -lmpi\n") -set(WRAPPER_SCRIPT_CXX "${SCRIPT_BASE}exec \"${CMAKE_CXX_COMPILER}\" -I\"$DIR/${CMAKE_INSTALL_INCLUDEDIR}\" \"$@\" -L\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -Wl,-rpath,\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -lmpi\n") -set(WRAPPER_SCRIPT_FC "${SCRIPT_BASE}exec gfortran -I\"$DIR/${CMAKE_INSTALL_INCLUDEDIR}\" \"$@\" -L\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -Wl,-rpath,\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -lmpi\n") +set(WRAPPER_SCRIPT_C "${SCRIPT_BASE}exec \"${CMAKE_C_COMPILER}\" -I\"$DIR/${CMAKE_INSTALL_INCLUDEDIR}\" \"$@\" -L\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -Wl,-rpath,\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -lmpi_abi\n") +set(WRAPPER_SCRIPT_CXX "${SCRIPT_BASE}exec \"${CMAKE_CXX_COMPILER}\" -I\"$DIR/${CMAKE_INSTALL_INCLUDEDIR}\" \"$@\" -L\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -Wl,-rpath,\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -lmpi_abi\n") +set(WRAPPER_SCRIPT_FC "${SCRIPT_BASE}exec gfortran -I\"$DIR/${CMAKE_INSTALL_INCLUDEDIR}\" \"$@\" -L\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -Wl,-rpath,\"$DIR/${CMAKE_INSTALL_LIBDIR}\" -lmpi_abi\n") # Copy the physical mpiexec script and FORCE Unix line endings (LF) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/bin/mpiexec ${CMAKE_CURRENT_BINARY_DIR}/mpiexec NEWLINE_STYLE LF) - - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/mpicc ${WRAPPER_SCRIPT_C}) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/mpicxx ${WRAPPER_SCRIPT_CXX}) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/mpif90 ${WRAPPER_SCRIPT_FC}) @@ -62,7 +44,7 @@ file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/mpiexec PERMISSIONS OWNER_READ OWNER_WRIT # INSTALLATION # ============================================================================== -install(TARGETS mpistub +install(TARGETS mpi_abi EXPORT MPIStubTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} @@ -71,8 +53,7 @@ install(TARGETS mpistub ) install(FILES - include/mpi.h - include/mpif.h + mpi.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) @@ -92,4 +73,4 @@ install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mod/ enable_testing() add_executable(test_mpi_stub tests/test_mpi_stub.c) target_link_libraries(test_mpi_stub PRIVATE MPI::MPI_C) -add_test(NAME MPIStubSanityCheck COMMAND test_mpi_stub) \ No newline at end of file +add_test(NAME MPIStubSanityCheck COMMAND test_mpi_stub) diff --git a/include/mpif.h b/include/mpif.h deleted file mode 100644 index e480f2b..0000000 --- a/include/mpif.h +++ /dev/null @@ -1,105 +0,0 @@ -! ================================================================ - ! MPI Fortran Polyglot Stub Header (ABI Compliant) - ! ================================================================ - - INTEGER MPI_SUCCESS, MPI_ERR_OTHER, MPI_ERR_UNKNOWN - PARAMETER (MPI_SUCCESS=0, MPI_ERR_OTHER=16, MPI_ERR_UNKNOWN=14) - - INTEGER MPI_COMM_WORLD, MPI_COMM_SELF, MPI_COMM_NULL - PARAMETER (MPI_COMM_NULL=256) - PARAMETER (MPI_COMM_WORLD=257) - PARAMETER (MPI_COMM_SELF=258) - - INTEGER MPI_DATATYPE_NULL, MPI_INT, MPI_INTEGER - INTEGER MPI_DOUBLE_PRECISION, MPI_REAL, MPI_COMPLEX - INTEGER MPI_DOUBLE_COMPLEX, MPI_LOGICAL, MPI_CHARACTER - INTEGER MPI_BYTE, MPI_PACKED, MPI_2INT - INTEGER MPI_2REAL, MPI_2DOUBLE_PRECISION, MPI_2INTEGER - INTEGER MPI_AINT, MPI_OFFSET, MPI_COUNT - - PARAMETER (MPI_DATATYPE_NULL=512) - PARAMETER (MPI_INT=521) - PARAMETER (MPI_INTEGER=537) - PARAMETER (MPI_REAL=538) - PARAMETER (MPI_COMPLEX=539) - PARAMETER (MPI_DOUBLE_PRECISION=540) - PARAMETER (MPI_DOUBLE_COMPLEX=541) - PARAMETER (MPI_LOGICAL=536) - PARAMETER (MPI_CHARACTER=542) - PARAMETER (MPI_BYTE=583) - PARAMETER (MPI_PACKED=519) - PARAMETER (MPI_2INT=555) - PARAMETER (MPI_2REAL=560) - PARAMETER (MPI_2DOUBLE_PRECISION=561) - PARAMETER (MPI_2INTEGER=562) - PARAMETER (MPI_AINT=513, MPI_OFFSET=515, MPI_COUNT=514) - - ! Explicitly sized Fortran Types (MUMPS needs MPI_INTEGER8) - INTEGER MPI_INTEGER1, MPI_INTEGER2, MPI_INTEGER4 - INTEGER MPI_INTEGER8, MPI_INTEGER16 - INTEGER MPI_REAL2, MPI_REAL4, MPI_REAL8, MPI_REAL16 - INTEGER MPI_COMPLEX4, MPI_COMPLEX8, MPI_COMPLEX16 - INTEGER MPI_COMPLEX32 - INTEGER MPI_LOGICAL1, MPI_LOGICAL2, MPI_LOGICAL4 - INTEGER MPI_LOGICAL8, MPI_LOGICAL16 - - PARAMETER (MPI_INTEGER1=705, MPI_INTEGER2=713) - PARAMETER (MPI_INTEGER4=721, MPI_INTEGER8=729) - PARAMETER (MPI_INTEGER16=737) - PARAMETER (MPI_REAL2=714, MPI_REAL4=722) - PARAMETER (MPI_REAL8=730, MPI_REAL16=738) - PARAMETER (MPI_COMPLEX4=723, MPI_COMPLEX8=731) - PARAMETER (MPI_COMPLEX16=739, MPI_COMPLEX32=747) - PARAMETER (MPI_LOGICAL1=704, MPI_LOGICAL2=712) - PARAMETER (MPI_LOGICAL4=720, MPI_LOGICAL8=728) - PARAMETER (MPI_LOGICAL16=736) - - INTEGER MPI_OP_NULL, MPI_SUM, MPI_MIN, MPI_MAX, MPI_PROD - INTEGER MPI_BAND, MPI_BOR, MPI_BXOR, MPI_LAND, MPI_LOR - INTEGER MPI_LXOR, MPI_MINLOC, MPI_MAXLOC, MPI_REPLACE - INTEGER MPI_NO_OP - - PARAMETER (MPI_OP_NULL=32) - PARAMETER (MPI_SUM=33, MPI_MIN=34, MPI_MAX=35, MPI_PROD=36) - PARAMETER (MPI_BAND=40, MPI_BOR=41, MPI_BXOR=42, MPI_LAND=48) - PARAMETER (MPI_LOR=49, MPI_LXOR=50, MPI_MINLOC=56) - PARAMETER (MPI_MAXLOC=57, MPI_REPLACE=60, MPI_NO_OP=61) - - INTEGER MPI_INFO_NULL, MPI_INFO_ENV - PARAMETER (MPI_INFO_NULL=304, MPI_INFO_ENV=305) - - INTEGER MPI_REQUEST_NULL - PARAMETER (MPI_REQUEST_NULL=384) - - INTEGER MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_PROC_NULL - INTEGER MPI_UNDEFINED, MPI_ROOT - PARAMETER (MPI_ANY_SOURCE=-1) - PARAMETER (MPI_ANY_TAG=-2) - PARAMETER (MPI_PROC_NULL=-3) - PARAMETER (MPI_ROOT=-4) - PARAMETER (MPI_UNDEFINED=-32766) - - INTEGER MPI_STATUS_SIZE - PARAMETER (MPI_STATUS_SIZE=8) - - ! Status Array indices and String Limits - INTEGER MPI_SOURCE, MPI_TAG, MPI_ERROR - PARAMETER (MPI_SOURCE=1, MPI_TAG=2, MPI_ERROR=3) - - INTEGER MPI_MAX_PROCESSOR_NAME, MPI_MAX_ERROR_STRING - PARAMETER (MPI_MAX_PROCESSOR_NAME=256) - PARAMETER (MPI_MAX_ERROR_STRING=512) - - ! Kinds - INTEGER MPI_ADDRESS_KIND, MPI_OFFSET_KIND, MPI_COUNT_KIND - PARAMETER (MPI_ADDRESS_KIND=8) - PARAMETER (MPI_OFFSET_KIND=8) - PARAMETER (MPI_COUNT_KIND=8) - - ! Sentinel memory addresses - INTEGER MPI_BOTTOM, MPI_IN_PLACE - COMMON /MPIPRIV/ MPI_BOTTOM, MPI_IN_PLACE - - ! MPI Timing Functions - DOUBLE PRECISION MPI_WTIME, MPI_WTICK - EXTERNAL MPI_WTIME, MPI_WTICK \ No newline at end of file diff --git a/src/mpi.c b/mpi.c similarity index 100% rename from src/mpi.c rename to mpi.c diff --git a/include/mpi.h b/mpi.h similarity index 100% rename from include/mpi.h rename to mpi.h diff --git a/src/mpi.f90 b/src/mpi.f90 deleted file mode 100644 index ec2c251..0000000 --- a/src/mpi.f90 +++ /dev/null @@ -1,3 +0,0 @@ -module mpi - include 'mpif.h' -end module mpi \ No newline at end of file