@@ -50,9 +50,183 @@ AC_DEFUN_ONCE([_OMPI_SETUP_FC_COMPILER],[
50
50
51
51
# ############################################################################
52
52
53
+ dnl On macOS with Xcode, test whether -Wl,-commons,use_dylibs works
54
+ dnl by itself or whether it also needs -Wl,-ld_classic.
55
+ dnl
56
+ dnl Backstory
57
+ dnl
58
+ dnl The history is that for a long time (decades),
59
+ dnl -Wl,-commons,use_dylibs worked by itself.
60
+ dnl
61
+ dnl XCode 15 introduced a a new linker (either " the new linker" or
62
+ dnl " ld_prime" , according to
63
+ dnl https://developer.apple.com/forums/thread/715385). The new linker
64
+ dnl originally did not support " -commons use_dylibs" , but Apple recently
65
+ dnl added support for that feature to the new linker in the XCode 16
66
+ dnl beta. " -ld_classic" forces using the old linker (which doesn' t support
67
+ dnl some other features that customers might like, but Open MPI doesn' t
68
+ dnl use for its Fortran bindings, like mergable libraries).
69
+ dnl
70
+ dnl Sidenode: Open MPI needs this " -commons use_dylibs" functionality
71
+ dnl because Fortran sentinel values (e.g., MPI_BOTTOM) are implemented
72
+ dnl with Fortran common blocks.
73
+ dnl
74
+ dnl So there' s three cases:
75
+ dnl
76
+ dnl 1. Customer' s default linker is the classic linker, which always
77
+ dnl supported " -commons use_dylibs" .
78
+ dnl 2. Customer' s default linker is the new linker, but not new enough
79
+ dnl to support "-commons use_dylibs", so we need to force using the old
80
+ dnl linker via "-ld_classic".
81
+ dnl 3. Customer' s default linker is the new linker, new enough to support
82
+ dnl " -commons use_dylibs" , so we do not want to force using the old
83
+ dnl linker.
84
+ dnl
85
+ dnl We have to use a slightly complex test code that will actually
86
+ dnl fail if the version of Xcode being used requires " -ld_classic"
87
+ dnl with " -commons,use_dylibs" .
88
+ dnl
89
+ dnl 1. Build a shared library (with C source code) with a public
90
+ dnl symbol that can be used as a Fortran common block symbol.
91
+ dnl 2. Compile a Fortran program that calls a function in the shared
92
+ dnl library, and link it against the shared library.
93
+ dnl
94
+ dnl Note: This is a linker test ; we are checking to see if this all
95
+ dnl compiles and links properly. The logic in the C / Fortran code
96
+ dnl below specifically does not test for correctness because we do not
97
+ dnl actually run the code.
98
+ AC_DEFUN([_OMPI_SETUP_FC_XCODE_COMMONS_LDFLAGS],[
99
+ OPAL_VAR_SCOPE_PUSH([xcode_flags])
100
+
101
+ # This variable is used by the invoking macro to display the
102
+ # results via AC RESULT (just to keep the symmetry of
103
+ # MSG_CHECKING / RESULT in the same upper-level macro).
104
+ OMPI_FORTRAN_WRAPPER_FLAGS=
105
+
106
+ xcode_flags= " -Wl,-commons,use_dylibs"
107
+ _OMPI_SETUP_FC_XCODE_COMMONS_LDFLAGS_BACKEND(
108
+ [$xcode_flags ],
109
+ [OMPI_FORTRAN_WRAPPER_FLAGS= $xcode_flags ], [])
110
+ AS_IF([test -z " $OMPI_FORTRAN_WRAPPER_FLAGS " ],
111
+ [xcode_flags= " -Wl,-commons,use_dylibs -Wl,-ld_classic"
112
+ _OMPI_SETUP_FC_XCODE_COMMONS_LDFLAGS_BACKEND(
113
+ [$xcode_flags ],
114
+ [OMPI_FORTRAN_WRAPPER_FLAGS= $xcode_flags ], [])])
115
+ AS_IF([test -z " $OMPI_FORTRAN_WRAPPER_FLAGS " ],
116
+ [OMPI_FORTRAN_WRAPPER_FLAGS= " none" ])
117
+
118
+ OPAL_VAR_SCOPE_POP
119
+ ])
120
+
121
+ dnl Companion to _OMPI SETUP_FC_XCODE_COMMONS_LDFLAGS;
122
+ dnl see that macro for an explanation of this macro.
123
+ dnl
124
+ dnl $1 : LDFLAGS to test
125
+ dnl $2 : action to perform upon success
126
+ dnl $3 : action to perform upon failure
127
+ AC_DEFUN([_OMPI_SETUP_FC_XCODE_COMMONS_LDFLAGS_BACKEND],[
128
+ OPAL_VAR_SCOPE_PUSH([xcode_happy xcode_dir LDFLAGS_save_xcode LIBS_save_xcode])
129
+
130
+ xcode_dir= conftest.$$
131
+ rm -r f $xcode_dir
132
+ mkdir -p $xcode_dir
133
+ cd $xcode_dir
134
+
135
+ LIBS_save_xcode= $LIBS
136
+ LDFLAGS_save_xcode= $LDFLAGS
137
+ LDFLAGS= " $LDFLAGS -L. $1 "
138
+
139
+ # Note: we use COMPILE_IFELSE and LANG_SOURCE below, which assume
140
+ # that confdefs.h exists. This is being invoked extremely early
141
+ # in the configure sequence, so we haven't AC DEFINE'ed anything
142
+ # yet, and therefore confdefs.h won't be automatically created
143
+ # yet. So we'll make an empty confdefs.h to avoid some error
144
+ # messages (it'll be removed with the whole tempdir, later).
145
+ touch confdefs.h
146
+
147
+ # Step 1: make a C library with some public symbols
148
+ xcode_happy= 0
149
+ AC_LANG_PUSH([C])
150
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
151
+ /* Must end the symbol in _ (remember: we are specifically targeting
152
+ the MacOS compilation environment, so it is ok to target a specific
153
+ Fortran symbol convention), otherwise the Fortran linker will not
154
+ find it, and will just create a new Fortran symbol for it * /
155
+ int ompi_mpi_bottom_ = 42;
156
+
157
+ void ompi_init_f(int * bogus);
158
+
159
+ /* Empty / useless function that still ensures that this compilation
160
+ unit will not be optimized out * /
161
+ void ompi_init_f(int * bogus)
162
+ {
163
+ * bogus = ompi_mpi_bottom_;
164
+ }
165
+ ]])],
166
+ [ # If the above compiled successfully, Then use
167
+ # conftest.OBJEXT to make the library. Note that
168
+ # conftest.OBJEXT will automatically be deleted upon exit of
169
+ # COMPILE_IFELSE.
170
+ #
171
+ # NOTE: this is pretty gross -- we're manually making a
172
+ # shared library. But the libtool binary doesn't exist yet,
173
+ # so this is the best that we can do.
174
+ OPAL_LOG_COMMAND([$CC -d ynamiclib -Wl,-undefined -Wl,dynamic_lookup $LDFLAGS conftest.$OBJEXT -o libconftest.dylib],
175
+ [xcode_happy= 1])])
176
+ AC_LANG_POP
177
+
178
+ # Now compile and link a Fortran program against this shared
179
+ # library.
180
+ AC_LANG_PUSH([Fortran])
181
+ AS_IF([test $xcode_happy -eq 1],
182
+ [LIBS= " $LIBS -lconftest"
183
+ AC_LINK_IFELSE([AC_LANG_SOURCE([
184
+ program test
185
+ integer :: mpi_bottom
186
+ common/ompi_mpi_bottom/mpi_bottom
187
+
188
+ interface
189
+ subroutine ompi_init(bogus) BIND(C, name=" ompi_init_f" )
190
+ implicit none
191
+ integer bogus
192
+ end subroutine ompi_init
193
+ end interface
194
+
195
+ integer bogus
196
+ call ompi_init(bogus)
197
+ end program
198
+ ])],
199
+
200
+ [],
201
+ [xcode_happy= 0])])
202
+ AC_LANG_POP
203
+
204
+ # Exit the temp dir
205
+ cd ..
206
+ rm -r f $xcode_dir
207
+
208
+ # LIBS was set specifically for the artificial conditions of this
209
+ # test, so reset it
210
+ LIBS= $LIBS_save_xcode
211
+
212
+ AS_IF([test $xcode_happy -eq 1],
213
+ [ # Restore LDFLAFGS + the new flags (i.e., get rid of the
214
+ # "-L." we added for this test)
215
+ LDFLAGS= " $LDFLAGS_xcode_save $1 "
216
+ $2 ],
217
+ [ # If we failed the test, reset LDFLAGS back to its
218
+ # original value.
219
+ LDFLAGS= $LDFLAGS_xcode_save
220
+ $3 ])
221
+
222
+ OPAL_VAR_SCOPE_POP
223
+ ])
224
+
225
+ # ############################################################################
226
+
53
227
# General Fortran compiler setup
54
228
AC_DEFUN([OMPI_SETUP_FC],[
55
- OPAL_VAR_SCOPE_PUSH([ompi_fc_happy LDFLAGS_save fc_version])
229
+ OPAL_VAR_SCOPE_PUSH([ompi_fc_happy LDFLAGS_save fc_version OMPI_FORTRAN_WRAPPER_FLAGS ])
56
230
57
231
# Force the intro banner to be displayed first
58
232
AC_REQUIRE([_OMPI_SETUP_FC_BANNER])
@@ -226,23 +400,12 @@ I = 3]])],
226
400
])
227
401
])
228
402
229
- # Per #1982, on OS X, we may need some esoteric linker flags in the
403
+ # Per Trac #1982, on OS X, we may need some esoteric linker flags in the
230
404
# Fortran wrapper compiler.
231
405
AC_MSG_CHECKING([to see if mpifort compiler needs additional linker flags])
232
406
case " $host " in
233
407
* apple-darwin* )
234
- # Test whether -Wl,-commons,use_dylibs works; if it does, use it.
235
- LDFLAGS_save=$LDFLAGS
236
- LDFLAGS=" $LDFLAGS -Wl,-commons,use_dylibs"
237
- AC_LANG_PUSH([Fortran])
238
- AC_LINK_IFELSE([AC_LANG_SOURCE([[program test
239
- integer :: i
240
- end program]])],
241
- [OMPI_FORTRAN_WRAPPER_FLAGS= " -Wl,-commons,use_dylibs"
242
- OPAL_WRAPPER_FLAGS_ADD([FCFLAGS], [$OMPI_FORTRAN_WRAPPER_FLAGS ])],
243
- [OMPI_FORTRAN_WRAPPER_FLAGS= none])
244
- AC_LANG_POP([Fortran])
245
- LDFLAGS=$LDFLAGS_save
408
+ _OMPI_SETUP_FC_XCODE_COMMONS_LDFLAGS
246
409
AC_MSG_RESULT([$OMPI_FORTRAN_WRAPPER_FLAGS ])
247
410
;;
248
411
* )
0 commit comments