brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.8 KiB · 4059fc3 Raw
234 lines · plain
1include(GNUInstallDirs)2include(LLVMDistributionSupport)3 4function(clang_tablegen)5  # Syntax:6  # clang_tablegen output-file [tablegen-arg ...] SOURCE source-file7  # [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]]8  #9  # Generates a custom command for invoking tblgen as10  #11  # tblgen source-file -o=output-file tablegen-arg ...12  #13  # and, if cmake-target-name is provided, creates a custom target for14  # executing the custom command depending on output-file. It is15  # possible to list more files to depend after DEPENDS.16 17  cmake_parse_arguments(CTG "" "SOURCE;TARGET" "" ${ARGN})18 19  if( NOT CTG_SOURCE )20    message(FATAL_ERROR "SOURCE source-file required by clang_tablegen")21  endif()22 23  set( CLANG_TABLEGEN_ARGUMENTS "" )24  set( LLVM_TARGET_DEFINITIONS ${CTG_SOURCE} )25  tablegen(CLANG ${CTG_UNPARSED_ARGUMENTS} ${CLANG_TABLEGEN_ARGUMENTS})26 27  if(CTG_TARGET)28    add_public_tablegen_target(${CTG_TARGET})29    set_property(GLOBAL APPEND PROPERTY CLANG_TABLEGEN_TARGETS ${CTG_TARGET})30  endif()31endfunction(clang_tablegen)32 33macro(set_clang_windows_version_resource_properties name)34  if(DEFINED windows_resource_file)35    set_windows_version_resource_properties(${name} ${windows_resource_file}36      VERSION_MAJOR ${CLANG_VERSION_MAJOR}37      VERSION_MINOR ${CLANG_VERSION_MINOR}38      VERSION_PATCHLEVEL ${CLANG_VERSION_PATCHLEVEL}39      VERSION_STRING "${CLANG_VERSION}"40      PRODUCT_NAME "clang")41  endif()42endmacro()43 44macro(add_clang_subdirectory name)45  add_llvm_subdirectory(CLANG TOOL ${name})46endmacro()47 48macro(add_clang_library name)49  cmake_parse_arguments(ARG50    "SHARED;STATIC;INSTALL_WITH_TOOLCHAIN"51    ""52    "ADDITIONAL_HEADERS"53    ${ARGN})54  set(srcs)55  if(MSVC_IDE OR XCODE)56    # Add public headers57    file(RELATIVE_PATH lib_path58      ${CLANG_SOURCE_DIR}/lib/59      ${CMAKE_CURRENT_SOURCE_DIR}60    )61    if(NOT lib_path MATCHES "^[.][.]")62      file( GLOB_RECURSE headers63        ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.h64        ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.def65      )66      set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON)67 68      file( GLOB_RECURSE tds69        ${CLANG_SOURCE_DIR}/include/clang/${lib_path}/*.td70      )71      source_group("TableGen descriptions" FILES ${tds})72      set_source_files_properties(${tds} PROPERTIES HEADER_FILE_ONLY ON)73 74      if(headers OR tds)75        set(srcs ${headers} ${tds})76      endif()77    endif()78  endif(MSVC_IDE OR XCODE)79  if(srcs OR ARG_ADDITIONAL_HEADERS)80    set(srcs81      ADDITIONAL_HEADERS82      ${srcs}83      ${ARG_ADDITIONAL_HEADERS} # It may contain unparsed unknown args.84      )85  endif()86 87  if(ARG_SHARED AND ARG_STATIC)88    set(LIBTYPE SHARED STATIC)89  elseif(ARG_SHARED)90    set(LIBTYPE SHARED)91  else()92    # llvm_add_library ignores BUILD_SHARED_LIBS if STATIC is explicitly set,93    # so we need to handle it here.94    if(BUILD_SHARED_LIBS)95      set(LIBTYPE SHARED)96    else()97      set(LIBTYPE STATIC)98    endif()99    if(NOT XCODE AND NOT MSVC_IDE)100      # The Xcode generator doesn't handle object libraries correctly.101      # The Visual Studio CMake generator does handle object libraries102      # correctly, but it is preferable to list the libraries with their103      # source files (instead of the object files and the source files in104      # a separate target in the "Object Libraries" folder)105      list(APPEND LIBTYPE OBJECT)106    endif()107    set_property(GLOBAL APPEND PROPERTY CLANG_STATIC_LIBS ${name})108  endif()109  llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})110 111  if(MSVC AND NOT CLANG_LINK_CLANG_DYLIB)112    # Make sure all consumers also turn off visibility macros so they're not113    # trying to dllimport symbols.114    target_compile_definitions(${name} PUBLIC CLANG_BUILD_STATIC)115    if(TARGET "obj.${name}")116      target_compile_definitions("obj.${name}" PUBLIC CLANG_BUILD_STATIC)117    endif()118  elseif(TARGET "obj.${name}" AND NOT ARG_SHARED AND NOT ARG_STATIC)119    # Clang component libraries linked to clang-cpp are declared without SHARED or STATIC120    target_compile_definitions("obj.${name}" PUBLIC CLANG_EXPORTS)121  endif()122 123  set(libs ${name})124  if(ARG_SHARED AND ARG_STATIC)125    list(APPEND libs ${name}_static)126  endif()127 128  foreach(lib ${libs})129    if(TARGET ${lib})130      target_link_libraries(${lib} INTERFACE ${LLVM_COMMON_LIBS})131 132      if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN)133        get_target_export_arg(${name} Clang export_to_clangtargets UMBRELLA clang-libraries)134        install(TARGETS ${lib}135          COMPONENT ${lib}136          ${export_to_clangtargets}137          LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}138          ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}139          RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")140 141        if (NOT LLVM_ENABLE_IDE)142          add_llvm_install_targets(install-${lib}143                                   DEPENDS ${lib}144                                   COMPONENT ${lib})145        endif()146 147        set_property(GLOBAL APPEND PROPERTY CLANG_LIBS ${lib})148      endif()149      set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${lib})150    else()151      # Add empty "phony" target152      add_custom_target(${lib})153    endif()154  endforeach()155 156  set_clang_windows_version_resource_properties(${name})157endmacro(add_clang_library)158 159macro(add_clang_executable name)160  add_llvm_executable( ${name} ${ARGN} )161  set_clang_windows_version_resource_properties(${name})162  set_target_properties(${name} PROPERTIES XCODE_GENERATE_SCHEME ON)163endmacro(add_clang_executable)164 165macro(add_clang_tool name)166  cmake_parse_arguments(ARG "DEPENDS;GENERATE_DRIVER" "" "" ${ARGN})167  if (NOT CLANG_BUILD_TOOLS)168    set(EXCLUDE_FROM_ALL ON)169  endif()170  if(ARG_GENERATE_DRIVER171     AND LLVM_TOOL_LLVM_DRIVER_BUILD172     AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS)173    )174    set(get_obj_args ${ARGN})175    list(FILTER get_obj_args EXCLUDE REGEX "^SUPPORT_PLUGINS$")176    generate_llvm_objects(${name} ${get_obj_args})177    add_custom_target(${name} DEPENDS llvm-driver clang-resource-headers)178  else()179    add_clang_executable(${name} ${ARGN})180    add_dependencies(${name} clang-resource-headers)181 182    if (CLANG_BUILD_TOOLS)183      get_target_export_arg(${name} Clang export_to_clangtargets)184      install(TARGETS ${name}185        ${export_to_clangtargets}186        RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"187        COMPONENT ${name})188 189      if (LLVM_ENABLE_PDB)190        install(FILES $<TARGET_PDB_FILE:${name}> DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name} OPTIONAL)191      endif()192 193      if(NOT LLVM_ENABLE_IDE)194        add_llvm_install_targets(install-${name}195                                 DEPENDS ${name}196                                 COMPONENT ${name})197      endif()198      set_property(GLOBAL APPEND PROPERTY CLANG_EXPORTS ${name})199    endif()200  endif()201  set_target_properties(${name} PROPERTIES XCODE_GENERATE_SCHEME ON)202endmacro()203 204macro(add_clang_symlink name dest)205  get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)206  if(LLVM_TOOL_LLVM_DRIVER_BUILD207     AND ${dest} IN_LIST LLVM_DRIVER_TOOLS208     AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${dest} IN_LIST LLVM_DISTRIBUTION_COMPONENTS)209    )210    set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${dest} ${name})211  else()212    llvm_add_tool_symlink(CLANG ${name} ${dest} ALWAYS_GENERATE)213    # Always generate install targets214    llvm_install_symlink(CLANG ${name} ${dest} ALWAYS_GENERATE)215  endif()216endmacro()217 218function(clang_target_link_libraries target type)219  if (TARGET obj.${target})220    target_link_libraries(obj.${target} ${ARGN})221  endif()222 223  get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)224  if(LLVM_TOOL_LLVM_DRIVER_BUILD AND ${target} IN_LIST LLVM_DRIVER_TOOLS)225    set(target llvm-driver)226  endif()227 228  if (CLANG_LINK_CLANG_DYLIB)229    target_link_libraries(${target} ${type} clang-cpp)230  else()231    target_link_libraries(${target} ${type} ${ARGN})232  endif()233endfunction()234