[CMake] How to have a static/shared option in a Find script ?

Barth barthelemy.von.haller at cern.ch
Mon Feb 20 05:37:36 EST 2012


Hello,

Thank you very much for your message. You have been very helpful.

Best regards,
Barth

On 02/16/2012 05:18 PM, Michael Hertling [via CMake] wrote:
> On 02/16/2012 03:14 PM, Barth wrote:
> > Hi again,
> >
> > I have understood what you meant :)
>
> Hhm, actually, I talked nonsense w.r.t. DIM_USE_STATIC. ;)
>
> > For records here is what I did :
> >
> > # (1) Use FIND_LIBRARY() to look for the shared and the static library
> > #     and define DIM_SHARED_LIBRARY and DIM_STATIC_LIBRARY in the 
> cache.
> > find_library(DIM_STATIC_LIBRARY NAMES libdim.a PATHS $ENV{DIMDIR}
> > PATH_SUFFIXES linux)
> > find_library(DIM_SHARED_LIBRARY NAMES dim PATHS $ENV{DIMDIR} 
> PATH_SUFFIXES
> > linux)
>
> If libdim.so doesn't exist, but libdim.a does, the last FIND_LIBRARY()
> call would return libdim.a, too, which is probably not desired. Here,
> one should consider to narrow the search for the respective library
> type, e.g. by manipulating CMAKE_FIND_LIBRARY_SUFFIXES; see also
> CMAKE_{SHARED,STATIC}_LIBRARY_{PREFIX,SUFFIX} in this regard.
>
> > # (2) Inspect DIM_FIND_COMPONENTS to see which flavor has been 
> requested,
> > #     defaulting to "shared" if no components have been requested at 
> all.
> > LIST(FIND DIM_FIND_COMPONENTS static ASK_STATIC_COMP)
> > LIST(FIND DIM_FIND_COMPONENTS shared ASK_SHARED_COMP)
>
> No need for them; use DIM_FIND_REQUIRED_{STATIC,SHARED} - predefined
> by FIND_PACKAGE(). Refer to Modules/readme.txt for more information.
>
> > # (3) Warn or bail out if "shared" and "static" have both been 
> requested
> > if ( ${ASK_STATIC_COMP} GREATER -1 AND ${ASK_SHARED_COMP} GREATER -1)
> >     message(WARNING "Two incompatible components specified : static and
> > shared. We are going to ignore the static component.")
> > endif ( ${ASK_STATIC_COMP} GREATER -1 AND ${ASK_SHARED_COMP} GREATER 
> -1)
>
> IF(DIM_FIND_REQUIRED_SHARED AND DIM_FIND_REQUIRED_STATIC)
>     MESSAGE(WARNING ...)
>     LIST(REMOVE_ITEM DIM_FIND_COMPONENTS static)
>     UNSET(DIM_FIND_REQUIRED_STATIC)
> ENDIF()
>
> Do something to the contrary if DIM_FIND_COMPONENTS is empty:
>
> IF(NOT DIM_FIND_COMPONENTS)
>     LIST(APPEND DIM_FIND_COMPONENTS shared)
>     SET(DIM_FIND_REQUIRED_SHARED TRUE)
> ENDIF()
>
> The point is that DIM_FIND_COMPONENTS and DIM_FIND_REQUIRED_* are set
> up properly *before* you are going to actually enable the components.
>
> > # (4) DIM_USE_STATIC decides if DIM_LIBRARIES receives 
> DIM_STATIC_LIBRARY
> > #     or DIM_SHARED_LIBRARY
> > option(DIM_FORCE_STATIC "Turn on to force the use of the static 
> library"
> > OFF)
> > if( ${DIM_FORCE_STATIC} OR ${ASK_STATIC_COMP} GREATER -1)
> >     set(DIM_LIBRARIES ${DIM_STATIC_LIBRARY} )
> > else ( ${DIM_FORCE_STATIC} OR ${ASK_STATIC_COMP} GREATER -1)
> >     set(DIM_LIBRARIES ${DIM_SHARED_LIBRARY} )
> > endif( ${DIM_FORCE_STATIC} OR ${ASK_STATIC_COMP} GREATER -1)
>
> UNSET(DIM_INCLUDE_DIRS)
> UNSET(DIM_LIBRARIES)
>
> SET(DIM_FOUND FALSE)
>
> FIND_PATH(DIM_INCLUDE_DIR ...)
>
> IF(DIM_INCLUDE_DIR)
>     SET(DIM_FOUND TRUE)
> ENDIF
>
> IF(DIM_FIND_REQUIRED_SHARED)
>     FIND_LIBRARY(DIM_SHARED_LIBRARY ...)
>     FIND_PACKAGE_HANDLE_STANDARD_ARGS(
>         DIM_SHARED
>         DEFAULT_MSG
>         DIM_INCLUDE_DIR
>         DIM_SHARED_LIBRARY)
>     IF(DIM_SHARED_FOUND)
>         LIST(APPEND DIM_INCLUDE_DIRS ${DIM_INCLUDE_DIR} ...)
>         LIST(APPEND DIM_LIBRARIES ${DIM_SHARED_LIBRARY} ...)
>    ENDIF()
>    LIST(REMOVE DIM_FIND_COMPONENTS shared)
>    UNSET(DIM_FIND_REQUIRED_SHARED)
> ENDIF()
>
> IF(DIM_FIND_REQUIRED_STATIC)
>     FIND_LIBRARY(DIM_STATIC_LIBRARY ...)
>     FIND_PACKAGE_HANDLE_STANDARD_ARGS(
>         DIM_STATIC
>         DEFAULT_MSG
>         DIM_INCLUDE_DIR
>         DIM_STATIC_LIBRARY)
>     IF(DIM_STATIC_FOUND)
>         LIST(APPEND DIM_INCLUDE_DIRS ${DIM_INCLUDE_DIR} ...)
>         LIST(APPEND DIM_LIBRARIES ${DIM_STATIC_LIBRARY} ...)
>    ENDIF()
>    LIST(REMOVE DIM_FIND_COMPONENTS static)
>    UNSET(DIM_FIND_REQUIRED_STATIC)
> ENDIF()
>
> # Consider to handle remaining components in DIM_FIND_COMPONENTS.
>
> Note that due to the preparatory work on DIM_FIND_COMPONENTS and the
> DIM_FIND_REQUIRED_* variables, the blocks for enabling the shared and
> static component have a straight forward structure. Note further that
> this can be achieved only with a quite simple package like yours with
> two mutually exclusive libraries; with packages providing more subtly
> related components - e.g. with inter-component dependencies - things
> can be much more complicated. Note finally that the user must issue
>
> IF(DIM_FOUND AND DIM_SHARED_FOUND)
>
> e.g., in order to check for the library's availability unless the
> REQUIRED flag was given to FIND_PACKAGE(). Checking for DIM_FOUND
> or DIM_SHARED_FOUND alone is *not* reliable, just as referring to
> a component that hasn't been requested explicitly - or enabled by
> default which, in turn, should be documented explicitly.
>
> Regards,
>
> Michael
> -- 
>
> 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
>
>
> ------------------------------------------------------------------------
> If you reply to this email, your message will be added to the 
> discussion below:
> http://cmake.3232098.n2.nabble.com/How-to-have-a-static-shared-option-in-a-Find-script-tp7287655p7291471.html 
>
> To unsubscribe from How to have a static/shared option in a Find 
> script ?, click here 
> <http://cmake.3232098.n2.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=7287655&code=YmFydGhlbGVteS52b24uaGFsbGVyQGNlcm4uY2h8NzI4NzY1NXwxNDQ2NTQ5NDE=>.
> NAML 
> <http://cmake.3232098.n2.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml> 
>


--
View this message in context: http://cmake.3232098.n2.nabble.com/How-to-have-a-static-shared-option-in-a-Find-script-tp7287655p7300806.html
Sent from the CMake mailing list archive at Nabble.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20120220/579edf4a/attachment.htm>


More information about the CMake mailing list