@@ -136,44 +136,78 @@ EOF
136
136
# OMPI_FORTRAN_F08_GET_HANDLE_ALIGNMENT(type, variable to set)
137
137
# ------------------------------------------
138
138
AC_DEFUN([OMPI_FORTRAN_F08_GET_HANDLE_ALIGNMENT],[
139
+ unset happy
140
+ OPAL_VAR_SCOPE_PUSH([happy ompi_conftest_h])
141
+
139
142
# Use of m4_translit suggested by Eric Blake:
140
143
# http://lists.gnu.org/archive/html/bug-autoconf/2010-10/msg00016.html
141
144
AS_VAR_PUSHDEF([type_var],
142
145
m4_translit([[ompi_cv_fortran_alignment_$1 ]], [* ], [p]))
143
146
144
147
AC_CACHE_CHECK([alignment of Fortran $1 ], type_var,
145
- [AC_LANG_PUSH([Fortran])
146
- AC_LINK_IFELSE([AC_LANG_SOURCE([[module alignment_mod
147
- type, BIND(C) :: test_mpi_handle
148
- integer :: MPI_VAL
149
- end type test_mpi_handle
150
- type(test_mpi_handle) :: t1
151
- type(test_mpi_handle) :: t2
152
- end module
153
-
154
- program falignment
155
- use alignment_mod
156
- OPEN(UNIT=10, FILE=" conftestval" )
157
- if (LOC(t1) > LOC(t2)) then
158
- write (10,' (I5)' ) LOC(t1)-LOC(t2)
159
- else
160
- write (10,' (I5)' ) LOC(t2)-LOC(t1)
161
- endif
162
- CLOSE(10)
163
-
164
- end program]])],
165
- [AS_IF([test " $cross_compiling " = " yes" ],
166
- [AC_MSG_ERROR([Can not determine alignment of $1 when cross-compiling])],
167
- [OPAL_LOG_COMMAND([./conftest],
168
- [AS_VAR_SET(type_var, [` cat conftestval` ])],
169
- [AC_MSG_ERROR([Could not determine alignment of $1 ])])])],
170
-
171
- [AC_MSG_WARN([Could not determine alignment of $1 ])
172
- AC_MSG_WARN([See config.log for details])
173
- AC_MSG_ERROR([Cannot continue])])
174
- rm -rf conftest* * .mod 2> /dev/null
175
- AC_LANG_POP([Fortran])])
148
+ [OMPI_FORTRAN_MAKE_C_FUNCTION([ompi_ac_align_fn], [align])
149
+ # Fortran module
150
+ cat > conftestf.f << EOF
151
+ program falign
152
+ external align
153
+ type, BIND(C) :: test_mpi_handle
154
+ integer :: MPI_VAL
155
+ end type test_mpi_handle
156
+ type(test_mpi_handle) :: w,x,y,z
157
+ CHARACTER a,b,c
158
+ common /foo/a,w,b,x,y,c,z
159
+ call align(w,x,y,z)
160
+ end
161
+ EOF
162
+
163
+ # C module
164
+ if test -f conftest.h; then
165
+ ompi_conftest_h=" #include \" conftest.h\" "
166
+ else
167
+ ompi_conftest_h=" "
168
+ fi
169
+ cat > conftest.c << EOF
170
+ # include <stdio.h>
171
+ # include <stdlib.h>
172
+
173
+ void $ompi_ac_align_fn (char * w, char * x, char * y, char * z)
174
+ {
175
+ unsigned long aw, ax, ay, az;
176
+ FILE * f = fopen(" conftestval" , " w" );
177
+ if (! f) exit(1);
178
+ aw = (unsigned long) w;
179
+ ax = (unsigned long) x;
180
+ ay = (unsigned long) y;
181
+ az = (unsigned long) z;
182
+ if (! (( aw% 16 )|| (ax% 16 )|| (ay% 16 )|| (az% 16 )) ) fprintf(f, " %d\n" , 16);
183
+ else if (! (( aw% 12 )|| (ax% 12 )|| (ay% 12 )|| (az% 12 )) ) fprintf(f, " %d\n" , 12);
184
+ else if (! (( aw% 8 )|| (ax% 8 )|| (ay% 8 )|| (az% 8 )) ) fprintf(f, " %d\n" , 8);
185
+ else if (! (( aw% 4 )|| (ax% 4 )|| (ay% 4 )|| (az% 4 )) ) fprintf(f, " %d\n" , 4);
186
+ else if (! (( aw% 2 )|| (ax% 2 )|| (ay% 2 )|| (az% 2 )) ) fprintf(f, " %d\n" , 2);
187
+ else fprintf(f, " %d\n" , 1);
188
+ fclose(f);
189
+ }
190
+ EOF
191
+
192
+ OPAL_LOG_COMMAND([$CC $CFLAGS -I. -c conftest.c],
193
+ [OPAL_LOG_COMMAND([$FC $FCFLAGS conftestf.f conftest.o -o conftest $LDFLAGS $LIBS ],
194
+ [happy= " yes" ], [happy= " no" ])], [happy= " no" ])
195
+
196
+ if test " $happy " = " no" ; then
197
+ AC_MSG_RESULT([Error! ])
198
+ AC_MSG_ERROR([Could not determine alignment of $1 ])
199
+ fi
200
+
201
+ AS_IF([test " $cross_compiling " = " yes" ],
202
+ [AC_MSG_RESULT([Error! ])
203
+ AC_MSG_ERROR([Can not determine alignment of $1 when cross-compiling])],
204
+ [OPAL_LOG_COMMAND([./conftest],
205
+ [AS_VAR_SET(type_var, [` cat conftestval` ])],
206
+ [AC_MSG_RESULT([Error! ])
207
+ AC_MSG_ERROR([Could not determine alignment of $1 ])])])
208
+ rm -rf conftest* ])
176
209
177
210
AS_VAR_COPY([$2 ], [type_var])
178
211
AS_VAR_POPDEF([type_var])dnl
212
+ OPAL_VAR_SCOPE_POP
179
213
])dnl
0 commit comments