diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt index 0bf1e3b427fc..95c3b6c66b59 100644 --- a/libc/CMakeLists.txt +++ b/libc/CMakeLists.txt @@ -62,6 +62,8 @@ else() (pass -DLLVM_LIBC_ENABLE_LINTING=ON to cmake).") endif() +option(LLVM_LIBC_FULL_BUILD "Build and test LLVM libc as if it is the full libc" OFF) + include(CMakeParseArguments) include(LLVMLibCRules) include(LLVMLibCCheckCpuFeatures) @@ -81,18 +83,22 @@ foreach(entrypoint IN LISTS TARGET_LLVMLIBC_ENTRYPOINTS) list(APPEND TARGET_ENTRYPOINT_NAME_LIST ${entrypoint_name}) endforeach() -# We need to set up hdrgen first since other targets depend on it. -add_subdirectory(utils/LibcTableGenUtil) -add_subdirectory(utils/HdrGen) +if(LLVM_LIBC_FULL_BUILD) + # We need to set up hdrgen first since other targets depend on it. + add_subdirectory(utils/LibcTableGenUtil) + add_subdirectory(utils/HdrGen) +endif() add_subdirectory(include) add_subdirectory(config) add_subdirectory(src) add_subdirectory(utils) -# The loader can potentially depend on the library components so add it -# after the library implementation directories. -add_subdirectory(loader) +if(LLVM_LIBC_FULL_BUILD) + # The loader can potentially depend on the library components so add it + # after the library implementation directories. + add_subdirectory(loader) +endif() # The lib and test directories are added at the very end as tests # and libraries potentially draw from the components present in all diff --git a/libc/cmake/modules/LLVMLibCHeaderRules.cmake b/libc/cmake/modules/LLVMLibCHeaderRules.cmake index ab1f6fe161bd..c9bf46613231 100644 --- a/libc/cmake/modules/LLVMLibCHeaderRules.cmake +++ b/libc/cmake/modules/LLVMLibCHeaderRules.cmake @@ -58,6 +58,12 @@ function(add_gen_header target_name) "PARAMS;DATA_FILES;DEPENDS" # Multi value arguments ${ARGN} ) + get_fq_target_name(${target_name} fq_target_name) + if(NOT LLVM_LIBC_FULL_BUILD) + # We don't want to use generated headers if we are doing a non-full-build. + add_custom_target(${fq_target_name}) + return() + endif() if(NOT ADD_GEN_HDR_DEF_FILE) message(FATAL_ERROR "`add_gen_hdr` rule requires DEF_FILE to be specified.") endif() @@ -100,7 +106,6 @@ function(add_gen_header target_name) ${LIBC_TABLEGEN_EXE} ${LIBC_TABLEGEN_TARGET} ) - get_fq_target_name(${target_name} fq_target_name) if(ADD_GEN_HDR_DEPENDS) get_fq_deps_list(fq_deps_list ${ADD_GEN_HDR_DEPENDS}) endif() diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 5e5c8fc3509c..a3fffae6e578 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -1,7 +1,4 @@ set(TARGET_LIBC_ENTRYPOINTS - # assert.h entrypoints - libc.src.assert.__assert_fail - # ctype.h entrypoints libc.src.ctype.isalnum libc.src.ctype.isalpha @@ -23,23 +20,6 @@ set(TARGET_LIBC_ENTRYPOINTS # errno.h entrypoints libc.src.errno.__errno_location - # signal.h entrypoints - libc.src.signal.raise - libc.src.signal.sigaction - libc.src.signal.sigdelset - libc.src.signal.sigaddset - libc.src.signal.sigemptyset - libc.src.signal.sigprocmask - libc.src.signal.sigfillset - libc.src.signal.signal - - # stdlib.h entrypoints - libc.src.stdlib._Exit - libc.src.stdlib.abort - libc.src.stdlib.abs - libc.src.stdlib.labs - libc.src.stdlib.llabs - # string.h entrypoints libc.src.string.bzero libc.src.string.memchr @@ -62,24 +42,6 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.string.strstr libc.src.string.strtok libc.src.string.strtok_r - - # sys/mman.h entrypoints - libc.src.sys.mman.mmap - libc.src.sys.mman.munmap - - # threads.h entrypoints - libc.src.threads.call_once - libc.src.threads.mtx_init - libc.src.threads.mtx_lock - libc.src.threads.mtx_unlock - libc.src.threads.thrd_create - libc.src.threads.thrd_join - - # time.h entrypoints - libc.src.time.mktime - - # unistd.h entrypoints - libc.src.unistd.write ) set(TARGET_LIBM_ENTRYPOINTS @@ -179,6 +141,48 @@ set(TARGET_LIBM_ENTRYPOINTS libc.src.math.truncl ) +if(LLVM_LIBC_FULL_BUILD) + list(APPEND TARGET_LIBC_ENTRYPOINTS + # assert.h entrypoints + libc.src.assert.__assert_fail + + # stdlib.h entrypoints + libc.src.stdlib._Exit + libc.src.stdlib.abort + libc.src.stdlib.abs + libc.src.stdlib.labs + libc.src.stdlib.llabs + + # signal.h entrypoints + libc.src.signal.raise + libc.src.signal.sigaction + libc.src.signal.sigdelset + libc.src.signal.sigaddset + libc.src.signal.sigemptyset + libc.src.signal.sigprocmask + libc.src.signal.sigfillset + libc.src.signal.signal + + # sys/mman.h entrypoints + libc.src.sys.mman.mmap + libc.src.sys.mman.munmap + + # threads.h entrypoints + libc.src.threads.call_once + libc.src.threads.mtx_init + libc.src.threads.mtx_lock + libc.src.threads.mtx_unlock + libc.src.threads.thrd_create + libc.src.threads.thrd_join + + # time.h entrypoints + libc.src.time.mktime + + # unistd.h entrypoints + libc.src.unistd.write + ) +endif() + set(TARGET_LLVMLIBC_ENTRYPOINTS ${TARGET_LIBC_ENTRYPOINTS} ${TARGET_LIBM_ENTRYPOINTS} diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt index 8f389bce6d2a..db270217d22c 100644 --- a/libc/src/CMakeLists.txt +++ b/libc/src/CMakeLists.txt @@ -1,16 +1,21 @@ -add_subdirectory(assert) +add_subdirectory(__support) + add_subdirectory(ctype) add_subdirectory(errno) add_subdirectory(fenv) add_subdirectory(math) +add_subdirectory(string) + +if(NOT LLVM_LIBC_FULL_BUILD) + return() +endif() + +add_subdirectory(assert) add_subdirectory(signal) add_subdirectory(stdio) add_subdirectory(stdlib) -add_subdirectory(string) # TODO: Add this target conditional to the target OS. add_subdirectory(sys) add_subdirectory(threads) add_subdirectory(time) add_subdirectory(unistd) - -add_subdirectory(__support) diff --git a/libc/test/CMakeLists.txt b/libc/test/CMakeLists.txt index 100c8ffd4b69..1187ba553d5a 100644 --- a/libc/test/CMakeLists.txt +++ b/libc/test/CMakeLists.txt @@ -7,7 +7,12 @@ add_header_library( add_custom_target(check-libc) add_custom_target(exhaustive-check-libc) -add_subdirectory(config) -add_subdirectory(loader) add_subdirectory(src) add_subdirectory(utils) + +if(NOT LLVM_LIBC_FULL_BUILD) + return() +endif() + +add_subdirectory(config) +add_subdirectory(loader) diff --git a/libc/test/src/CMakeLists.txt b/libc/test/src/CMakeLists.txt index 291925f5db2d..8638dea06e74 100644 --- a/libc/test/src/CMakeLists.txt +++ b/libc/test/src/CMakeLists.txt @@ -1,8 +1,13 @@ -add_subdirectory(assert) add_subdirectory(ctype) add_subdirectory(errno) add_subdirectory(fenv) add_subdirectory(math) + +if(NOT LLVM_LIBC_FULL_BUILD) + return() +endif() + +add_subdirectory(assert) add_subdirectory(signal) add_subdirectory(stdio) add_subdirectory(stdlib) diff --git a/libc/test/utils/CMakeLists.txt b/libc/test/utils/CMakeLists.txt index c796961afc34..b658c827cc25 100644 --- a/libc/test/utils/CMakeLists.txt +++ b/libc/test/utils/CMakeLists.txt @@ -1,3 +1,8 @@ add_subdirectory(FPUtil) add_subdirectory(CPP) + +if(NOT LLVM_LIBC_FULL_BUILD) + return() +endif() + add_subdirectory(tools) diff --git a/libc/utils/CMakeLists.txt b/libc/utils/CMakeLists.txt index dfee2646b9b1..6655cb116349 100644 --- a/libc/utils/CMakeLists.txt +++ b/libc/utils/CMakeLists.txt @@ -2,5 +2,8 @@ add_subdirectory(CPP) add_subdirectory(FPUtil) add_subdirectory(MPFRWrapper) add_subdirectory(testutils) -add_subdirectory(tools) add_subdirectory(UnitTest) + +if(LLVM_LIBC_FULL_BUILD) + add_subdirectory(tools) +endif()