Overhaul FindOpenShotAudio.cmake

* Version checking!
  - Supports EXACT
    (but only for M.N.B, e.g. 0.1.8-dev1 matches 0.1.8 EXACT)
  - REQUIRED will now cause CMake to abort if version is not
    sufficient (lower than requested)
  - Outputs the following:
    - Version requested, if set
    - Version found, if successfully parsed from header
    - Compatibility status, if version set on both ends
* Accept `LIBOPENSHOT_AUDIO_DIR` cache variable, in addition to
  the environment variable (for `cmake -DLIBOPENSHOT_AUDIO_DIR=...`)
* Do two-stage search for both headers and libs
  (Avoids this situation...)
  LIBOPENSHOT_AUDIO_INCLUDE_DIRS=/usr/include/libopenshot-audio
  LIBOPENSHOT_AUDIO_LIBRARY=/home/ferd/build/

(Largely inspired by CMake's `FindPythonLibs.cmake`)
This commit is contained in:
FeRD (Frank Dana)
2019-07-12 18:28:40 -04:00
parent ed4b32d4f5
commit 8dcefbd87c

View File

@@ -5,34 +5,114 @@
# LIBOPENSHOT_AUDIO_INCLUDE_DIRS - The juce.h include directories
# LIBOPENSHOT_AUDIO_LIBRARIES - The libraries needed to use juce
message("$ENV{LIBOPENSHOT_AUDIO_DIR}")
include(GNUInstallDirs)
# Find the libopenshot-audio header files
find_path(LIBOPENSHOT_AUDIO_INCLUDE_DIR JuceHeader.h
PATHS $ENV{LIBOPENSHOT_AUDIO_DIR}/include/libopenshot-audio/
/usr/include/libopenshot-audio/
/usr/local/include/libopenshot-audio/ )
if("$ENV{LIBOPENSHOT_AUDIO_DIR}" AND NOT "${OpenShotAudio_FIND_QUIETLY}")
message(STATUS "Looking for OpenShotAudio in: $ENV{LIBOPENSHOT_AUDIO_DIR}")
endif()
# Find the libopenshot-audio.so (check env var first)
find_library(LIBOPENSHOT_AUDIO_LIBRARY
NAMES libopenshot-audio openshot-audio
PATHS $ENV{LIBOPENSHOT_AUDIO_DIR}/lib/ NO_DEFAULT_PATH)
# Find the libopenshot-audio header files (check env/cache vars first)
find_path(
LIBOPENSHOT_AUDIO_INCLUDE_DIR
JuceHeader.h
HINTS
ENV LIBOPENSHOT_AUDIO_DIR
PATHS
${LIBOPENSHOT_AUDIO_DIR}
PATH_SUFFIXES
include/libopenshot-audio
libopenshot-audio
include
NO_DEFAULT_PATH
)
# Find the libopenshot-audio.so / libopenshot-audio.dll library (fallback)
find_library(LIBOPENSHOT_AUDIO_LIBRARY
NAMES libopenshot-audio openshot-audio
HINTS $ENV{LIBOPENSHOT_AUDIO_DIR}/lib/
/usr/lib/
/usr/lib/libopenshot-audio/
/usr/local/lib/ )
# Find the libopenshot-audio header files (fallback to std. paths)
find_path(
LIBOPENSHOT_AUDIO_INCLUDE_DIR
JuceHeader.h
HINTS
ENV LIBOPENSHOT_AUDIO_DIR
PATHS
${LIBOPENSHOT_AUDIO_DIR}
PATH_SUFFIXES
include/libopenshot-audio
libopenshot-audio
include
)
set(LIBOPENSHOT_AUDIO_LIBRARIES ${LIBOPENSHOT_AUDIO_LIBRARY})
set(LIBOPENSHOT_AUDIO_LIBRARY ${LIBOPENSHOT_AUDIO_LIBRARIES})
# Find libopenshot-audio.so / libopenshot-audio.dll (check env/cache vars first)
find_library(
LIBOPENSHOT_AUDIO_LIBRARY
NAMES
libopenshot-audio
openshot-audio
HINTS
ENV LIBOPENSHOT_AUDIO_DIR
PATHS
${LIBOPENSHOT_AUDIO_DIR}
PATH_SUFFIXES
lib/libopenshot-audio
libopenshot-audio
lib
NO_DEFAULT_PATH
)
set(LIBOPENSHOT_AUDIO_INCLUDE_DIRS ${LIBOPENSHOT_AUDIO_INCLUDE_DIR} )
# Find libopenshot-audio.so / libopenshot-audio.dll (fallback)
find_library(
LIBOPENSHOT_AUDIO_LIBRARY
NAMES
libopenshot-audio
openshot-audio
HINTS
ENV LIBOPENSHOT_AUDIO_DIR
PATHS
${LIBOPENSHOT_AUDIO_DIR}
PATH_SUFFIXES
lib/libopenshot-audio
libopenshot-audio
lib
)
set(LIBOPENSHOT_AUDIO_LIBRARIES "${LIBOPENSHOT_AUDIO_LIBRARY}")
set(LIBOPENSHOT_AUDIO_LIBRARY "${LIBOPENSHOT_AUDIO_LIBRARIES}")
set(LIBOPENSHOT_AUDIO_INCLUDE_DIRS "${LIBOPENSHOT_AUDIO_INCLUDE_DIR}")
if(LIBOPENSHOT_AUDIO_INCLUDE_DIR AND EXISTS "${LIBOPENSHOT_AUDIO_INCLUDE_DIR}/JuceHeader.h")
file(STRINGS "${LIBOPENSHOT_AUDIO_INCLUDE_DIR}/JuceHeader.h" libosa_version_str
REGEX "versionString.*=.*\"[^\"]+\"")
if(libosa_version_str MATCHES "versionString.*=.*\"([^\"]+)\"")
set(LIBOPENSHOT_AUDIO_VERSION_STRING ${CMAKE_MATCH_1})
endif()
unset(libosa_version_str)
string(REGEX REPLACE "^([0-9]+\.[0-9]+\.[0-9]+).*$" "\\1"
LIBOPENSHOT_AUDIO_VERSION "${LIBOPENSHOT_AUDIO_VERSION_STRING}")
endif()
# If we couldn't parse M.N.B version, don't keep any of it
if(NOT LIBOPENSHOT_AUDIO_VERSION)
unset(LIBOPENSHOT_AUDIO_VERSION)
unset(LIBOPENSHOT_AUDIO_VERSION_STRING)
endif()
# Determine compatibility with requested version in find_package()
if(OpenShotAudio_FIND_VERSION AND LIBOPENSHOT_AUDIO_VERSION)
if("${OpenShotAudio_FIND_VERSION}" STREQUAL "${LIBOPENSHOT_AUDIO_VERSION}")
set(OpenShotAudio_VERSION_EXACT TRUE)
endif()
if("${OpenShotAudio_FIND_VERSION}" VERSION_GREATER "${LIBOPENSHOT_AUDIO_VERSION}")
set(OpenShotAudio_VERSION_COMPATIBLE FALSE)
else()
set(OpenShotAudio_VERSION_COMPATIBLE TRUE)
endif()
endif()
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LIBOPENSHOT_AUDIO_FOUND to TRUE
# if all listed variables are TRUE
find_package_handle_standard_args(LIBOPENSHOT_AUDIO DEFAULT_MSG
LIBOPENSHOT_AUDIO_LIBRARY LIBOPENSHOT_AUDIO_INCLUDE_DIR)
find_package_handle_standard_args(OpenShotAudio
REQUIRED_VARS
LIBOPENSHOT_AUDIO_LIBRARY
LIBOPENSHOT_AUDIO_INCLUDE_DIRS
VERSION_VAR
LIBOPENSHOT_AUDIO_VERSION_STRING
)