From a610b4ca41bc587e627937499c785e1c7c4ce652 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 13 Oct 2020 15:23:35 -0700 Subject: [PATCH] Update how wasi-sdk uses cmake Change `CMAKE_SYSTEM_NAME` to `WASI`, use a `CMAKE_MODULE_PATH`, remove `CACHE` usage, and fix the compiler autodetection code so that the "compiler works" hacks are no longer needed, following the advice in [this comment](https://gitlab.kitware.com/cmake/cmake/-/issues/19223#note_567327). This is hopefully a step towards re-submitting WASI support to upstream cmake. --- Makefile | 19 +++++++++++++++++-- cmake/Platform/WASI.cmake | 1 + wasi-sdk.cmake | 19 +++++-------------- 3 files changed, 23 insertions(+), 16 deletions(-) create mode 100644 cmake/Platform/WASI.cmake diff --git a/Makefile b/Makefile index 89c3b40..163eff5 100644 --- a/Makefile +++ b/Makefile @@ -55,6 +55,7 @@ clean: build/llvm.BUILT: mkdir -p build/llvm cd build/llvm && cmake -G Ninja \ + -DCMAKE_MODULE_PATH=$(ROOT_DIR)/cmake \ -DCMAKE_BUILD_TYPE=MinSizeRel \ -DCMAKE_INSTALL_PREFIX=$(PREFIX) \ -DLLVM_TARGETS_TO_BUILD=WebAssembly \ @@ -92,9 +93,14 @@ build/wasi-libc.BUILT: build/llvm.BUILT touch build/wasi-libc.BUILT build/compiler-rt.BUILT: build/llvm.BUILT + # Create an empty library so that cmake's configure checks which + # run the compiler to see if it produces working binaries succeed. + mkdir -p $(PREFIX)/lib/clang/$(CLANG_VERSION)/lib/wasi + $(AR) cr $(PREFIX)/lib/clang/$(CLANG_VERSION)/lib/wasi/libclang_rt.builtins-wasm32.a # Do the build, and install it. mkdir -p build/compiler-rt cd build/compiler-rt && cmake -G Ninja \ + -DCMAKE_MODULE_PATH=$(ROOT_DIR)/cmake \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/wasi-sdk.cmake \ -DCOMPILER_RT_BAREMETAL_BUILD=On \ @@ -117,6 +123,7 @@ build/compiler-rt.BUILT: build/llvm.BUILT # Flags for libcxx. LIBCXX_CMAKE_FLAGS = \ + -DCMAKE_MODULE_PATH=$(ROOT_DIR)/cmake \ -DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/wasi-sdk.cmake \ -DCMAKE_STAGING_PREFIX=$(PREFIX)/share/wasi-sysroot \ -DLLVM_CONFIG_PATH=$(ROOT_DIR)/build/llvm/bin/llvm-config \ @@ -138,9 +145,12 @@ LIBCXX_CMAKE_FLAGS = \ -DWASI_SDK_PREFIX=$(BUILD_PREFIX) \ --debug-trycompile - #-DCMAKE_STAGING_PREFIX= - build/libcxx.BUILT: build/llvm.BUILT build/compiler-rt.BUILT build/wasi-libc.BUILT + # Create an empty library so that cmake's configure checks which + # run the compiler to see if it produces working binaries succeed. + mkdir -p $(PREFIX)/lib/clang/$(CLANG_VERSION)/lib/wasi + $(AR) cr $(PREFIX)/share/wasi-sysroot/lib/wasm32-wasi/libc++.a + $(AR) cr $(PREFIX)/share/wasi-sysroot/lib/wasm32-wasi/libc++abi.a # Do the build. mkdir -p build/libcxx cd build/libcxx && cmake -G Ninja $(LIBCXX_CMAKE_FLAGS) \ @@ -155,6 +165,7 @@ build/libcxx.BUILT: build/llvm.BUILT build/compiler-rt.BUILT build/wasi-libc.BUI # Flags for libcxxabi. LIBCXXABI_CMAKE_FLAGS = \ + -DCMAKE_MODULE_PATH=$(ROOT_DIR)/cmake \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ -DCMAKE_CXX_COMPILER_WORKS=ON \ -DCMAKE_C_COMPILER_WORKS=ON \ @@ -180,6 +191,10 @@ LIBCXXABI_CMAKE_FLAGS = \ --debug-trycompile build/libcxxabi.BUILT: build/libcxx.BUILT build/llvm.BUILT + # Create an empty library so that cmake's configure checks which + # run the compiler to see if it produces working binaries succeed. + mkdir -p $(PREFIX)/lib/clang/$(CLANG_VERSION)/lib/wasi + $(AR) cr $(PREFIX)/share/wasi-sysroot/lib/wasm32-wasi/libc++.a # Do the build. mkdir -p build/libcxxabi cd build/libcxxabi && cmake -G Ninja $(LIBCXXABI_CMAKE_FLAGS) \ diff --git a/cmake/Platform/WASI.cmake b/cmake/Platform/WASI.cmake new file mode 100644 index 0000000..b49713f --- /dev/null +++ b/cmake/Platform/WASI.cmake @@ -0,0 +1 @@ +set(WASI 1) diff --git a/wasi-sdk.cmake b/wasi-sdk.cmake index 18c9901..3245a4c 100644 --- a/wasi-sdk.cmake +++ b/wasi-sdk.cmake @@ -3,7 +3,7 @@ # This is arbitrary, AFAIK, for now. cmake_minimum_required(VERSION 3.4.0) -set(CMAKE_SYSTEM_NAME Wasm) +set(CMAKE_SYSTEM_NAME WASI) set(CMAKE_SYSTEM_VERSION 1) set(CMAKE_SYSTEM_PROCESSOR wasm32) set(triple wasm32-wasi) @@ -16,15 +16,10 @@ endif() set(CMAKE_C_COMPILER ${WASI_SDK_PREFIX}/bin/clang${WASI_HOST_EXE_SUFFIX}) set(CMAKE_CXX_COMPILER ${WASI_SDK_PREFIX}/bin/clang++${WASI_HOST_EXE_SUFFIX}) -set(CMAKE_AR ${WASI_SDK_PREFIX}/bin/llvm-ar${WASI_HOST_EXE_SUFFIX} CACHE STRING "wasi-sdk build") -set(CMAKE_RANLIB ${WASI_SDK_PREFIX}/bin/llvm-ranlib${WASI_HOST_EXE_SUFFIX} CACHE STRING "wasi-sdk build") -set(CMAKE_C_COMPILER_TARGET ${triple} CACHE STRING "wasi-sdk build") -set(CMAKE_CXX_COMPILER_TARGET ${triple} CACHE STRING "wasi-sdk build") -set(CMAKE_C_FLAGS "-v" CACHE STRING "wasi-sdk build") -set(CMAKE_CXX_FLAGS "-v -std=c++11" CACHE STRING "wasi-sdk build") - -set(CMAKE_SYSROOT ${WASI_SDK_PREFIX}/share/wasi-sysroot CACHE STRING "wasi-sdk build") -set(CMAKE_STAGING_PREFIX ${WASI_SDK_PREFIX}/share/wasi-sysroot CACHE STRING "wasi-sdk build") +set(CMAKE_AR ${WASI_SDK_PREFIX}/bin/llvm-ar${WASI_HOST_EXE_SUFFIX}) +set(CMAKE_RANLIB ${WASI_SDK_PREFIX}/bin/llvm-ranlib${WASI_HOST_EXE_SUFFIX}) +set(CMAKE_C_COMPILER_TARGET ${triple}) +set(CMAKE_CXX_COMPILER_TARGET ${triple}) # Don't look in the sysroot for executables to run during the build set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) @@ -32,7 +27,3 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) - -# Some other hacks -set(CMAKE_C_COMPILER_WORKS ON) -set(CMAKE_CXX_COMPILER_WORKS ON)