[libc-commits] [libc] 80cf21d - [libc] Fix unit test compile flags propagation. (#106128)
via libc-commits
libc-commits at lists.llvm.org
Fri Sep 6 08:56:11 PDT 2024
Author: lntue
Date: 2024-09-06T11:56:07-04:00
New Revision: 80cf21dad150ae8fb82e4a17f3bc594d1486b210
URL: https://github.com/llvm/llvm-project/commit/80cf21dad150ae8fb82e4a17f3bc594d1486b210
DIFF: https://github.com/llvm/llvm-project/commit/80cf21dad150ae8fb82e4a17f3bc594d1486b210.diff
LOG: [libc] Fix unit test compile flags propagation. (#106128)
With this change, I was able to build and test for aarch64 & riscv64 on
x86-64 host as follow:
Pre-requisite:
- cross build toolchain for aarch64
```
$ sudo apt install binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
```
- cross build toolchain for riscv64
```
$ sudo apt install binutils-riscv64-linux-gnu gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
```
- qemu user:
```
$ sudo apt install qemu qemu-user qemu-user-static
```
CMake invocation:
```
$ cmake ../runtimes -GNinja -DLLVM_ENABLE_RUNTIMES=libc -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBC_TARGET_TRIPLE=<aarch64-linux-gnu/riscv64-linux-gnu> -DCMAKE_BUILD_TYPE=Release -DLIBC_TEST_COMPILE_OPTIONS_DEFAULT="-static"
$ ninja libc
$ ninja check-libc
```
Added:
Modified:
libc/CMakeLists.txt
libc/cmake/modules/LLVMLibCArchitectures.cmake
libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake
libc/cmake/modules/LLVMLibCCheckMPFR.cmake
libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
libc/cmake/modules/LLVMLibCTestRules.cmake
libc/test/UnitTest/CMakeLists.txt
libc/test/integration/startup/CMakeLists.txt
libc/utils/MPFRWrapper/CMakeLists.txt
Removed:
################################################################################
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index dd45d6cc8cb6ab..c393d23a3b33d4 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -112,6 +112,7 @@ add_compile_definitions(LIBC_NAMESPACE=${LIBC_NAMESPACE})
# Flags to pass down to the compiler while building the libc functions.
set(LIBC_COMPILE_OPTIONS_DEFAULT "" CACHE STRING "Architecture to tell clang to optimize for (e.g. -march=... or -mcpu=...)")
+set(LIBC_TEST_COMPILE_OPTIONS_DEFAULT "" CACHE STRING "Common compile options for all the tests.")
list(APPEND LIBC_COMPILE_OPTIONS_DEFAULT ${LIBC_COMMON_TUNE_OPTIONS})
@@ -131,12 +132,31 @@ if(COMMAND_RETURN_CODE EQUAL 0)
message(STATUS "Set COMPILER_RESOURCE_DIR to "
"${COMPILER_RESOURCE_DIR} using --print-resource-dir")
else()
- if (LIBC_TARGET_OS_IS_GPU)
- message(FATAL_ERROR "COMPILER_RESOURCE_DIR must be set for GPU builds")
- else()
- set(COMPILER_RESOURCE_DIR OFF)
- message(STATUS "COMPILER_RESOURCE_DIR not set
- --print-resource-dir not supported by host compiler")
+ # Try with GCC option: -print-search-dirs, which will output in the form:
+ # install: <path>
+ # programs: ........
+ # So we try to capture the <path> after "install: " in the first line of the
+ # output.
+ execute_process(
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ COMMAND ${CMAKE_CXX_COMPILER} -print-search-dirs
+ RESULT_VARIABLE COMMAND_RETURN_CODE
+ OUTPUT_VARIABLE COMPILER_RESOURCE_DIR
+ )
+ if(COMMAND_RETURN_CODE EQUAL 0)
+ string(REPLACE " " ";" COMPILER_RESOURCE_DIR ${COMPILER_RESOURCE_DIR})
+ string(REPLACE "\n" ";" COMPILER_RESOURCE_DIR "${COMPILER_RESOURCE_DIR}")
+ list(GET COMPILER_RESOURCE_DIR 1 COMPILER_RESOURCE_DIR)
+ message(STATUS "Set COMPILER_RESOURCE_DIR to "
+ "${COMPILER_RESOURCE_DIR} using --print-search-dirs")
+else()
+ if (LIBC_TARGET_OS_IS_GPU)
+ message(FATAL_ERROR "COMPILER_RESOURCE_DIR must be set for GPU builds")
+ else()
+ set(COMPILER_RESOURCE_DIR OFF)
+ message(STATUS "COMPILER_RESOURCE_DIR not set
+ --print-resource-dir not supported by host compiler")
+ endif()
endif()
endif()
diff --git a/libc/cmake/modules/LLVMLibCArchitectures.cmake b/libc/cmake/modules/LLVMLibCArchitectures.cmake
index dacb4db75d3374..d922b4f21a8ac6 100644
--- a/libc/cmake/modules/LLVMLibCArchitectures.cmake
+++ b/libc/cmake/modules/LLVMLibCArchitectures.cmake
@@ -207,4 +207,5 @@ if(explicit_target_triple AND
endif()
message(STATUS
- "Building libc for ${LIBC_TARGET_ARCHITECTURE} on ${LIBC_TARGET_OS}")
+ "Building libc for ${LIBC_TARGET_ARCHITECTURE} on ${LIBC_TARGET_OS} with
+ LIBC_COMPILE_OPTIONS_DEFAULT: ${LIBC_COMPILE_OPTIONS_DEFAULT}")
diff --git a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake
index be569f6f9cabfb..3b6b6f56fc80cf 100644
--- a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake
+++ b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake
@@ -13,6 +13,10 @@ elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
set(LIBC_COMPILE_OPTIONS_NATIVE -mcpu=native)
endif()
+if(LIBC_CROSSBUILD)
+ set(LIBC_COMPILE_OPTIONS_NATIVE ${LIBC_COMPILE_OPTIONS_DEFAULT})
+endif()
+
# Making sure ALL_CPU_FEATURES is sorted.
list(SORT ALL_CPU_FEATURES)
diff --git a/libc/cmake/modules/LLVMLibCCheckMPFR.cmake b/libc/cmake/modules/LLVMLibCCheckMPFR.cmake
index a27c2dc0c030bc..95815deb072986 100644
--- a/libc/cmake/modules/LLVMLibCCheckMPFR.cmake
+++ b/libc/cmake/modules/LLVMLibCCheckMPFR.cmake
@@ -11,7 +11,9 @@ else()
LIBC_TESTS_CAN_USE_MPFR
${CMAKE_CURRENT_BINARY_DIR}
SOURCES
- ${LIBC_SOURCE_DIR}/utils/MPFRWrapper/check_mpfr.cpp
+ ${LIBC_SOURCE_DIR}/utils/MPFRWrapper/check_mpfr.cpp
+ COMPILE_DEFINITIONS
+ ${LIBC_COMPILE_OPTIONS_DEFAULT}
LINK_LIBRARIES
-lmpfr -lgmp -latomic
)
diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
index e3dfe1a1529691..45dfe3e63302bf 100644
--- a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
+++ b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
@@ -188,7 +188,10 @@ endfunction()
function(_get_common_test_compile_options output_var c_test flags)
_get_compile_options_from_flags(compile_flags ${flags})
- set(compile_options ${LIBC_COMPILE_OPTIONS_DEFAULT} ${compile_flags})
+ set(compile_options
+ ${LIBC_COMPILE_OPTIONS_DEFAULT}
+ ${LIBC_TEST_COMPILE_OPTIONS_DEFAULT}
+ ${compile_flags})
if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
list(APPEND compile_options "-fpie")
@@ -232,9 +235,12 @@ function(_get_common_test_compile_options output_var c_test flags)
endfunction()
function(_get_hermetic_test_compile_options output_var flags)
- _get_compile_options_from_flags(compile_flags ${flags})
- list(APPEND compile_options ${LIBC_COMPILE_OPTIONS_DEFAULT} ${compile_flags}
- ${flags} -fpie -ffreestanding -fno-exceptions -fno-rtti)
+ _get_common_test_compile_options(compile_options "" "${flags}")
+
+ list(APPEND compile_options "-fpie")
+ list(APPEND compile_options "-ffreestanding")
+ list(APPEND compile_options "-fno-exceptions")
+ list(APPEND compile_options "-fno-rtti")
# The GPU build requires overriding the default CMake triple and architecture.
if(LIBC_TARGET_ARCHITECTURE_IS_AMDGPU)
@@ -248,9 +254,5 @@ function(_get_hermetic_test_compile_options output_var flags)
-nogpulib -march=${LIBC_GPU_TARGET_ARCHITECTURE} -fno-use-cxa-atexit)
endif()
- if(LLVM_LIBC_FULL_BUILD)
- list(APPEND compile_options "-DLIBC_FULL_BUILD")
- endif()
-
set(${output_var} ${compile_options} PARENT_SCOPE)
endfunction()
diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake
index d8097855d16377..1f6ccb27f35f02 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -192,6 +192,7 @@ function(create_libc_unittest fq_target_name)
target_include_directories(${fq_build_target_name} SYSTEM PRIVATE ${LIBC_INCLUDE_DIR})
target_include_directories(${fq_build_target_name} PRIVATE ${LIBC_SOURCE_DIR})
target_compile_options(${fq_build_target_name} PRIVATE ${compile_options})
+ target_link_options(${fq_build_target_name} PRIVATE ${compile_options})
if(NOT LIBC_UNITTEST_CXX_STANDARD)
set(LIBC_UNITTEST_CXX_STANDARD ${CMAKE_CXX_STANDARD})
@@ -465,8 +466,9 @@ function(add_integration_test test_name)
target_include_directories(${fq_build_target_name} SYSTEM PRIVATE ${LIBC_INCLUDE_DIR})
target_include_directories(${fq_build_target_name} PRIVATE ${LIBC_SOURCE_DIR})
- _get_hermetic_test_compile_options(compile_options "${INTEGRATION_TEST_COMPILE_OPTIONS}")
- target_compile_options(${fq_build_target_name} PRIVATE ${compile_options})
+ _get_hermetic_test_compile_options(compile_options "")
+ target_compile_options(${fq_build_target_name} PRIVATE
+ ${compile_options} ${INTEGRATION_TEST_COMPILE_OPTIONS})
if(LIBC_TARGET_ARCHITECTURE_IS_AMDGPU)
target_link_options(${fq_build_target_name} PRIVATE
@@ -638,11 +640,12 @@ function(add_libc_hermetic test_name)
#OUTPUT_NAME ${fq_target_name}
)
- _get_hermetic_test_compile_options(compile_options "${HERMETIC_TEST_COMPILE_OPTIONS}")
target_include_directories(${fq_build_target_name} SYSTEM PRIVATE ${LIBC_INCLUDE_DIR})
target_include_directories(${fq_build_target_name} PRIVATE ${LIBC_SOURCE_DIR})
- _get_hermetic_test_compile_options(compile_options "${HERMETIC_TEST_COMPILE_OPTIONS}")
- target_compile_options(${fq_build_target_name} PRIVATE ${compile_options})
+ _get_hermetic_test_compile_options(compile_options "")
+ target_compile_options(${fq_build_target_name} PRIVATE
+ ${compile_options}
+ ${HERMETIC_TEST_COMPILE_OPTIONS})
set(link_libraries "")
foreach(lib IN LISTS HERMETIC_TEST_LINK_LIBRARIES)
diff --git a/libc/test/UnitTest/CMakeLists.txt b/libc/test/UnitTest/CMakeLists.txt
index 6427b861580777..570bd600d1a430 100644
--- a/libc/test/UnitTest/CMakeLists.txt
+++ b/libc/test/UnitTest/CMakeLists.txt
@@ -19,19 +19,27 @@ function(add_unittest_framework_library name)
${TEST_LIB_SRCS}
${TEST_LIB_HDRS}
)
- target_include_directories(${lib} PUBLIC ${LIBC_SOURCE_DIR})
- list(APPEND compile_options -fno-exceptions -fno-rtti)
+ target_include_directories(${lib} PRIVATE ${LIBC_SOURCE_DIR})
if(TARGET libc.src.time.clock)
target_compile_definitions(${lib} PRIVATE TARGET_SUPPORTS_CLOCK)
endif()
- if(LIBC_COMPILER_HAS_FIXED_POINT)
- list(APPEND compile_options -ffixed-point)
- endif()
- target_compile_options(${lib} PUBLIC ${compile_options})
endforeach()
- _get_hermetic_test_compile_options(compile_options -nostdinc++)
- target_include_directories(${name}.hermetic PRIVATE ${LIBC_BUILD_DIR}/include)
- target_compile_options(${name}.hermetic PRIVATE ${compile_options})
+
+ if(LLVM_LIBC_FULL_BUILD)
+ # TODO: Build test framework with LIBC_FULL_BUILD in full build mode after
+ # making LibcFPExceptionHelpers and LibcDeathTestExecutors hermetic.
+ set(LLVM_LIBC_FULL_BUILD "")
+ _get_common_test_compile_options(compile_options "" "")
+ target_compile_options(${name}.unit PRIVATE ${compile_options})
+ set(LLVM_LIBC_FULL_BUILD ON)
+ else()
+ _get_common_test_compile_options(compile_options "" "")
+ target_compile_options(${name}.unit PRIVATE ${compile_options})
+endif()
+
+ _get_hermetic_test_compile_options(compile_options "")
+ target_include_directories(${name}.hermetic PRIVATE ${LIBC_INCLUDE_DIR})
+ target_compile_options(${name}.hermetic PRIVATE ${compile_options} -nostdinc++)
if(TEST_LIB_DEPENDS)
foreach(dep IN ITEMS ${TEST_LIB_DEPENDS})
diff --git a/libc/test/integration/startup/CMakeLists.txt b/libc/test/integration/startup/CMakeLists.txt
index fb5d6bc787cc26..3a01d49b5e6c48 100644
--- a/libc/test/integration/startup/CMakeLists.txt
+++ b/libc/test/integration/startup/CMakeLists.txt
@@ -32,7 +32,7 @@ function(add_startup_test target_name)
PRIVATE
${LIBC_SOURCE_DIR}
${LIBC_BUILD_DIR}
- ${LIBC_BUILD_DIR}/include
+ ${LIBC_INCLUDE_DIR}
)
if(ADD_STARTUP_TEST_DEPENDS)
diff --git a/libc/utils/MPFRWrapper/CMakeLists.txt b/libc/utils/MPFRWrapper/CMakeLists.txt
index be0415d0956fa4..e6d3b5af9dc297 100644
--- a/libc/utils/MPFRWrapper/CMakeLists.txt
+++ b/libc/utils/MPFRWrapper/CMakeLists.txt
@@ -4,7 +4,8 @@ if(LIBC_TESTS_CAN_USE_MPFR)
MPFRUtils.h
mpfr_inc.h
)
- target_compile_options(libcMPFRWrapper PRIVATE -O3)
+ _get_common_test_compile_options(compile_options "" "")
+ target_compile_options(libcMPFRWrapper PRIVATE -O3 ${compile_options})
add_dependencies(
libcMPFRWrapper
libc.src.__support.CPP.array
@@ -19,6 +20,7 @@ if(LIBC_TESTS_CAN_USE_MPFR)
target_include_directories(libcMPFRWrapper PUBLIC ${LLVM_LIBC_MPFR_INSTALL_PATH}/include)
target_link_directories(libcMPFRWrapper PUBLIC ${LLVM_LIBC_MPFR_INSTALL_PATH}/lib)
endif()
+ target_include_directories(libcMPFRWrapper PUBLIC ${LIBC_SOURCE_DIR})
target_link_libraries(libcMPFRWrapper PUBLIC LibcFPTestHelpers.unit LibcTest.unit mpfr gmp)
elseif(NOT LIBC_TARGET_OS_IS_GPU AND NOT LLVM_LIBC_FULL_BUILD)
message(WARNING "Math tests using MPFR will be skipped.")
More information about the libc-commits
mailing list