diff --git a/src/compiler/extTools.Mod b/src/compiler/extTools.Mod index 24ea1dc3..4c9b2c11 100644 --- a/src/compiler/extTools.Mod +++ b/src/compiler/extTools.Mod @@ -89,6 +89,23 @@ PROCEDURE LinkMain*(VAR moduleName: ARRAY OF CHAR; statically: BOOLEAN; addition Strings.Append(OPM.Model, cmd); Strings.Append(Configuration.libext, cmd); execute("C compile and link: ", cmd); + + IF (Configuration.os = "darwin") & ~statically THEN + (* Darwin requires an extra command to set the library directory into the binary *) + cmd := "install_name_tool -change lib"; + Strings.Append(Configuration.name, cmd); + Strings.Append('-O', cmd); + Strings.Append(OPM.Model, cmd); + Strings.Append('.dylib ', cmd); + Strings.Append(OPM.InstallDir, cmd); + Strings.Append('/lib/lib', cmd); + Strings.Append(Configuration.name, cmd); + Strings.Append('-O', cmd); + Strings.Append(OPM.Model, cmd); + Strings.Append('.dylib ', cmd); + Strings.Append(moduleName, cmd); + execute("Set library directory: ", cmd) + END END LinkMain; diff --git a/src/tools/make/configure.c b/src/tools/make/configure.c index f40adf8d..f82a5d37 100644 --- a/src/tools/make/configure.c +++ b/src/tools/make/configure.c @@ -47,14 +47,13 @@ char libspec[1024]; #define macrotostringhelper(s) #s #define macrotostring(s) macrotostringhelper(s) -char *version = macrotostring(O_VER); -char *objext = ".o"; -char *objflag = " -o "; -char *linkflags = " -L\""; -char *libext = ""; -char *oname = NULL; // From O_NAME env var if present, or O_NAME macro otherwise. - - +char *version = macrotostring(O_VER); +char *objext = ".o"; +char *objflag = " -o "; +char *linkflags = " -L\""; +char *libext = ""; +char *oname = NULL; // From O_NAME env var if present, or O_NAME macro otherwise. +char *dynext = ".so"; char *dataModel = NULL; char *compiler = NULL; char *cc = NULL; @@ -114,7 +113,7 @@ void determineOS() { else if (strncasecmp(sys.sysname, "linux", 5) == 0) {determineLinuxVariant();} else if (strncasecmp(sys.sysname, "freebsd", 5) == 0) {os = "freebsd"; bsd = 1;} else if (strncasecmp(sys.sysname, "openbsd", 5) == 0) {os = "openbsd"; bsd = 1;} - else if (strncasecmp(sys.sysname, "darwin", 5) == 0) {os = "darwin"; staticlink = "";} + else if (strncasecmp(sys.sysname, "darwin", 5) == 0) {os = "darwin"; staticlink = ""; dynext = ".dylib";} else { fprintf(stderr, "\n\n** Unrecognised utsname.sysname '%s' returned by uname().\n", sys.sysname); fprintf(stderr, "** Please add a test for this OS in src/buildtools/configure.c\n"); @@ -376,6 +375,7 @@ void writeMakeParameters() { fprintf(fd, "INSTALLDIR=%s\n", installdir); fprintf(fd, "PLATFORM=%s\n", platform); fprintf(fd, "BINEXT=%s\n", binext); + fprintf(fd, "DYNEXT=%s\n", dynext); fprintf(fd, "COMPILE=%s\n", cc); fprintf(fd, "STATICLINK=%s\n", staticlink); fclose(fd); @@ -396,6 +396,7 @@ void writeConfigurationMod() { fprintf(fd, " linkflags* = '%s';\n", linkflags); fprintf(fd, " libspec* = '%s';\n", libspec); fprintf(fd, " libext* = '%s';\n", libext); + fprintf(fd, " os* = '%s';\n", os); fprintf(fd, " compiler* = '%s';\n", compiler); fprintf(fd, " compile* = '%s';\n", cc); fprintf(fd, " installdir* = '%s';\n", installdir); diff --git a/src/tools/make/oberon.mk b/src/tools/make/oberon.mk index 4de7e18b..7f159ce8 100644 --- a/src/tools/make/oberon.mk +++ b/src/tools/make/oberon.mk @@ -386,7 +386,7 @@ library: @make -f src/tools/make/oberon.mk -s O$(MODEL)library MODEL=$(MODEL) @printf '\nMaking lib$(ONAME)-O$(MODEL) .a and .so\n' ar rcs "$(BUILDDIR)/$(MODEL)/lib$(ONAME)-O$(MODEL).a" $(BUILDDIR)/$(MODEL)/*.o - @cd $(BUILDDIR)/$(MODEL) && $(COMPILE) -shared -o lib$(ONAME)-O$(MODEL).so *.o + @cd $(BUILDDIR)/$(MODEL) && $(COMPILE) -shared -o lib$(ONAME)-O$(MODEL)$(DYNEXT) *.o