detect_using_file_command.cmake 4.31 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#
# Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
#
# This file is part of Orfeo Toolbox
#
#     https://www.orfeo-toolbox.org/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
function(detect_using_file_command input_file result_type result_dir)
  
  execute_process(COMMAND "${FILE_COMMAND}" "${input_file}"
    RESULT_VARIABLE file_rv
    OUTPUT_VARIABLE file_ov
    ERROR_VARIABLE file_ev
    OUTPUT_STRIP_TRAILING_WHITESPACE
    )
  if(NOT file_rv STREQUAL "0")
    message(FATAL_ERROR "${FILE_COMMAND} failed: ${file_rv}\n${file_ev}\n${file_ov}")
  endif()

  get_filename_component(input_file_NAME ${input_file} NAME)
  string(REPLACE "${input_file}" " _file_full_ " file_ov "${file_ov}")
  string(TOLOWER "${file_ov}" file_ov_lower)

  set(detected_type)
  set(detected_dir)
  # below executable check works for both mac osx and linux
  if("${file_ov_lower}" MATCHES "executable")
    set(detected_type PROGRAMS)
    set(detected_dir bin)
    # detect position independent executables on Linux,
    # where "file" gives "dynamically linked (uses shared libraries)"
  elseif("${file_ov_lower}" MATCHES "dynamically linked.*\(uses shared libs\)")
    set(detected_type FILES)
    set(detected_dir lib)
    # detect position independent executables on Linux,
    # where "file" gives "shared object ... (uses shared libraries)"
  elseif("${file_ov_lower}" MATCHES "shared object.*\(uses shared libs\)")
    set(detected_type FILES)
    set(detected_dir lib)
    # detect shared libraries on Linux,
    # where "file" gives "ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped"
  elseif("${file_ov_lower}" MATCHES "elf.*shared object.*version")
    set(detected_type FILES)
    set(detected_dir lib)
    # "file" version 5.22 does not print "(used shared libraries)"
    # but uses "interpreter"
  elseif("${file_ov_lower}" MATCHES "shared object.*interpreter")
    set(detected_type FILES)
    set(detected_dir lib)
    # detect shared libraries on Mac OSX
    # where "file" gives "Mach-O 64-bit x86_64 dynamically linked shared library"
  elseif("${file_ov_lower}" MATCHES "mach-o.*dynamically linked shared library")
    set(detected_type FILES)
    set(detected_dir lib)
    #below check is redundant.  detect executables on Mac OSX
    # where "file" gives "Mach-O 64-bit x86_64 executable"
  elseif("${file_ov_lower}" MATCHES "mach-o.*executable")
    set(detected_type PROGRAMS)
    set(detected_dir bin)
    # detect shared libraries on Mac OSX
    # where "file" gives "Mach-O 64-bit x86_64 bundle"
  elseif("${file_ov_lower}" MATCHES "mach-o.*bundle")
    set(detected_type FILES)
    set(detected_dir lib)
  elseif("${file_ov_lower}" MATCHES "mach-o.*bundle")
    set(detected_type FILES)
    set(detected_dir lib)
  elseif("${file_ov_lower}" MATCHES "symbolic link")
    #this will do a symlink check again using but that's okay!

    #set type to symlink we are going to resolve it anyway
    set(detected_type "symlink")

    set(is_this_a_symbolic_link FALSE)
    set(target_file)
    isfile_symlink("${input_file}" is_this_a_symbolic_link target_file)    
    if(is_this_a_symbolic_link)
      
      if(target_file)
	set(libdir "lib")
	setif_value_in_list(is_gtk_lib "${input_file_NAME}" GTK_LIB_LIST_1)
	if(is_gtk_lib)
	  set(libdir "lib/gtk")
	endif()
	file(APPEND
	  ${CMAKE_BINARY_DIR}/make_symlinks
	  "ln -sf \"$OUT_DIR/${libdir}/${target_file}\" \"$OUT_DIR/${libdir}/${input_file_NAME}\" \n"
	  )
      endif() #target_file
    endif() #is_this_a_symbolic_link
  else() #if("${file_ov_lower}" MATCHES ...)
    #we are out of options at this point. throw error!
    message(FATAL_ERROR "unknown/untracked file type found: ${input_file}")
  endif() #if("${file_ov_lower}" MATCHES ...)

  #message("detected_type=${detected_type}")
  set(${result_type} "${detected_type}" PARENT_SCOPE)
  set(${result_dir} "${detected_dir}" PARENT_SCOPE)
endfunction()