123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- # Generate variables that can be used to help emit a pkg-config file
- # using configure_file().
- #
- # Usage: gen_pkgconfig_vars(VAR_PREFIX target)
- #
- # This will set two variables in the caller scope:
- # ${VAR_PREFIX}_CFLAGS: set to the compile flags computed from the specified
- # target
- # ${VAR_PREFIX}_PRIVATE_LIBS: set to the linker flags needed for static
- # linking computed from the specified target
- function(gen_pkgconfig_vars)
- if (NOT ${ARGC} EQUAL 2)
- message(FATAL_ERROR "gen_pkgconfig_vars() requires exactly 2 arguments")
- endif()
- set(var_prefix "${ARGV0}")
- set(target "${ARGV1}")
- get_target_property(target_cflags "${target}" INTERFACE_COMPILE_OPTIONS)
- if(target_cflags)
- list(APPEND cflags "${target_cflags}")
- endif()
- get_target_property(
- target_inc_dirs "${target}" INTERFACE_INCLUDE_DIRECTORIES)
- if(target_inc_dirs)
- list(APPEND include_dirs "${target_inc_dirs}")
- endif()
- get_target_property(target_defns "${target}" INTERFACE_COMPILE_DEFINITIONS)
- if(target_defns)
- list(APPEND definitions "${target_defns}")
- endif()
- # The INTERFACE_LINK_LIBRARIES list is unfortunately somewhat awkward to
- # process. Entries in this list may be any of
- # - target names
- # - absolute paths to a library file
- # - plain library names that need "-l" prepended
- # - other linker flags starting with "-"
- #
- # Walk through each entry and transform it into the desired arguments
- get_target_property(link_libs "${target}" INTERFACE_LINK_LIBRARIES)
- if(link_libs)
- foreach(lib_arg IN LISTS link_libs)
- if(TARGET "${lib_arg}")
- # Add any compile options specified in the targets
- # INTERFACE_COMPILE_OPTIONS. We don't need to process its
- # INTERFACE_LINK_LIBRARIES property, since our INTERFACE_LINK_LIBRARIES
- # will already include its entries transitively.
- get_target_property(lib_cflags "${lib_arg}" INTERFACE_COMPILE_OPTIONS)
- if(lib_cflags)
- list(APPEND cflags "${lib_cflags}")
- endif()
- get_target_property(lib_defs "${lib_arg}"
- INTERFACE_COMPILE_DEFINITIONS)
- if(lib_defs)
- list(APPEND definitions "${lib_defs}")
- endif()
- elseif(lib_arg MATCHES "^[-/]")
- list(APPEND private_libs "${lib_arg}")
- else()
- list(APPEND private_libs "-l${lib_arg}")
- endif()
- endforeach()
- endif()
- list(APPEND cflags "${CMAKE_REQUIRED_FLAGS}")
- if(definitions)
- list(REMOVE_DUPLICATES definitions)
- foreach(def_arg IN LISTS definitions)
- list(APPEND cflags "-D${def_arg}")
- endforeach()
- endif()
- if(include_dirs)
- list(REMOVE_DUPLICATES include_dirs)
- foreach(inc_dir IN LISTS include_dirs)
- list(APPEND cflags "-I${inc_dir}")
- endforeach()
- endif()
- # Set the output variables
- string(REPLACE ";" " " cflags "${cflags}")
- set("${var_prefix}_CFLAGS" "${cflags}" PARENT_SCOPE)
- string(REPLACE ";" " " private_libs "${private_libs}")
- set("${var_prefix}_PRIVATE_LIBS" "${private_libs}" PARENT_SCOPE)
- endfunction()
|