diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:44:14 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:44:14 +0000 |
| commit | 2b6b257f4e5503a7a2675bdb8735693db769f75c (patch) | |
| tree | e85e046ae7003fe3bcc8b5454cd0fa3f7407b470 /cmake | |
| parent | b4348ed0b7e90c0831b925fbee00b5f179a99796 (diff) | |
Notes
Diffstat (limited to 'cmake')
| -rw-r--r-- | cmake/caches/3-stage-base.cmake | 15 | ||||
| -rw-r--r-- | cmake/caches/3-stage.cmake | 16 | ||||
| -rw-r--r-- | cmake/caches/Apple-stage1.cmake | 23 | ||||
| -rw-r--r-- | cmake/caches/Apple-stage2.cmake | 50 | ||||
| -rw-r--r-- | cmake/caches/README.txt | 72 | ||||
| -rw-r--r-- | cmake/modules/AddClang.cmake | 149 | ||||
| -rw-r--r-- | cmake/modules/CMakeLists.txt | 47 | ||||
| -rw-r--r-- | cmake/modules/ClangConfig.cmake | 8 | ||||
| -rw-r--r-- | cmake/modules/ClangConfig.cmake.in | 11 |
9 files changed, 364 insertions, 27 deletions
diff --git a/cmake/caches/3-stage-base.cmake b/cmake/caches/3-stage-base.cmake new file mode 100644 index 000000000000..46c747edd778 --- /dev/null +++ b/cmake/caches/3-stage-base.cmake @@ -0,0 +1,15 @@ +set(CMAKE_BUILD_TYPE RELEASE CACHE STRING "") +set(CLANG_ENABLE_BOOTSTRAP ON CACHE BOOL "") +set(LLVM_BUILD_EXTERNAL_COMPILER_RT ON CACHE BOOL "") +set(BOOTSTRAP_LLVM_ENABLE_LTO ON CACHE BOOL "") + +set(CLANG_BOOTSTRAP_TARGETS + clang + check-all + check-llvm + check-clang + test-suite CACHE STRING "") + +set(CLANG_BOOTSTRAP_CMAKE_ARGS + -C ${CMAKE_CURRENT_LIST_DIR}/3-stage-base.cmake + CACHE STRING "") diff --git a/cmake/caches/3-stage.cmake b/cmake/caches/3-stage.cmake new file mode 100644 index 000000000000..49bce39dfc98 --- /dev/null +++ b/cmake/caches/3-stage.cmake @@ -0,0 +1,16 @@ +set(CLANG_BOOTSTRAP_TARGETS + clang + check-all + check-llvm + check-clang + test-suite + stage3 + stage3-clang + stage3-check-all + stage3-check-llvm + stage3-check-clang + stage3-test-suite CACHE STRING "") + +set(LLVM_TARGETS_TO_BUILD Native CACHE STRING "") + +include(${CMAKE_CURRENT_LIST_DIR}/3-stage-base.cmake) diff --git a/cmake/caches/Apple-stage1.cmake b/cmake/caches/Apple-stage1.cmake index a5c3fdbbdfd0..814cfdf48603 100644 --- a/cmake/caches/Apple-stage1.cmake +++ b/cmake/caches/Apple-stage1.cmake @@ -16,15 +16,36 @@ set(LLVM_INCLUDE_DOCS OFF CACHE BOOL "") set(CLANG_INCLUDE_TESTS OFF CACHE BOOL "") set(COMPILER_RT_INCLUDE_TESTS OFF CACHE BOOL "") set(COMPILER_RT_BUILD_SANITIZERS OFF CACHE BOOL "") +set(CMAKE_MACOSX_RPATH ON CACHE BOOL "") +set(LLVM_ENABLE_ZLIB OFF CACHE BOOL "") +set(LLVM_ENABLE_BACKTRACES OFF CACHE BOOL "") +set(CLANG_PLUGIN_SUPPORT OFF CACHE BOOL "") +set(CLANG_BOOTSTRAP_PASSTHROUGH + CMAKE_OSX_ARCHITECTURES + CACHE STRING "") +set(BOOTSTRAP_LLVM_ENABLE_LTO ON CACHE BOOL "") set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "") -set(PACKAGE_VERSION 7.1.0 CACHE STRING "") # LIBCXX Settings set(LIBCXX_INSTALL_LIBRARY OFF CACHE BOOL "") set(LIBCXX_INSTALL_HEADERS ON CACHE BOOL "") set(LIBCXX_OVERRIDE_DARWIN_INSTALL ON CACHE BOOL "") +set(CLANG_BOOTSTRAP_TARGETS + generate-order-file + check-all + check-llvm + check-clang + llvm-config + test-suite + test-depends + llvm-test-depends + clang-test-depends + distribution + install-distribution + clang CACHE STRING "") + #bootstrap set(CLANG_ENABLE_BOOTSTRAP ON CACHE BOOL "") set(CLANG_BOOTSTRAP_CMAKE_ARGS diff --git a/cmake/caches/Apple-stage2.cmake b/cmake/caches/Apple-stage2.cmake index bb319aaeb86c..9076868fd6d4 100644 --- a/cmake/caches/Apple-stage2.cmake +++ b/cmake/caches/Apple-stage2.cmake @@ -2,23 +2,37 @@ # specified by the stage1 build. set(LLVM_TARGETS_TO_BUILD X86 ARM AArch64 CACHE STRING "") -set(CLANG_VENDOR Apple CACHE STRING "") -set(LLVM_INCLUDE_TESTS OFF CACHE BOOL "") +set(PACKAGE_VENDOR Apple CACHE STRING "") set(LLVM_INCLUDE_EXAMPLES OFF CACHE BOOL "") -set(LLVM_INCLUDE_UTILS OFF CACHE BOOL "") set(LLVM_INCLUDE_DOCS OFF CACHE BOOL "") -set(CLANG_INCLUDE_TESTS OFF CACHE BOOL "") -set(COMPILER_RT_INCLUDE_TESTS OFF CACHE BOOL "") -set(COMPILER_RT_BUILD_SANITIZERS OFF CACHE BOOL "") +set(LLVM_TOOL_CLANG_TOOLS_EXTRA_BUILD OFF CACHE BOOL "") +set(CLANG_TOOL_SCAN_BUILD_BUILD OFF CACHE BOOL "") +set(CLANG_TOOL_SCAN_VIEW_BUILD OFF CACHE BOOL "") set(CLANG_LINKS_TO_CREATE clang++ cc c++ CACHE STRING "") +set(CMAKE_MACOSX_RPATH ON CACHE BOOL "") +set(LLVM_ENABLE_ZLIB ON CACHE BOOL "") +set(LLVM_ENABLE_BACKTRACES OFF CACHE BOOL "") +set(LLVM_EXTERNALIZE_DEBUGINFO ON CACHE BOOL "") +set(CLANG_PLUGIN_SUPPORT OFF CACHE BOOL "") +set(BUG_REPORT_URL "http://developer.apple.com/bugreporter/" CACHE STRING "") -set(CMAKE_C_FLAGS_RELWITHDEBINFO "-Os -flto -gline-tables-only -DNDEBUG" CACHE STRING "") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Os -flto -gline-tables-only -DNDEBUG" CACHE STRING "") +set(LLVM_BUILD_EXTERNAL_COMPILER_RT ON CACHE BOOL "Build Compiler-RT with just-built clang") +set(COMPILER_RT_ENABLE_IOS ON CACHE BOOL "Build iOS Compiler-RT libraries") + +# Make unit tests (if present) part of the ALL target +set(LLVM_BUILD_TESTS ON CACHE BOOL "") + +set(LLVM_ENABLE_LTO ON CACHE BOOL "") +set(CMAKE_C_FLAGS "-fno-stack-protector -fno-common -Wno-profile-instr-unprofiled" CACHE STRING "") +set(CMAKE_CXX_FLAGS "-fno-stack-protector -fno-common -Wno-profile-instr-unprofiled" CACHE STRING "") +set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -gline-tables-only -DNDEBUG" CACHE STRING "") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -gline-tables-only -DNDEBUG" CACHE STRING "") set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "") -set(PACKAGE_VERSION 7.1.0 CACHE STRING "") set(LIBCXX_INSTALL_LIBRARY OFF CACHE BOOL "") -set(LIBCXX_INSTALL_HEADERS OFF CACHE BOOL "") +set(LIBCXX_INSTALL_HEADERS ON CACHE BOOL "") +set(LIBCXX_INCLUDE_TESTS OFF CACHE BOOL "") +set(LLVM_LTO_VERSION_OFFSET 3000 CACHE STRING "") # setup toolchain set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "") @@ -27,4 +41,20 @@ set(LLVM_TOOLCHAIN_TOOLS llvm-cov llvm-dwarfdump llvm-profdata + llvm-objdump + llvm-nm + llvm-size + CACHE STRING "") + +set(LLVM_DISTRIBUTION_COMPONENTS + clang + LTO + clang-format + clang-headers + libcxx-headers + ${LLVM_TOOLCHAIN_TOOLS} CACHE STRING "") + +# test args + +set(LLVM_LIT_ARGS "--xunit-xml-output=testresults.xunit.xml -v" CACHE STRING "") diff --git a/cmake/caches/README.txt b/cmake/caches/README.txt index 55e5e159db13..db5c85a68fa1 100644 --- a/cmake/caches/README.txt +++ b/cmake/caches/README.txt @@ -4,15 +4,71 @@ CMake Caches This directory contains CMake cache scripts that pre-populate the CMakeCache in a build directory with commonly used settings. -The first two cache files in the directory are used by Apple to build the clang -distribution packaged with Xcode. You can use the caches with the following -CMake invocation: +You can use the caches files with the following CMake invocation: cmake -G <build system> - -C <path to llvm>/tools/clang/cmake/caches/Apple-stage1.cmake - -DCMAKE_BUILD_TYPE=Release - [-DCMAKE_INSTALL_PREFIX=<install path>] + -C <path to cache file> + [additional CMake options (i.e. -DCMAKE_INSTALL_PREFIX=<install path>)] <path to llvm> -Building the `bootstrap` target from this generation will build clang, and -`bootstrap-install` will install it. +Options specified on the command line will override options in the cache files. + +The following cache files exist. + +Apple-stage1 +------------ + +The Apple stage1 cache configures a two stage build similar to how Apple builds +the clang shipped with Xcode. The build files generated from this invocation has +a target named "stage2" which performs an LTO build of clang. + +The Apple-stage2 cache can be used directly to match the build settings Apple +uses in shipping builds without doing a full bootstrap build. + +PGO +--- + +The PGO CMake cache can be used to generate a multi-stage instrumented compiler. +You can configure your build directory with the following invocation of CMake: + +cmake -G <generator> -C <path_to_clang>/cmake/caches/PGO.cmake <source dir> + +After configuration the following additional targets will be generated: + +stage2-instrumented: +Builds a stage1 x86 compiler, runtime, and required tools (llvm-config, +llvm-profdata) then uses that compiler to build an instrumented stage2 compiler. + +stage2-instrumented-generate-profdata: +Depends on "stage2-instrumented" and will use the instrumented compiler to +generate profdata based on the training files in <clang>/utils/perf-training + +stage2: +Depends on "stage2-instrumented-generate-profdata" and will use the stage1 +compiler with the stage2 profdata to build a PGO-optimized compiler. + +stage2-check-llvm: +Depends on stage2 and runs check-llvm using the stage3 compiler. + +stage2-check-clang: +Depends on stage2 and runs check-clang using the stage3 compiler. + +stage2-check-all: +Depends on stage2 and runs check-all using the stage3 compiler. + +stage2-test-suite: +Depends on stage2 and runs the test-suite using the stage3 compiler (requires +in-tree test-suite). + +3-stage +------- + +This cache file can be used to generate a 3-stage clang build. You can configure +using the following CMake command: + +cmake -C <path to clang>/cmake/caches/3-stage.cmake -G Ninja <path to llvm> + +You can then run "ninja stage3-clang" to build stage1, stage2 and stage3 clangs. + +This is useful for finding non-determinism the compiler by verifying that stage2 +and stage3 are identical. diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake new file mode 100644 index 000000000000..6e063a706bf2 --- /dev/null +++ b/cmake/modules/AddClang.cmake @@ -0,0 +1,149 @@ +function(clang_tablegen) + # Syntax: + # clang_tablegen output-file [tablegen-arg ...] SOURCE source-file + # [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]] + # + # Generates a custom command for invoking tblgen as + # + # tblgen source-file -o=output-file tablegen-arg ... + # + # and, if cmake-target-name is provided, creates a custom target for + # executing the custom command depending on output-file. It is + # possible to list more files to depend after DEPENDS. + + cmake_parse_arguments(CTG "" "SOURCE;TARGET" "" ${ARGN}) + + if( NOT CTG_SOURCE ) + message(FATAL_ERROR "SOURCE source-file required by clang_tablegen") + endif() + + set( LLVM_TARGET_DEFINITIONS ${CTG_SOURCE} ) + tablegen(CLANG ${CTG_UNPARSED_ARGUMENTS}) + + if(CTG_TARGET) + add_public_tablegen_target(${CTG_TARGET}) + set_target_properties( ${CTG_TARGET} PROPERTIES FOLDER "Clang tablegenning") + set_property(GLOBAL APPEND PROPERTY CLANG_TABLEGEN_TARGETS ${CTG_TARGET}) + endif() +endfunction(clang_tablegen) + +macro(set_clang_windows_version_resource_properties name) + if(DEFINED windows_resource_file) + set_windows_version_resource_properties(${name} ${windows_resource_file} + VERSION_MAJOR ${CLANG_VERSION_MAJOR} + VERSION_MINOR ${CLANG_VERSION_MINOR} + VERSION_PATCHLEVEL ${CLANG_VERSION_PATCHLEVEL} + VERSION_STRING "${CLANG_VERSION} (${BACKEND_PACKAGE_STRING})" + PRODUCT_NAME "clang") + endif() +endmacro() + +macro(add_clang_subdirectory name) + add_llvm_subdirectory(CLANG TOOL ${name}) +endmacro() + +macro(add_clang_library name) + cmake_parse_arguments(ARG + "SHARED" + "" + "ADDITIONAL_HEADERS" + ${ARGN}) + set(srcs) + if(MSVC_IDE OR XCODE) + # Add public headers + file(RELATIVE_PATH lib_path + ${CLANG_SOURCE_DIR}/lib/ + ${CMAKE_CURRENT_SOURCE_DIR} + ) + if(NOT lib_path MATCHES "^[.][.]") + file( GLOB_RECURSE headers + ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.h + ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.def + ) + set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON) + + file( GLOB_RECURSE tds + ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.td + ) + source_group("TableGen descriptions" FILES ${tds}) + set_source_files_properties(${tds}} PROPERTIES HEADER_FILE_ONLY ON) + + if(headers OR tds) + set(srcs ${headers} ${tds}) + endif() + endif() + endif(MSVC_IDE OR XCODE) + if(srcs OR ARG_ADDITIONAL_HEADERS) + set(srcs + ADDITIONAL_HEADERS + ${srcs} + ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args. + ) + endif() + if(ARG_SHARED) + set(ARG_ENABLE_SHARED SHARED) + endif() + llvm_add_library(${name} ${ARG_ENABLE_SHARED} ${ARG_UNPARSED_ARGUMENTS} ${srcs}) + + if(TARGET ${name}) + target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS}) + + if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libclang") + install(TARGETS ${name} + COMPONENT ${name} + EXPORT ClangTargets + LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} + ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} + RUNTIME DESTINATION bin) + + if (${ARG_SHARED} AND NOT CMAKE_CONFIGURATION_TYPES) + add_custom_target(install-${name} + DEPENDS ${name} + COMMAND "${CMAKE_COMMAND}" + -DCMAKE_INSTALL_COMPONENT=${name} + -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") + endif() + endif() + set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name}) + else() + # Add empty "phony" target + add_custom_target(${name}) + endif() + + set_target_properties(${name} PROPERTIES FOLDER "Clang libraries") + set_clang_windows_version_resource_properties(${name}) +endmacro(add_clang_library) + +macro(add_clang_executable name) + add_llvm_executable( ${name} ${ARGN} ) + set_target_properties(${name} PROPERTIES FOLDER "Clang executables") + set_clang_windows_version_resource_properties(${name}) +endmacro(add_clang_executable) + +macro(add_clang_tool name) + if (NOT CLANG_BUILD_TOOLS) + set(EXCLUDE_FROM_ALL ON) + endif() + + add_clang_executable(${name} ${ARGN}) + + if (CLANG_BUILD_TOOLS) + install(TARGETS ${name} + RUNTIME DESTINATION bin + COMPONENT ${name}) + + if(NOT CMAKE_CONFIGURATION_TYPES) + add_custom_target(install-${name} + DEPENDS ${name} + COMMAND "${CMAKE_COMMAND}" + -DCMAKE_INSTALL_COMPONENT=${name} + -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") + endif() + endif() +endmacro() + +macro(add_clang_symlink name dest) + add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE) + # Always generate install targets + llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE) +endmacro() diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt new file mode 100644 index 000000000000..3cc808a46b95 --- /dev/null +++ b/cmake/modules/CMakeLists.txt @@ -0,0 +1,47 @@ +# Generate a list of CMake library targets so that other CMake projects can +# link against them. LLVM calls its version of this file LLVMExports.cmake, but +# the usual CMake convention seems to be ${Project}Targets.cmake. +set(CLANG_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/clang) +set(clang_cmake_builddir "${CMAKE_BINARY_DIR}/${CLANG_INSTALL_PACKAGE_DIR}") + +get_property(CLANG_EXPORTS GLOBAL PROPERTY CLANG_EXPORTS) +export(TARGETS ${CLANG_EXPORTS} FILE ${clang_cmake_builddir}/ClangTargets.cmake) + +# Generate ClangConfig.cmake for the build tree. +set(CLANG_CONFIG_CMAKE_DIR "${clang_cmake_builddir}") +set(CLANG_CONFIG_EXPORTS_FILE "${clang_cmake_builddir}/ClangTargets.cmake") +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in + ${clang_cmake_builddir}/ClangConfig.cmake + @ONLY) +set(CLANG_CONFIG_CMAKE_DIR) +set(CLANG_CONFIG_EXPORTS_FILE) + +# Generate ClangConfig.cmake for the install tree. +set(CLANG_CONFIG_CODE " +# Compute the installation prefix from this LLVMConfig.cmake file location. +get_filename_component(CLANG_INSTALL_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)") +# Construct the proper number of get_filename_component(... PATH) +# calls to compute the installation prefix. +string(REGEX REPLACE "/" ";" _count "${CLANG_INSTALL_PACKAGE_DIR}") +foreach(p ${_count}) + set(CLANG_CONFIG_CODE "${CLANG_CONFIG_CODE} +get_filename_component(CLANG_INSTALL_PREFIX \"\${CLANG_INSTALL_PREFIX}\" PATH)") +endforeach(p) +set(CLANG_CONFIG_CMAKE_DIR "\${CLANG_INSTALL_PREFIX}/${CLANG_INSTALL_PACKAGE_DIR}") +set(CLANG_CONFIG_EXPORTS_FILE "\${CLANG_CMAKE_DIR}/ClangTargets.cmake") +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/ClangConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake + @ONLY) +set(CLANG_CONFIG_CODE) +set(CLANG_CONFIG_CMAKE_DIR) +set(CLANG_CONFIG_EXPORTS_FILE) + +if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(EXPORT ClangTargets DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) + + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/ClangConfig.cmake + DESTINATION ${CLANG_INSTALL_PACKAGE_DIR}) +endif() diff --git a/cmake/modules/ClangConfig.cmake b/cmake/modules/ClangConfig.cmake deleted file mode 100644 index f052bb9e8c8e..000000000000 --- a/cmake/modules/ClangConfig.cmake +++ /dev/null @@ -1,8 +0,0 @@ -# This file allows users to call find_package(Clang) and pick up our targets. - -# Clang doesn't have any CMake configuration settings yet because it mostly -# uses LLVM's. When it does, we should move this file to ClangConfig.cmake.in -# and call configure_file() on it. - -# Provide all our library targets to users. -include("${CMAKE_CURRENT_LIST_DIR}/ClangTargets.cmake") diff --git a/cmake/modules/ClangConfig.cmake.in b/cmake/modules/ClangConfig.cmake.in new file mode 100644 index 000000000000..a946944dd991 --- /dev/null +++ b/cmake/modules/ClangConfig.cmake.in @@ -0,0 +1,11 @@ +# This file allows users to call find_package(Clang) and pick up our targets. + +find_package(LLVM REQUIRED CONFIG) + +@CLANG_CONFIG_CODE@ + +set(CLANG_EXPORTED_TARGETS "@CLANG_EXPORTS@") +set(CLANG_CMAKE_DIR "@CLANG_CONFIG_CMAKE_DIR@") + +# Provide all our library targets to users. +include("@CLANG_CONFIG_EXPORTS_FILE@") |
