xref: /llvm-project/flang/cmake/modules/AddFlang.cmake (revision 532e639ec66876092d7930cc8b89eb54ebf9c6b7)
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