| # Copyright (c) 2005 Vladimir Prus. |
| # Copyright 2006 Rene Rivera. |
| # |
| # Use, modification and distribution is subject to the Boost Software |
| # License Version 1.0. (See accompanying file LICENSE_1_0.txt or |
| # http://www.boost.org/LICENSE_1_0.txt) |
| |
| # Provides mechanism for installing whole packages into a specific directory |
| # structure. This is opposed to the 'install' rule, that installs a number of |
| # targets to a single directory, and does not care about directory structure at |
| # all. |
| |
| # Example usage: |
| # |
| # package.install boost : <properties> |
| # : <binaries> |
| # : <libraries> |
| # : <headers> |
| # ; |
| # |
| # This will install binaries, libraries and headers to the 'proper' location, |
| # given by command line options --prefix, --exec-prefix, --bindir, --libdir and |
| # --includedir. |
| # |
| # The rule is just a convenient wrapper, avoiding the need to define several |
| # 'install' targets. |
| # |
| # The only install-related feature is <install-source-root>. It will apply to |
| # headers only and if present, paths of headers relatively to source root will |
| # be retained after installing. If it is not specified, then "." is assumed, so |
| # relative paths in headers are always preserved. |
| |
| import "class" : new ; |
| import option ; |
| import project ; |
| import property ; |
| import stage ; |
| import targets ; |
| import modules ; |
| |
| rule install ( name : requirements * : binaries * : libraries * : headers * ) |
| { |
| if [ MATCH --prefix=(.*) : [ modules.peek : ARGV ] ] |
| { |
| # If --prefix is explicitly specified on the command line, |
| # then we need wipe away any settings of libdir/includir that |
| # is specified via options in config files. |
| option.set bindir : ; |
| option.set libdir : ; |
| option.set includedir : ; |
| } |
| |
| # If <install-source-root> is not specified, all headers are installed to |
| # prefix/include, no matter what their relative path is. Sometimes that is |
| # what is needed. |
| local install-source-root = [ property.select <install-source-root> : |
| $(requirements) ] ; |
| install-source-root = $(install-source-root:G=) ; |
| requirements = [ property.change $(requirements) : <install-source-root> ] ; |
| |
| local install-header-subdir = [ property.select <install-header-subdir> : |
| $(requirements) ] ; |
| install-header-subdir = /$(install-header-subdir:G=) ; |
| install-header-subdir ?= "" ; |
| requirements = [ property.change $(requirements) : <install-header-subdir> ] |
| ; |
| |
| # First, figure out all locations. Use the default if no prefix option |
| # given. |
| local prefix = [ option.get prefix : [ property.select |
| <install-default-prefix> : $(requirements) ] ] ; |
| prefix = $(prefix:G=) ; |
| requirements = [ property.change $(requirements) : <install-default-prefix> |
| ] ; |
| # Or some likely defaults if neither is given. |
| if ! $(prefix) |
| { |
| if [ modules.peek : NT ] { prefix = C:\\$(name) ; } |
| else if [ modules.peek : UNIX ] { prefix = /usr/local ; } |
| } |
| |
| # Architecture dependent files. |
| local exec-locate = [ option.get exec-prefix : $(prefix) ] ; |
| |
| # Binaries. |
| local bin-locate = [ option.get bindir : $(prefix)/bin ] ; |
| |
| # Object code libraries. |
| local lib-locate = [ option.get libdir : $(prefix)/lib ] ; |
| |
| # Source header files. |
| local include-locate = [ option.get includedir : $(prefix)/include ] ; |
| |
| stage.install $(name)-bin : $(binaries) : $(requirements) |
| <location>$(bin-locate) ; |
| alias $(name)-lib : $(name)-lib-shared $(name)-lib-static ; |
| |
| # Since the install location of shared libraries differs on universe |
| # and cygwin, use target alternatives to make different targets. |
| # We should have used indirection conditioanl requirements, but it's |
| # awkward to pass bin-locate and lib-locate from there to another rule. |
| alias $(name)-lib-shared : $(name)-lib-shared-universe ; |
| alias $(name)-lib-shared : $(name)-lib-shared-cygwin : <target-os>cygwin ; |
| |
| # For shared libraries, we install both explicitly specified one and the |
| # shared libraries that the installed executables depend on. |
| stage.install $(name)-lib-shared-universe : $(binaries) $(libraries) : $(requirements) |
| <location>$(lib-locate) <install-dependencies>on <install-type>SHARED_LIB ; |
| stage.install $(name)-lib-shared-cygwin : $(binaries) $(libraries) : $(requirements) |
| <location>$(bin-locate) <install-dependencies>on <install-type>SHARED_LIB ; |
| |
| # For static libraries, we do not care about executable dependencies, since |
| # static libraries are already incorporated into them. |
| stage.install $(name)-lib-static : $(libraries) : $(requirements) |
| <location>$(lib-locate) <install-dependencies>on <install-type>STATIC_LIB ; |
| stage.install $(name)-headers : $(headers) : $(requirements) |
| <location>$(include-locate)$(install-header-subdir) |
| <install-source-root>$(install-source-root) ; |
| alias $(name) : $(name)-bin $(name)-lib $(name)-headers ; |
| |
| local c = [ project.current ] ; |
| local project-module = [ $(c).project-module ] ; |
| module $(project-module) |
| { |
| explicit $(1)-bin $(1)-lib $(1)-headers $(1) $(1)-lib-shared $(1)-lib-static |
| $(1)-lib-shared-universe $(1)-lib-shared-cygwin ; |
| } |
| } |