Haxe Code Cookbook
Haxe programming cookbookCompilationCompiling libraries without main class

Compiling libraries without main class

Reading time: 1.5 minute

In most cases, you want a Main class with a static main function as entry point to start your program. However, there are cases where there is no need for this - for example if you are writing a library that other programs will be using.

Here's how you can compile your code without having a Main class and a static entry main function:

Create your library class(es)

Let's create an library class called BarLib placed in a foo package:

 package foo; class BarLib {  public function new() {}  public function test() {  return "Hello from BarLib!";  } } 

Create a build.hxml without -main

Now, we can create a build.hxml without specifying the Main class -main Main the way we usually do. Instead we add the classes that we want to include, one per row, using the full class name including package path:

 -cp src  # add the class(es) that you want to include the following way, one per line foo.BarLib # <- Include the class foo.BarLib -js bin/lib.js # <- Compile the library, in this case to JavaScript 

Compile the library

Now, you can compile your library with > haxe build.hxml.

If you compile to JavaScript, the result will be the following:

 (function (console) { "use strict"; var foo_BarLib = function() { }; foo_BarLib.prototype = {  test: function() {  return "Hello from BarLib";  } }; })(typeof console != "undefined" ? console : {log:function(){}}); 

You can include more than one package/class if needed in the build.hxml:

 -cp src  foo.BarLib # include class foo.BarLib buz.qux.Norf # include class buz.qux.Norf Config # include class Config ... 

Caution with dead code elimination

Dead code elimination is a great Haxe compiler feature that lets the compiler remove code that isn't used by the program. In this case, when dealing with libraries, this might cause unwanted results: If you compile the examples above with full dead code elimination (using the compilation flag -dce full), all your library code will be stripped away! To avoid a class being stripped away like this, use the metadata @:keep before the class definition:

 package foo; @:keep // <-- Avoid dead code elimination stripping this class away  class BarLib {  public function new() {}  public function test() {  return "Hello from BarLib!";  } } 

Note: This works (as you would expect) the same for all Haxe targets.

Exposing Haxe classes for JavaScript

If you are writing libraries for JavaScript, you might want to use the @:expose metadata to make your code available in the global namespace. You can read more about that in the Haxe manual or in this snippet.


Contributors:
Last modified:
Created:
Category:  Compilation