aboutsummaryrefslogtreecommitdiffstats
path: root/cmake/modules/FindWSWinLibs.cmake
blob: 60f5a2ac8efd383d99a167eaf3fb510d2cac2e66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
#
# - Find WSWin Libs
#  Due to the layout of the Wireshark Win support libs,
#  CMake needs some support to find them
#
#  The function is passed the directory name to search for and the variable
#  to set in the callers scope.

function( FindWSWinLibs _WS_LIB_SEARCH_PATH _LIB_HINT_VAR )
  if( WIN32 )
    if( ARGN )
      set( _PROJECT_LIB_DIR ${ARGN} )
    else()
      if( DEFINED ENV{WIRESHARK_LIB_DIR} )
        # The buildbots set WIRESHARK_LIB_DIR but not WIRESHARK_BASE_DIR.
        file( TO_CMAKE_PATH "$ENV{WIRESHARK_LIB_DIR}" _PROJECT_LIB_DIR )
      else()
        file( TO_CMAKE_PATH "$ENV{WIRESHARK_BASE_DIR}" _WS_BASE_DIR )
        set( _PROJECT_LIB_DIR "${_WS_BASE_DIR}/wireshark-${WIRESHARK_TARGET_PLATFORM}-libs" )
      endif()
    endif()

    file( GLOB _SUBDIR "${_PROJECT_LIB_DIR}/*" )
    # We might be able to use $ENV{VSCMD_ARG_TGT_ARCH} here.
    set (_vcpkg_arch x64)
    if(WIRESHARK_TARGET_PLATFORM MATCHES "win32")
      set (_vcpkg_arch x86)
    endif()

    foreach( _DIR ${_SUBDIR} )
      if( IS_DIRECTORY ${_DIR} )
        if( "${_DIR}" MATCHES ".*/${_WS_LIB_SEARCH_PATH}" )
          set(_vcpkg_dir "${_DIR}/installed/${_vcpkg_arch}-windows")
          if( IS_DIRECTORY "${_vcpkg_dir}")
            set( ${_LIB_HINT_VAR} ${_vcpkg_dir} PARENT_SCOPE )
          else()
            set( ${_LIB_HINT_VAR} ${_DIR} PARENT_SCOPE )
          endif()
        endif()
      endif()
    endforeach()
  endif()
endfunction()

# Add a single DLL
function(AddWSWinDLL _PKG_NAME _PKG_HINTS _DLL_GLOB)
  if(WIN32 AND ${_PKG_NAME}_FOUND)
    string(TOUPPER ${_PKG_NAME} _PKG_VAR)
    set ( ${_PKG_VAR}_DLL_DIR "${${_PKG_HINTS}}/bin"
      CACHE PATH "Path to ${_PKG_NAME} DLL"
    )
    file( GLOB _pkg_dll RELATIVE "${${_PKG_VAR}_DLL_DIR}"
      "${${_PKG_VAR}_DLL_DIR}/${_DLL_GLOB}.dll"
    )
    set ( ${_PKG_VAR}_DLL ${_pkg_dll}
      CACHE STRING "${_PKG_NAME} DLL file name"
    )
    file( GLOB _pkg_pdb RELATIVE "${${_PKG_VAR}_DLL_DIR}"
      "${${_PKG_VAR}_DLL_DIR}/${_DLL_GLOB}.pdb"
    )
    set ( ${_PKG_VAR}_PDB ${_pkg_pdb}
      CACHE STRING "${_PKG_NAME} PDB file name"
    )
    mark_as_advanced( ${_PKG_VAR}_DLL_DIR ${_PKG_VAR}_DLL ${_PKG_VAR}_PDB )
  else()
    set( ${_PKG_VAR}_DLL_DIR )
    set( ${_PKG_VAR}_DLL )
  endif()
endfunction()

# Add a list of DLLs
function(AddWSWinDLLS _PKG_NAME _PKG_HINTS) # ...DLL globs
  if(WIN32 AND ${_PKG_NAME}_FOUND)
    string(TOUPPER ${_PKG_NAME} _PKG_VAR)
    set ( ${_PKG_VAR}_DLL_DIR "${${_PKG_HINTS}}/bin"
      CACHE PATH "Path to ${_PKG_NAME} DLLs"
    )

    set (_pkg_dlls)
    set (_pkg_pdbs)
    foreach(_dll_glob ${ARGN})
      file( GLOB _pkg_dll RELATIVE "${${_PKG_VAR}_DLL_DIR}"
        "${${_PKG_VAR}_DLL_DIR}/${_dll_glob}.dll"
      )
      list(APPEND _pkg_dlls "${_pkg_dll}")
      file( GLOB _pkg_pdb RELATIVE "${${_PKG_VAR}_DLL_DIR}"
        "${${_PKG_VAR}_DLL_DIR}/${_dll_glob}.pdb"
      )
      list(APPEND _pkg_pdbs "${_pkg_pdb}")
    endforeach()

    set ( ${_PKG_VAR}_DLLS ${_pkg_dlls}
    CACHE FILEPATH "${_PKG_NAME} DLL list"
    )
    set ( ${_PKG_VAR}_PDBS ${_pkg_pdbs}
      CACHE FILEPATH "${_PKG_NAME} PDB list"
    )

    mark_as_advanced( ${_PKG_VAR}_DLL_DIR ${_PKG_VAR}_DLLS ${_PKG_VAR}_PDBS )
  else()
    set( ${_PKG_VAR}_DLL_DIR )
    set( ${_PKG_VAR}_DLLS )
    set( ${_PKG_VAR}_PDBS )
  endif()
endfunction()