mirror of
https://github.com/Kitware/CMake.git
synced 2026-03-13 12:59:55 -05:00
Merge topic 'implicit-incs-upd'
2e91627deaParseImplicitIncludeInfo: add Fortran implicit include handling568343767eParseImplicitIncludeInfo: handle/add SunPro, XL, and -nostdinc test cases Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !2855
This commit is contained in:
@@ -61,6 +61,7 @@ endif()
|
||||
@CMAKE_Fortran_SYSROOT_FLAG_CODE@
|
||||
@CMAKE_Fortran_OSX_DEPLOYMENT_TARGET_FLAG_CODE@
|
||||
|
||||
set(CMAKE_Fortran_IMPLICIT_INCLUDE_DIRECTORIES "@CMAKE_Fortran_IMPLICIT_INCLUDE_DIRECTORIES@")
|
||||
set(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES "@CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES@")
|
||||
set(CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES "@CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES@")
|
||||
set(CMAKE_Fortran_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "@CMAKE_Fortran_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES@")
|
||||
|
||||
@@ -11,9 +11,10 @@ function(cmake_parse_implicit_include_line line lang id_var log_var state_var)
|
||||
unset(rv)
|
||||
set(log "")
|
||||
|
||||
# ccfe: cray compiler front end (PrgEnv-cray)
|
||||
# Cray compiler (from cray wrapper, via PrgEnv-cray)
|
||||
if("${CMAKE_${lang}_COMPILER_ID}" STREQUAL "Cray" AND
|
||||
"${line}" MATCHES "-isystem")
|
||||
"${line}" MATCHES "^/" AND "${line}" MATCHES "/ccfe |/ftnfe " AND
|
||||
"${line}" MATCHES " -isystem| -I")
|
||||
string(REGEX MATCHALL " (-I ?|-isystem )([^ ]*)" incs "${line}")
|
||||
foreach(inc IN LISTS incs)
|
||||
string(REGEX REPLACE " (-I ?|-isystem )([^ ]*)" "\\2" idir "${inc}")
|
||||
@@ -26,10 +27,84 @@ function(cmake_parse_implicit_include_line line lang id_var log_var state_var)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# SunPro compiler
|
||||
if("${CMAKE_${lang}_COMPILER_ID}" STREQUAL "SunPro" AND
|
||||
"${line}" MATCHES "-D__SUNPRO_C")
|
||||
string(REGEX MATCHALL " (-I ?)([^ ]*)" incs "${line}")
|
||||
foreach(inc IN LISTS incs)
|
||||
string(REGEX REPLACE " (-I ?)([^ ]*)" "\\2" idir "${inc}")
|
||||
if(NOT "${idir}" STREQUAL "-xbuiltin")
|
||||
list(APPEND rv "${idir}")
|
||||
endif()
|
||||
endforeach()
|
||||
if(rv)
|
||||
# /usr/include appears to be hardwired in
|
||||
list(APPEND rv "/usr/include")
|
||||
string(APPEND log " got implicit includes via sunpro parser!\n")
|
||||
else()
|
||||
string(APPEND log " warning: sunpro parse failed!\n")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# XL compiler
|
||||
if("${CMAKE_${lang}_COMPILER_ID}" STREQUAL "XL" AND "${line}" MATCHES "^/"
|
||||
AND ( ("${lang}" STREQUAL "Fortran" AND
|
||||
"${line}" MATCHES "/xl[fF]entry " AND
|
||||
"${line}" MATCHES "OSVAR\\([^ ]+\\)")
|
||||
OR
|
||||
( ("${lang}" STREQUAL "C" OR "${lang}" STREQUAL "CXX") AND
|
||||
"${line}" MATCHES "/xl[cC]entry " AND
|
||||
"${line}" MATCHES " -qosvar=")
|
||||
) )
|
||||
# -qnostdinc cancels other stdinc flags, even if present
|
||||
string(FIND "${line}" " -qnostdinc" nostd)
|
||||
if(NOT ${nostd} EQUAL -1)
|
||||
set(rv "") # defined but empty
|
||||
string(APPEND log " got implicit includes via XL parser (nostdinc)\n")
|
||||
else()
|
||||
if("${lang}" STREQUAL "CXX")
|
||||
string(REGEX MATCHALL " -qcpp_stdinc=([^ ]*)" std "${line}")
|
||||
string(REGEX MATCHALL " -qgcc_cpp_stdinc=([^ ]*)" gcc_std "${line}")
|
||||
else()
|
||||
string(REGEX MATCHALL " -qc_stdinc=([^ ]*)" std "${line}")
|
||||
string(REGEX MATCHALL " -qgcc_c_stdinc=([^ ]*)" gcc_std "${line}")
|
||||
endif()
|
||||
set(xlstd ${std} ${gcc_std})
|
||||
foreach(inc IN LISTS xlstd)
|
||||
string(REGEX REPLACE " -q(cpp|gcc_cpp|c|gcc_c)_stdinc=([^ ]*)" "\\2"
|
||||
ipath "${inc}")
|
||||
string(REPLACE ":" ";" ipath "${ipath}")
|
||||
list(APPEND rv ${ipath})
|
||||
endforeach()
|
||||
endif()
|
||||
# user can add -I flags via CMAKE_{C,CXX}_FLAGS, look for that too
|
||||
string(REGEX MATCHALL " (-I ?)([^ ]*)" incs "${line}")
|
||||
unset(urv)
|
||||
foreach(inc IN LISTS incs)
|
||||
string(REGEX REPLACE " (-I ?)([^ ]*)" "\\2" idir "${inc}")
|
||||
list(APPEND urv "${idir}")
|
||||
endforeach()
|
||||
if(urv)
|
||||
if ("${rv}" STREQUAL "")
|
||||
set(rv ${urv})
|
||||
else()
|
||||
list(APPEND rv ${urv})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(DEFINED rv)
|
||||
string(APPEND log " got implicit includes via XL parser!\n")
|
||||
else()
|
||||
string(APPEND log " warning: XL parse failed!\n")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(log)
|
||||
set(${log_var} "${log}" PARENT_SCOPE)
|
||||
else()
|
||||
unset(${log_var} PARENT_SCOPE)
|
||||
endif()
|
||||
if(rv)
|
||||
if(DEFINED rv)
|
||||
set(${id_var} "${rv}" PARENT_SCOPE)
|
||||
set(${state_var} "done" PARENT_SCOPE)
|
||||
endif()
|
||||
@@ -48,10 +123,11 @@ function(cmake_parse_implicit_include_info text lang dir_var log_var state_var)
|
||||
string(REGEX REPLACE "\r?\n" ";" output_lines "${text}")
|
||||
foreach(line IN LISTS output_lines)
|
||||
if(state STREQUAL start)
|
||||
string(FIND "${line}" "#include <...> search starts here:" rv)
|
||||
string(FIND "${line}" "#include \"...\" search starts here:" rv)
|
||||
if(rv GREATER -1)
|
||||
set(state loading)
|
||||
string(APPEND log " found start of implicit include info\n")
|
||||
set(preload 1) # looking for include <...> now
|
||||
string(APPEND log " found start of include info\n")
|
||||
else()
|
||||
cmake_parse_implicit_include_line("${line}" "${lang}" implicit_dirs_tmp
|
||||
linelog state)
|
||||
@@ -68,15 +144,24 @@ function(cmake_parse_implicit_include_info text lang dir_var log_var state_var)
|
||||
set(state done)
|
||||
string(APPEND log " end of search list found\n")
|
||||
break()
|
||||
else()
|
||||
string(STRIP "${line}" path) # remove leading/trailing spaces
|
||||
if ("${path}" MATCHES " \\(framework directory\\)$")
|
||||
continue() # frameworks are handled elsewhere, ignore them here
|
||||
endif()
|
||||
string(REPLACE "\\" "/" path "${path}")
|
||||
list(APPEND implicit_dirs_tmp "${path}")
|
||||
string(APPEND log " add: [${path}]\n")
|
||||
endif()
|
||||
if(preload)
|
||||
string(FIND "${line}" "#include <...> search starts here:" rv)
|
||||
if(rv GREATER -1)
|
||||
set(preload 0)
|
||||
string(APPEND log " found start of implicit include info\n")
|
||||
endif()
|
||||
continue()
|
||||
endif()
|
||||
if("${line}" MATCHES "^ ")
|
||||
string(SUBSTRING "${line}" 1 -1 line) # remove leading space
|
||||
endif()
|
||||
if ("${line}" MATCHES " \\(framework directory\\)$")
|
||||
continue() # frameworks are handled elsewhere, ignore them here
|
||||
endif()
|
||||
string(REPLACE "\\" "/" path "${line}")
|
||||
list(APPEND implicit_dirs_tmp "${path}")
|
||||
string(APPEND log " add: [${path}]\n")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user