diff --git a/node.gyp b/node.gyp index 28714b3f7b..c24c230b65 100644 --- a/node.gyp +++ b/node.gyp @@ -159,8 +159,12 @@ }], [ 'node_use_dtrace=="true"', { 'defines': [ 'HAVE_DTRACE=1' ], - 'dependencies': [ 'node_dtrace_header' ], + 'dependencies': [ + 'node_dtrace_header', + 'specialize_node_d', + ], 'include_dirs': [ '<(SHARED_INTERMEDIATE_DIR)' ], + # # DTrace is supported on solaris, mac, and bsd. There are three # object files associated with DTrace support, but they're not all @@ -482,10 +486,36 @@ ] } ], ] - } + }, ] } ], ] + }, + { + 'target_name': 'specialize_node_d', + 'type': 'none', + 'conditions': [ + [ 'node_use_dtrace=="true"', { + 'actions': [ + { + 'action_name': 'specialize_node_d', + 'inputs': [ + 'src/node.d' + ], + 'outputs': [ + '<(PRODUCT_DIR)/node.d', + ], + 'action': [ + 'tools/specialize_node_d.py', + '<@(_outputs)', + '<@(_inputs)', + '<@(OS)', + '<@(target_arch)', + ], + }, + ], + } ], + ] } ] # end targets } diff --git a/tools/install.py b/tools/install.py index 7249de36e9..f51d95a129 100755 --- a/tools/install.py +++ b/tools/install.py @@ -132,7 +132,7 @@ def files(action): # install unconditionally, checking if the platform supports dtrace doesn't # work when cross-compiling and besides, there's at least one linux flavor # with dtrace support now (oracle's "unbreakable" linux) - action(['src/node.d'], 'lib/dtrace/') + action(['out/Release/node.d'], 'lib/dtrace/node.d') if 'freebsd' in sys.platform or 'openbsd' in sys.platform: action(['doc/node.1'], 'man/man1/') diff --git a/tools/specialize_node_d.py b/tools/specialize_node_d.py new file mode 100755 index 0000000000..0ee505ae91 --- /dev/null +++ b/tools/specialize_node_d.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +# +# specialize_node_d.py output_file src/node.d flavor arch +# +# Specialize node.d for given flavor (`freebsd`) and arch (`x64` or `ia32`) +# + +import re +import subprocess +import sys +import errno + +if len(sys.argv) != 5: + print "usage: specialize_node_d.py outfile src/node.d flavor arch" + sys.exit(2); + +outfile = file(sys.argv[1], 'w'); +infile = file(sys.argv[2], 'r'); +flavor = sys.argv[3]; +arch = sys.argv[4]; + +model = r'curpsinfo->pr_dmodel == PR_MODEL_ILP32' + +for line in infile: + if flavor == 'freebsd': + line = re.sub('procfs.d', 'psinfo.d', line); + if arch == 'x64': + line = re.sub(model, '0', line); + else: + line = re.sub(model, '1', line); + outfile.write(line);