| # | |
| # Copyright 2016 WebAssembly Community Group participants | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| # | |
| .SUFFIXES: | |
| MAKEFILE_NAME := $(lastword $(MAKEFILE_LIST)) | |
| ROOT_DIR := $(dir $(abspath $(MAKEFILE_NAME))) | |
| USE_NINJA ?= 1 | |
| CMAKE_CMD ?= cmake | |
| DEFAULT_SUFFIX = clang-debug | |
| COMPILERS := GCC GCC_I686 CLANG CLANG_I686 EMCC | |
| BUILD_TYPES := DEBUG RELEASE | |
| SANITIZERS := ASAN MSAN LSAN UBSAN FUZZ | |
| CONFIGS := NORMAL $(SANITIZERS) COV NO_TESTS | |
| # directory names | |
| GCC_DIR := gcc/ | |
| GCC_I686_DIR := gcc-i686/ | |
| CLANG_DIR := clang/ | |
| CLANG_I686_DIR := clang-i686/ | |
| EMCC_DIR := emscripten/ | |
| DEBUG_DIR := Debug/ | |
| RELEASE_DIR := Release/ | |
| NORMAL_DIR := | |
| ASAN_DIR := asan/ | |
| MSAN_DIR := msan/ | |
| LSAN_DIR := lsan/ | |
| UBSAN_DIR := ubsan/ | |
| FUZZ_DIR := fuzz/ | |
| COV_DIR := cov/ | |
| NO_TESTS_DIR := no-tests/ | |
| # CMake flags | |
| GCC_FLAG := -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ | |
| GCC_I686_FLAG := -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ \ | |
| -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32 | |
| CLANG_FLAG := -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ | |
| CLANG_I686_FLAG := -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \ | |
| -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32 | |
| DEBUG_FLAG := -DCMAKE_BUILD_TYPE=Debug | |
| RELEASE_FLAG := -DCMAKE_BUILD_TYPE=Release | |
| NORMAL_FLAG := | |
| ASAN_FLAG := -DUSE_ASAN=ON | |
| MSAN_FLAG := -DUSE_MSAN=ON | |
| LSAN_FLAG := -DUSE_LSAN=ON | |
| UBSAN_FLAG := -DUSE_UBSAN=ON | |
| FUZZ_FLAG := -DBUILD_FUZZ_TOOLS=ON | |
| COV_FLAG := -DCODE_COVERAGE=ON | |
| NO_TESTS_FLAG := -DBUILD_TESTS=OFF | |
| # make target prefixes | |
| GCC_PREFIX := gcc | |
| GCC_I686_PREFIX := gcc-i686 | |
| CLANG_PREFIX := clang | |
| CLANG_I686_PREFIX := clang-i686 | |
| EMCC_PREFIX := emscripten | |
| DEBUG_PREFIX := -debug | |
| RELEASE_PREFIX := -release | |
| NORMAL_PREFIX := | |
| ASAN_PREFIX := -asan | |
| MSAN_PREFIX := -msan | |
| LSAN_PREFIX := -lsan | |
| UBSAN_PREFIX := -ubsan | |
| FUZZ_PREFIX := -fuzz | |
| COV_PREFIX := -cov | |
| NO_TESTS_PREFIX := -no-tests | |
| ifeq ($(USE_NINJA),1) | |
| BUILD_CMD := ninja | |
| BUILD_FILE := build.ninja | |
| GENERATOR := Ninja | |
| else | |
| BUILD_CMD := +$(MAKE) --no-print-directory | |
| BUILD_FILE := Makefile | |
| GENERATOR := "Unix Makefiles" | |
| endif | |
| CMAKE_DIR = out/$($(1)_DIR)$($(2)_DIR)$($(3)_DIR) | |
| BUILD_TARGET = $($(1)_PREFIX)$($(2)_PREFIX)$($(3)_PREFIX) | |
| INSTALL_TARGET = install-$($(1)_PREFIX)$($(2)_PREFIX)$($(3)_PREFIX) | |
| TEST_TARGET = test-$($(1)_PREFIX)$($(2)_PREFIX)$($(3)_PREFIX) | |
| define CMAKE | |
| $(call CMAKE_DIR,$(1),$(2),$(3)): | |
| mkdir -p $(call CMAKE_DIR,$(1),$(2),$(3)) | |
| $(call CMAKE_DIR,$(1),$(2),$(3))$$(BUILD_FILE): | $(call CMAKE_DIR,$(1),$(2),$(3)) | |
| cd $(call CMAKE_DIR,$(1),$(2),$(3)) && \ | |
| $$(if $$(filter EMCC,$(1)),emcmake ,)$$(CMAKE_CMD) -G $$(GENERATOR) $$(ROOT_DIR) $$($(1)_FLAG) $$($(2)_FLAG) $$($(3)_FLAG) | |
| endef | |
| define BUILD | |
| .PHONY: $(call BUILD_TARGET,$(1),$(2),$(3)) | |
| $(call BUILD_TARGET,$(1),$(2),$(3)): $(call CMAKE_DIR,$(1),$(2),$(3))$$(BUILD_FILE) | |
| $$(BUILD_CMD) -C $(call CMAKE_DIR,$(1),$(2),$(3)) all | |
| endef | |
| define INSTALL | |
| .PHONY: $(call INSTALL_TARGET,$(1),$(2),$(3)) | |
| $(call INSTALL_TARGET,$(1),$(2),$(3)): $(call CMAKE_DIR,$(1),$(2),$(3))$$(BUILD_FILE) | |
| $$(BUILD_CMD) -C $(call CMAKE_DIR,$(1),$(2),$(3)) install | |
| endef | |
| define TEST | |
| .PHONY: $(call TEST_TARGET,$(1),$(2),$(3)) | |
| $(call TEST_TARGET,$(1),$(2),$(3)): $(call CMAKE_DIR,$(1),$(2),$(3))$$(BUILD_FILE) | |
| $$(BUILD_CMD) -C $(call CMAKE_DIR,$(1),$(2),$(3)) check | |
| test-everything: $(CALL TEST_TARGET,$(1),$(2),$(3)) | |
| endef | |
| .PHONY: all install test | |
| all: $(DEFAULT_SUFFIX) | |
| install: install-$(DEFAULT_SUFFIX) | |
| test: test-$(DEFAULT_SUFFIX) | |
| .PHONY: clean | |
| clean: | |
| rm -rf out | |
| .PHONY: test-everything | |
| test-everything: | |
| .PHONY: update-gperf | |
| update-gperf: src/prebuilt/lexer-keywords.cc | |
| src/prebuilt/lexer-keywords.cc: src/lexer-keywords.txt | |
| gperf -m 50 -L C++ -N InWordSet -E -t -c --output-file=$@ $< | |
| .PHONY: update-wasm2c-fac | |
| update-wasm2c-fac: | |
| make -C wasm2c/examples/fac | |
| .PHONY: demo | |
| demo: emscripten-release | |
| cp out/emscripten/Release/libwabt.js docs/demo | |
| cp out/emscripten/Release/libwabt.wasm docs/demo | |
| # running CMake | |
| $(foreach CONFIG,$(CONFIGS), \ | |
| $(foreach COMPILER,$(COMPILERS), \ | |
| $(foreach BUILD_TYPE,$(BUILD_TYPES), \ | |
| $(eval $(call CMAKE,$(COMPILER),$(BUILD_TYPE),$(CONFIG)))))) | |
| # building | |
| $(foreach CONFIG,$(CONFIGS), \ | |
| $(foreach COMPILER,$(COMPILERS), \ | |
| $(foreach BUILD_TYPE,$(BUILD_TYPES), \ | |
| $(eval $(call BUILD,$(COMPILER),$(BUILD_TYPE),$(CONFIG)))))) | |
| # installing | |
| $(foreach CONFIG,$(CONFIGS), \ | |
| $(foreach COMPILER,$(COMPILERS), \ | |
| $(foreach BUILD_TYPE,$(BUILD_TYPES), \ | |
| $(eval $(call INSTALL,$(COMPILER),$(BUILD_TYPE),$(CONFIG)))))) | |
| # test running | |
| $(foreach CONFIG,$(CONFIGS), \ | |
| $(foreach COMPILER,$(COMPILERS), \ | |
| $(foreach BUILD_TYPE,$(BUILD_TYPES), \ | |
| $(eval $(call TEST,$(COMPILER),$(BUILD_TYPE),$(CONFIG)))))) |