gyp: specialize node.d for freebsd
authorFedor Indutny <fedor.indutny@gmail.com>
Thu, 20 Feb 2014 16:52:26 +0000 (20:52 +0400)
committerFedor Indutny <fedor.indutny@gmail.com>
Thu, 20 Feb 2014 20:46:26 +0000 (00:46 +0400)
`node.d` should use `psinfo.d` instead of `procfs.d` and have statically
defined architecture on FreeBSD.

node.gyp
tools/install.py
tools/specialize_node_d.py [new file with mode: 0755]

index 28714b3..c24c230 100644 (file)
--- a/node.gyp
+++ b/node.gyp
         }],
         [ '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
                   ]
                 } ],
               ]
-            }
+            },
           ]
         } ],
       ]
+    },
+    {
+      '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
 }
index 7249de3..f51d95a 100755 (executable)
@@ -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 (executable)
index 0000000..0ee505a
--- /dev/null
@@ -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);