Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
send argv and argc to fortran runtimes, to allow using getarg
authorAugustin Degomme <adegomme@users.noreply.github.com>
Wed, 25 Jul 2018 22:09:08 +0000 (00:09 +0200)
committerAugustin Degomme <adegomme@users.noreply.github.com>
Wed, 25 Jul 2018 22:20:09 +0000 (00:20 +0200)
src/smpi/internals/smpi_global.cpp
tools/cmake/MakeLib.cmake

index 5e70fb2..021bb07 100644 (file)
@@ -42,6 +42,15 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke
 #include <boost/tokenizer.hpp>
 #include <boost/algorithm/string.hpp> /* trim_right / trim_left */
 
+#if defined(__GNUC__)
+  extern "C" void _gfortran_set_args(int, char **);
+#elif defined(__FLANG)
+  extern "C" void __io_set_argc(int);
+  extern "C" void __io_set_argv(char **);
+#elif defined(__INTEL_COMPILER) || defined(__ICC)
+  extern "C" void for_rtl_init_ (int *, char **);
+#endif
+
 #ifndef RTLD_DEEPBIND
 /* RTLD_DEEPBIND is a bad idea of GNU ld that obviously does not exist on other platforms
  * See https://www.akkadia.org/drepper/dsohowto.pdf
@@ -423,9 +432,15 @@ static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector<s
     argv[i] = args[i].empty() ? noarg : &args[i].front();
   argv[argc] = nullptr;
   char ** argvptr=argv.get();
-
   simgrid::smpi::ActorExt::init(&argc, &argvptr);
-
+#if defined(__GNUC__)
+  _gfortran_set_args(argc, argvptr);
+#elif defined(__FLANG)
+  __io_set_argc(argc);
+  __io_set_argv(argvptr);
+#elif defined(__INTEL_COMPILER) || defined(__ICC)
+  for_rtl_init_ (&argc, argvptr);
+#endif 
   int res = entry_point(argc, argvptr);
   if (res != 0){
     XBT_WARN("SMPI process did not return 0. Return value : %d", res);
index 57292dd..c6aba0d 100644 (file)
@@ -94,6 +94,17 @@ if(enable_smpi)
     PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/simgrid)
   install(TARGETS smpimain # install that binary without breaking the rpath on Mac
     RUNTIME DESTINATION lib/simgrid)
+
+  if(SMPI_FORTRAN)
+    if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
+      SET(SIMGRID_DEP "${SIMGRID_DEP} -lgfortran")
+    elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel")
+      SET(SIMGRID_DEP "${SIMGRID_DEP} -lifcore")
+    elseif(CMAKE_Fortran_COMPILER_ID MATCHES "PGI|Flang")
+      SET(SIMGRID_DEP "${SIMGRID_DEP} -lflang")
+    endif()
+  endif()
+
 endif()
 
 if(enable_smpi AND APPLE)