Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
smpif2c: Compile common structs and building function as weak symbol (so that they...
authorpini <pini@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 26 Nov 2010 19:55:02 +0000 (19:55 +0000)
committerpini <pini@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 26 Nov 2010 19:55:02 +0000 (19:55 +0000)
smpiff: Fix linking of object files. Also remove generated C file upon compilation success.

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@8684 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/smpi/smpif2c.in
src/smpi/smpiff.in

index 02330f3..296ca19 100755 (executable)
@@ -16,6 +16,9 @@ foreach my $fortran (@ARGV) {
    die "F2C failed\n" if $?;
    open F2C,"<$output";
    my $started = 0;
+   print $tmp "#ifndef INTEGER_STAR_8\n";
+   print $tmp "#define INTEGER_STAR_8\n";
+   print $tmp "#endif\n";
    print $tmp "#include <stdlib.h>\n";
    print $tmp "#include <smpif.h>\n";
    while(<F2C>) {
@@ -25,15 +28,15 @@ foreach my $fortran (@ARGV) {
       }
       if($started) {
          if(/^} (.*?);/) {
-            $_ = "}* $1 = NULL;\n";
+            $_ = "}* __attribute__((weak)) $1 = NULL;\n";
          } elsif(/^#define\s*(\S*)\s*\(?([^.]*)(\..*?)?\)?$/) {
             $_ = "#define $1 $2\[smpi_global_rank()\]";
             if(defined $3) {
                $_ .= $3;
             }
             $_ .= "\n";
-            $_ .= "\nvoid __attribute__((constructor)) __preinit_$1(void) {\n  if(!$2) $2 = malloc(smpi_global_size() * sizeof(*$2));\n}\n";
-            $_ .= "\nvoid __attribute__((destructor)) __postfini_$1(void) {\n  free($2);\n  $2 = NULL;\n}\n";
+            $_ .= "\nvoid __attribute__((weak,constructor)) __preinit_$1(void) {\n  if(!$2) $2 = malloc(smpi_global_size() * sizeof(*$2));\n}\n";
+            $_ .= "\nvoid __attribute__((weak,destructor)) __postfini_$1(void) {\n  free($2);\n  $2 = NULL;\n}\n";
          }
       }
       if(/\/\* Table of constant values \*\// || /MAIN__/) {
index 3d90003..315349d 100644 (file)
@@ -21,8 +21,15 @@ while [ -n "$1" ]; do
   esac
 done
 
-for SRCFILE in "${SRCFILES}"
-do
-   CFILE="${SRCFILE%.f}.c"
-   $prefix/bin/smpif2c ${SRCFILE} && $prefix/bin/smpicc ${ARGS} ${CFILE}
-done
+if [ -n "${SRCFILES}" ]
+then
+   for SRCFILE in "${SRCFILES}"
+   do
+      CFILE="${SRCFILE%.f}.c"
+      #echo "$prefix/bin/smpif2c ${SRCFILE} && $prefix/bin/smpicc ${ARGS} ${CFILE} && rm ${CFILE}"
+      $prefix/bin/smpif2c ${SRCFILE} && $prefix/bin/smpicc ${ARGS} ${CFILE} && rm ${CFILE}
+   done
+else
+   #echo "$prefix/bin/smpicc ${ARGS}"
+   $prefix/bin/smpicc ${ARGS}
+fi