From 4accddb312ad61574d142d7973592f08b48a12ed Mon Sep 17 00:00:00 2001 From: Michael Gottesman <mgottesman@apple.com> Date: Sat, 9 Jul 2016 21:58:40 +0000 Subject: [PATCH] Move add_clang_* entry points from the main clang CMakeLists.txt to cmake/modules/AddClang.cmake. This matches how LLVM has its cmake files organized and is cleaner than just shoving this business logic into the main CMakeLists.txt. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274992 91177308-0d34-0410-b5e6-96231b3b80d8 --- CMakeLists.txt | 148 ++--------------------------------- cmake/modules/AddClang.cmake | 142 +++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+), 143 deletions(-) create mode 100644 cmake/modules/AddClang.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 4601c5523f8..1a37b64aeb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -168,6 +168,10 @@ else() set(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}") endif() +# Make sure that our source directory is on the current cmake module path so that +# we can include cmake files from this directory. +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") + find_package(LibXml2 2.5.3 QUIET) if (LIBXML2_FOUND) set(CLANG_HAVE_LIBXML 1) @@ -308,149 +312,7 @@ configure_file( ${CLANG_BINARY_DIR}/include/clang/Config/config.h) include(CMakeParseArguments) - -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) - add_clang_executable(${name} ${ARGN}) - 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() -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() +include(AddClang) set(CMAKE_INCLUDE_CURRENT_DIR ON) diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake new file mode 100644 index 00000000000..121ad29b500 --- /dev/null +++ b/cmake/modules/AddClang.cmake @@ -0,0 +1,142 @@ +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) + add_clang_executable(${name} ${ARGN}) + 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() +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() -- GitLab