@@ -99,6 +99,8 @@ def CalculateVariables(default_variables, params):
99
99
default_variables .setdefault ("OS" , operating_system )
100
100
if flavor == "aix" :
101
101
default_variables .setdefault ("SHARED_LIB_SUFFIX" , ".a" )
102
+ elif flavor == "zos" :
103
+ default_variables .setdefault ("SHARED_LIB_SUFFIX" , ".x" )
102
104
else :
103
105
default_variables .setdefault ("SHARED_LIB_SUFFIX" , ".so" )
104
106
default_variables .setdefault ("SHARED_LIB_DIR" , "$(builddir)/lib.$(TOOLSET)" )
@@ -286,6 +288,24 @@ def CalculateGeneratorInputInfo(params):
286
288
""" # noqa: E501
287
289
288
290
291
+ LINK_COMMANDS_OS400 = """\
292
+ quiet_cmd_alink = AR($(TOOLSET)) $@
293
+ cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) -X64 crs $@ $(filter %.o,$^)
294
+
295
+ quiet_cmd_alink_thin = AR($(TOOLSET)) $@
296
+ cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) -X64 crs $@ $(filter %.o,$^)
297
+
298
+ quiet_cmd_link = LINK($(TOOLSET)) $@
299
+ cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
300
+
301
+ quiet_cmd_solink = SOLINK($(TOOLSET)) $@
302
+ cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
303
+
304
+ quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
305
+ cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
306
+ """ # noqa: E501
307
+
308
+
289
309
LINK_COMMANDS_OS390 = """\
290
310
quiet_cmd_alink = AR($(TOOLSET)) $@
291
311
cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)
@@ -297,10 +317,10 @@ def CalculateGeneratorInputInfo(params):
297
317
cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)
298
318
299
319
quiet_cmd_solink = SOLINK($(TOOLSET)) $@
300
- cmd_solink = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) -Wl,DLL
320
+ 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
301
321
302
322
quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
303
- cmd_solink_module = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) -Wl,DLL
323
+ cmd_solink_module = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
304
324
""" # noqa: E501
305
325
306
326
@@ -449,6 +469,9 @@ def CalculateGeneratorInputInfo(params):
449
469
# send stderr to /dev/null to ignore messages when linking directories.
450
470
cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp %(copy_archive_args)s "$<" "$@")
451
471
472
+ quiet_cmd_symlink = SYMLINK $@
473
+ cmd_symlink = ln -sf "$<" "$@"
474
+
452
475
%(link_commands)s
453
476
""" # noqa: E501
454
477
r"""
@@ -1030,12 +1053,20 @@ def WriteActions(
1030
1053
# libraries, but until everything is made cross-compile safe, also use
1031
1054
# target libraries.
1032
1055
# TODO(piman): when everything is cross-compile safe, remove lib.target
1033
- self .WriteLn (
1034
- "cmd_%s = LD_LIBRARY_PATH=$(builddir)/lib.host:"
1035
- "$(builddir)/lib.target:$$LD_LIBRARY_PATH; "
1036
- "export LD_LIBRARY_PATH; "
1037
- "%s%s" % (name , cd_action , command )
1038
- )
1056
+ if self .flavor == "zos" or self .flavor == "aix" :
1057
+ self .WriteLn (
1058
+ "cmd_%s = LIBPATH=$(builddir)/lib.host:"
1059
+ "$(builddir)/lib.target:$$LIBPATH; "
1060
+ "export LIBPATH; "
1061
+ "%s%s" % (name , cd_action , command )
1062
+ )
1063
+ else :
1064
+ self .WriteLn (
1065
+ "cmd_%s = LD_LIBRARY_PATH=$(builddir)/lib.host:"
1066
+ "$(builddir)/lib.target:$$LD_LIBRARY_PATH; "
1067
+ "export LD_LIBRARY_PATH; "
1068
+ "%s%s" % (name , cd_action , command )
1069
+ )
1039
1070
self .WriteLn ()
1040
1071
outputs = [self .Absolutify (o ) for o in outputs ]
1041
1072
# The makefile rules are all relative to the top dir, but the gyp actions
@@ -1529,6 +1560,8 @@ def ComputeOutputBasename(self, spec):
1529
1560
target_prefix = "lib"
1530
1561
if self .flavor == "aix" :
1531
1562
target_ext = ".a"
1563
+ elif self .flavor == "zos" :
1564
+ target_ext = ".x"
1532
1565
else :
1533
1566
target_ext = ".so"
1534
1567
elif self .type == "none" :
@@ -1609,6 +1642,14 @@ def ComputeDeps(self, spec):
1609
1642
# link_deps.extend(spec.get('libraries', []))
1610
1643
return (gyp .common .uniquer (deps ), gyp .common .uniquer (link_deps ))
1611
1644
1645
+ def GetSharedObjectFromSidedeck (self , sidedeck ):
1646
+ """Return the shared object files based on sidedeck"""
1647
+ return re .sub (r"\.x$" , ".so" , sidedeck )
1648
+
1649
+ def GetUnversionedSidedeckFromSidedeck (self , sidedeck ):
1650
+ """Return the shared object files based on sidedeck"""
1651
+ return re .sub (r"\.\d+\.x$" , ".x" , sidedeck )
1652
+
1612
1653
def WriteDependencyOnExtraOutputs (self , target , extra_outputs ):
1613
1654
self .WriteMakeRule (
1614
1655
[self .output_binary ],
@@ -1861,6 +1902,11 @@ def WriteTarget(
1861
1902
part_of_all ,
1862
1903
postbuilds = postbuilds ,
1863
1904
)
1905
+ # z/OS has a .so target as well as a sidedeck .x target
1906
+ if self .flavor == "zos" :
1907
+ self .WriteLn ('%s: %s' % (
1908
+ QuoteSpaces (self .GetSharedObjectFromSidedeck (self .output_binary )),
1909
+ QuoteSpaces (self .output_binary )))
1864
1910
elif self .type == "loadable_module" :
1865
1911
for link_dep in link_deps :
1866
1912
assert " " not in link_dep , (
@@ -1918,7 +1964,9 @@ def WriteTarget(
1918
1964
else :
1919
1965
file_desc = "executable"
1920
1966
install_path = self ._InstallableTargetInstallPath ()
1921
- installable_deps = [self .output ]
1967
+ installable_deps = []
1968
+ if self .flavor != "zos" :
1969
+ installable_deps .append (self .output )
1922
1970
if (
1923
1971
self .flavor == "mac"
1924
1972
and "product_dir" not in spec
@@ -1943,15 +1991,42 @@ def WriteTarget(
1943
1991
comment = "Copy this to the %s output path." % file_desc ,
1944
1992
part_of_all = part_of_all ,
1945
1993
)
1946
- installable_deps .append (install_path )
1994
+ if self .flavor != "zos" :
1995
+ installable_deps .append (install_path )
1996
+ if self .flavor == 'zos' and self .type == 'shared_library' :
1997
+ # lib.target/libnode.so has a dependency on $(obj).target/libnode.so
1998
+ self .WriteDoCmd ([self .GetSharedObjectFromSidedeck (install_path )],
1999
+ [self .GetSharedObjectFromSidedeck (self .output )], 'copy' ,
2000
+ comment = 'Copy this to the %s output path.' %
2001
+ file_desc , part_of_all = part_of_all )
2002
+ # Create a symlink of libnode.x to libnode.version.x
2003
+ self .WriteDoCmd ([self .GetUnversionedSidedeckFromSidedeck (install_path )],
2004
+ [install_path ], 'symlink' ,
2005
+ comment = 'Symlnk this to the %s output path.' %
2006
+ file_desc , part_of_all = part_of_all )
2007
+ # Place libnode.version.so and libnode.x symlink in lib.target dir
2008
+ installable_deps .append (self .GetSharedObjectFromSidedeck (install_path ))
2009
+ installable_deps .append (
2010
+ self .GetUnversionedSidedeckFromSidedeck (install_path ))
1947
2011
if self .output != self .alias and self .alias != self .target :
1948
2012
self .WriteMakeRule (
1949
2013
[self .alias ],
1950
2014
installable_deps ,
1951
2015
comment = "Short alias for building this %s." % file_desc ,
1952
2016
phony = True ,
1953
2017
)
1954
- if part_of_all :
2018
+ if self .flavor == 'zos' and self .type == 'shared_library' :
2019
+ # Make sure that .x symlink target is run
2020
+ self .WriteMakeRule (
2021
+ ['all' ],
2022
+ [
2023
+ self .GetUnversionedSidedeckFromSidedeck (install_path ),
2024
+ self .GetSharedObjectFromSidedeck (install_path )
2025
+ ],
2026
+ comment = 'Add %s to "all" target.' % file_desc ,
2027
+ phony = True ,
2028
+ )
2029
+ elif part_of_all :
1955
2030
self .WriteMakeRule (
1956
2031
["all" ],
1957
2032
[install_path ],
@@ -2247,6 +2322,9 @@ def _InstallableTargetInstallPath(self):
2247
2322
# # Install all shared libs into a common directory (per toolset) for
2248
2323
# # convenient access with LD_LIBRARY_PATH.
2249
2324
# return "$(builddir)/lib.%s/%s" % (self.toolset, self.alias)
2325
+ if self .flavor == "zos" and self .type == "shared_library" :
2326
+ return "$(builddir)/lib.%s/%s" % (self .toolset , self .alias )
2327
+
2250
2328
return "$(builddir)/" + self .alias
2251
2329
2252
2330
@@ -2414,6 +2492,16 @@ def CalculateMakefilePath(build_file, base_name):
2414
2492
"flock_index" : 2 ,
2415
2493
}
2416
2494
)
2495
+ elif flavor == "os400" :
2496
+ copy_archive_arguments = "-pPRf"
2497
+ header_params .update (
2498
+ {
2499
+ "copy_archive_args" : copy_archive_arguments ,
2500
+ "link_commands" : LINK_COMMANDS_OS400 ,
2501
+ "flock" : "./gyp-flock-tool flock" ,
2502
+ "flock_index" : 2 ,
2503
+ }
2504
+ )
2417
2505
2418
2506
build_file , _ , _ = gyp .common .ParseQualifiedTarget (target_list [0 ])
2419
2507
make_global_settings_array = data [build_file ].get ("make_global_settings" , [])
0 commit comments