@@ -99,6 +99,8 @@ def CalculateVariables(default_variables, params):
9999 default_variables .setdefault ("OS" , operating_system )
100100 if flavor == "aix" :
101101 default_variables .setdefault ("SHARED_LIB_SUFFIX" , ".a" )
102+ elif flavor == "zos" :
103+ default_variables .setdefault ("SHARED_LIB_SUFFIX" , ".x" )
102104 else :
103105 default_variables .setdefault ("SHARED_LIB_SUFFIX" , ".so" )
104106 default_variables .setdefault ("SHARED_LIB_DIR" , "$(builddir)/lib.$(TOOLSET)" )
@@ -237,6 +239,24 @@ def CalculateGeneratorInputInfo(params):
237239""" # noqa: E501
238240
239241
242+ LINK_COMMANDS_OS400 = """\
243+ quiet_cmd_alink = AR($(TOOLSET)) $@
244+ cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) -X64 crs $@ $(filter %.o,$^)
245+
246+ quiet_cmd_alink_thin = AR($(TOOLSET)) $@
247+ cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) -X64 crs $@ $(filter %.o,$^)
248+
249+ quiet_cmd_link = LINK($(TOOLSET)) $@
250+ cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
251+
252+ quiet_cmd_solink = SOLINK($(TOOLSET)) $@
253+ cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
254+
255+ quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
256+ cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
257+ """ # noqa: E501
258+
259+
240260LINK_COMMANDS_OS390 = """\
241261 quiet_cmd_alink = AR($(TOOLSET)) $@
242262cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)
@@ -248,10 +268,10 @@ def CalculateGeneratorInputInfo(params):
248268cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
249269
250270quiet_cmd_solink = SOLINK($(TOOLSET)) $@
251- cmd_solink = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) -Wl,DLL
271+ cmd_solink = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,DLL - o $(patsubst %.x,%.so,$@) $(LD_INPUTS) $(LIBS) && if [ -f $(notdir $@) ]; then /bin/cp $(notdir $@) $@; else true; fi
252272
253273quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
254- cmd_solink_module = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) -Wl,DLL
274+ cmd_solink_module = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
255275""" # noqa: E501
256276
257277
@@ -400,6 +420,9 @@ def CalculateGeneratorInputInfo(params):
400420# send stderr to /dev/null to ignore messages when linking directories.
401421cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp %(copy_archive_args)s "$<" "$@")
402422
423+ quiet_cmd_symlink = SYMLINK $@
424+ cmd_symlink = ln -sf "$<" "$@"
425+
403426%(link_commands)s
404427""" # noqa: E501
405428 r"""
@@ -981,12 +1004,20 @@ def WriteActions(
9811004 # libraries, but until everything is made cross-compile safe, also use
9821005 # target libraries.
9831006 # TODO(piman): when everything is cross-compile safe, remove lib.target
984- self .WriteLn (
985- "cmd_%s = LD_LIBRARY_PATH=$(builddir)/lib.host:"
986- "$(builddir)/lib.target:$$LD_LIBRARY_PATH; "
987- "export LD_LIBRARY_PATH; "
988- "%s%s" % (name , cd_action , command )
989- )
1007+ if self .flavor == "zos" or self .flavor == "aix" :
1008+ self .WriteLn (
1009+ "cmd_%s = LIBPATH=$(builddir)/lib.host:"
1010+ "$(builddir)/lib.target:$$LIBPATH; "
1011+ "export LIBPATH; "
1012+ "%s%s" % (name , cd_action , command )
1013+ )
1014+ else :
1015+ self .WriteLn (
1016+ "cmd_%s = LD_LIBRARY_PATH=$(builddir)/lib.host:"
1017+ "$(builddir)/lib.target:$$LD_LIBRARY_PATH; "
1018+ "export LD_LIBRARY_PATH; "
1019+ "%s%s" % (name , cd_action , command )
1020+ )
9901021 self .WriteLn ()
9911022 outputs = [self .Absolutify (o ) for o in outputs ]
9921023 # The makefile rules are all relative to the top dir, but the gyp actions
@@ -1480,6 +1511,8 @@ def ComputeOutputBasename(self, spec):
14801511 target_prefix = "lib"
14811512 if self .flavor == "aix" :
14821513 target_ext = ".a"
1514+ elif self .flavor == "zos" :
1515+ target_ext = ".x"
14831516 else :
14841517 target_ext = ".so"
14851518 elif self .type == "none" :
@@ -1560,6 +1593,14 @@ def ComputeDeps(self, spec):
15601593 # link_deps.extend(spec.get('libraries', []))
15611594 return (gyp .common .uniquer (deps ), gyp .common .uniquer (link_deps ))
15621595
1596+ def GetSharedObjectFromSidedeck (self , sidedeck ):
1597+ """Return the shared object files based on sidedeck"""
1598+ return re .sub (r"\.x$" , ".so" , sidedeck )
1599+
1600+ def GetUnversionedSidedeckFromSidedeck (self , sidedeck ):
1601+ """Return the shared object files based on sidedeck"""
1602+ return re .sub (r"\.\d+\.x$" , ".x" , sidedeck )
1603+
15631604 def WriteDependencyOnExtraOutputs (self , target , extra_outputs ):
15641605 self .WriteMakeRule (
15651606 [self .output_binary ],
@@ -1798,6 +1839,11 @@ def WriteTarget(
17981839 part_of_all ,
17991840 postbuilds = postbuilds ,
18001841 )
1842+ # z/OS has a .so target as well as a sidedeck .x target
1843+ if self .flavor == "zos" :
1844+ self .WriteLn ('%s: %s' % (
1845+ QuoteSpaces (self .GetSharedObjectFromSidedeck (self .output_binary )),
1846+ QuoteSpaces (self .output_binary )))
18011847 elif self .type == "loadable_module" :
18021848 for link_dep in link_deps :
18031849 assert " " not in link_dep , (
@@ -1855,7 +1901,9 @@ def WriteTarget(
18551901 else :
18561902 file_desc = "executable"
18571903 install_path = self ._InstallableTargetInstallPath ()
1858- installable_deps = [self .output ]
1904+ installable_deps = []
1905+ if self .flavor != "zos" :
1906+ installable_deps .append (self .output )
18591907 if (
18601908 self .flavor == "mac"
18611909 and "product_dir" not in spec
@@ -1880,15 +1928,42 @@ def WriteTarget(
18801928 comment = "Copy this to the %s output path." % file_desc ,
18811929 part_of_all = part_of_all ,
18821930 )
1883- installable_deps .append (install_path )
1931+ if self .flavor != "zos" :
1932+ installable_deps .append (install_path )
1933+ if self .flavor == 'zos' and self .type == 'shared_library' :
1934+ # lib.target/libnode.so has a dependency on $(obj).target/libnode.so
1935+ self .WriteDoCmd ([self .GetSharedObjectFromSidedeck (install_path )],
1936+ [self .GetSharedObjectFromSidedeck (self .output )], 'copy' ,
1937+ comment = 'Copy this to the %s output path.' %
1938+ file_desc , part_of_all = part_of_all )
1939+ # Create a symlink of libnode.x to libnode.version.x
1940+ self .WriteDoCmd ([self .GetUnversionedSidedeckFromSidedeck (install_path )],
1941+ [install_path ], 'symlink' ,
1942+ comment = 'Symlnk this to the %s output path.' %
1943+ file_desc , part_of_all = part_of_all )
1944+ # Place libnode.version.so and libnode.x symlink in lib.target dir
1945+ installable_deps .append (self .GetSharedObjectFromSidedeck (install_path ))
1946+ installable_deps .append (
1947+ self .GetUnversionedSidedeckFromSidedeck (install_path ))
18841948 if self .output != self .alias and self .alias != self .target :
18851949 self .WriteMakeRule (
18861950 [self .alias ],
18871951 installable_deps ,
18881952 comment = "Short alias for building this %s." % file_desc ,
18891953 phony = True ,
18901954 )
1891- if part_of_all :
1955+ if self .flavor == 'zos' and self .type == 'shared_library' :
1956+ # Make sure that .x symlink target is run
1957+ self .WriteMakeRule (
1958+ ['all' ],
1959+ [
1960+ self .GetUnversionedSidedeckFromSidedeck (install_path ),
1961+ self .GetSharedObjectFromSidedeck (install_path )
1962+ ],
1963+ comment = 'Add %s to "all" target.' % file_desc ,
1964+ phony = True ,
1965+ )
1966+ elif part_of_all :
18921967 self .WriteMakeRule (
18931968 ["all" ],
18941969 [install_path ],
@@ -2184,6 +2259,9 @@ def _InstallableTargetInstallPath(self):
21842259 # # Install all shared libs into a common directory (per toolset) for
21852260 # # convenient access with LD_LIBRARY_PATH.
21862261 # return "$(builddir)/lib.%s/%s" % (self.toolset, self.alias)
2262+ if self .flavor == "zos" and self .type == "shared_library" :
2263+ return "$(builddir)/lib.%s/%s" % (self .toolset , self .alias )
2264+
21872265 return "$(builddir)/" + self .alias
21882266
21892267
@@ -2351,6 +2429,16 @@ def CalculateMakefilePath(build_file, base_name):
23512429 "flock_index" : 2 ,
23522430 }
23532431 )
2432+ elif flavor == "os400" :
2433+ copy_archive_arguments = "-pPRf"
2434+ header_params .update (
2435+ {
2436+ "copy_archive_args" : copy_archive_arguments ,
2437+ "link_commands" : LINK_COMMANDS_OS400 ,
2438+ "flock" : "./gyp-flock-tool flock" ,
2439+ "flock_index" : 2 ,
2440+ }
2441+ )
23542442
23552443 build_file , _ , _ = gyp .common .ParseQualifiedTarget (target_list [0 ])
23562444 make_global_settings_array = data [build_file ].get ("make_global_settings" , [])
0 commit comments