Hey hey!

I just did some reeeeally cool find-out that I am really happy about - and 
since, I want to share that too! :3

Caution: Make sure you have your toolchai  (Xcode, gcc, MSYS, …) ready to use 
and a copy of the latest nodejs source code. I myself am using v0.10.24.

Okay, let’s go.


1. Your module or addon needs preparation.
Usual JS modules will work nicely, but…you need to make sure that you dont use 
too many modules. The ultra-basic require you will be having does not have all 
the functions you may expect. The in-binary require function seems to only look 
up actual filenames. In example, using require(„myFile“) will result in an 
internal lookup for myFile.js . Therefore, make sure your JS module is not 
using path-wise lookups - and especially, no subfolders. Subfolders simply dont 
exist in memory ;)

If you have a native addon, then you need to change your entry-code’s 
NODE_MODULE declaration. If it looked like this before:

        NODE_MODULE(ph7, InitAll)

Then you now need to make it look like this:

        NODE_MODULE(node_ph7, InitAll)
 
You’re best off by creating a copy of your module entirely, so you aren’t 
modifying your working copies.


2. Telling GYP about the new files
Open node.gyp in a text editor, and locate the section named library_files. 
This is a long JSON array, and at the bottom, add your module files. I 
recommend creating a new folder called extra/ and placing your stuff inside 
there. And very importantly, you need to add a very special file to the list:

      'lib/_third_party_main.js',

This file will be called instead of nodejs’ main() function. As it does not 
exist, you may comment out this entry for now - but we’ll need it later. I have 
NOT tested this without this file - for now, I am just assuming you want your 
script to run always when the binary is launched, and want to pull the several 
moduels form within the binary itself.
After you filled this array, it’s time you fill up the native addon array - 
that is, if you have one. In my case, I do. So, to do so, locate sources, and 
add your sources at the bottom. If your souces need a custom include path, then 
you also need to edit include_dirs.


3. Telling the node-code to use your native addon (Not required if you dont use 
one)
If you use a native addon, you must edit just one single file: 
src/node_extensions.h . The way it needs to be done should be ultra-obvious. 
But maybe I should explain anyway: This file contains a list of all the 
„internal extensions“. You may recognize, that all of them are prefixed with 
node_. That is a prefix to mark it as internal - and which is why I told you to 
change your native addon’s NODE_MODULE call too. So in that list, add your 
addon just like any other - save, exit.

4. Building.
Now, after you added your sources, library_files, include_dirs and the like, 
you should have a nice GYP file. So, return to the nodejs source tree’s root, 
and run ./configure
Now you can use whatever you want to. In my case, i used —ninja, and then 
typed: ninja -C out/Release
Once you finished building, locate the new binary. If building and running 
seems okay, then it’s time to do some really cool things!

5. Implentation time!
Before, I was telling you about _third_party_main.js. Now, this doesnt really 
exist so far. So what we now do, is create it. You may have commented it out 
previously (by putting a hashtag infront of it, like all the cool twitter kids 
do :p), but you may now uncomment it in node.gyp. Then, type: touch 
lib/_third_party_main.js
Now you can open that file - and edit it.
Note: Please consider the following:
        - require() only looks up the filenames inside the binary - but no 
folders, or subfolders, or the like. This is a semi-low-level JS you are doing 
here. You can still interact with files and everything else like normal, but 
require acts a bit different than usual.
        - To link against your native addon, use process.binding(). I,e,: var 
ph7 = process.binding(„ph7“);
        The name you have to give in, is the same as the one in NODE_MODULE, 
just without the node_ prefix.
Once you are done, rebuild and test.

DONE :D

Again, this is more an experiment and soemthing i JUST learned. But I saw 
projects such as nexe - and i just felt like sharing what I figured out - it 
could be useful to them. If we can programaticaly edit node.gyp and 
node_extensions.h, then we actually can patch a source tree in order to allow 
„native modules“. I am still testing this thing myself, but it surely is 
something quite interesting. I also haven’t seen process.binding within the API 
docs or the like. I had to read it off lib/os.js :p

Have fun with that lil thing! :D

Kind regards, Ingwie.

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to