154 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
# Author thomas.roehr@dfki.de
 | 
						|
#
 | 
						|
# Version 0.3 2013-07-02
 | 
						|
#       - rely on `gem content` to find library and header
 | 
						|
#       - introduce GEM_OS_PKG to allow search via pkgconfig
 | 
						|
# Version 0.2 2010-01-14
 | 
						|
#       - add support for searching for multiple gems
 | 
						|
# Version 0.1 2010-12-15
 | 
						|
# 	- support basic search functionality 
 | 
						|
#       - tested to find rice
 | 
						|
#
 | 
						|
# OUTPUT:
 | 
						|
#
 | 
						|
# GEM_INCLUDE_DIRS	After successful search contains the include directores
 | 
						|
#
 | 
						|
# GEM_LIBRARIES		After successful search contains the full path of each found library
 | 
						|
#
 | 
						|
#
 | 
						|
# Usage: 
 | 
						|
# set(GEM_DEBUG TRUE)
 | 
						|
# find_package(Gem COMPONENTS rice hoe)
 | 
						|
# include_directories(${GEM_INCLUDE_DIRS})
 | 
						|
# target_link_libraries(${GEM_LIBRARIES}
 | 
						|
#
 | 
						|
# in case pkg-config should be used to search for the os pkg, set GEM_OS_PKG, i.e.
 | 
						|
# set(GEM_OS_PKG TRUE)
 | 
						|
#
 | 
						|
# Check for how 'gem' should be called
 | 
						|
include(FindPackageHandleStandardArgs)
 | 
						|
find_program(GEM_EXECUTABLE
 | 
						|
    NAMES "gem${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}"
 | 
						|
        "gem${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}"
 | 
						|
        "gem-${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}"
 | 
						|
        "gem-${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}"
 | 
						|
        "gem${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}${RUBY_VERSION_PATCH}"
 | 
						|
        "gem${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}.${RUBY_VERSION_PATCH}"
 | 
						|
        "gem-${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}${RUBY_VERSION_PATCH}"
 | 
						|
        "gem-${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}.${RUBY_VERSION_PATCH}"
 | 
						|
        "gem")
 | 
						|
 | 
						|
# Making backward compatible
 | 
						|
if(Gem_DEBUG)
 | 
						|
    set(GEM_DEBUG TRUE)
 | 
						|
endif()
 | 
						|
 | 
						|
if(NOT GEM_EXECUTABLE)
 | 
						|
	MESSAGE(FATAL_ERROR "Could not find the gem executable - install 'gem' first")
 | 
						|
endif()
 | 
						|
 | 
						|
if(NOT Gem_FIND_COMPONENTS)
 | 
						|
	MESSAGE(FATAL_ERROR "If searching for a Gem you have to provide COMPONENTS with the name of the gem")
 | 
						|
endif()
 | 
						|
 | 
						|
foreach(Gem_NAME ${Gem_FIND_COMPONENTS})
 | 
						|
    set(GEM_${Gem_NAME}_FOUND TRUE)
 | 
						|
    list(APPEND components_found_vars GEM_${Gem_NAME}_FOUND)
 | 
						|
    # If the gem is installed as a gem
 | 
						|
    if(NOT GEM_OS_PKG)
 | 
						|
	    set(GEM_HOME ENV{GEM_HOME})
 | 
						|
 | 
						|
        # Use `gem content <gem-name>` to extract current information about installed gems
 | 
						|
        # Store the information into ${GEM_LOCAL_INFO}
 | 
						|
        EXECUTE_PROCESS(COMMAND ${GEM_EXECUTABLE} content ${Gem_NAME}
 | 
						|
            RESULT_VARIABLE GEM_RUN_RESULT
 | 
						|
            OUTPUT_VARIABLE GEM_LOCAL_INFO)
 | 
						|
 | 
						|
        if(GEM_RUN_RESULT STREQUAL "0")
 | 
						|
            list(APPEND FOUND_GEMS ${Gem_NAME})
 | 
						|
            set(_library_NAME_PATTERN lib${Gem_NAME}.a
 | 
						|
	        		   lib${Gem_NAME}.so
 | 
						|
	        		   lib${Gem_NAME}.dylib
 | 
						|
	        		   ${Gem_NAME}.a
 | 
						|
	        		   ${Gem_NAME}.so
 | 
						|
	        		   ${Gem_NAME}.dylib
 | 
						|
                       .*.a
 | 
						|
                       .*.so
 | 
						|
                       .*.dylib
 | 
						|
	        )
 | 
						|
 | 
						|
            set(_header_SUFFIX_PATTERN
 | 
						|
                        .h
 | 
						|
                        .hh
 | 
						|
                        .hpp
 | 
						|
            )
 | 
						|
 | 
						|
            # Create a list from the output results of the gem command
 | 
						|
            string(REPLACE "\n" ";" GEM_CONTENT_LIST "${GEM_LOCAL_INFO}")
 | 
						|
            foreach(_gem_CONTENT_PATH ${GEM_CONTENT_LIST})
 | 
						|
                
 | 
						|
                # Convert so that only '/' Unix path separator are being using
 | 
						|
                # needed to do proper regex matching
 | 
						|
                FILE(TO_CMAKE_PATH ${_gem_CONTENT_PATH} gem_CONTENT_PATH)
 | 
						|
 | 
						|
                # Identify library -- checking for a library in the gems 'lib' (sub)directory
 | 
						|
                # Search for an existing library, but only within the gems folder
 | 
						|
                foreach(_library_NAME ${_library_NAME_PATTERN})
 | 
						|
                    STRING(REGEX MATCH ".*${Gem_NAME}.*/lib/.*${_library_NAME}$" GEM_PATH_INFO "${gem_CONTENT_PATH}")
 | 
						|
                    if(NOT "${GEM_PATH_INFO}" STREQUAL "")
 | 
						|
                        list(APPEND GEM_LIBRARIES ${GEM_PATH_INFO})
 | 
						|
                        break()
 | 
						|
                    endif()
 | 
						|
                endforeach()
 | 
						|
 | 
						|
                # Identify headers
 | 
						|
                # Checking for available headers in an include directory
 | 
						|
                foreach(_header_PATTERN ${_header_SUFFIX_PATTERN})
 | 
						|
                    STRING(REGEX MATCH ".*${Gem_NAME}.*/include/.*${_header_PATTERN}$" GEM_PATH_INFO "${gem_CONTENT_PATH}")
 | 
						|
                    if(NOT "${GEM_PATH_INFO}" STREQUAL "")
 | 
						|
                        STRING(REGEX REPLACE "(.*${Gem_NAME}.*/include/).*${_header_PATTERN}$" "\\1" GEM_PATH_INFO "${gem_CONTENT_PATH}")
 | 
						|
                        list(APPEND GEM_INCLUDE_DIRS ${GEM_PATH_INFO})
 | 
						|
                        break()
 | 
						|
                    endif()
 | 
						|
                endforeach()
 | 
						|
            endforeach()
 | 
						|
        else()
 | 
						|
            set(GEM_${Gem_NAME}_FOUND FALSE)
 | 
						|
        endif()
 | 
						|
    else(NOT GEM_OS_PKG)
 | 
						|
        pkg_check_modules(GEM_PKG ${Gem_NAME})
 | 
						|
        set(GEM_${GEM_NAME}_FOUND GEM_PKG_FOUND)
 | 
						|
        set(GEM_INCLUDE_DIRS ${GEM_PKG_INCLUDE_DIRS})
 | 
						|
        set(GEM_LIBRARIES ${GEM_PKG_LIBRARIES} ${GEM_PKG_STATIC_LIBRARIES})
 | 
						|
        list(APPEND GEM_LIBRARIES ${GEM_PKG_LDFLAGS} ${GEM_PKG_STATIC_LDFLAGS})
 | 
						|
        list(APPEND GEM_LIBRARIES ${GEM_PKG_LDFLAGS_OTHER} ${GEM_PKG_STATIC_LDFLAGS_OTHER})
 | 
						|
 | 
						|
        if(GEM_DEBUG)
 | 
						|
            message(STATUS "GEM_OS_PKG is defined")
 | 
						|
            message(STATUS "GEM_INCLUDE_DIRS ${GEM_INCLUDE_DIRS}")
 | 
						|
            message(STATUS "GEM_STATIC_LIBRARY_DIRS ${GEM_PKG_STATIC_LIBRARY_DIRS}")
 | 
						|
            message(STATUS "GEM_LIBRARY_DIRS ${GEM_PKG_STATIC_LIBRARY_DIRS}")
 | 
						|
            message(STATUS "GEM_STATIC_LIBRARIES ${GEM_PKG_STATIC_LIBRARIES}")
 | 
						|
            message(STATUS "GEM_LIBRARIES ${GEM_LIBRARIES}")
 | 
						|
        endif()
 | 
						|
    endif()
 | 
						|
 | 
						|
    if(GEM_DEBUG)
 | 
						|
		message(STATUS "${Gem_NAME} library dir: ${GEM_LIBRARIES}")
 | 
						|
		message(STATUS "${Gem_NAME} include dir: ${GEM_INCLUDE_DIRS}")
 | 
						|
    endif()
 | 
						|
endforeach()
 | 
						|
 | 
						|
# Compact the lists
 | 
						|
if(DEFINED GEM_LIBRARIES)
 | 
						|
    LIST(REMOVE_DUPLICATES GEM_LIBRARIES)
 | 
						|
endif()
 | 
						|
if(DEFINED GEM_INCLUDE_DIRS)
 | 
						|
    LIST(REMOVE_DUPLICATES GEM_INCLUDE_DIRS)
 | 
						|
endif()
 | 
						|
 | 
						|
find_package_handle_standard_args(GEM
 | 
						|
    REQUIRED_VARS ${components_found_vars}
 | 
						|
    FAIL_MESSAGE "Could not find all required gems")
 | 
						|
 |