Skip to content
Snippets Groups Projects
Unverified Commit bdf16967 authored by Tim Haase's avatar Tim Haase
Browse files

Use built-in cmake_parse_arguments() function for parsing macro arguments

This is much better than writing it ourselves.
parent 47a99018
No related branches found
No related tags found
No related merge requests found
...@@ -15,7 +15,7 @@ include(FetchContent) ...@@ -15,7 +15,7 @@ include(FetchContent)
FetchContent_Declare( FetchContent_Declare(
LoadStaticSharedTargets LoadStaticSharedTargets
GIT_REPOSITORY "https://github.com/lepus2589/LoadStaticSharedTargets.git" GIT_REPOSITORY "https://github.com/lepus2589/LoadStaticSharedTargets.git"
GIT_TAG v1.1 GIT_TAG v1.2
) )
FetchContent_MakeAvailable(LoadStaticSharedTargets) FetchContent_MakeAvailable(LoadStaticSharedTargets)
FetchContent_GetProperties( FetchContent_GetProperties(
......
...@@ -50,26 +50,26 @@ load_static_shared_targets( ...@@ -50,26 +50,26 @@ load_static_shared_targets(
]] ]]
macro(load_static_shared_targets) macro(load_static_shared_targets)
set(${CMAKE_FIND_PACKAGE_NAME}_known_comps static shared) set(${CMAKE_FIND_PACKAGE_NAME}_KNOWN_COMPS static shared)
set(${CMAKE_FIND_PACKAGE_NAME}_comp_static NO) set(${CMAKE_FIND_PACKAGE_NAME}_COMP_static NO)
set(${CMAKE_FIND_PACKAGE_NAME}_comp_shared NO) set(${CMAKE_FIND_PACKAGE_NAME}_COMP_shared NO)
# Iterate the list of requested components given to `find_package()` # Iterate the list of requested components given to `find_package()`
foreach (${CMAKE_FIND_PACKAGE_NAME}_comp IN LISTS ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS) foreach (${CMAKE_FIND_PACKAGE_NAME}_COMP IN LISTS ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS)
# If it's a valid component, turn on the respective switch. # If it's a valid component, turn on the respective switch.
if (${CMAKE_FIND_PACKAGE_NAME}_comp IN_LIST ${CMAKE_FIND_PACKAGE_NAME}_known_comps) if (${CMAKE_FIND_PACKAGE_NAME}_COMP IN_LIST ${CMAKE_FIND_PACKAGE_NAME}_KNOWN_COMPS)
set(${CMAKE_FIND_PACKAGE_NAME}_comp_${${CMAKE_FIND_PACKAGE_NAME}_comp} YES) set(${CMAKE_FIND_PACKAGE_NAME}_COMP_${${CMAKE_FIND_PACKAGE_NAME}_COMP} YES)
# Else do error handling. # Else do error handling.
else () else ()
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE
"${CMAKE_FIND_PACKAGE_NAME} does not recognize component `${${CMAKE_FIND_PACKAGE_NAME}_comp}`.") "${CMAKE_FIND_PACKAGE_NAME} does not recognize component `${${CMAKE_FIND_PACKAGE_NAME}_COMP}`.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE) set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE)
return() return()
endif () endif ()
endforeach () endforeach ()
# Components static and shared are mutually exclusive. # Components static and shared are mutually exclusive.
if (${CMAKE_FIND_PACKAGE_NAME}_comp_static AND ${CMAKE_FIND_PACKAGE_NAME}_comp_shared) if (${CMAKE_FIND_PACKAGE_NAME}_COMP_static AND ${CMAKE_FIND_PACKAGE_NAME}_COMP_shared)
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE
"${CMAKE_FIND_PACKAGE_NAME} `static` and `shared` components are mutually exclusive.") "${CMAKE_FIND_PACKAGE_NAME} `static` and `shared` components are mutually exclusive.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE) set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE)
...@@ -77,91 +77,54 @@ macro(load_static_shared_targets) ...@@ -77,91 +77,54 @@ macro(load_static_shared_targets)
endif () endif ()
# Parse static and shared targets from argument list. # Parse static and shared targets from argument list.
_static_shared_parse_args(${ARGN}) set(${CMAKE_FIND_PACKAGE_NAME}_ARGUMENT_KEYWORDS STATIC_TARGETS SHARED_TARGETS)
cmake_parse_arguments(${CMAKE_FIND_PACKAGE_NAME} "" "" "${${CMAKE_FIND_PACKAGE_NAME}_ARGUMENT_KEYWORDS}" ${ARGN})
# We now have ${CMAKE_FIND_PACKAGE_NAME}_STATIC_TARGETS and
# ${CMAKE_FIND_PACKAGE_NAME}_SHARED_TARGETS variables created for us.
# Static component requested # Static component requested
if (${CMAKE_FIND_PACKAGE_NAME}_comp_static) if (${CMAKE_FIND_PACKAGE_NAME}_COMP_static)
_static_shared_load_targets(static) _static_shared_load_targets(STATIC)
# Shared component requested # Shared component requested
elseif (${CMAKE_FIND_PACKAGE_NAME}_comp_shared) elseif (${CMAKE_FIND_PACKAGE_NAME}_COMP_shared)
_static_shared_load_targets(shared) _static_shared_load_targets(SHARED)
# ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS cache variable set to ON # ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS cache variable set to ON
elseif (DEFINED ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS AND ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS) elseif (DEFINED ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS AND ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS)
_static_shared_load_targets(shared) _static_shared_load_targets(SHARED)
# ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS cache variable set to OFF # ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS cache variable set to OFF
elseif (DEFINED ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS AND NOT ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS) elseif (DEFINED ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS AND NOT ${CMAKE_FIND_PACKAGE_NAME}_SHARED_LIBS)
_static_shared_load_targets(static) _static_shared_load_targets(STATIC)
# BUILD_SHARED_LIBS variable set to ON # BUILD_SHARED_LIBS variable set to ON
elseif (BUILD_SHARED_LIBS) elseif (BUILD_SHARED_LIBS)
# If shared target is installed, include it. # If shared target is installed, include it.
if (EXISTS "${${CMAKE_FIND_PACKAGE_NAME}_shared_targets}") if (EXISTS "${${CMAKE_FIND_PACKAGE_NAME}_SHARED_TARGETS}")
_static_shared_load_targets(shared) _static_shared_load_targets(SHARED)
# Otherwise at least load the static target # Otherwise at least load the static target
else () else ()
_static_shared_load_targets(static) _static_shared_load_targets(STATIC)
endif () endif ()
# BUILD_SHARED_LIBS variable set to OFF # BUILD_SHARED_LIBS variable set to OFF
else () else ()
# If static target is installed, include it. # If static target is installed, include it.
if (EXISTS "${${CMAKE_FIND_PACKAGE_NAME}_static_targets}") if (EXISTS "${${CMAKE_FIND_PACKAGE_NAME}_STATIC_TARGETS}")
_static_shared_load_targets(static) _static_shared_load_targets(STATIC)
# Otherwise at least load the shared target # Otherwise at least load the shared target
else () else ()
_static_shared_load_targets(shared) _static_shared_load_targets(SHARED)
endif () endif ()
endif () endif ()
endmacro() endmacro()
# Macro to check, if the requested file with the exported targets is installed. # Macro to check, if the requested file with the exported targets is installed.
# Do error handling if not, include it otherwise. # Do error handling if not, include it otherwise.
macro(_static_shared_load_targets type) macro(_static_shared_load_targets TYPE)
foreach (${CMAKE_FIND_PACKAGE_NAME}_target ${${CMAKE_FIND_PACKAGE_NAME}_${type}_targets}) foreach (${CMAKE_FIND_PACKAGE_NAME}_TARGET ${${CMAKE_FIND_PACKAGE_NAME}_${TYPE}_TARGETS})
if (NOT EXISTS "${${CMAKE_FIND_PACKAGE_NAME}_target}") if (NOT EXISTS "${${CMAKE_FIND_PACKAGE_NAME}_TARGET}")
set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE
"${CMAKE_FIND_PACKAGE_NAME} `${type}` libraries were requested but not found.") "${CMAKE_FIND_PACKAGE_NAME} `${TYPE}` libraries were requested but not found.")
set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE) set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE)
return() return()
endif () endif ()
include("${${CMAKE_FIND_PACKAGE_NAME}_target}") include("${${CMAKE_FIND_PACKAGE_NAME}_TARGET}")
endforeach () endforeach ()
endmacro() endmacro()
# Parse the list of static targets and the list of shared targets from the macro
# arguments.
macro(_static_shared_parse_args)
set(_STATIC_SHARED_EXTRA_MACRO_ARGS ${ARGN})
list(FIND _STATIC_SHARED_EXTRA_MACRO_ARGS STATIC_TARGETS _STATIC_SHARED_STATIC_OPTION_INDEX)
list(FIND _STATIC_SHARED_EXTRA_MACRO_ARGS SHARED_TARGETS _STATIC_SHARED_SHARED_OPTION_INDEX)
if (NOT _STATIC_SHARED_STATIC_OPTION_INDEX EQUAL -1 AND NOT _STATIC_SHARED_SHARED_OPTION_INDEX EQUAL -1)
math(EXPR _STATIC_SHARED_STATIC_START_INDEX "${_STATIC_SHARED_STATIC_OPTION_INDEX} + 1")
math(EXPR _STATIC_SHARED_SHARED_START_INDEX "${_STATIC_SHARED_SHARED_OPTION_INDEX} + 1")
if (_STATIC_SHARED_STATIC_OPTION_INDEX LESS _STATIC_SHARED_SHARED_OPTION_INDEX)
math(EXPR _STATIC_SHARED_STATIC_LENGTH "${_STATIC_SHARED_SHARED_OPTION_INDEX} - ${_STATIC_SHARED_STATIC_START_INDEX}")
set(_STATIC_SHARED_SHARED_LENGTH -1)
else ()
set(_STATIC_SHARED_STATIC_LENGTH -1)
math(EXPR _STATIC_SHARED_SHARED_LENGTH "${_STATIC_SHARED_STATIC_OPTION_INDEX} - ${_STATIC_SHARED_SHARED_START_INDEX}")
endif ()
list(
SUBLIST
_STATIC_SHARED_EXTRA_MACRO_ARGS
${_STATIC_SHARED_SHARED_START_INDEX}
${_STATIC_SHARED_SHARED_LENGTH}
${CMAKE_FIND_PACKAGE_NAME}_shared_targets
)
list(
SUBLIST
_STATIC_SHARED_EXTRA_MACRO_ARGS
${_STATIC_SHARED_STATIC_START_INDEX}
${_STATIC_SHARED_STATIC_LENGTH}
${CMAKE_FIND_PACKAGE_NAME}_static_targets
)
# Else do error handling.
else ()
message(FATAL_ERROR "load_static_shared_targets() has been called with invalid arguments!")
endif ()
endmacro()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment