1include(GNUInstallDirs) 2include(LLVMDistributionSupport) 3 4macro(set_flang_windows_version_resource_properties name) 5 if (DEFINED windows_resource_file) 6 set_windows_version_resource_properties(${name} ${windows_resource_file} 7 VERSION_MAJOR ${FLANG_VERSION_MAJOR} 8 VERSION_MINOR ${FLANG_VERSION_MINOR} 9 VERSION_PATCHLEVEL ${FLANG_VERSION_PATCHLEVEL} 10 VERSION_STRING "${FLANG_VERSION}" 11 PRODUCT_NAME "flang") 12 endif() 13endmacro() 14 15macro(add_flang_subdirectory name) 16 add_llvm_subdirectory(FLANG TOOL ${name}) 17endmacro() 18 19function(add_flang_library name) 20 set(options SHARED STATIC INSTALL_WITH_TOOLCHAIN) 21 set(multiValueArgs ADDITIONAL_HEADERS CLANG_LIBS MLIR_LIBS) 22 cmake_parse_arguments(ARG 23 "${options}" 24 "" 25 "${multiValueArgs}" 26 ${ARGN}) 27 28 set(srcs) 29 if (MSVC_IDE OR XCODE) 30 # Add public headers 31 file(RELATIVE_PATH lib_path 32 ${FLANG_SOURCE_DIR}/lib/ 33 ${CMAKE_CURRENT_SOURCE_DIR}) 34 if(NOT lib_path MATCHES "^[.][.]") 35 file( GLOB_RECURSE headers 36 ${FLANG_SOURCE_DIR}/include/flang/${lib_path}/*.h 37 ${FLANG_SOURCE_DIR}/include/flang/${lib_path}/*.def) 38 set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON) 39 40 if (headers) 41 set(srcs ${headers}) 42 endif() 43 endif() 44 endif(MSVC_IDE OR XCODE) 45 46 if (srcs OR ARG_ADDITIONAL_HEADERS) 47 set(srcs 48 ADDITIONAL_HEADERS 49 ${srcs} 50 ${ARG_ADDITIONAL_HEADERS}) # It may contain unparsed unknown args. 51 52 endif() 53 54 if(ARG_SHARED AND ARG_STATIC) 55 set(LIBTYPE SHARED STATIC) 56 elseif(ARG_SHARED) 57 set(LIBTYPE SHARED) 58 elseif(ARG_STATIC) 59 # If BUILD_SHARED_LIBS and ARG_STATIC are both set, llvm_add_library prioritizes STATIC. 60 # This is required behavior for libFortranFloat128Math. 61 set(LIBTYPE STATIC) 62 else() 63 # Let llvm_add_library decide, taking BUILD_SHARED_LIBS into account. 64 set(LIBTYPE) 65 endif() 66 llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs}) 67 68 clang_target_link_libraries(${name} PRIVATE ${ARG_CLANG_LIBS}) 69 if (ARG_MLIR_LIBS) 70 mlir_target_link_libraries(${name} PRIVATE ${ARG_MLIR_LIBS}) 71 endif() 72 73 if (TARGET ${name}) 74 75 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libflang" 76 OR ARG_INSTALL_WITH_TOOLCHAIN) 77 get_target_export_arg(${name} Flang export_to_flangtargets UMBRELLA flang-libraries) 78 install(TARGETS ${name} 79 COMPONENT ${name} 80 ${export_to_flangtargets} 81 LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} 82 ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} 83 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") 84 85 if (NOT LLVM_ENABLE_IDE) 86 add_llvm_install_targets(install-${name} 87 DEPENDS ${name} 88 COMPONENT ${name}) 89 endif() 90 91 set_property(GLOBAL APPEND PROPERTY FLANG_LIBS ${name}) 92 endif() 93 set_property(GLOBAL APPEND PROPERTY FLANG_EXPORTS ${name}) 94 else() 95 # Add empty "phony" target 96 add_custom_target(${name}) 97 endif() 98 99 set_target_properties(${name} PROPERTIES FOLDER "Flang/Libraries") 100 set_flang_windows_version_resource_properties(${name}) 101endfunction(add_flang_library) 102 103macro(add_flang_executable name) 104 add_llvm_executable(${name} ${ARGN}) 105 set_flang_windows_version_resource_properties(${name}) 106endmacro(add_flang_executable) 107 108macro(add_flang_tool name) 109 if (NOT FLANG_BUILD_TOOLS) 110 set(EXCLUDE_FROM_ALL ON) 111 endif() 112 113 add_flang_executable(${name} ${ARGN}) 114 115 if (FLANG_BUILD_TOOLS) 116 get_target_export_arg(${name} Flang export_to_flangtargets) 117 install(TARGETS ${name} 118 ${export_to_flangtargets} 119 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" 120 COMPONENT ${name}) 121 122 if(NOT LLVM_ENABLE_IDE) 123 add_llvm_install_targets(install-${name} 124 DEPENDS ${name} 125 COMPONENT ${name}) 126 endif() 127 set_property(GLOBAL APPEND PROPERTY FLANG_EXPORTS ${name}) 128 endif() 129endmacro() 130 131macro(add_flang_symlink name dest) 132 llvm_add_tool_symlink(FLANG ${name} ${dest} ALWAYS_GENERATE) 133 # Always generate install targets 134 llvm_install_symlink(FLANG ${name} ${dest} ALWAYS_GENERATE) 135endmacro() 136