1751ea9d9SOscar Fuentesinclude(AddFileDependencies)
2db2a4af3SNAKAMURA Takumiinclude(CMakeParseArguments)
3751ea9d9SOscar Fuentes
477c4f701SOscar Fuentesfunction(llvm_replace_compiler_option var old new)
59bf25958SOscar Fuentes  # Replaces a compiler option or switch `old' in `var' by `new'.
69bf25958SOscar Fuentes  # If `old' is not in `var', appends `new' to `var'.
79bf25958SOscar Fuentes  # Example: llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
877c4f701SOscar Fuentes  # If the option already is on the variable, don't add it:
977c4f701SOscar Fuentes  if( "${${var}}" MATCHES "(^| )${new}($| )" )
1077c4f701SOscar Fuentes    set(n "")
119bf25958SOscar Fuentes  else()
1277c4f701SOscar Fuentes    set(n "${new}")
139bf25958SOscar Fuentes  endif()
1477c4f701SOscar Fuentes  if( "${${var}}" MATCHES "(^| )${old}($| )" )
1577c4f701SOscar Fuentes    string( REGEX REPLACE "(^| )${old}($| )" " ${n} " ${var} "${${var}}" )
1677c4f701SOscar Fuentes  else()
1777c4f701SOscar Fuentes    set( ${var} "${${var}} ${n}" )
1877c4f701SOscar Fuentes  endif()
1977c4f701SOscar Fuentes  set( ${var} "${${var}}" PARENT_SCOPE )
2077c4f701SOscar Fuentesendfunction(llvm_replace_compiler_option)
212c10b22bSOscar Fuentes
222c10b22bSOscar Fuentesmacro(add_td_sources srcs)
232c10b22bSOscar Fuentes  file(GLOB tds *.td)
242c10b22bSOscar Fuentes  if( tds )
252c10b22bSOscar Fuentes    source_group("TableGen descriptions" FILES ${tds})
262c10b22bSOscar Fuentes    set_source_files_properties(${tds} PROPERTIES HEADER_FILE_ONLY ON)
272c10b22bSOscar Fuentes    list(APPEND ${srcs} ${tds})
282c10b22bSOscar Fuentes  endif()
292c10b22bSOscar Fuentesendmacro(add_td_sources)
302c10b22bSOscar Fuentes
31aeedd65cSZachary Turnerfunction(add_header_files_for_glob hdrs_out glob)
32aeedd65cSZachary Turner  file(GLOB hds ${glob})
331f68002cSMichal Gorny  set(filtered)
341f68002cSMichal Gorny  foreach(file ${hds})
351f68002cSMichal Gorny    # Explicit existence check is necessary to filter dangling symlinks
361f68002cSMichal Gorny    # out.  See https://bugs.gentoo.org/674662.
371f68002cSMichal Gorny    if(EXISTS ${file})
381f68002cSMichal Gorny      list(APPEND filtered ${file})
391f68002cSMichal Gorny    endif()
401f68002cSMichal Gorny  endforeach()
411f68002cSMichal Gorny  set(${hdrs_out} ${filtered} PARENT_SCOPE)
42aeedd65cSZachary Turnerendfunction(add_header_files_for_glob)
432c10b22bSOscar Fuentes
44aeedd65cSZachary Turnerfunction(find_all_header_files hdrs_out additional_headerdirs)
45aeedd65cSZachary Turner  add_header_files_for_glob(hds *.h)
46aeedd65cSZachary Turner  list(APPEND all_headers ${hds})
47aeedd65cSZachary Turner
48aeedd65cSZachary Turner  foreach(additional_dir ${additional_headerdirs})
49aeedd65cSZachary Turner    add_header_files_for_glob(hds "${additional_dir}/*.h")
50aeedd65cSZachary Turner    list(APPEND all_headers ${hds})
51aeedd65cSZachary Turner    add_header_files_for_glob(hds "${additional_dir}/*.inc")
52aeedd65cSZachary Turner    list(APPEND all_headers ${hds})
53aeedd65cSZachary Turner  endforeach(additional_dir)
54aeedd65cSZachary Turner
55aeedd65cSZachary Turner  set( ${hdrs_out} ${all_headers} PARENT_SCOPE )
56aeedd65cSZachary Turnerendfunction(find_all_header_files)
572c10b22bSOscar Fuentes
582c10b22bSOscar Fuentes
592c10b22bSOscar Fuentesfunction(llvm_process_sources OUT_VAR)
60*9ff3f339SKirill Bobyrev  cmake_parse_arguments(ARG "PARTIAL_SOURCES_INTENDED" "" "ADDITIONAL_HEADERS;ADDITIONAL_HEADER_DIRS" ${ARGN})
616acf320aSNAKAMURA Takumi  set(sources ${ARG_UNPARSED_ARGUMENTS})
62*9ff3f339SKirill Bobyrev  if (NOT ARG_PARTIAL_SOURCES_INTENDED)
63c710219dSOscar Fuentes    llvm_check_source_file_list(${sources})
64*9ff3f339SKirill Bobyrev  endif()
653a389bd4SChris Bieneman
662c10b22bSOscar Fuentes  # This adds .td and .h files to the Visual Studio solution:
672c10b22bSOscar Fuentes  add_td_sources(sources)
68aeedd65cSZachary Turner  find_all_header_files(hdrs "${ARG_ADDITIONAL_HEADER_DIRS}")
69aeedd65cSZachary Turner  if (hdrs)
70aeedd65cSZachary Turner    set_source_files_properties(${hdrs} PROPERTIES HEADER_FILE_ONLY ON)
71aeedd65cSZachary Turner  endif()
726acf320aSNAKAMURA Takumi  set_source_files_properties(${ARG_ADDITIONAL_HEADERS} PROPERTIES HEADER_FILE_ONLY ON)
73aeedd65cSZachary Turner  list(APPEND sources ${ARG_ADDITIONAL_HEADERS} ${hdrs})
74889c1e7dSOscar Fuentes
752c10b22bSOscar Fuentes  set( ${OUT_VAR} ${sources} PARENT_SCOPE )
76751ea9d9SOscar Fuentesendfunction(llvm_process_sources)
77c710219dSOscar Fuentes
78c710219dSOscar Fuentes
79c710219dSOscar Fuentesfunction(llvm_check_source_file_list)
80d650a8cfSShoaib Meenai  cmake_parse_arguments(ARG "" "SOURCE_DIR" "" ${ARGN})
811447c979SSerge Guelton  foreach(l ${ARG_UNPARSED_ARGUMENTS})
821447c979SSerge Guelton      get_filename_component(fp ${l} REALPATH)
831447c979SSerge Guelton      list(APPEND listed ${fp})
841447c979SSerge Guelton  endforeach()
851447c979SSerge Guelton
86d650a8cfSShoaib Meenai  if(ARG_SOURCE_DIR)
87d650a8cfSShoaib Meenai    file(GLOB globbed
88d650a8cfSShoaib Meenai         "${ARG_SOURCE_DIR}/*.c" "${ARG_SOURCE_DIR}/*.cpp")
89d650a8cfSShoaib Meenai  else()
90db441f68SNAKAMURA Takumi    file(GLOB globbed *.c *.cpp)
91d650a8cfSShoaib Meenai  endif()
921447c979SSerge Guelton
93c710219dSOscar Fuentes  foreach(g ${globbed})
94c710219dSOscar Fuentes    get_filename_component(fn ${g} NAME)
95d650a8cfSShoaib Meenai    if(ARG_SOURCE_DIR)
96d650a8cfSShoaib Meenai      set(entry "${g}")
97d650a8cfSShoaib Meenai    else()
98d650a8cfSShoaib Meenai      set(entry "${fn}")
99d650a8cfSShoaib Meenai    endif()
1001447c979SSerge Guelton    get_filename_component(gp ${g} REALPATH)
101a3fc9238SMatt Arsenault
102a3fc9238SMatt Arsenault    # Don't reject hidden files. Some editors create backups in the
103a3fc9238SMatt Arsenault    # same directory as the file.
104a3fc9238SMatt Arsenault    if (NOT "${fn}" MATCHES "^\\.")
105d650a8cfSShoaib Meenai      list(FIND LLVM_OPTIONAL_SOURCES ${entry} idx)
10694d02518SChandler Carruth      if( idx LESS 0 )
1071447c979SSerge Guelton        list(FIND listed ${gp} idx)
108c710219dSOscar Fuentes        if( idx LESS 0 )
1091447c979SSerge Guelton          if(ARG_SOURCE_DIR)
1101447c979SSerge Guelton              set(fn_relative "${ARG_SOURCE_DIR}/${fn}")
1111447c979SSerge Guelton          else()
1121447c979SSerge Guelton              set(fn_relative "${fn}")
1131447c979SSerge Guelton          endif()
1141447c979SSerge Guelton          message(SEND_ERROR "Found unknown source file ${fn_relative}
115db441f68SNAKAMURA TakumiPlease update ${CMAKE_CURRENT_LIST_FILE}\n")
116c710219dSOscar Fuentes        endif()
11794d02518SChandler Carruth      endif()
118a3fc9238SMatt Arsenault    endif()
119c710219dSOscar Fuentes  endforeach()
120c710219dSOscar Fuentesendfunction(llvm_check_source_file_list)
121