1 include(CMakeParseArguments)
4 @brief Detect library
type of a library
6 Sometimes it needs to be known whether a library is shared or
static on a
7 system in
order to change the usage requirements of an imported
target 8 representing that library. This commonly occurs between
static and shared
9 builds that share a
set of installed headers. This
function returns one of
10 `SHARED`, `STATIC`, or `UNKNOWN` into the variable passed as the first
19 cmake_parse_arguments(vdlt
25 if (NOT DEFINED vdlt_PATH)
27 "The `PATH` argument is required.")
30 if (DEFINED vdlt_UNPARSED_ARGUMENTS)
32 "Unparsed arguments for vtk_detect_library_type: " 33 "${vdlt_UNPARSED_ARGUMENTS}")
38 "The `PATH` argument is empty.")
41 set(vdlt_type UNKNOWN)
42 # Windows libraries all end with `.lib`. We need to detect the
type based
on 43 # the contents of the library. However, MinGW does use different extensions.
44 if (WIN32 AND NOT MINGW)
45 find_program(DUMPBIN_EXECUTABLE
47 DOC
"Path to the dumpbin executable")
48 mark_as_advanced(DUMPBIN_EXECUTABLE)
50 COMMAND
"${DUMPBIN_EXECUTABLE}" 53 OUTPUT_VARIABLE vdlt_out
54 ERROR_VARIABLE vdlt_err
55 RESULT_VARIABLE vdlt_res)
58 "Failed to run `dumpbin` on ${vdlt_PATH}. Cannot determine " 59 "shared/static library type: ${vdlt_err}")
61 if (vdlt_out MATCHES
"DLL name :")
68 string(LENGTH
"${vdlt_PATH}" vdlt_path_len)
70 string(LENGTH
"${CMAKE_SHARED_LIBRARY_SUFFIX}" vdlt_shared_suffix_len)
71 math(EXPR vdlt_shared_idx
"${vdlt_path_len} - ${vdlt_shared_suffix_len}")
72 string(SUBSTRING
"${vdlt_PATH}" "${vdlt_shared_idx}" -1 vdlt_shared_check)
74 string(LENGTH
"${CMAKE_STATIC_LIBRARY_SUFFIX}" vdlt_static_suffix_len)
75 math(EXPR vdlt_static_idx
"${vdlt_path_len} - ${vdlt_static_suffix_len}")
76 string(SUBSTRING
"${vdlt_PATH}" "${vdlt_static_idx}" -1 vdlt_static_check)
78 if (vdlt_shared_check STREQUAL CMAKE_SHARED_LIBRARY_SUFFIX)
80 elseif (vdlt_static_check STREQUAL CMAKE_STATIC_LIBRARY_SUFFIX)
84 # when import suffix != static suffix, we can disambiguate static and import 85 if (WIN32 AND NOT CMAKE_IMPORT_LIBRARY_SUFFIX STREQUAL CMAKE_STATIC_LIBRARY_SUFFIX)
86 string(LENGTH
"${CMAKE_IMPORT_LIBRARY_SUFFIX}" vdlt_import_suffix_len)
87 math(EXPR vdlt_import_idx
"${vdlt_path_len} - ${vdlt_import_suffix_len}")
88 string(SUBSTRING
"${vdlt_PATH}" "${vdlt_import_idx}" -1 vdlt_import_check)
89 if (vdlt_import_check STREQUAL CMAKE_IMPORT_LIBRARY_SUFFIX)
101 @brief Detect whether an imported
target is shared or not
103 This is intended
for use with modules
using 105 not. Generally,
this should be replaced with the `Find` module providing
this 106 information and modifying the usage requirements as necessary instead, but it
107 is not always possible.
113 Sets `<
name>_is_shared` in the caller
's scope if `<target>` is a shared 114 library. If it is an `UNKNOWN_LIBRARY`, a cache variable is exposed to allow 115 the user to provide the information if it ends up breaking something. 117 function (vtk_detect_library_shared name target) 118 if (VTK_MODULE_USE_EXTERNAL_${name}) 119 get_property(library_type 122 if (library_type STREQUAL "SHARED_LIBRARY") 124 elseif (library_type STREQUAL "UNKNOWN_LIBRARY") 125 option("VTK_MODULE_${name}_IS_SHARED" "Whether the ${name} in use is shared or not" ON) 126 mark_as_advanced("VTK_MODULE_${name}_IS_SHARED") 127 set(is_shared "${VTK_MODULE_${name}_IS_SHARED}") 132 set(is_shared "${BUILD_SHARED_LIBS}") 135 set("${name}_is_shared" boost::graph_traits< vtkGraph * >::vertex_descriptor target(boost::graph_traits< vtkGraph *>::edge_descriptor e, vtkGraph *)
function vtk_detect_library_type(output)
Detect library type of a library.
function vtk_detect_library_shared(name, target)
Detect whether an imported target is shared or not.
function vtk_module_third_party_external()
External third party package.