How can I conditionally compile code for emscripten?

This is my current solution:

  • I have a linux Makefile with the usual target, it links a previously generated static library and outputs an executable.

  • The code acts upon the WEB define with ifdefs.

  • The Makefile for the library acts upon the TARGET enviroment variable for the platform specific sources:

    ifeq ($(TARGET),WEB)
        MODULES = RenderingEngine2.o RenderingEngine1.o WebApp.o main.o
    else
        MODULES = RenderingEngine2.o RenderingEngine1.o LinuxApp.o main.o
    endif
  • Along the Makefile there is a bash script called emscripten.sh with the following content:
    #!/bin/bash

    make TARGET="WEB" CXX="em++ -DWEB" AR="emar" modules
    make TARGET="WEB" CXX="em++ -DWEB" AR="emar"
    emcc --preload-file assets -o bin/helloArrow.html bin/helloArrow bin/lib.o
    firefox bin/helloArrow.html
  • Compile and execute with ./emscripten.sh

NOTE: emscripten doesn't seem to like .a extension in static libraries so name you library with .o extension.


#ifdef EMSCRIPTEN is the prefered way AFAIK.

Before cluttering your source code with #ifdefs, think about whether it would not make more sense to have certain platform dependent files and let the build tool do the work.

Also, emscripten already defines LINUX, because it handles very much like a Linux system. Normally this behavior already fixes most of the need for platform handling.


According to Detecting Emscripten in preprocessor, the correct define to use is __EMSCRIPTEN__.

In October 2016, a strict build mode was introduced which, when enabled, removes the EMSCRIPTEN define. Therefore it is not recommended to use EMSCRIPTEN even though it still works in non-strict build mode.