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} (${BACKEND_PACKAGE_STRING})"
11      PRODUCT_NAME "flang")
12  endif()
13endmacro()
14
15macro(add_flang_subdirectory name)
16  add_llvm_subdirectory(FLANG TOOL ${name})
17endmacro()
18
19macro(add_flang_library name)
20  cmake_parse_arguments(ARG
21    "SHARED;STATIC"
22    ""
23    "ADDITIONAL_HEADERS"
24    ${ARGN})
25  set(srcs)
26  if (MSVC_IDE OR XCODE)
27    # Add public headers
28    file(RELATIVE_PATH lib_path
29      ${FLANG_SOURCE_DIR}/lib/
30      ${CMAKE_CURRENT_SOURCE_DIR})
31    if(NOT lib_path MATCHES "^[.][.]")
32      file( GLOB_RECURSE headers
33        ${FLANG_SOURCE_DIR}/include/flang/${lib_path}/*.h
34        ${FLANG_SOURCE_DIR}/include/flang/${lib_path}/*.def)
35      set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON)
36
37      if (headers)
38        set(srcs ${headers})
39      endif()
40    endif()
41  endif(MSVC_IDE OR XCODE)
42
43  if (srcs OR ARG_ADDITIONAL_HEADERS)
44    set(srcs
45      ADDITIONAL_HEADERS
46      ${srcs}
47      ${ARG_ADDITIONAL_HEADERS}) # It may contain unparsed unknown args.
48
49  endif()
50
51  if (ARG_SHARED)
52    set(LIBTYPE SHARED)
53  else()
54    # llvm_add_library ignores BUILD_SHARED_LIBS if STATIC is explicitly set,
55    # so we need to handle it here.
56    if (BUILD_SHARED_LIBS AND NOT ARG_STATIC)
57      set(LIBTYPE SHARED OBJECT)
58    else()
59      set(LIBTYPE STATIC OBJECT)
60    endif()
61    set_property(GLOBAL APPEND PROPERTY FLANG_STATIC_LIBS ${name})
62  endif()
63
64  llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
65
66  if (TARGET ${name})
67
68    if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "libflang")
69      get_target_export_arg(${name} Flang export_to_flangtargets UMBRELLA flang-libraries)
70      install(TARGETS ${name}
71        COMPONENT ${name}
72        ${export_to_flangtargets}
73        LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
74        ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
75        RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
76
77      if (NOT LLVM_ENABLE_IDE)
78        add_llvm_install_targets(install-${name}
79                                 DEPENDS ${name}
80                                 COMPONENT ${name})
81      endif()
82
83      set_property(GLOBAL APPEND PROPERTY FLANG_LIBS ${name})
84    endif()
85    set_property(GLOBAL APPEND PROPERTY FLANG_EXPORTS ${name})
86  else()
87    # Add empty "phony" target
88    add_custom_target(${name})
89  endif()
90
91  set_target_properties(${name} PROPERTIES FOLDER "Flang libraries")
92  set_flang_windows_version_resource_properties(${name})
93endmacro(add_flang_library)
94
95macro(add_flang_executable name)
96  add_llvm_executable(${name} ${ARGN})
97  set_target_properties(${name} PROPERTIES FOLDER "Flang executables")
98  set_flang_windows_version_resource_properties(${name})
99endmacro(add_flang_executable)
100
101macro(add_flang_tool name)
102  if (NOT FLANG_BUILD_TOOLS)
103    set(EXCLUDE_FROM_ALL ON)
104  endif()
105
106  add_flang_executable(${name} ${ARGN})
107
108  if (FLANG_BUILD_TOOLS)
109    get_target_export_arg(${name} Flang export_to_flangtargets)
110    install(TARGETS ${name}
111      ${export_to_flangtargets}
112      RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
113      COMPONENT ${name})
114
115    if(NOT LLVM_ENABLE_IDE)
116      add_llvm_install_targets(install-${name}
117                               DEPENDS ${name}
118                               COMPONENT ${name})
119    endif()
120    set_property(GLOBAL APPEND PROPERTY FLANG_EXPORTS ${name})
121  endif()
122endmacro()
123
124macro(add_flang_symlink name dest)
125  add_llvm_tool_symlink(${name} ${dest} ALWAYS_GENERATE)
126  # Always generate install targets
127  llvm_install_symlink(${name} ${dest} ALWAYS_GENERATE)
128endmacro()
129
130