Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
LoadStaticSharedTargets
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
CMake
LoadStaticSharedTargets
Commits
bdf16967
Unverified
Commit
bdf16967
authored
2 years ago
by
Tim Haase
Browse files
Options
Downloads
Patches
Plain Diff
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
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
README.md
+1
-1
1 addition, 1 deletion
README.md
src/cmake/LoadStaticSharedTargets.cmake
+29
-66
29 additions, 66 deletions
src/cmake/LoadStaticSharedTargets.cmake
with
30 additions
and
67 deletions
README.md
+
1
−
1
View file @
bdf16967
...
...
@@ -15,7 +15,7 @@ include(FetchContent)
FetchContent_Declare
(
LoadStaticSharedTargets
GIT_REPOSITORY
"https://github.com/lepus2589/LoadStaticSharedTargets.git"
GIT_TAG v1.
1
GIT_TAG v1.
2
)
FetchContent_MakeAvailable
(
LoadStaticSharedTargets
)
FetchContent_GetProperties
(
...
...
This diff is collapsed.
Click to expand it.
src/cmake/LoadStaticSharedTargets.cmake
+
29
−
66
View file @
bdf16967
...
...
@@ -50,26 +50,26 @@ load_static_shared_targets(
]]
macro
(
load_static_shared_targets
)
set
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
known_comps
static shared
)
set
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
comp
_static NO
)
set
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
comp
_shared NO
)
set
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
KNOWN_COMPS
static shared
)
set
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
COMP
_static NO
)
set
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
COMP
_shared NO
)
# 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
(
${
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
)
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
)
# Else do error handling.
else
()
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
)
return
()
endif
()
endforeach
()
# 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
"
${
CMAKE_FIND_PACKAGE_NAME
}
`static` and `shared` components are mutually exclusive."
)
set
(
${
CMAKE_FIND_PACKAGE_NAME
}
_FOUND FALSE
)
...
...
@@ -77,91 +77,54 @@ macro(load_static_shared_targets)
endif
()
# 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
if
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
comp
_static
)
_static_shared_load_targets
(
static
)
if
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
COMP
_static
)
_static_shared_load_targets
(
STATIC
)
# Shared component requested
elseif
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
comp
_shared
)
_static_shared_load_targets
(
shared
)
elseif
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
COMP
_shared
)
_static_shared_load_targets
(
SHARED
)
# ${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
)
_static_shared_load_targets
(
shared
)
_static_shared_load_targets
(
SHARED
)
# ${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
)
_static_shared_load_targets
(
static
)
_static_shared_load_targets
(
STATIC
)
# BUILD_SHARED_LIBS variable set to ON
elseif
(
BUILD_SHARED_LIBS
)
# If shared target is installed, include it.
if
(
EXISTS
"
${${
CMAKE_FIND_PACKAGE_NAME
}
_
shared_targets
}
"
)
_static_shared_load_targets
(
shared
)
if
(
EXISTS
"
${${
CMAKE_FIND_PACKAGE_NAME
}
_
SHARED_TARGETS
}
"
)
_static_shared_load_targets
(
SHARED
)
# Otherwise at least load the static target
else
()
_static_shared_load_targets
(
static
)
_static_shared_load_targets
(
STATIC
)
endif
()
# BUILD_SHARED_LIBS variable set to OFF
else
()
# If static target is installed, include it.
if
(
EXISTS
"
${${
CMAKE_FIND_PACKAGE_NAME
}
_
static_targets
}
"
)
_static_shared_load_targets
(
static
)
if
(
EXISTS
"
${${
CMAKE_FIND_PACKAGE_NAME
}
_
STATIC_TARGETS
}
"
)
_static_shared_load_targets
(
STATIC
)
# Otherwise at least load the shared target
else
()
_static_shared_load_targets
(
shared
)
_static_shared_load_targets
(
SHARED
)
endif
()
endif
()
endmacro
()
# Macro to check, if the requested file with the exported targets is installed.
# Do error handling if not, include it otherwise.
macro
(
_static_shared_load_targets
type
)
foreach
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
target
${${
CMAKE_FIND_PACKAGE_NAME
}
_
${
type
}
_targets
}
)
if
(
NOT EXISTS
"
${${
CMAKE_FIND_PACKAGE_NAME
}
_
target
}
"
)
macro
(
_static_shared_load_targets
TYPE
)
foreach
(
${
CMAKE_FIND_PACKAGE_NAME
}
_
TARGET
${${
CMAKE_FIND_PACKAGE_NAME
}
_
${
TYPE
}
_TARGETS
}
)
if
(
NOT EXISTS
"
${${
CMAKE_FIND_PACKAGE_NAME
}
_
TARGET
}
"
)
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
)
return
()
endif
()
include
(
"
${${
CMAKE_FIND_PACKAGE_NAME
}
_
target
}
"
)
include
(
"
${${
CMAKE_FIND_PACKAGE_NAME
}
_
TARGET
}
"
)
endforeach
()
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
()
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment