From 413fe73ce2b3be0a282b83b4deb5c82183f0dc1b Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 30 Jan 2018 09:48:10 -0800 Subject: [PATCH] Add cmake support This change will allow us to remove the libc.py script and build the wasm targets using cmake+ninja instead. --- CMakeLists.txt | 148 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..ce98f91a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,148 @@ +# We require 3.9 because of the use of $ +cmake_minimum_required(VERSION 3.9) +project(MUSL) +enable_language(C ASM) +include(CheckCCompilerFlag) + +if(WASM) + set(ARCH "wasm32") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") + set(ARCH "x86_64") +else() + error("Could not detect ARCH") +endif(WASM) + +set(EMPTY_LIB_NAMES m rt pthread crypt util xnet resolv dl) + +include_directories( + ${MUSL_SOURCE_DIR}/arch/${ARCH} + ${MUSL_SOURCE_DIR}/arch/generic + ${MUSL_BINARY_DIR}/src/internal + ${MUSL_SOURCE_DIR}/src/internal + ${MUSL_BINARY_DIR}/include + ${MUSL_SOURCE_DIR}/include +) + +add_definitions( + -D_XOPEN_SOURCE=700 + -std=c99 + -ffreestanding + -nostdinc +) + +set(OPTIONAL_FLAGS + -fomit-frame-pointer + -fno-unwind-tables + -fno-asynchronous-unwind-tables + -ffunction-sections + -fdata-sections + -fexcess-precision=standard + -frounding-math + -Wa,--noexecstack +) + +set(WARNING_FLAGS + -Werror + -Wno-empty-body + -Wno-incompatible-library-redeclaration + -Wno-shift-op-parentheses + -Wno-tautological-unsigned-zero-compare + -Wno-tautological-constant-out-of-range-compare + -Wno-tautological-unsigned-enum-zero-compare + -Wno-ignored-attributes + -Wno-format + -Wno-bitwise-op-parentheses + -Wno-logical-op-paretheses + -Wno-string-plus-int + -Wno-pointer-sign + -Wno-dangling-else + -Wno-absolute-value + -Wno-parentheses + -Wno-unknown-pragmas +) + +foreach(flag IN LISTS OPTIONAL_FLAGS WARNING_FLAGS) + check_c_compiler_flag(${flag} FLAG_${flag}) + if(FLAG_${flag}) + add_definitions(${flag}) + endif(FLAG_${flag}) +endforeach(flag) + +set(CMAKE_SHARED_LINKER_FLAGS "-nostdlib -Wl,-e,_dlstart") + +add_custom_command( + OUTPUT ${MUSL_BINARY_DIR}/src/internal/version.h + COMMAND + echo '\#define VERSION \"1\"' > ${MUSL_BINARY_DIR}/src/internal/version.h + DEPENDS + ${MUSL_SOURCE_DIR}/VERSION +) + +add_custom_command( + OUTPUT ${MUSL_BINARY_DIR}/include/bits/syscall.h + COMMAND + cp ${MUSL_SOURCE_DIR}/arch/${ARCH}/bits/syscall.h.in ${MUSL_BINARY_DIR}/include/bits/syscall.h && + sed -n -e s/__NR_/SYS_/p < ${MUSL_SOURCE_DIR}/arch/${ARCH}/bits/syscall.h.in >> ${MUSL_BINARY_DIR}/include/bits/syscall.h + DEPENDS ${MUSL_SOURCE_DIR}/arch/${ARCH}/bits/syscall.h.in +) + +add_custom_command( + OUTPUT ${MUSL_BINARY_DIR}/include/bits/alltypes.h + COMMAND + sed -f ${MUSL_SOURCE_DIR}/tools/mkalltypes.sed ${MUSL_SOURCE_DIR}/arch/${ARCH}/bits/alltypes.h.in ${MUSL_SOURCE_DIR}/include/alltypes.h.in >${MUSL_BINARY_DIR}/include/bits/alltypes.h + DEPENDS + ${MUSL_SOURCE_DIR}/tools/mkalltypes.sed + ${MUSL_SOURCE_DIR}/arch/${ARCH}/bits/alltypes.h.in + ${MUSL_SOURCE_DIR}/include/alltypes.h.in +) + +file(GLOB SOURCES "src/*/*.c") +file(GLOB LDSO_SOURCES "ldso/*.c") +file(GLOB ASM_SOURCES "src/*/${ARCH}/*.s") + +# Filter out (replace) any sources that are provided in asm form +foreach(src IN LISTS ASM_SOURCES) + string(REPLACE "/${ARCH}/" "/" src ${src}) + string(REPLACE ".s" ".c" src ${src}) + list(REMOVE_ITEM SOURCES ${src}) +endforeach(src) + +set(ALL_SOURCES + ${SOURCES} + ${ASM_SOURCES} + ${MUSL_BINARY_DIR}/src/internal/version.h + ${MUSL_BINARY_DIR}/include/bits/alltypes.h + ${MUSL_BINARY_DIR}/include/bits/syscall.h +) + +foreach(lib IN LISTS EMPTY_LIB_NAMES) + # Include a random header here to avoid CMake warning about creating + # a library with no sources. + add_library(${lib} STATIC ${MUSL_SOURCE_DIR}/include/stdio.h) + # Also to avoid a cmake warning + set_property(TARGET ${lib} PROPERTY LINKER_LANGUAGE C) +endforeach(lib) + +add_library(c-static STATIC ${ALL_SOURCES}) +set_target_properties(c-static PROPERTIES OUTPUT_NAME c CLEAN_DIRECT_OUTPUT 1) + +add_library(crt1 OBJECT crt/crt1.c) +set_target_properties(crt1 PROPERTIES OUTPUT_NAME crt1 CLEAN_DIRECT_OUTPUT 1) + +add_custom_target( + crt1.o ALL + COMMAND cp $ crt1.o + DEPENDS crt1 +) + +if(!WASM) + add_library(c SHARED ${ALL_SOURCES} ${LDSO_SOURCES}) + install(TARGETS c DESTINATION lib) +endif(!WASM) + +install(TARGETS c-static ${EMPTY_LIB_NAMES} DESTINATION lib) +install(FILES ${MUSL_BINARY_DIR}/crt1.o DESTINATION lib) +install(DIRECTORY ${MUSL_SOURCE_DIR}/include DESTINATION include) +install(DIRECTORY ${MUSL_SOURCE_DIR}/arch/generic/bits DESTINATION include/bits) +install(DIRECTORY ${MUSL_SOURCE_DIR}/arch/${ARCH}/bits DESTINATION include/bits) +install(DIRECTORY ${MUSL_BINARY_DIR}/include/bits DESTINATION include/bits)