# # 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 EMSCRIPTEN_DIR ?= $(dir $(shell which emcc)) 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 EMCC_FLAG := -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN_DIR}/cmake/Modules/Platform/Emscripten.cmake 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)) && \ $$(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 # 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))))))