summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2019-11-27 11:28:44 -0800
committerGitHub <noreply@github.com>2019-11-27 11:28:44 -0800
commit8c97dc61a713768d7f8302ec3a695c1207ce7239 (patch)
tree36ce18de2526ad36acd6bc8542b6ae7c5c850d9d
parent132d81eca7f9b07520ce17f69ea348bfb4dbc8e8 (diff)
downloadbinaryen-8c97dc61a713768d7f8302ec3a695c1207ce7239.tar.gz
binaryen-8c97dc61a713768d7f8302ec3a695c1207ce7239.tar.bz2
binaryen-8c97dc61a713768d7f8302ec3a695c1207ce7239.zip
Use CMake to build binaryen.js (#2464)
Fixes #2453 As a bonus this also provides a port of wasm-opt etc. with NODERAWFS and everything seems to work, that is, you can run stuff like nodejs wasm-opt.js input.wasm --metrics
-rw-r--r--CMakeLists.txt53
-rwxr-xr-xbuild-js.sh187
-rwxr-xr-xtravis-emcc-tests.sh5
3 files changed, 49 insertions, 196 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c641570a9..36b9e0750 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -161,10 +161,27 @@ ELSE()
ENDIF()
ADD_DEBUG_COMPILE_FLAG("-O0")
ADD_DEBUG_COMPILE_FLAG("-g3")
- ADD_NONDEBUG_COMPILE_FLAG("-O2")
+ IF (EMSCRIPTEN)
+ # really focus on minimizing output size when compiling sources
+ ADD_NONDEBUG_COMPILE_FLAG("-Oz")
+ ELSE()
+ ADD_NONDEBUG_COMPILE_FLAG("-O2")
+ ENDIF()
ADD_NONDEBUG_COMPILE_FLAG("-UNDEBUG") # Keep asserts.
ENDIF()
+IF (EMSCRIPTEN)
+ # link with -O3 for metadce and other powerful optimizations. note that we
+ # must use add_link_options so that this appears after CMake's default -O2
+ add_link_options("-O3")
+ ADD_LINK_FLAG("-s SINGLE_FILE")
+ ADD_LINK_FLAG("-s ALLOW_MEMORY_GROWTH=1")
+ ADD_COMPILE_FLAG("-s DISABLE_EXCEPTION_CATCHING=0")
+ ADD_LINK_FLAG("-s DISABLE_EXCEPTION_CATCHING=0")
+ # make the tools immediately usable on Node.js
+ ADD_LINK_FLAG("-s NODERAWFS")
+ENDIF()
+
# clang doesn't print colored diagnostics when invoked from Ninja
IF (UNIX AND
CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND
@@ -196,7 +213,6 @@ SET(binaryen_objs
# Sources.
-
SET(binaryen_SOURCES
src/binaryen-c.cpp
)
@@ -212,12 +228,6 @@ INSTALL(TARGETS binaryen DESTINATION ${CMAKE_INSTALL_LIBDIR})
INSTALL(FILES src/binaryen-c.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
-# if binaryen.js was built (using "./build-js.sh", currently
-# optional), install it
-IF(EXISTS "${PROJECT_SOURCE_DIR}/out/binaryen.js")
- INSTALL(FILES out/binaryen.js DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME})
-ENDIF()
-
SET(wasm-shell_SOURCES
src/tools/wasm-shell.cpp
)
@@ -308,6 +318,33 @@ SET_PROPERTY(TARGET wasm-reduce PROPERTY CXX_STANDARD 14)
SET_PROPERTY(TARGET wasm-reduce PROPERTY CXX_STANDARD_REQUIRED ON)
INSTALL(TARGETS wasm-reduce DESTINATION ${CMAKE_INSTALL_BINDIR})
+# binaryen.js
+#
+# Note that we can't emit binaryen.js directly, as there is libbinaryen already
+# declared earlier, so we create binaryen_js.js, which must then be copied.
+IF (EMSCRIPTEN)
+ SET(binaryen_js_SOURCES
+ src/binaryen-c.cpp
+ )
+ ADD_EXECUTABLE(binaryen_js
+ ${binaryen_js_SOURCES})
+ TARGET_LINK_LIBRARIES(binaryen_js wasm asmjs emscripten-optimizer passes ir cfg support wasm)
+ # note that SHELL: is needed as otherwise cmake will coalesce -s link flags
+ # in an incorrect way for emscripten
+ TARGET_LINK_LIBRARIES(binaryen_js "-s WASM=0")
+ TARGET_LINK_LIBRARIES(binaryen_js "-s WASM_ASYNC_COMPILATION=0")
+ TARGET_LINK_LIBRARIES(binaryen_js "-s MODULARIZE_INSTANCE=1")
+ TARGET_LINK_LIBRARIES(binaryen_js "-s NO_FILESYSTEM=0")
+ TARGET_LINK_LIBRARIES(binaryen_js "-s NODERAWFS=0")
+ TARGET_LINK_LIBRARIES(binaryen_js "-s 'EXPORT_NAME=\"Binaryen\"'")
+ TARGET_LINK_LIBRARIES(binaryen_js "--post-js ${CMAKE_CURRENT_SOURCE_DIR}/src/js/binaryen.js-post.js")
+ TARGET_LINK_LIBRARIES(binaryen_js optimized "--closure 1")
+ TARGET_LINK_LIBRARIES(binaryen_js debug "--profiling")
+ SET_PROPERTY(TARGET binaryen_js PROPERTY CXX_STANDARD 14)
+ SET_PROPERTY(TARGET binaryen_js PROPERTY CXX_STANDARD_REQUIRED ON)
+ INSTALL(TARGETS binaryen_js DESTINATION ${CMAKE_INSTALL_BINDIR})
+ENDIF()
+
# Testing
#
# Currently just some very simple smoke tests.
diff --git a/build-js.sh b/build-js.sh
deleted file mode 100755
index 423445764..000000000
--- a/build-js.sh
+++ /dev/null
@@ -1,187 +0,0 @@
-#
-# This file builds the js components using emscripten. You normally don't need
-# to run this, as the builds are bundled in the repo in bin/. Running this is
-# useful if you are a developer and want to update those builds.
-#
-# Usage: build-js.sh
-# Usage: EMSCRIPTEN=path/to/emscripten build-js.sh # explicit emscripten dir
-#
-# Emscripten's em++ and tools/webidl_binder.py will be accessed through the
-# env var EMSCRIPTEN, e.g. ${EMSCRIPTEN}/em++
-#
-# You can get emscripten from
-# http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html
-#
-set -e
-
-if [ "$1" == "-h" ] || [ "$1" == "--help" ] || [ "$1" == "-help" ]; then
- echo "usage: $0 [-g]" >&2
- echo " -g produce debug build" >&2
- echo ""
- echo "If EMSCRIPTEN is set in the environment, emscripten will be loaded"
- echo "from that directory. Otherwise the location of emscripten is resolved"
- echo "through PATH."
- exit 1
-fi
-
-if [ -z "$EMSCRIPTEN" ]; then
- if (which emcc >/dev/null); then
- # Found emcc in PATH -- set EMSCRIPTEN (we need this to access webidl_binder.py)
- EMSCRIPTEN=$(dirname "$(which emcc)")
- else
- echo "$0: EMSCRIPTEN environment variable is not set and emcc was not found in PATH" >&2
- exit 1
- fi
-elif [ ! -d "$EMSCRIPTEN" ]; then
- echo "$0: \"$EMSCRIPTEN\" (\$EMSCRIPTEN) is not a directory" >&2
- exit 1
-fi
-
-EMCC_ARGS="-std=gnu++14 --memory-init-file 0"
-EMCC_ARGS="$EMCC_ARGS -s ALLOW_MEMORY_GROWTH=1"
-EMCC_ARGS="$EMCC_ARGS -s DEMANGLE_SUPPORT=1"
-EMCC_ARGS="$EMCC_ARGS -s NO_FILESYSTEM=0"
-EMCC_ARGS="$EMCC_ARGS -s WASM=0"
-EMCC_ARGS="$EMCC_ARGS -s BINARYEN_ASYNC_COMPILATION=0"
-EMCC_ARGS="$EMCC_ARGS -s DISABLE_EXCEPTION_CATCHING=0" # Exceptions are thrown and caught when optimizing endless loops
-OUT_FILE_SUFFIX=
-
-if [ "$1" == "-g" ]; then
- EMCC_ARGS="$EMCC_ARGS -O2" # need emcc js opts to be decently fast
- EMCC_ARGS="$EMCC_ARGS --llvm-opts 0 --llvm-lto 0"
- EMCC_ARGS="$EMCC_ARGS -profiling"
- EMCC_ARGS="$EMCC_ARGS -s ASSERTIONS=0" # 0 as a temporary workaround for https://github.com/emscripten-core/emscripten/pull/9360
-else
- EMCC_ARGS="$EMCC_ARGS -Oz"
- EMCC_ARGS="$EMCC_ARGS --llvm-lto 1"
- EMCC_ARGS="$EMCC_ARGS -s ELIMINATE_DUPLICATE_FUNCTIONS=1"
- EMCC_ARGS="$EMCC_ARGS --closure 1"
- # Why these settings?
- # See https://gist.github.com/rsms/e33c61a25a31c08260161a087be03169
-fi
-
-# input sources relative to this script
-BINARYEN_SRC="$(dirname $0)/src"
-
-# input sources relative to this script
-BINARYEN_SCRIPTS="$(dirname $0)/scripts"
-
-# output binaries relative to current working directory
-OUT="$PWD/out"
-
-echo "generate embedded intrinsics module"
-
-python3 "$BINARYEN_SCRIPTS/embedwast.py" "$BINARYEN_SRC/passes/wasm-intrinsics.wast" "$BINARYEN_SRC/passes/WasmIntrinsics.cpp"
-
-echo "compiling source files"
-
-mkdir -p "$OUT"
-"$EMSCRIPTEN/em++" \
- $EMCC_ARGS \
- "$BINARYEN_SRC/asmjs/asm_v_wasm.cpp" \
- "$BINARYEN_SRC/asmjs/asmangle.cpp" \
- "$BINARYEN_SRC/asmjs/shared-constants.cpp" \
- "$BINARYEN_SRC/cfg/Relooper.cpp" \
- "$BINARYEN_SRC/emscripten-optimizer/optimizer-shared.cpp" \
- "$BINARYEN_SRC/emscripten-optimizer/parser.cpp" \
- "$BINARYEN_SRC/emscripten-optimizer/simple_ast.cpp" \
- "$BINARYEN_SRC/ir/ExpressionAnalyzer.cpp" \
- "$BINARYEN_SRC/ir/ExpressionManipulator.cpp" \
- "$BINARYEN_SRC/ir/LocalGraph.cpp" \
- "$BINARYEN_SRC/ir/ReFinalize.cpp" \
- "$BINARYEN_SRC/passes/pass.cpp" \
- "$BINARYEN_SRC/passes/AlignmentLowering.cpp" \
- "$BINARYEN_SRC/passes/Asyncify.cpp" \
- "$BINARYEN_SRC/passes/AvoidReinterprets.cpp" \
- "$BINARYEN_SRC/passes/CoalesceLocals.cpp" \
- "$BINARYEN_SRC/passes/DeadArgumentElimination.cpp" \
- "$BINARYEN_SRC/passes/CodeFolding.cpp" \
- "$BINARYEN_SRC/passes/CodePushing.cpp" \
- "$BINARYEN_SRC/passes/ConstHoisting.cpp" \
- "$BINARYEN_SRC/passes/DataFlowOpts.cpp" \
- "$BINARYEN_SRC/passes/DeadCodeElimination.cpp" \
- "$BINARYEN_SRC/passes/Directize.cpp" \
- "$BINARYEN_SRC/passes/DuplicateImportElimination.cpp" \
- "$BINARYEN_SRC/passes/DuplicateFunctionElimination.cpp" \
- "$BINARYEN_SRC/passes/ExtractFunction.cpp" \
- "$BINARYEN_SRC/passes/Flatten.cpp" \
- "$BINARYEN_SRC/passes/FuncCastEmulation.cpp" \
- "$BINARYEN_SRC/passes/I64ToI32Lowering.cpp" \
- "$BINARYEN_SRC/passes/Inlining.cpp" \
- "$BINARYEN_SRC/passes/InstrumentLocals.cpp" \
- "$BINARYEN_SRC/passes/InstrumentMemory.cpp" \
- "$BINARYEN_SRC/passes/LegalizeJSInterface.cpp" \
- "$BINARYEN_SRC/passes/LimitSegments.cpp" \
- "$BINARYEN_SRC/passes/LocalCSE.cpp" \
- "$BINARYEN_SRC/passes/LogExecution.cpp" \
- "$BINARYEN_SRC/passes/LoopInvariantCodeMotion.cpp" \
- "$BINARYEN_SRC/passes/MemoryPacking.cpp" \
- "$BINARYEN_SRC/passes/MergeBlocks.cpp" \
- "$BINARYEN_SRC/passes/MergeLocals.cpp" \
- "$BINARYEN_SRC/passes/Metrics.cpp" \
- "$BINARYEN_SRC/passes/MinifyImportsAndExports.cpp" \
- "$BINARYEN_SRC/passes/NameList.cpp" \
- "$BINARYEN_SRC/passes/NoExitRuntime.cpp" \
- "$BINARYEN_SRC/passes/OptimizeAddedConstants.cpp" \
- "$BINARYEN_SRC/passes/OptimizeInstructions.cpp" \
- "$BINARYEN_SRC/passes/PickLoadSigns.cpp" \
- "$BINARYEN_SRC/passes/PostAssemblyScript.cpp" \
- "$BINARYEN_SRC/passes/PostEmscripten.cpp" \
- "$BINARYEN_SRC/passes/Precompute.cpp" \
- "$BINARYEN_SRC/passes/Print.cpp" \
- "$BINARYEN_SRC/passes/PrintFeatures.cpp" \
- "$BINARYEN_SRC/passes/PrintFunctionMap.cpp" \
- "$BINARYEN_SRC/passes/PrintCallGraph.cpp" \
- "$BINARYEN_SRC/passes/RedundantSetElimination.cpp" \
- "$BINARYEN_SRC/passes/RelooperJumpThreading.cpp" \
- "$BINARYEN_SRC/passes/RemoveNonJSOps.cpp" \
- "$BINARYEN_SRC/passes/RemoveImports.cpp" \
- "$BINARYEN_SRC/passes/RemoveMemory.cpp" \
- "$BINARYEN_SRC/passes/RemoveUnusedBrs.cpp" \
- "$BINARYEN_SRC/passes/RemoveUnusedModuleElements.cpp" \
- "$BINARYEN_SRC/passes/RemoveUnusedNames.cpp" \
- "$BINARYEN_SRC/passes/ReorderFunctions.cpp" \
- "$BINARYEN_SRC/passes/ReorderLocals.cpp" \
- "$BINARYEN_SRC/passes/ReReloop.cpp" \
- "$BINARYEN_SRC/passes/SafeHeap.cpp" \
- "$BINARYEN_SRC/passes/SimplifyGlobals.cpp" \
- "$BINARYEN_SRC/passes/SimplifyLocals.cpp" \
- "$BINARYEN_SRC/passes/Souperify.cpp" \
- "$BINARYEN_SRC/passes/SpillPointers.cpp" \
- "$BINARYEN_SRC/passes/SSAify.cpp" \
- "$BINARYEN_SRC/passes/StackIR.cpp" \
- "$BINARYEN_SRC/passes/Strip.cpp" \
- "$BINARYEN_SRC/passes/StripTargetFeatures.cpp" \
- "$BINARYEN_SRC/passes/TrapMode.cpp" \
- "$BINARYEN_SRC/passes/Untee.cpp" \
- "$BINARYEN_SRC/passes/Vacuum.cpp" \
- "$BINARYEN_SRC/passes/WasmIntrinsics.cpp" \
- "$BINARYEN_SRC/support/bits.cpp" \
- "$BINARYEN_SRC/support/colors.cpp" \
- "$BINARYEN_SRC/support/file.cpp" \
- "$BINARYEN_SRC/support/safe_integer.cpp" \
- "$BINARYEN_SRC/support/threads.cpp" \
- "$BINARYEN_SRC/wasm/literal.cpp" \
- "$BINARYEN_SRC/wasm/wasm-binary.cpp" \
- "$BINARYEN_SRC/wasm/wasm-emscripten.cpp" \
- "$BINARYEN_SRC/wasm/wasm-interpreter.cpp" \
- "$BINARYEN_SRC/wasm/wasm-io.cpp" \
- "$BINARYEN_SRC/wasm/wasm-s-parser.cpp" \
- "$BINARYEN_SRC/wasm/wasm-stack.cpp" \
- "$BINARYEN_SRC/wasm/wasm-type.cpp" \
- "$BINARYEN_SRC/wasm/wasm-validator.cpp" \
- "$BINARYEN_SRC/wasm/wasm.cpp" \
- -I"$BINARYEN_SRC" \
- -o "$OUT/shared.o"
-
-echo "building binaryen.js"
-
-"$EMSCRIPTEN/em++" \
- $EMCC_ARGS \
- "$BINARYEN_SRC/binaryen-c.cpp" \
- "$OUT/shared.o" \
- -I"$BINARYEN_SRC/" \
- -o "$OUT/binaryen$OUT_FILE_SUFFIX.js" \
- -s MODULARIZE_INSTANCE=1 \
- -s 'EXPORT_NAME="Binaryen"' \
- --post-js "$BINARYEN_SRC/js/binaryen.js-post.js"
diff --git a/travis-emcc-tests.sh b/travis-emcc-tests.sh
index c141919c8..224636cfd 100755
--- a/travis-emcc-tests.sh
+++ b/travis-emcc-tests.sh
@@ -1,6 +1,9 @@
set -e
echo "travis-test build"
-./build-js.sh -g
+emconfigure cmake -DCMAKE_BUILD_TYPE=Release
+emmake make -j4 binaryen_js
+mkdir out
+cp bin/binaryen_js.js out/binaryen.js
echo "travis-test test"
python3 -m scripts.test.binaryenjs
echo "travis-test yay!"