Hi all,

I have a library that is built and linked to as part of my project. I want to provide the facility to OPTIONALLY have the library installed system-wide (or wherever ${CMAKE_INSTALL_PREFIX} is set). Otherwise, by default, the project's final build products will be linked statically to the library, and the former get installed, but the library binaries stay in the build directory.

In other words:

    $ make
    $ make install

will build and install, the programs, but only something like

    $ make install.foo

will install the library to ${CMAKE_INSTALL_PREFIX}, building it first if needed.

I have something like this so far (simplified from the actual script, so there might be errors):


    INCLUDE_DIRECTORIES( "${CMAKE_CURRENT_LIST_DIR}")
    SET (FOO_LIBRARY "foo")

    # Following builds library and makes it available to
    # be linked other targets within project by:
    # TARGET_LINK_LIBRARIES(${progname} ${FOO_LIBRARY})
    ADD_LIBRARY(${FOO_LIBRARY}
        foo/foo.cpp # and other sources ...
        )

    ###########################################################
    # Approach #1
    # -----------
    # Optionally allow users to install it by invoking:
    #
    #       cmake .. -DINSTALL_FOO="yes"
    #
    # This works, but it means that users will have to run
    # cmake again to switch back and forth between the libary
    # installation and non-library installation.
    #
    OPTION(INSTALL_FOO "Install foo" OFF)
    IF (INSTALL_FOO)
        INSTALL(TARGETS ${FOO_LIBRARY} DESTINATION lib/foo)
        SET(FOO_HEADERS foo/foo.h)
        INSTALL(FILES ${FOO_HEADERS} DESTINATION include/foo)
        UNSET(INSTALL_FOO CACHE)
    ENDIF()
    ###########################################################

    ###########################################################
    # Approach #2
    # -----------
    # Optionally allow users to install it by invoking:
    #
    #       make install.foo
    #
    # Unfortunately, this gets installed by "make install",
    # which I want to avoid
    SET(FOO_INSTALL "install.foo")
    ADD_CUSTOM_TARGET(${FOO_INSTALL}
        COMMAND ${CMAKE_COMMAND}
            -D COMPONENT=foo
            -P cmake_install.cmake)
    ADD_DEPENDENCIES(${FOO_INSTALL} ${FOO_LIBRARY})
    INSTALL(TARGETS ${FOO_LIBRRARY}
        DESTINATION lib/foo COMPONENT foo)
    SET(FOO_HEADERS foo/foo.h)
    INSTALL(FILES ${FOO_HEADERS}
        DESTINATION include/foo COMPONENT foo)
    ###########################################################

As can be seen, approach #1 sort of works, but the required steps to install the library are:

    $ cmake .. -DINSTALL_FOO="yes"
    $ make && make install

And then, to go back to "normal" builds, the user has to remember to run cmake again without the "-DINSTALL_FOO" option, otherwise the library will be installed on the next "make install".

The second approach works when I run "make install.foo", but it also install the library if I run "make install". I would like to avoid the latter.

Does anyone have any suggestions on how to go about achieving this?

Thanks!


-- jeet



--------------------------------------
Jeet Sukumaran
--------------------------------------
jeet.sukuma...@duke.edu
--------------------------------------
Department of Biology
Duke University
Box 90338
Durham, NC 27708
--------------------------------------
Blog/Personal Pages:
   http://jeetworks.org/
Photograph Galleries:
   http://jeet.smugmug.com/
GitHub Repositories:
   http://github.com/jeetsukumaran
--------------------------------------

--

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