diff options
author | Chuck Cranor <chuck@ece.cmu.edu> | 2019-01-24 15:30:03 (GMT) |
---|---|---|
committer | Chuck Cranor <chuck@ece.cmu.edu> | 2019-01-25 14:48:00 (GMT) |
commit | 568343767e5852f0e5751341a3aa44ab6feffb8a (patch) | |
tree | 155402b29ad86aaefdf3838fc42ba5594ad798b2 /Modules | |
parent | 40628b2519ae1553a33f701cf46ee8fbbd013b85 (diff) | |
download | CMake-568343767e5852f0e5751341a3aa44ab6feffb8a.zip CMake-568343767e5852f0e5751341a3aa44ab6feffb8a.tar.gz CMake-568343767e5852f0e5751341a3aa44ab6feffb8a.tar.bz2 |
ParseImplicitIncludeInfo: handle/add SunPro, XL, and -nostdinc test cases
Add parser code for compiler IDs SunPro and XL. For SunPro, /usr/include
appears to be hardwired in and it does not have a -nostdinc-type flag.
For XL, the "xlc" and "xlC" commands determine if you are C or C++
based on input filename. So compiling x.c with "xlC" reverts to C
and compiling x.cc with "xlc" upgrades to CXX. System include paths
are specified by:
-qc_stdinc=[path] and -qgcc_c_stdinc=[path] (for C)
-qcpp_stdinc=[path] and -qgcc_cpp_stdinc=[path] (for CXX)
If you specify "-qnostdinc" then the above flags are ignored.
Specifying an empty path reverts the value to the default
path (e.g. "-qgcc_c_stdinc=" reverts that to the default).
Adjust the code to handle parsing the case where the user specifies
additional compiler include flags via CMAKE_C_FLAGS/CMAKE_CXX_FLAGS.
For example: "-DCMAKE_C_FLAGS=-nostdinc" ... note that gcc and clang
output slightly differ when -nostdinc is specified (clang skips
printing 'search starts here:' with the angle brackets, gcc always
prints it).
Enable sunos-{C,CXX}-SunPro test cases and add XL test cases.
Also add a few -nostdinc style tests.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/CMakeParseImplicitIncludeInfo.cmake | 101 |
1 files changed, 90 insertions, 11 deletions
diff --git a/Modules/CMakeParseImplicitIncludeInfo.cmake b/Modules/CMakeParseImplicitIncludeInfo.cmake index 9901fea..6603e1c 100644 --- a/Modules/CMakeParseImplicitIncludeInfo.cmake +++ b/Modules/CMakeParseImplicitIncludeInfo.cmake @@ -11,8 +11,9 @@ 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 "^/" AND "${line}" MATCHES "/ccfe " AND "${line}" MATCHES "-isystem") string(REGEX MATCHALL " (-I ?|-isystem )([^ ]*)" incs "${line}") foreach(inc IN LISTS incs) @@ -26,10 +27,78 @@ 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 C/CXX compiler + if("${CMAKE_${lang}_COMPILER_ID}" STREQUAL "XL" AND + "${line}" MATCHES "^/" AND "${line}" MATCHES "/xlcentry |/xlCentry " 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 +117,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 +138,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() + 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() - string(REPLACE "\\" "/" path "${path}") - list(APPEND implicit_dirs_tmp "${path}") - string(APPEND log " add: [${path}]\n") + 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() |