Because I have no trust in people.
<hashlink>
points to your installation of Hashlink, e.g. folder in whichhl.exe
(or Unix executable) is, alongside with library binaries (.hdll
files), andinclude
folder.<src>
points to the folder containing generated HL/C sources. One that containshlc.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 thishlc.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 islibhl.dll
, notstd.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.
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 ;)
cl.exe /Ox /Fe <app> -I "<hashlink>\include" -I "<src>" "<src>\<main>" "<hashlink>\libhl.lib" ...libs
/Fe <app>
: Output to an executable, for example/Fe game.exe
would produce agame.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'slibhl.lib
, but in case of Heaps - it expands to at leastfmt.lib
,ui.lib
,openal.lib
, andsdl.lib
ordirectx.lib
. /Ox
is optional optimization flag.
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"
Make sure you're running 64-bit MSVC on newer Hashlink, because it defaults to 32-bit if you're running MSVC dev shell.
Note: This is untested. Ping me in discord if there are errors or if it worked for you.
gcc -O3 -o <app> -std=c11 -I <src> <src>/<main> -lhl /usr/local/lib/libhl.so ...libs
-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.
gcc -O3 -o app -std=c11 -I out hlc/app.c -lhl /usr/local/lib/*.hdll
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).
That's it. Really. There's nothing more to it.
Well, I don't give a damn. Sucks to be you I guess. ¯\_(ツ)_/¯
Aka alternative approaches.
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.
- Route A: Rename your .hl to
hlboot.dat
and runhl.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)
This is what worked for me with gcc on linux:
/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