xref: /llvm-project/flang/cmake/modules/AddFlang.cmake (revision 532e639ec66876092d7930cc8b89eb54ebf9c6b7)
15c3347aaSJohn Ericsoninclude(GNUInstallDirs)
256f7e5a8SShoaib Meenaiinclude(LLVMDistributionSupport)
356f7e5a8SShoaib Meenai
46c16aa4fSPatrick McCormickmacro(set_flang_windows_version_resource_properties name)
56c16aa4fSPatrick McCormick  if (DEFINED windows_resource_file)
66c16aa4fSPatrick McCormick    set_windows_version_resource_properties(${name} ${windows_resource_file}
76c16aa4fSPatrick McCormick      VERSION_MAJOR ${FLANG_VERSION_MAJOR}
86c16aa4fSPatrick McCormick      VERSION_MINOR ${FLANG_VERSION_MINOR}
96c16aa4fSPatrick McCormick      VERSION_PATCHLEVEL ${FLANG_VERSION_PATCHLEVEL}
103a0b6101SFangrui Song      VERSION_STRING "${FLANG_VERSION}"
116c16aa4fSPatrick McCormick      PRODUCT_NAME "flang")
126c16aa4fSPatrick McCormick  endif()
136c16aa4fSPatrick McCormickendmacro()
146c16aa4fSPatrick McCormick
156c16aa4fSPatrick McCormickmacro(add_flang_subdirectory name)
166c16aa4fSPatrick McCormick  add_llvm_subdirectory(FLANG TOOL ${name})
176c16aa4fSPatrick McCormickendmacro()
186c16aa4fSPatrick McCormick
19cbfa4aa7SEzike Ebukafunction(add_flang_library name)
20ffc67bb3SDavid Spickett  set(options SHARED STATIC INSTALL_WITH_TOOLCHAIN)
216a2cc122SMichał Górny  set(multiValueArgs ADDITIONAL_HEADERS CLANG_LIBS MLIR_LIBS)
226c16aa4fSPatrick McCormick  cmake_parse_arguments(ARG
23cbfa4aa7SEzike Ebuka    "${options}"
246c16aa4fSPatrick McCormick    ""
25cbfa4aa7SEzike Ebuka    "${multiValueArgs}"
266c16aa4fSPatrick McCormick    ${ARGN})
27cbfa4aa7SEzike Ebuka
286c16aa4fSPatrick McCormick  set(srcs)
296c16aa4fSPatrick McCormick  if (MSVC_IDE OR XCODE)
306c16aa4fSPatrick McCormick    # Add public headers
316c16aa4fSPatrick McCormick    file(RELATIVE_PATH lib_path
326c16aa4fSPatrick McCormick      ${FLANG_SOURCE_DIR}/lib/
336c16aa4fSPatrick McCormick      ${CMAKE_CURRENT_SOURCE_DIR})
346c16aa4fSPatrick McCormick    if(NOT lib_path MATCHES "^[.][.]")
356c16aa4fSPatrick McCormick      file( GLOB_RECURSE headers
366c16aa4fSPatrick McCormick        ${FLANG_SOURCE_DIR}/include/flang/${lib_path}/*.h
376c16aa4fSPatrick McCormick        ${FLANG_SOURCE_DIR}/include/flang/${lib_path}/*.def)
386c16aa4fSPatrick McCormick      set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON)
396c16aa4fSPatrick McCormick
406c16aa4fSPatrick McCormick      if (headers)
416c16aa4fSPatrick McCormick        set(srcs ${headers})
426c16aa4fSPatrick McCormick      endif()
436c16aa4fSPatrick McCormick    endif()
446c16aa4fSPatrick McCormick  endif(MSVC_IDE OR XCODE)
456c16aa4fSPatrick McCormick
466c16aa4fSPatrick McCormick  if (srcs OR ARG_ADDITIONAL_HEADERS)
476c16aa4fSPatrick McCormick    set(srcs
486c16aa4fSPatrick McCormick      ADDITIONAL_HEADERS
496c16aa4fSPatrick McCormick      ${srcs}
506c16aa4fSPatrick McCormick      ${ARG_ADDITIONAL_HEADERS}) # It may contain unparsed unknown args.
516c16aa4fSPatrick McCormick
526c16aa4fSPatrick McCormick  endif()
536c16aa4fSPatrick McCormick
546244d87fSMichael Kruse  if(ARG_SHARED AND ARG_STATIC)
556244d87fSMichael Kruse    set(LIBTYPE SHARED STATIC)
566244d87fSMichael Kruse  elseif(ARG_SHARED)
576c16aa4fSPatrick McCormick    set(LIBTYPE SHARED)
58424ad163SMichael Kruse  elseif(ARG_STATIC)
59424ad163SMichael Kruse    # If BUILD_SHARED_LIBS and ARG_STATIC are both set, llvm_add_library prioritizes STATIC.
60424ad163SMichael Kruse    # This is required behavior for libFortranFloat128Math.
616244d87fSMichael Kruse    set(LIBTYPE STATIC)
62424ad163SMichael Kruse  else()
63424ad163SMichael Kruse    # Let llvm_add_library decide, taking BUILD_SHARED_LIBS into account.
64424ad163SMichael Kruse    set(LIBTYPE)
656244d87fSMichael Kruse  endif()
666c16aa4fSPatrick McCormick  llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
676c16aa4fSPatrick McCormick
68cbfa4aa7SEzike Ebuka  clang_target_link_libraries(${name} PRIVATE ${ARG_CLANG_LIBS})
69*532e639eSMichał Górny  if (ARG_MLIR_LIBS)
706a2cc122SMichał Górny    mlir_target_link_libraries(${name} PRIVATE ${ARG_MLIR_LIBS})
71*532e639eSMichał Górny  endif()
72cbfa4aa7SEzike Ebuka
736c16aa4fSPatrick McCormick  if (TARGET ${name})
746c16aa4fSPatrick McCormick
75467abac2SDiana Picus    if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libflang"
76467abac2SDiana Picus        OR ARG_INSTALL_WITH_TOOLCHAIN)
7756f7e5a8SShoaib Meenai      get_target_export_arg(${name} Flang export_to_flangtargets UMBRELLA flang-libraries)
786c16aa4fSPatrick McCormick      install(TARGETS ${name}
796c16aa4fSPatrick McCormick        COMPONENT ${name}
806c16aa4fSPatrick McCormick        ${export_to_flangtargets}
81e941b031SJohn Ericson        LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
82e941b031SJohn Ericson        ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
835c3347aaSJohn Ericson        RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
846c16aa4fSPatrick McCormick
856c16aa4fSPatrick McCormick      if (NOT LLVM_ENABLE_IDE)
866c16aa4fSPatrick McCormick        add_llvm_install_targets(install-${name}
876c16aa4fSPatrick McCormick                                 DEPENDS ${name}
886c16aa4fSPatrick McCormick                                 COMPONENT ${name})
896c16aa4fSPatrick McCormick      endif()
906c16aa4fSPatrick McCormick
916c16aa4fSPatrick McCormick      set_property(GLOBAL APPEND PROPERTY FLANG_LIBS ${name})
926c16aa4fSPatrick McCormick    endif()
936c16aa4fSPatrick McCormick    set_property(GLOBAL APPEND PROPERTY FLANG_EXPORTS ${name})
946c16aa4fSPatrick McCormick  else()
956c16aa4fSPatrick McCormick    # Add empty "phony" target
966c16aa4fSPatrick McCormick    add_custom_target(${name})
976c16aa4fSPatrick McCormick  endif()
986c16aa4fSPatrick McCormick
9976e7c8f4SMichael Kruse  set_target_properties(${name} PROPERTIES FOLDER "Flang/Libraries")
1006c16aa4fSPatrick McCormick  set_flang_windows_version_resource_properties(${name})
101cbfa4aa7SEzike Ebukaendfunction(add_flang_library)
1026c16aa4fSPatrick McCormick
1036c16aa4fSPatrick McCormickmacro(add_flang_executable name)
1046c16aa4fSPatrick McCormick  add_llvm_executable(${name} ${ARGN})
1056c16aa4fSPatrick McCormick  set_flang_windows_version_resource_properties(${name})
1066c16aa4fSPatrick McCormickendmacro(add_flang_executable)
1076c16aa4fSPatrick McCormick
1086c16aa4fSPatrick McCormickmacro(add_flang_tool name)
1096c16aa4fSPatrick McCormick  if (NOT FLANG_BUILD_TOOLS)
1106c16aa4fSPatrick McCormick    set(EXCLUDE_FROM_ALL ON)
1116c16aa4fSPatrick McCormick  endif()
1126c16aa4fSPatrick McCormick
1136c16aa4fSPatrick McCormick  add_flang_executable(${name} ${ARGN})
1146c16aa4fSPatrick McCormick
1156c16aa4fSPatrick McCormick  if (FLANG_BUILD_TOOLS)
11656f7e5a8SShoaib Meenai    get_target_export_arg(${name} Flang export_to_flangtargets)
1176c16aa4fSPatrick McCormick    install(TARGETS ${name}
1186c16aa4fSPatrick McCormick      ${export_to_flangtargets}
1195c3347aaSJohn Ericson      RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
1206c16aa4fSPatrick McCormick      COMPONENT ${name})
1216c16aa4fSPatrick McCormick
1226c16aa4fSPatrick McCormick    if(NOT LLVM_ENABLE_IDE)
1236c16aa4fSPatrick McCormick      add_llvm_install_targets(install-${name}
1246c16aa4fSPatrick McCormick                               DEPENDS ${name}
1256c16aa4fSPatrick McCormick                               COMPONENT ${name})
1266c16aa4fSPatrick McCormick    endif()
1276c16aa4fSPatrick McCormick    set_property(GLOBAL APPEND PROPERTY FLANG_EXPORTS ${name})
1286c16aa4fSPatrick McCormick  endif()
1296c16aa4fSPatrick McCormickendmacro()
1306c16aa4fSPatrick McCormick
1316c16aa4fSPatrick McCormickmacro(add_flang_symlink name dest)
13207b74980SJohn Ericson  llvm_add_tool_symlink(FLANG ${name} ${dest} ALWAYS_GENERATE)
1336c16aa4fSPatrick McCormick  # Always generate install targets
13407b74980SJohn Ericson  llvm_install_symlink(FLANG ${name} ${dest} ALWAYS_GENERATE)
1356c16aa4fSPatrick McCormickendmacro()
136