tResolveCompilerPaths.cmake - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch) (HTM) git clone git://src.adamsgaard.dk/pism (DIR) Log (DIR) Files (DIR) Refs (DIR) LICENSE --- tResolveCompilerPaths.cmake (4183B) --- 1 # ResolveCompilerPaths - this module defines two macros 2 # 3 # RESOLVE_LIBRARIES (XXX_LIBRARIES LINK_LINE) 4 # This macro is intended to be used by FindXXX.cmake modules. 5 # It parses a compiler link line and resolves all libraries 6 # (-lfoo) using the library path contexts (-L/path) in scope. 7 # The result in XXX_LIBRARIES is the list of fully resolved libs. 8 # Example: 9 # 10 # RESOLVE_LIBRARIES (FOO_LIBRARIES "-L/A -la -L/B -lb -lc -ld") 11 # 12 # will be resolved to 13 # 14 # FOO_LIBRARIES:STRING="/A/liba.so;/B/libb.so;/A/libc.so;/usr/lib/libd.so" 15 # 16 # if the filesystem looks like 17 # 18 # /A: liba.so libc.so 19 # /B: liba.so libb.so 20 # /usr/lib: liba.so libb.so libc.so libd.so 21 # 22 # and /usr/lib is a system directory. 23 # 24 # Note: If RESOLVE_LIBRARIES() resolves a link line differently from 25 # the native linker, there is a bug in this macro (please report it). 26 # 27 # RESOLVE_INCLUDES (XXX_INCLUDES INCLUDE_LINE) 28 # This macro is intended to be used by FindXXX.cmake modules. 29 # It parses a compile line and resolves all includes 30 # (-I/path/to/include) to a list of directories. Other flags are ignored. 31 # Example: 32 # 33 # RESOLVE_INCLUDES (FOO_INCLUDES "-I/A -DBAR='\"irrelevant -I/string here\"' -I/B") 34 # 35 # will be resolved to 36 # 37 # FOO_INCLUDES:STRING="/A;/B" 38 # 39 # assuming both directories exist. 40 # Note: as currently implemented, the -I/string will be picked up mistakenly (cry, cry) 41 include (CorrectWindowsPaths) 42 43 macro (RESOLVE_LIBRARIES LIBS LINK_LINE) 44 string (REGEX MATCHALL "((-L|-l|-Wl)([^\" ]+|\"[^\"]+\")|[^\" ]+\\.(a|so|dll|lib))" _all_tokens "${LINK_LINE}") 45 set (_libs_found "") 46 set (_directory_list "") 47 foreach (token ${_all_tokens}) 48 if (token MATCHES "-L([^\" ]+|\"[^\"]+\")") 49 # If it's a library path, add it to the list 50 string (REGEX REPLACE "^-L" "" token ${token}) 51 string (REGEX REPLACE "//" "/" token ${token}) 52 convert_cygwin_path(token) 53 list (APPEND _directory_list ${token}) 54 elseif (token MATCHES "^(-l([^\" ]+|\"[^\"]+\")|[^\" ]+\\.(a|so|dll|lib))") 55 # It's a library, resolve the path by looking in the list and then (by default) in system directories 56 if (WIN32) #windows expects "libfoo", linux expects "foo" 57 string (REGEX REPLACE "^-l" "lib" token ${token}) 58 else (WIN32) 59 string (REGEX REPLACE "^-l" "" token ${token}) 60 endif (WIN32) 61 set (_root "") 62 if (token MATCHES "^/") # We have an absolute path 63 #separate into a path and a library name: 64 string (REGEX MATCH "[^/]*\\.(a|so|dll|lib)$" libname ${token}) 65 string (REGEX MATCH ".*[^${libname}$]" libpath ${token}) 66 convert_cygwin_path(libpath) 67 set (_directory_list ${_directory_list} ${libpath}) 68 set (token ${libname}) 69 endif (token MATCHES "^/") 70 set (_lib "NOTFOUND" CACHE FILEPATH "Cleared" FORCE) 71 find_library (_lib ${token} HINTS ${_directory_list} ${_root}) 72 if (_lib) 73 string (REPLACE "//" "/" _lib ${_lib}) 74 list (APPEND _libs_found ${_lib}) 75 else (_lib) 76 message (STATUS "Unable to find library ${token}") 77 endif (_lib) 78 endif (token MATCHES "-L([^\" ]+|\"[^\"]+\")") 79 endforeach (token) 80 set (_lib "NOTFOUND" CACHE INTERNAL "Scratch variable" FORCE) 81 # only the LAST occurence of each library is required since there should be no circular dependencies 82 if (_libs_found) 83 list (REVERSE _libs_found) 84 list (REMOVE_DUPLICATES _libs_found) 85 list (REVERSE _libs_found) 86 endif (_libs_found) 87 set (${LIBS} "${_libs_found}") 88 endmacro (RESOLVE_LIBRARIES) 89 90 macro (RESOLVE_INCLUDES INCS COMPILE_LINE) 91 string (REGEX MATCHALL "-I([^\" ]+|\"[^\"]+\")" _all_tokens "${COMPILE_LINE}") 92 set (_incs_found "") 93 foreach (token ${_all_tokens}) 94 string (REGEX REPLACE "^-I" "" token ${token}) 95 string (REGEX REPLACE "//" "/" token ${token}) 96 convert_cygwin_path(token) 97 if (EXISTS ${token}) 98 list (APPEND _incs_found ${token}) 99 else (EXISTS ${token}) 100 message (STATUS "Include directory ${token} does not exist") 101 endif (EXISTS ${token}) 102 endforeach (token) 103 list (REMOVE_DUPLICATES _incs_found) 104 set (${INCS} "${_incs_found}") 105 endmacro (RESOLVE_INCLUDES)