Skip to content

Commit f9d135e

Browse files
committed
Add CMake build system
1 parent f2a618f commit f9d135e

17 files changed

+1072
-0
lines changed

CMakeLists.txt

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
cmake_minimum_required(VERSION 3.16.3)
2+
3+
project(wasi-libc LANGUAGES C)
4+
5+
enable_testing()
6+
7+
if("${CMAKE_C_COMPILER}" MATCHES "(.*)clang(-[0-9]+)?$")
8+
set(CMAKE_NM "${CMAKE_MATCH_1}llvm-nm${CMAKE_MATCH_2}")
9+
endif()
10+
11+
find_package(Python COMPONENTS Interpreter REQUIRED)
12+
13+
set(TARGET_TRIPLE wasm32-wasi)
14+
set(MULTIARCH_TRIPLE wasm32-wasi)
15+
16+
set(CMAKE_C_COMPILER_TARGET ${TARGET_TRIPLE} CACHE STRING "The target to compile for")
17+
18+
# note that pthread support is still a work-in-progress.
19+
set(THREAD_MODEL "single" CACHE STRING "single or posix")
20+
21+
set(MALLOC_IMPL "dlmalloc" CACHE STRING "dlmalloc or none")
22+
23+
option(BUILD_LIBC_TOP_HALF "Build libc top half" ON)
24+
25+
# When the length is no larger than this threshold, we consider the
26+
# overhead of bulk memory opcodes to outweigh the performance benefit,
27+
# and fall back to the original musl implementation. See
28+
# https://github.com/WebAssembly/wasi-libc/pull/263 for relevant
29+
# discussion
30+
set(BULK_MEMORY_THRESHOLD "32" CACHE STRING "bulk memory threshold")
31+
32+
add_subdirectory(cmake)

cmake/CMakeLists.txt

+112
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
set(LIBC_BOTTOM_HALF_HEADERS_PUBLIC_DIR ${PROJECT_SOURCE_DIR}/libc-bottom-half/headers/public)
2+
set(LIBC_TOP_HALF_MUSL_DIR ${PROJECT_SOURCE_DIR}/libc-top-half/musl)
3+
set(LIBC_TOP_HALF_MUSL_SRC_DIR ${LIBC_TOP_HALF_MUSL_DIR}/src)
4+
set(LIBC_BOTTOM_HALF_DIR ${PROJECT_SOURCE_DIR}/libc-bottom-half)
5+
set(LIBC_BOTTOM_HALF_CLOUDLIBC_SRC_DIR ${LIBC_BOTTOM_HALF_DIR}/cloudlibc/src)
6+
7+
set(INSTALL_LIB_DIR lib/${MULTIARCH_TRIPLE})
8+
set(INSTALL_SHARE_DIR share/${MULTIARCH_TRIPLE})
9+
10+
include(global-compiler-options.cmake)
11+
include(local-sysroot.cmake)
12+
include(predefined-macros.cmake)
13+
include(libc-imports.cmake)
14+
15+
add_subdirectory(libc-bottom-half)
16+
add_subdirectory(libc-top-half)
17+
18+
if(${MALLOC_IMPL} STREQUAL "dlmalloc")
19+
add_subdirectory(dlmalloc)
20+
endif()
21+
22+
add_library(wasi-emulated-signal)
23+
target_link_libraries(wasi-emulated-signal
24+
wasi-emulated-signal-musl-objs
25+
wasi-emulated-signal-objs
26+
)
27+
add_custom_command(TARGET wasi-emulated-signal POST_BUILD
28+
COMMAND ${CMAKE_C_COMPILER_AR} crs $<TARGET_FILE:c>
29+
)
30+
31+
add_library(c)
32+
33+
set (LIBC_LINK_LIBRARIES
34+
libc-bottom-half
35+
)
36+
37+
if(${BUILD_LIBC_TOP_HALF} STREQUAL "ON")
38+
list(APPEND LIBC_LINK_LIBRARIES
39+
libc-top-half
40+
)
41+
endif()
42+
43+
if(${MALLOC_IMPL} STREQUAL "dlmalloc")
44+
list(APPEND LIBC_LINK_LIBRARIES
45+
dlmalloc)
46+
elseif(${MALLOC_IMPL} STREQUAL "none")
47+
# nothing to do here
48+
else()
49+
message(FATAL_ERROR "unknown malloc implementation ${MALLOC_IMPL}")
50+
endif()
51+
52+
target_link_libraries(c
53+
PRIVATE
54+
${LIBC_LINK_LIBRARIES}
55+
)
56+
57+
add_custom_command(TARGET c POST_BUILD
58+
COMMAND ${CMAKE_C_COMPILER_AR} crs $<TARGET_FILE:c>
59+
)
60+
61+
add_dependencies(c sysroot-headers)
62+
63+
# Create empty placeholder libraries.
64+
foreach(stub m rt pthread crypt util xnet resolve dl)
65+
set(lib_path ${SYSROOT_LIB_DIR}/lib${stub}.a)
66+
add_custom_command(OUTPUT ${lib_path}
67+
COMMAND ${CMAKE_COMMAND} -E make_directory ${SYSROOT_LIB_DIR}
68+
COMMAND ${CMAKE_C_COMPILER_AR} crs ${lib_path})
69+
add_custom_target(${stub} ALL
70+
DEPENDS ${lib_path})
71+
endforeach()
72+
73+
install(
74+
TARGETS
75+
c
76+
c-printscan-long-double
77+
c-printscan-no-floating-point
78+
wasi-emulated-mman
79+
wasi-emulated-process-clocks
80+
wasi-emulated-getpid
81+
wasi-emulated-signal
82+
ARCHIVE DESTINATION ${INSTALL_LIB_DIR}
83+
LIBRARY DESTINATION ${INSTALL_LIB_DIR}
84+
)
85+
86+
install(
87+
DIRECTORY ${SYSROOT_INC_DIR}
88+
DESTINATION .
89+
)
90+
91+
install(
92+
DIRECTORY ${SYSROOT_SHARE_DIR}
93+
DESTINATION share
94+
)
95+
96+
install(
97+
DIRECTORY ${SYSROOT_LIB_DIR}
98+
DESTINATION lib
99+
)
100+
101+
add_test(NAME check-metadata
102+
COMMAND diff -wur
103+
${PROJECT_SOURCE_DIR}/expected/${MULTIARCH_TRIPLE}/${THREAD_MODEL}/predefined-macros.txt
104+
${CMAKE_BINARY_DIR}/sysroot/share/${MULTIARCH_TRIPLE}/predefined-macros.txt)
105+
106+
add_test(NAME check-headers
107+
COMMAND ${CMAKE_C_COMPILER}
108+
-target ${CMAKE_C_COMPILER_TARGET}
109+
--sysroot=${CMAKE_BINARY_DIR}/sysroot
110+
-fsyntax-only
111+
"-Wno#warnings"
112+
${CMAKE_BINARY_DIR}/sysroot/share/${MULTIARCH_TRIPLE}/include-all.c)

cmake/dlmalloc/CMakeLists.txt

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
set(DLMALLOC_DIR ${PROJECT_SOURCE_DIR}/dlmalloc)
2+
3+
add_library(dlmalloc OBJECT
4+
${DLMALLOC_DIR}/src/dlmalloc.c)
5+
6+
target_include_directories(dlmalloc
7+
PRIVATE
8+
${DLMALLOC_DIR}/include)
9+
10+
add_dependencies(dlmalloc sysroot-headers)

cmake/global-compiler-options.cmake

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# WebAssembly floating-point match doesn't trap.
2+
# TODO: Add -fno-signaling-nans when the compiler supports it.
3+
add_compile_options(-fno-trapping-math)
4+
5+
# Add all warnings, but disable a few which occur in third-party code.
6+
add_compile_options(
7+
-Wall -Wextra -Werror
8+
-Wno-null-pointer-arithmetic
9+
-Wno-unused-parameter
10+
-Wno-sign-compare
11+
-Wno-unused-variable
12+
-Wno-unused-function
13+
-Wno-ignored-attributes
14+
-Wno-missing-braces
15+
-Wno-ignored-pragmas
16+
-Wno-unused-but-set-variable
17+
-Wno-unknown-warning-option
18+
)
19+
20+
# Configure support for threads
21+
if("${THREAD_MODEL}" STREQUAL "single")
22+
add_compile_options(-mthread-model single)
23+
elseif("${THREAD_MODEL}" STREQUAL "posix")
24+
add_compile_options(-mthread-model posix -pthread -ftls-model=local-exec)
25+
endif()
26+
27+
# Expose the public headers to the implementation. We use `-isystem` for
28+
# purpose for two reasons:
29+
#
30+
# 1. It only does `<...>` not `"...."` lookup. We are making a libc,
31+
# which is a system library, so all public headers should be
32+
# accessible via `<...>` and never also need `"..."`. `-isystem` main
33+
# purpose is to only effect `<...>` lookup.
34+
#
35+
# 2. The `-I` for private headers added for specific C files below
36+
# should come earlier in the search path, so they can "override"
37+
# and/or `#include_next` the public headers. `-isystem` (like
38+
# `-idirafter`) comes later in the search path than `-I`.
39+
include_directories(SYSTEM ${CMAKE_BINARY_DIR}/sysroot/include)

cmake/libc-bottom-half/CMakeLists.txt

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
set(LIBC_BOTTOM_HALF_CLOUDLIBC_SRC_INC_DIR ${LIBC_BOTTOM_HALF_CLOUDLIBC_SRC_DIR}/include)
2+
set(LIBC_BOTTOM_HALF_SRC_DIR ${LIBC_BOTTOM_HALF_DIR}/sources)
3+
set(LIBC_BOTTOM_HALF_HEADERS_PRIVATE_DIR ${LIBC_BOTTOM_HALF_DIR}/headers/private)
4+
5+
file(GLOB_RECURSE
6+
LIBC_BOTTOM_HALF_ALL_SOURCES
7+
CONFIGURE_DEPENDS
8+
${LIBC_BOTTOM_HALF_CLOUDLIBC_SRC_DIR}/*.c
9+
${LIBC_BOTTOM_HALF_SRC_DIR}/*.c)
10+
11+
set(LIBC_BOTTOM_HALF_INC_DIRS
12+
${LIBC_BOTTOM_HALF_HEADERS_PRIVATE_DIR}
13+
${LIBC_BOTTOM_HALF_CLOUDLIBC_SRC_INC_DIR}
14+
${LIBC_BOTTOM_HALF_CLOUDLIBC_SRC_DIR}
15+
${LIBC_TOP_HALF_MUSL_SRC_DIR}/include
16+
${LIBC_TOP_HALF_MUSL_SRC_DIR}/internal
17+
)
18+
19+
# FIXME(https://reviews.llvm.org/D85567) - due to a bug in LLD the weak
20+
# references to a function defined in `chdir.c` only work if `chdir.c` is at the
21+
# end of the archive, but once that LLD review lands and propagates into LLVM
22+
# then we don't have to do this.
23+
set(CHDIR_SRC "${LIBC_BOTTOM_HALF_SRC_DIR}/chdir.c")
24+
list(REMOVE_ITEM LIBC_BOTTOM_HALF_ALL_SOURCES ${CHDIR_SRC})
25+
list(APPEND LIBC_BOTTOM_HALF_ALL_SOURCES ${CHDIR_SRC})
26+
27+
add_library(libc-bottom-half OBJECT
28+
${LIBC_BOTTOM_HALF_ALL_SOURCES})
29+
add_dependencies(libc-bottom-half sysroot-headers)
30+
target_include_directories(libc-bottom-half
31+
PRIVATE
32+
${LIBC_BOTTOM_HALF_INC_DIRS}
33+
SYSTEM
34+
${SYSROOT_INC_DIR}
35+
)
36+
37+
add_subdirectory(clocks)
38+
add_subdirectory(getpid)
39+
add_subdirectory(mman)
40+
add_subdirectory(signal)
41+
add_subdirectory(crt1)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
file(GLOB_RECURSE
2+
CLOCKS_SOURCES
3+
${LIBC_BOTTOM_HALF_DIR}/clocks/*.c)
4+
5+
add_library(wasi-emulated-process-clocks STATIC
6+
${CLOCKS_SOURCES})
7+
8+
target_include_directories(wasi-emulated-process-clocks
9+
PRIVATE
10+
${LIBC_BOTTOM_HALF_CLOUDLIBC_SRC_DIR})
11+
12+
add_dependencies(wasi-emulated-process-clocks sysroot-headers)
13+
14+
add_custom_command(TARGET wasi-emulated-process-clocks POST_BUILD
15+
COMMAND ${CMAKE_C_COMPILER_AR} crs $<TARGET_FILE:c>
16+
)
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
file(GLOB
2+
LIBC_BOTTOM_HALF_CRT_SOURCES
3+
CONFIGURE_DEPENDS
4+
${LIBC_BOTTOM_HALF_DIR}/crt/*.c)
5+
6+
foreach(crt_path ${LIBC_BOTTOM_HALF_CRT_SOURCES})
7+
get_filename_component(crt_name ${crt_path} NAME_WLE)
8+
add_library(${crt_name} OBJECT ${crt_path})
9+
10+
target_include_directories(${crt_name}
11+
PRIVATE
12+
${LIBC_BOTTOM_HALF_INC_DIRS}
13+
)
14+
15+
add_dependencies(${crt_name} sysroot-headers)
16+
17+
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/sysroot/lib/${crt_name}.o
18+
COMMAND ${CMAKE_COMMAND} -E make_directory ${SYSROOT_LIB_DIR}
19+
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_OBJECTS:${crt_name}> ${SYSROOT_LIB_DIR}/${crt_name}.o
20+
COMMAND_EXPAND_LISTS
21+
)
22+
23+
add_custom_target(${crt_name}.o ALL
24+
DEPENDS ${CMAKE_BINARY_DIR}/sysroot/lib/${crt_name}.o)
25+
add_dependencies(${crt_name}.o ${crt_name})
26+
endforeach()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
file(GLOB_RECURSE
2+
GETPID_SOURCES
3+
${LIBC_BOTTOM_HALF_DIR}/getpid/*.c)
4+
5+
add_library(wasi-emulated-getpid STATIC
6+
${GETPID_SOURCES})
7+
8+
set_target_properties(wasi-emulated-getpid
9+
PROPERTIES
10+
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/sysroot/lib
11+
)
12+
13+
add_dependencies(wasi-emulated-getpid sysroot-headers)
14+
15+
add_custom_command(TARGET wasi-emulated-getpid POST_BUILD
16+
COMMAND ${CMAKE_C_COMPILER_AR} crs $<TARGET_FILE:c>
17+
)
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
file(GLOB_RECURSE
2+
MMAN_SOURCES
3+
${LIBC_BOTTOM_HALF_DIR}/mman/*.c)
4+
5+
add_library(wasi-emulated-mman STATIC
6+
${MMAN_SOURCES})
7+
8+
add_dependencies(wasi-emulated-mman sysroot-headers)
9+
10+
add_custom_command(TARGET wasi-emulated-mman POST_BUILD
11+
COMMAND ${CMAKE_C_COMPILER_AR} crs $<TARGET_FILE:c>
12+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
file(GLOB_RECURSE
2+
SIGNAL_SOURCES
3+
${LIBC_BOTTOM_HALF_DIR}/signal/*.c)
4+
5+
add_library(wasi-emulated-signal-objs
6+
OBJECT
7+
${SIGNAL_SOURCES}
8+
)
9+
10+
add_dependencies(wasi-emulated-signal-objs sysroot-headers)

cmake/libc-imports.cmake

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
add_custom_command(OUTPUT ${SYSROOT_LIB_DIR}/libc.imports
2+
COMMAND
3+
${Python_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/gen-imports.py
4+
--nm ${CMAKE_NM}
5+
--libc-imports-output ${SYSROOT_LIB_DIR}/libc.imports
6+
--defined-symbols-output ${SYSROOT_SHARE_DIR}/defined-symbols.txt
7+
--undefined-symbols-output ${SYSROOT_SHARE_DIR}/undefined-symbols.txt
8+
$<TARGET_FILE:c>
9+
$<TARGET_FILE:c-printscan-long-double>
10+
$<TARGET_FILE:c-printscan-no-floating-point>
11+
$<TARGET_FILE:wasi-emulated-mman>
12+
$<TARGET_FILE:wasi-emulated-process-clocks>
13+
$<TARGET_FILE:wasi-emulated-getpid>
14+
$<TARGET_FILE:wasi-emulated-signal>
15+
$<TARGET_OBJECTS:crt1>
16+
$<TARGET_OBJECTS:crt1-command>
17+
$<TARGET_OBJECTS:crt1-reactor>
18+
DEPENDS
19+
${PROJECT_SOURCE_DIR}/tools/gen-imports.py)
20+
21+
add_custom_target(libc.imports ALL
22+
DEPENDS ${SYSROOT_LIB_DIR}/libc.imports)
23+
add_dependencies(libc.imports
24+
c
25+
c-printscan-long-double
26+
c-printscan-no-floating-point
27+
wasi-emulated-mman
28+
wasi-emulated-process-clocks
29+
wasi-emulated-getpid
30+
wasi-emulated-signal
31+
crt1
32+
crt1-command
33+
crt1-reactor
34+
)

0 commit comments

Comments
 (0)