I built a beta-version of the FindPantheios.cmake (see attached version,
no copyright stuff, I'm sorry), it works - at least on windows and in my
configuration.
As I am new to this and this is my first try with Find* files, could
those experienced in the art of CMakeing please have a look at it, give
me some tips & tricks?
Suggestions welcome ;)

Another thing: I understand the function find_library is to be used to
"find" libs - the docs did not help me with understanding the naming
scheme used. Is it possible to use find_library to locate e.g.
"pantheios.1.core.vc10.x64.dll.debug.lib" if I have the string
"pantheios.1.core" and also ".dll.debug"? I do not know anything about
the part in the middle nor the ending. Sorry if this is a stupid question :/

My current solution is not very pretty and more of a hack and will only
work in Windows as it uses FILE GLOB.

Third question: Is there an easy way to deal with the singular/plural
variables, for example _INCLUDE_DIR and _INCLUDE_DIRS? How exactly is
the syntax for setting those (String, List, etc)?

Thank you for your time, help and patience

Philipp Berger

Am 13.07.2012 08:30, schrieb Rolf Eike Beer:
> Am Freitag, 13. Juli 2012, 02:41:50 schrieb Philipp Berger:
>> Hello everybody,
>>
>> I'm relatively new to CMake, but managed to learn everything I needed,
>> up until now.
>> For a software project in C++ we want to use Pantheios (
>> http://www.pantheios.org <http://www.pantheios.org/> ) as logging framework.
>> Sadly, there is no FindPantheios.cmake file readily available, so I set of
>> to write my own.
>>
>> The part for searching the include files/path was easy.
>>
>> The big problem I am facing and find myself unable to solve is the wide
>> variety of library files.
>> The amount of available lib files is huge, see the attached file for the
>> list.
>>
>> For example, the core libs:
>> pantheios.1.core.vc10.x64.dll.debug.lib
>> pantheios.1.core.vc10.x64.dll.lib
>> pantheios.1.core.vc10.x64.mt.debug.lib
>> pantheios.1.core.vc10.x64.mt.lib
>> pantheios.1.core.vc10.x64.widestring.dll.debug.lib
>> pantheios.1.core.vc10.x64.widestring.dll.lib
>> pantheios.1.core.vc10.x64.widestring.mt.debug.lib
>> pantheios.1.core.vc10.x64.widestring.mt.lib
>>
>> I would like to have a checkbox to select Widestring capability yes/no.
>>
>> A main problem for me is to check that the selected libs are valid for
>> the current configuration (if VC10 x64 was selected as compiler, only
>> allow vc10.x64 libs) - is there a way to securely achieve that? Or
>> should I rather let the user select arbitrary lib files and hope that
>> they will work?
>>
>> What I need is six fields for the user to select lib files - the core
>> lib, one frontend and a backend. And that for both Debug and Release. It
>> would be much more useful if the user could select from a dropdown menu
>> which Front-/Backend he would like together with the Widestring checkbox
>> and the CMake file would assign the required Debug and Release libs to
>> the variables, but as sated above, I do not know how to produce the
>> required version string and how to create such mechanisms in CMake in
>> general.
> The debug/release stuff can be handled by CMake, just put both of them in the 
> result variable prefixed with "debug" and "optimized". See what I've done 
> recently in e.g. FindBZip2.cmake.
>
> I would put the backends in the COMPONENTS section, as well as the 
> widestring, 
> so you could do something like this:
>
> find_package(Pantheios COMPONENTS SomeBackend WideString)
Thanks for the tip, I implemented that.
> Choose one backend as default for the case the user does not select any and 
> raise an error if more than one is specified (unless that actually makes 
> sense, 
> dunno).
>
> Eike
>
>
> --
>
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at 
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at: 
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake


# Locate the Pantheois Logging Framework.
#
# Defines the following variables:
#
#   PANTHEIOS_FOUND - Found the Pantheios Logging Framework
#   PANTHEIOS_INCLUDE_DIRS - Include directories
#
# Accepts the following variables as input:
#
#   PANTHEIOS_ROOT - (as a CMake or environment variable)
#                The root directory of the pantheios install prefix
#
#   PANTHEIOS_USE_DYNAMIC_RUNTIME
#   
# Possible Components for BackEnd:
# ACELogger
# COMErrorObject
# File
# FileCallback
# FPrintf
# FPrintfCallback
# Null
# Speech
# Syslog
# WindowsConsole
# WindowsConsoleCallback
# WindowsDebugger
# WindowsDebuggerCallback
# WindowsEventLog
# WindowsMessageBox
# WindowsSyslog
# WindowsSyslogCallback
#
# Possible components for FrontEnd:
# NoFrontEnd
# SimpleFrontEnd
# NFrontEnd
#
#


# Use FIND_PACKAGE( Pantheios COMPONENTS ... ) to enable modules
IF( Pantheios_FIND_COMPONENTS )
        SET(PANTHEIOS_WIDESTRING 0)
        SET(PANTHEIOS_HAVE_BACKEND 0)
        SET(PANTHEIOS_HAVE_FRONTEND 0)
        FOREACH( component ${Pantheios_FIND_COMPONENTS} )
                IF (${component} STREQUAL "WideString")
                        message(STATUS "WideString set")
                        SET(PANTHEIOS_WIDESTRING 1)
                ELSE()
                        IF (component STREQUAL "ACELogger")
                                message(STATUS "Pantheios: Settung BackEnd to 
ACELogger")
                                SET(PANTHEIOS_BACKEND "ACE")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "COMErrorObject")
                                message(STATUS "Pantheios: Settung BackEnd to 
COMErrorObject")
                                SET(PANTHEIOS_BACKEND "COMErrorObject")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "File")
                                message(STATUS "Pantheios: Settung BackEnd to 
File")
                                SET(PANTHEIOS_BACKEND "file")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "FileCallback")
                                message(STATUS "Pantheios: Settung BackEnd to 
FileCallback")
                                SET(PANTHEIOS_BACKEND "file.WithCallback")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "FPrintf")
                                message(STATUS "Pantheios: Settung BackEnd to 
FPrintf")
                                SET(PANTHEIOS_BACKEND "fprintf")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "FPrintfCallback")
                                message(STATUS "Pantheios: Settung BackEnd to 
FPrintfCallback")
                                SET(PANTHEIOS_BACKEND "fprintf.WithCallback")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "Null")
                                message(STATUS "Pantheios: Settung BackEnd to 
Null")
                                SET(PANTHEIOS_BACKEND "null")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "Speech")
                                message(STATUS "Pantheios: Settung BackEnd to 
Speech")
                                SET(PANTHEIOS_BACKEND "speech")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "Syslog")
                                message(STATUS "Pantheios: Settung BackEnd to 
Syslog")
                                SET(PANTHEIOS_BACKEND "syslog")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "WindowsConsole")
                                message(STATUS "Pantheios: Settung BackEnd to 
WindowsConsole")
                                SET(PANTHEIOS_BACKEND "WindowsConsole")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "WindowsConsoleCallback")
                                message(STATUS "Pantheios: Settung BackEnd to 
WindowsConsoleCallback")
                                SET(PANTHEIOS_BACKEND 
"WindowsConsole.WithCallback")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "WindowsDebugger")
                                message(STATUS "Pantheios: Settung BackEnd to 
WindowsDebugger")
                                SET(PANTHEIOS_BACKEND "WindowsDebugger")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "WindowsDebuggerCallback")
                                message(STATUS "Pantheios: Settung BackEnd to 
WindowsDebuggerCallback")
                                SET(PANTHEIOS_BACKEND 
"WindowsDebugger.WithCallback")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "WindowsEventLog")
                                message(STATUS "Pantheios: Settung BackEnd to 
WindowsEventLog")
                                SET(PANTHEIOS_BACKEND "EventLog")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "WindowsMessageBox")
                                message(STATUS "Pantheios: Settung BackEnd to 
WindowsMessageBox")
                                SET(PANTHEIOS_BACKEND "MessageBox")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "WindowsSyslog")
                                message(STATUS "Pantheios: Settung BackEnd to 
WindowsSyslog")
                                SET(PANTHEIOS_BACKEND "WindowsSyslog")
                                SET(PANTHEIOS_HAVE_BACKEND 1)
                        ELSEIF (component STREQUAL "WindowsSyslogCallback")
                                message(STATUS "Pantheios: Settung BackEnd to 
WindowsSyslogCallback")
                                SET(PANTHEIOS_BACKEND 
"WindowsSyslog.WithCallback")
                                SET(PANTHEIOS_HAVE_BACKEND 1)   
                        
                        ELSEIF (component STREQUAL "NoFrontEnd")
                                message(STATUS "Pantheios: Settung FrontEnd to 
NoFrontEnd")
                                SET(PANTHEIOS_FRONTEND "null")
                                SET(PANTHEIOS_HAVE_FRONTEND 1)
                        ELSEIF (component STREQUAL "SimpleFrontEnd")
                                message(STATUS "Pantheios: Settung FrontEnd to 
SimpleFrontEnd")
                                SET(PANTHEIOS_FRONTEND "simple")
                                SET(PANTHEIOS_HAVE_FRONTEND 1)  
                                
                        ELSE ()
                                message(FATAL_ERROR "Unknown Component: 
${component}")
                        ENDIF ()
                ENDIF()
        ENDFOREACH( component )
  

ELSE()
        SET(PANTHEIOS_WIDESTRING 0)
ENDIF(Pantheios_FIND_COMPONENTS)


IF (NOT PANTHEIOS_FRONTEND)
        message(STATUS "Pantheios: No FrontEnd selected, defaulting to 
fe.simple")
        SET(PANTHEIOS_FRONTEND "simple")
        SET(PANTHEIOS_HAVE_FRONTEND 1)  
ENDIF ()
IF (NOT PANTHEIOS_BACKEND)
        message(STATUS "Pantheios: No BackEnd selected, defaulting to be.file")
        SET(PANTHEIOS_BACKEND "file")
        SET(PANTHEIOS_HAVE_BACKEND 1)
ENDIF ()


IF (PANTHEIOS_USE_DYNAMIC_RUNTIME)
        SET(PANTHEIOS_LIB_LINKTYPE "dll")
ELSE ()
        SET(PANTHEIOS_LIB_LINKTYPE "mt")
ENDIF ()

IF (NOT PANTHEIOS_ROOT)
        IF (NOT PANTHEIOS_INCLUDE_DIR STREQUAL "")
                SET(PANTHEIOS_ROOT "${PANTHEIOS_INCLUDE_DIR}/..")
                # message(STATUS "setting PANTHEIOS_ROOT to ${PANTHEIOS_ROOT}")
        ENDIF()
ENDIF()
mark_as_advanced(PANTHEIOS_ROOT)

find_path(PANTHEIOS_INCLUDE_DIR pantheios/pantheios.h
    HINTS
        $ENV{PANTHEIOS_ROOT}/include
        ${PANTHEIOS_ROOT}/include
)

# Is this the right way?
SET(PANTHEIOS_INCLUDE_DIRS PANTHEIOS_INCLUDE_DIR)

IF (PANTHEIOS_INCLUDE_DIR STREQUAL "")
        message(STATUS "Could not find pantheios/pantheios.h in provided 
pathes, please set either PANTHEIOS_ROOT or PANTHEIOS_INCLUDE_DIR")
        SET(PANTHEIOS_LIBRARIES NOTFOUND)
ELSE ()
        IF (PANTHEIOS_LIBRARY_DIRS STREQUAL "" OR NOT EXISTS 
PANTHEIOS_LIBRARY_DIRS)
                SET(PANTHEIOS_LIBRARY_DIRS "${PANTHEIOS_INCLUDE_DIR}/../lib")
        ENDIF()

        IF (NOT EXISTS ${PANTHEIOS_LIBRARY_DIRS})
                message(STATUS "Could not find PANTHEIOS_LIBRARY_DIRS: 
${PANTHEIOS_LIBRARY_DIRS}")
        ENDIF ()

        FILE(GLOB PANTHEIOS_L_CORE_DBG 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.core.*.${PANTHEIOS_LIB_LINKTYPE}.debug.lib")
        FILE(GLOB PANTHEIOS_L_CORE_RLS 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.core.*.${PANTHEIOS_LIB_LINKTYPE}.lib")

        FILE(GLOB PANTHEIOS_L_UTIL_DBG 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.util.*.${PANTHEIOS_LIB_LINKTYPE}.debug.lib")
        FILE(GLOB PANTHEIOS_L_UTIL_RLS 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.util.*.${PANTHEIOS_LIB_LINKTYPE}.lib")

        # Backend
        FILE(GLOB PANTHEIOS_L_BACK1_DBG 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.bec.${PANTHEIOS_BACKEND}.${PANTHEIOS_LIB_LINKTYPE}.debug.lib")
        FILE(GLOB PANTHEIOS_L_BACK1_RLS 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.bec.${PANTHEIOS_BACKEND}.${PANTHEIOS_LIB_LINKTYPE}.lib")
        FILE(GLOB PANTHEIOS_L_BACK2_DBG 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.be.${PANTHEIOS_BACKEND}.${PANTHEIOS_LIB_LINKTYPE}.debug.lib")
        FILE(GLOB PANTHEIOS_L_BACK2_RLS 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.be.${PANTHEIOS_BACKEND}.${PANTHEIOS_LIB_LINKTYPE}.lib")

        # Frontend
        IF (PANTHEIOS_FRONTEND STREQUAL "null")
                message(STATUS "Pantheios: Linking NO FrontEnd, you will have 
to add your own.")
                SET(PANTHEIOS_L_FRONT_DBG "")
                SET(PANTHEIOS_L_FRONT_RLS "")
        ELSE ()
                FILE(GLOB PANTHEIOS_L_FRONT_DBG 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.fe.${PANTHEIOS_FRONTEND}.${PANTHEIOS_LIB_LINKTYPE}.debug.lib")
                FILE(GLOB PANTHEIOS_L_FRONT_RLS 
"${PANTHEIOS_LIBRARY_DIRS}/pantheios.1.fe.${PANTHEIOS_FRONTEND}.${PANTHEIOS_LIB_LINKTYPE}.lib")
        ENDIF ()

        SET(PANTHEIOS_LIBRARIES optimized ${PANTHEIOS_L_CORE_RLS} 
${PANTHEIOS_L_UTIL_RLS} ${PANTHEIOS_L_BACK1_RLS} ${PANTHEIOS_L_BACK2_RLS} 
${PANTHEIOS_L_FRONT_RLS} debug ${PANTHEIOS_L_CORE_DBG} ${PANTHEIOS_L_UTIL_DBG} 
${PANTHEIOS_L_BACK1_DBG} ${PANTHEIOS_L_BACK2_DBG} ${PANTHEIOS_L_FRONT_DBG})

ENDIF()
        

# handle the QUIETLY and REQUIRED arguments and set Pantheios_FOUND to TRUE if 
# all listed variables are TRUE
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Pantheios
                                  REQUIRED_VARS PANTHEIOS_LIBRARIES 
PANTHEIOS_INCLUDE_DIR
                                  VERSION_VAR PANTHEIOS_VERSION_STRING)
                                                                  

mark_as_advanced(PANTHEIOS_INCLUDE_DIR PANTHEIOS_LIBRARIES PANTHEIOS_ROOT)

--

Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to