| include(AddFileDependencies) | |
| function(llvm_replace_compiler_option var old new) | |
| # Replaces a compiler option or switch `old' in `var' by `new'. | |
| # If `old' is not in `var', appends `new' to `var'. | |
| # Example: llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2") | |
| # If the option already is on the variable, don't add it: | |
| if( "${${var}}" MATCHES "(^| )${new}($| )" ) | |
| set(n "") | |
| else() | |
| set(n "${new}") | |
| endif() | |
| if( "${${var}}" MATCHES "(^| )${old}($| )" ) | |
| string( REGEX REPLACE "(^| )${old}($| )" " ${n} " ${var} "${${var}}" ) | |
| else() | |
| set( ${var} "${${var}} ${n}" ) | |
| endif() | |
| set( ${var} "${${var}}" PARENT_SCOPE ) | |
| endfunction(llvm_replace_compiler_option) | |
| macro(add_td_sources srcs) | |
| file(GLOB tds *.td) | |
| if( tds ) | |
| source_group("TableGen descriptions" FILES ${tds}) | |
| set_source_files_properties(${tds} PROPERTIES HEADER_FILE_ONLY ON) | |
| list(APPEND ${srcs} ${tds}) | |
| endif() | |
| endmacro(add_td_sources) | |
| macro(add_header_files srcs) | |
| file(GLOB hds *.h *.def) | |
| if( hds ) | |
| set_source_files_properties(${hds} PROPERTIES HEADER_FILE_ONLY ON) | |
| list(APPEND ${srcs} ${hds}) | |
| endif() | |
| endmacro(add_header_files) | |
| function(llvm_process_sources OUT_VAR) | |
| set( sources ${ARGN} ) | |
| llvm_check_source_file_list( ${sources} ) | |
| # Create file dependencies on the tablegenned files, if any. Seems | |
| # that this is not strictly needed, as dependencies of the .cpp | |
| # sources on the tablegenned .inc files are detected and handled, | |
| # but just in case... | |
| foreach( s ${sources} ) | |
| set( f ${CMAKE_CURRENT_SOURCE_DIR}/${s} ) | |
| add_file_dependencies( ${f} ${TABLEGEN_OUTPUT} ) | |
| endforeach(s) | |
| if( MSVC_IDE ) | |
| # This adds .td and .h files to the Visual Studio solution: | |
| add_td_sources(sources) | |
| add_header_files(sources) | |
| endif() | |
| # Set common compiler options: | |
| if( NOT LLVM_REQUIRES_EH ) | |
| if( LLVM_COMPILER_IS_GCC_COMPATIBLE ) | |
| add_definitions( -fno-exceptions ) | |
| elseif( MSVC ) | |
| llvm_replace_compiler_option(CMAKE_CXX_FLAGS "/EHsc" "/EHs-c-") | |
| add_definitions( /D_HAS_EXCEPTIONS=0 ) | |
| endif() | |
| endif() | |
| if( NOT LLVM_REQUIRES_RTTI ) | |
| if( LLVM_COMPILER_IS_GCC_COMPATIBLE ) | |
| llvm_replace_compiler_option(CMAKE_CXX_FLAGS "-frtti" "-fno-rtti") | |
| elseif( MSVC ) | |
| llvm_replace_compiler_option(CMAKE_CXX_FLAGS "/GR" "/GR-") | |
| endif() | |
| endif() | |
| set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE ) | |
| set( ${OUT_VAR} ${sources} PARENT_SCOPE ) | |
| endfunction(llvm_process_sources) | |
| function(llvm_check_source_file_list) | |
| set(listed ${ARGN}) | |
| file(GLOB globbed *.cpp) | |
| foreach(g ${globbed}) | |
| get_filename_component(fn ${g} NAME) | |
| list(FIND listed ${fn} idx) | |
| if( idx LESS 0 ) | |
| message(SEND_ERROR "Found unknown source file ${g} | |
| Please update ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt\n") | |
| endif() | |
| endforeach() | |
| endfunction(llvm_check_source_file_list) |