Skip to content

Commit 783d529

Browse files
committed
[GR-20084] Use .bundle for C extensions on macOS like MRI.
PullRequest: truffleruby/1161
2 parents 06479a9 + e19c626 commit 783d529

File tree

13 files changed

+80
-50
lines changed

13 files changed

+80
-50
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ workingsets.xml
2222
# C extensions
2323
*.o
2424
*.so
25+
*.bundle
2526
*.dylib
2627
/.ext
2728
conftest

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Compatibility:
5454
* JCodings has been updated from 1.0.42 to 1.0.45.
5555
* Joni has been updated from 2.1.25 to 2.1.30.
5656
* Implemented `Method#<<` and `Method#>>` (#1821).
57+
* The `.bundle` file extension is now used for C extensions on macOS (#1819, #1837).
5758

5859
Performance:
5960

lib/truffle/rbconfig.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,17 @@ module RbConfig
189189

190190
expanded['CPP'] = "#{cc} -E"
191191
mkconfig['CPP'] = '$(CC) -E'
192-
expanded['LDSHARED'] = "#{cc} -shared"
193-
mkconfig['LDSHARED'] = '$(CC) -shared'
194-
expanded['LDSHAREDXX'] = "#{cxx} -shared"
195-
mkconfig['LDSHAREDXX'] = '$(CXX) -shared'
192+
if Truffle::Platform.darwin?
193+
expanded['LDSHARED'] = "#{cc} -dynamic -bundle"
194+
mkconfig['LDSHARED'] = '$(CC) -dynamic -bundle'
195+
expanded['LDSHAREDXX'] = "#{cxx} -dynamic -bundle"
196+
mkconfig['LDSHAREDXX'] = '$(CXX) -dynamic -bundle'
197+
else
198+
expanded['LDSHARED'] = "#{cc} -shared"
199+
mkconfig['LDSHARED'] = '$(CC) -shared'
200+
expanded['LDSHAREDXX'] = "#{cxx} -shared"
201+
mkconfig['LDSHAREDXX'] = '$(CXX) -shared'
202+
end
196203
end
197204

198205
launcher = Truffle::Boot.get_option 'launcher'

mx.truffleruby/mx_truffleruby.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,25 @@
1111

1212
import mx
1313
import mx_sdk
14+
import mx_subst
1415

1516
if 'RUBY_BENCHMARKS' in os.environ:
1617
import mx_truffleruby_benchmark # pylint: disable=unused-import
1718

1819
_suite = mx.suite('truffleruby')
1920
root = _suite.dir
2021

22+
def add_ext_suffix(name):
23+
"""
24+
Adds the platform specific C extension suffix to a name
25+
"""
26+
if mx.is_darwin():
27+
return name + '.bundle'
28+
else:
29+
return name + '.so'
30+
31+
mx_subst.results_substitutions.register_with_arg('extsuffix', add_ext_suffix)
32+
2133
# Utilities
2234

2335
class VerboseMx:

mx.truffleruby/suite.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -270,13 +270,13 @@
270270
"src/main/c/spawn-helper/spawn-helper",
271271
"src/main/c/truffleposix/<lib:truffleposix>",
272272
"src/main/c/cext/<lib:truffleruby>",
273-
"src/main/c/etc/<libsuffix:etc>",
274-
"src/main/c/nkf/<libsuffix:nkf>",
275-
"src/main/c/openssl/<libsuffix:openssl>",
276-
"src/main/c/psych/<libsuffix:psych>",
277-
"src/main/c/rbconfig-sizeof/<libsuffix:sizeof>",
278-
"src/main/c/syslog/<libsuffix:syslog>",
279-
"src/main/c/zlib/<libsuffix:zlib>",
273+
"src/main/c/etc/<extsuffix:etc>",
274+
"src/main/c/nkf/<extsuffix:nkf>",
275+
"src/main/c/openssl/<extsuffix:openssl>",
276+
"src/main/c/psych/<extsuffix:psych>",
277+
"src/main/c/rbconfig-sizeof/<extsuffix:sizeof>",
278+
"src/main/c/syslog/<extsuffix:syslog>",
279+
"src/main/c/zlib/<extsuffix:zlib>",
280280
],
281281
"license": [
282282
"EPL-2.0", # JRuby (we're choosing EPL out of EPL,GPL,LGPL)
@@ -425,15 +425,15 @@
425425
"file:lib/cext/include/*.h",
426426
],
427427
"lib/mri/": [
428-
"dependency:org.truffleruby.cext/src/main/c/etc/<libsuffix:etc>",
429-
"dependency:org.truffleruby.cext/src/main/c/nkf/<libsuffix:nkf>",
430-
"dependency:org.truffleruby.cext/src/main/c/openssl/<libsuffix:openssl>",
431-
"dependency:org.truffleruby.cext/src/main/c/psych/<libsuffix:psych>",
432-
"dependency:org.truffleruby.cext/src/main/c/syslog/<libsuffix:syslog>",
433-
"dependency:org.truffleruby.cext/src/main/c/zlib/<libsuffix:zlib>",
428+
"dependency:org.truffleruby.cext/src/main/c/etc/<extsuffix:etc>",
429+
"dependency:org.truffleruby.cext/src/main/c/nkf/<extsuffix:nkf>",
430+
"dependency:org.truffleruby.cext/src/main/c/openssl/<extsuffix:openssl>",
431+
"dependency:org.truffleruby.cext/src/main/c/psych/<extsuffix:psych>",
432+
"dependency:org.truffleruby.cext/src/main/c/syslog/<extsuffix:syslog>",
433+
"dependency:org.truffleruby.cext/src/main/c/zlib/<extsuffix:zlib>",
434434
],
435435
"lib/mri/rbconfig/": [
436-
"dependency:org.truffleruby.cext/src/main/c/rbconfig-sizeof/<libsuffix:sizeof>",
436+
"dependency:org.truffleruby.cext/src/main/c/rbconfig-sizeof/<extsuffix:sizeof>",
437437
],
438438
"lib/truffle/": [
439439
"dependency:org.truffleruby.cext/src/main/c/spawn-helper/spawn-helper",

src/main/c/Makefile

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ MKMF_MAKEFILE_SUBPROCESS_FLAGS = $(MX_VERBOSE:y=V=1)
44

55
OS := $(shell uname)
66
ifeq ($(OS),Darwin)
7-
DLEXT := dylib
7+
SOEXT := dylib
8+
DLEXT := bundle
89
else
10+
SOEXT := so
911
DLEXT := so
1012
endif
1113

@@ -20,14 +22,14 @@ CC := clang
2022
CFLAGS := -Wall -Werror -Wno-unused-function -fPIC -std=c99
2123
LDFLAGS := -m64
2224

23-
TRUFFLE_POSIX := truffleposix/libtruffleposix.$(DLEXT)
25+
TRUFFLE_POSIX := truffleposix/libtruffleposix.$(SOEXT)
2426
SPAWN_HELPER := spawn-helper/spawn-helper
2527

2628
RUBY_HEADERS := $(wildcard $(ROOT)/lib/cext/include/*.h) $(wildcard $(ROOT)/lib/cext/include/*/*.h) $(wildcard $(ROOT)/lib/cext/include/*/*/*.h)
2729
RBCONFIG := $(ROOT)/lib/truffle/rbconfig.rb
2830
RBCONFIG_MKMF := $(ROOT)/lib/truffle/rbconfig-for-mkmf.rb
2931
MKMF := $(ROOT)/lib/mri/mkmf.rb
30-
LIBTRUFFLERUBY = cext/libtruffleruby.$(DLEXT)
32+
LIBTRUFFLERUBY = cext/libtruffleruby.$(SOEXT)
3133
BASIC_EXTCONF_DEPS := $(SPAWN_HELPER) $(TRUFFLE_POSIX) $(RUBY_HEADERS) $(RBCONFIG) $(RBCONFIG_MKMF) $(MKMF)
3234
# C extensions link against libtruffleruby (and might do have_func() checks against it), so it needs to be there before.
3335
# However, if libtruffleruby is recompiled, there is no need to rebuild C extensions, so it's a order-only-prerequisite.

src/main/c/cext/extconf.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@
66
# GNU General Public License version 2, or
77
# GNU Lesser General Public License version 2.1.
88

9+
# Compile libtruffleruby as a .dylib shared library and not a .bundle on macOS to allow -ltruffleruby
10+
if Truffle::Platform.darwin?
11+
module Truffle::Platform
12+
remove_const :DLEXT
13+
DLEXT = SOEXT
14+
end
15+
16+
require 'rbconfig'
17+
RbConfig::CONFIG['LDSHARED'] = "#{RbConfig::CONFIG['CC']} -shared"
18+
RbConfig::MAKEFILE_CONFIG['LDSHARED'] = '$(CC) -shared'
19+
end
20+
921
require 'mkmf'
1022

1123
$srcs = %w[ruby.c internal.c st.c]

src/main/c/truffleposix/Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ Q$(MX_VERBOSE) = @
22

33
OS := $(shell uname)
44
ifeq ($(OS),Darwin)
5-
DLEXT := dylib
5+
SOEXT := dylib
66
else
7-
DLEXT := so
7+
SOEXT := so
88
endif
99

1010
ifeq ($(OS),SunOS)
@@ -32,7 +32,7 @@ ifeq ($(OS),SunOS)
3232
LDFLAGS += -lrt
3333
endif
3434

35-
libtruffleposix.$(DLEXT): truffleposix.o Makefile
35+
libtruffleposix.$(SOEXT): truffleposix.o Makefile
3636
$(Q) $(CC) -shared $(LDFLAGS) -o $@ $<
3737

3838
truffleposix.o: truffleposix.c Makefile

src/main/java/org/truffleruby/RubyLanguage.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ public class RubyLanguage extends TruffleLanguage<RubyContext> {
6868

6969
public static final String LLVM_BITCODE_MIME_TYPE = "application/x-llvm-ir-bitcode";
7070

71-
public static final String CEXT_MIME_TYPE = "application/x-ruby-cext-library";
72-
public static final String CEXT_EXTENSION = "." + Platform.LIBSUFFIX;
71+
public static final String CEXT_EXTENSION = Platform.CEXT_SUFFIX;
7372

7473
public static final String RESOURCE_SCHEME = "resource:";
7574
public static final String RUBY_HOME_SCHEME = "rubyHome:";

src/main/java/org/truffleruby/language/loader/FeatureLoader.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
import java.util.Map;
1717
import java.util.concurrent.locks.ReentrantLock;
1818

19-
import com.oracle.truffle.api.TruffleFile;
20-
import com.oracle.truffle.api.source.Source;
2119
import org.jcodings.Encoding;
2220
import org.truffleruby.Layouts;
2321
import org.truffleruby.RubyContext;
@@ -32,19 +30,22 @@
3230
import org.truffleruby.language.control.JavaException;
3331
import org.truffleruby.language.control.RaiseException;
3432
import org.truffleruby.platform.NativeConfiguration;
33+
import org.truffleruby.platform.Platform;
3534
import org.truffleruby.platform.TruffleNFIPlatform;
3635
import org.truffleruby.platform.TruffleNFIPlatform.NativeFunction;
3736
import org.truffleruby.shared.Metrics;
3837
import org.truffleruby.shared.TruffleRuby;
3938

4039
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
40+
import com.oracle.truffle.api.TruffleFile;
4141
import com.oracle.truffle.api.interop.ArityException;
4242
import com.oracle.truffle.api.interop.InteropLibrary;
4343
import com.oracle.truffle.api.interop.TruffleObject;
4444
import com.oracle.truffle.api.interop.UnsupportedMessageException;
4545
import com.oracle.truffle.api.interop.UnsupportedTypeException;
4646
import com.oracle.truffle.api.object.DynamicObject;
4747
import com.oracle.truffle.api.profiles.ConditionProfile;
48+
import com.oracle.truffle.api.source.Source;
4849
import com.oracle.truffle.api.source.SourceSection;
4950

5051
public class FeatureLoader {
@@ -275,28 +276,25 @@ private String findFeatureWithAndWithoutExtension(String path) {
275276

276277
if (path.endsWith(".so")) {
277278
final String base = path.substring(0, path.length() - 3);
279+
final String pathWithNativeExt = base + RubyLanguage.CEXT_EXTENSION;
278280

279-
final String asSO = findFeatureWithExactPath(base + RubyLanguage.CEXT_EXTENSION);
280-
281-
if (asSO != null) {
282-
return asSO;
281+
final String asCExt = findFeatureWithExactPath(pathWithNativeExt);
282+
if (asCExt != null) {
283+
return asCExt;
283284
}
284285
}
285286

286-
final String withExtension = findFeatureWithExactPath(path + TruffleRuby.EXTENSION);
287-
288-
if (withExtension != null) {
289-
return withExtension;
287+
final String asRuby = findFeatureWithExactPath(path + TruffleRuby.EXTENSION);
288+
if (asRuby != null) {
289+
return asRuby;
290290
}
291291

292292
final String asCExt = findFeatureWithExactPath(path + RubyLanguage.CEXT_EXTENSION);
293-
294293
if (asCExt != null) {
295294
return asCExt;
296295
}
297296

298297
final String withoutExtension = findFeatureWithExactPath(path);
299-
300298
if (withoutExtension != null) {
301299
return withoutExtension;
302300
}
@@ -353,8 +351,7 @@ public void ensureCExtImplementationLoaded(String feature, RequireNode requireNo
353351
final DynamicObject truffleModule = context.getCoreLibrary().getTruffleModule();
354352
final Object truffleCExt = Layouts.MODULE.getFields(truffleModule).getConstant("CExt").getValue();
355353

356-
final String rubyLibPath = context.getRubyHome() + "/lib/cext/libtruffleruby" +
357-
RubyLanguage.CEXT_EXTENSION;
354+
final String rubyLibPath = context.getRubyHome() + "/lib/cext/libtruffleruby" + Platform.LIB_SUFFIX;
358355
final TruffleObject library = loadCExtLibRuby(rubyLibPath, feature);
359356

360357
final TruffleObject initFunction = requireNode

0 commit comments

Comments
 (0)