Skip to content

Instantly share code, notes, and snippets.

@kLabz
Forked from Yanrishatum/hlc.md
Created October 21, 2020 13:17
Show Gist options
  • Save kLabz/65571374afb9cbd5b805b4256cde4565 to your computer and use it in GitHub Desktop.
Save kLabz/65571374afb9cbd5b805b4256cde4565 to your computer and use it in GitHub Desktop.
How to compile HL/C

How to compile HL/C

Prepwork/terms

Because I have no trust in people.

  • <hashlink> points to your installation of Hashlink, e.g. folder in which hl.exe (or Unix executable) is, alongside with library binaries (.hdll files), and include folder.
  • <src> points to the folder containing generated HL/C sources. One that contains hlc.json file.
  • <app> refers to your output executable name, including extension.
  • <main> refers to your entry-point file name, including extension (see below).
  • I provide example of doing it on Windows via MSVC cl.exe, but Unix should be more or less same with replacement of argument flags and compiler.
  • I expect that you DO have a compiler installed and can call cl.exe or other compiler from command-line.
  • As far as I'm aware - static linking of libraries not possible atm.
  • hlc.json contains information you need in order to compile the sources. It's contents are referenced as <hlc.*>. <hlc.libs> for example.
    • version tells what format version this hlc.json is. Instructions are based on version 4000, but should work on newer ones if they are to follow.
    • libs array contains the list of referenced hdll libraries.
    • defines provide defines used during compilation, and can be safely ignored.
    • files array contains all generated files, with first file always being the entry-point.
  • std library as a file is libhl.dll, not std.hdll.
  • Some libraries need you to copy dependency files alongside the hdll file.
    • sdl -> SDL2.dll
    • openal -> OpenAL32.dll
  • If you are using any external hdll libraries - find them in respective library locations.

Generating HLC

First of all, to generate HLC sources instead of HL bytecode you just replace -hl command extension from .hl to .c. That name also will be your entry-point file name. And be sure to use subfolder (-hl hlc/game.c), because you don't want to pollute your root with .c output ;)

MSVC

General template

cl.exe /Ox /Fe <app> -I "<hashlink>\include" -I "<src>" "<src>\<main>" "<hashlink>\libhl.lib" ...libs

Meaning

  • /Fe <app>: Output to an executable, for example /Fe game.exe would produce a game.exe executable in cwd.
  • -I "<hashlink>\include": Includes hashlink headers, as they are mandatory in order to compile.
  • -I "<src>": Includes source files.
  • "<src>\<main>": Specifies entry-point.
  • Libraries: Here you should link all libraries that are listed in <hlc.libs>. At the very least it's libhl.lib, but in case of Heaps - it expands to at least fmt.lib, ui.lib, openal.lib, and sdl.lib or directx.lib.
  • /Ox is optional optimization flag.

Command sample

cl.exe /Ox /Fe app.exe -I "%hashlink%\include" -I "hlc" "hlc\app.c" "%hashlink%\ssl.lib" "%hashlink%\directx.lib" "%hashlink%\openal.lib" "%hashlink%\fmt.lib" "%hashlink%\libhl.lib"

Notes

Make sure you're running 64-bit MSVC on newer Hashlink, because it defaults to 32-bit if you're running MSVC dev shell.

GCC

Note: This is untested. Ping me in discord if there are errors or if it worked for you.

General template

gcc -O3 -o <app> -std=c11 -I <src> <src>/<main> -lhl /usr/local/lib/libhl.so ...libs

Meaning

  • -o <app>: Output to an executable.
  • -std=c11: Some mandatory GCC stuff. ;)
  • -I <src>: Includes source files.
  • <src>/<main>: Specified entry-point.
  • -lhl: Includes hashlink includes via -l flag. Alternatively should work with -I <hashlink>/include.
  • Libraries: See above. Note that for unix systems it should be .hdll / .so instead of .lib, depending on which library you refer to. Also if you can't be assed: Include all hdlls possible, see below.
  • -O3 is optional optimization flag.

Command sample

gcc -O3 -o app -std=c11 -I out hlc/app.c -lhl /usr/local/lib/*.hdll

Bundling

To get your compilation portable, you should not forget to copy over all linked .hdll files near executable, as well as libhl and all dependency libraries (sdl/openal).

??????

Profit!

That's it. Really. There's nothing more to it.

Ma, I can't get assed to do this shit!

Well, I don't give a damn. Sucks to be you I guess. ¯\_(ツ)_/¯

Aka alternative approaches.

Windows visual studio template

haxelib install hashlink # Install HL support library.
haxelib run hashlink build <src> -D hlgen.makefile=vs2015 # Generate template

Then just open your vs project file and compile.

Bundle Hashlink with the game

  • Route A: Rename your .hl to hlboot.dat and run hl.exe (Afaik, DeadCells used this before switching to precompiled HLC)
  • Route B: Use cmd file that just does hl game.hl (I use that approach for development builds internally)
@mangoducksparkles
Copy link

This is what worked for me with gcc on linux:

gcc -o <app> <src>/<main> -I<src> /usr/local/lib/*.hdll -lhl -lSDL2 -lm -lopenal -lGL

/usr/local/lib/*.hdll is where all the hdll files are kept because I built and installed hashlink from source.

I figured this out thanks to: HaxeFoundation/hashlink#124

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment