2006-06-18 14:58:39 +04:00
# ==========================================================================
# Installing headers
#
2008-06-15 23:41:09 +04:00
# header-y - list files to be installed. They are preprocessed
# to remove __KERNEL__ section of the file
2012-10-02 21:01:56 +04:00
# genhdr-y - Same as header-y but in a generated/ directory
2006-06-18 14:58:39 +04:00
#
# ==========================================================================
2011-11-12 03:20:34 +04:00
# generated header directory
gen := $( if $( gen) ,$( gen) ,$( subst include/,include/generated/,$( obj) ) )
2008-06-05 21:19:47 +04:00
kbuild-file := $( srctree) /$( obj) /Kbuild
i n c l u d e $( kbuild -file )
2006-06-18 14:58:39 +04:00
2013-02-02 14:18:35 +04:00
# called may set destination dir (when installing to asm/)
2013-03-05 00:36:24 +04:00
_dst := $( if $( destination-y) ,$( destination-y) ,$( if $( dst) ,$( dst) ,$( obj) ) )
2013-02-02 14:18:35 +04:00
2012-10-02 21:01:57 +04:00
old-kbuild-file := $( srctree) /$( subst uapi/,,$( obj) ) /Kbuild
i f n e q ( $( wildcard $ ( old -kbuild -file ) ) , )
i n c l u d e $( old -kbuild -file )
e n d i f
2009-04-10 10:52:43 +04:00
2008-06-05 21:19:47 +04:00
i n c l u d e s c r i p t s / K b u i l d . i n c l u d e
2006-09-25 01:15:14 +04:00
2012-10-02 21:01:57 +04:00
installdir := $( INSTALL_HDR_PATH) /$( subst uapi/,,$( _dst) )
2006-06-18 14:58:39 +04:00
2010-08-14 12:22:58 +04:00
header-y := $( sort $( header-y) )
2008-06-15 23:41:09 +04:00
subdirs := $( patsubst %/,%,$( filter %/, $( header-y) ) )
header-y := $( filter-out %/, $( header-y) )
2006-09-25 01:15:14 +04:00
2008-06-15 23:41:09 +04:00
# files used to track state of install/check
2012-10-02 21:01:57 +04:00
install-file := $( installdir) /.install
check-file := $( installdir) /.check
2006-09-25 01:15:14 +04:00
2011-04-28 00:29:49 +04:00
# generic-y list all files an architecture uses from asm-generic
# Use this to build a list of headers which require a wrapper
wrapper-files := $( filter $( header-y) , $( generic-y) )
2012-10-02 21:01:57 +04:00
srcdir := $( srctree) /$( obj)
gendir := $( objtree) /$( gen)
oldsrcdir := $( srctree) /$( subst /uapi,,$( obj) )
2008-06-15 23:41:09 +04:00
# all headers files for this dir
2011-04-28 00:29:49 +04:00
header-y := $( filter-out $( generic-y) , $( header-y) )
2012-10-02 21:01:56 +04:00
all-files := $( header-y) $( genhdr-y) $( wrapper-files)
2012-10-02 21:01:57 +04:00
output-files := $( addprefix $( installdir) /, $( all-files) )
2013-04-29 16:15:51 +04:00
input-files1 := $( foreach hdr, $( header-y) , \
2013-03-05 00:36:24 +04:00
$( if $( wildcard $( srcdir) /$( hdr) ) , \
2013-04-29 16:15:51 +04:00
$( wildcard $( srcdir) /$( hdr) ) ) \
)
input-files1-name := $( notdir $( input-files1) )
input-files2 := $( foreach hdr, $( header-y) , \
$( if $( wildcard $( srcdir) /$( hdr) ) ,, \
2013-03-05 00:36:24 +04:00
$( if $( wildcard $( oldsrcdir) /$( hdr) ) , \
$( wildcard $( oldsrcdir) /$( hdr) ) , \
$( error Missing UAPI file $( srcdir) /$( hdr) ) ) \
2013-04-29 16:15:51 +04:00
) )
input-files2-name := $( notdir $( input-files2) )
input-files3 := $( foreach hdr, $( genhdr-y) , \
2013-03-05 00:36:24 +04:00
$( if $( wildcard $( gendir) /$( hdr) ) , \
2012-10-02 21:01:57 +04:00
$( wildcard $( gendir) /$( hdr) ) , \
$( error Missing generated UAPI file $( gendir) /$( hdr) ) \
) )
2013-04-29 16:15:51 +04:00
input-files3-name := $( notdir $( input-files3) )
2006-09-25 01:15:14 +04:00
2008-06-15 23:41:09 +04:00
# Work out what needs to be removed
2012-10-02 21:01:57 +04:00
oldheaders := $( patsubst $( installdir) /%,%,$( wildcard $( installdir) /*.h) )
2008-06-15 23:41:09 +04:00
unwanted := $( filter-out $( all-files) ,$( oldheaders) )
2006-06-18 14:58:39 +04:00
2008-06-15 23:41:09 +04:00
# Prefix unwanted with full paths to $(INSTALL_HDR_PATH)
2012-10-02 21:01:57 +04:00
unwanted-file := $( addprefix $( installdir) /, $( unwanted) )
2006-09-25 01:15:14 +04:00
2008-06-15 23:41:09 +04:00
printdir = $( patsubst $( INSTALL_HDR_PATH) /%/,%,$( dir $@ ) )
2006-06-18 15:02:10 +04:00
2008-06-15 23:41:09 +04:00
quiet_cmd_install = INSTALL $( printdir) ( $( words $( all-files) ) \
file$( if $( word 2, $( all-files) ) ,s) )
2008-06-16 23:29:38 +04:00
cmd_install = \
2013-04-29 16:15:51 +04:00
$( CONFIG_SHELL) $< $( installdir) $( srcdir) $( input-files1-name) ; \
$( CONFIG_SHELL) $< $( installdir) $( oldsrcdir) $( input-files2-name) ; \
$( CONFIG_SHELL) $< $( installdir) $( gendir) $( input-files3-name) ; \
2011-04-28 00:29:49 +04:00
for F in $( wrapper-files) ; do \
2012-10-02 21:01:57 +04:00
echo " \#include <asm-generic/ $$ F> " > $( installdir) /$$ F; \
2011-04-28 00:29:49 +04:00
done ; \
2008-06-16 23:29:38 +04:00
touch $@
2006-06-18 14:58:39 +04:00
2008-06-15 23:41:09 +04:00
quiet_cmd_remove = REMOVE $( unwanted)
cmd_remove = rm -f $( unwanted-file)
2006-06-18 14:58:39 +04:00
2008-06-15 23:41:09 +04:00
quiet_cmd_check = CHECK $( printdir) ( $( words $( all-files) ) files)
2009-06-05 16:11:09 +04:00
# Headers list can be pretty long, xargs helps to avoid
# the "Argument list too long" error.
cmd_check = for f in $( all-files) ; do \
2012-10-02 21:01:57 +04:00
echo " $( installdir) / $$ {f} " ; done \
2009-06-05 16:11:09 +04:00
| xargs \
$( PERL) $< $( INSTALL_HDR_PATH) /include $( SRCARCH) ; \
2008-06-15 23:41:09 +04:00
touch $@
2006-09-25 01:15:14 +04:00
2008-06-15 23:41:09 +04:00
PHONY += __headersinst __headerscheck
2006-09-25 01:15:14 +04:00
2008-06-15 23:41:09 +04:00
i f n d e f H D R C H E C K
# Rules for installing headers
__headersinst : $( subdirs ) $( install -file )
@:
2006-09-25 01:15:14 +04:00
2008-06-15 23:41:09 +04:00
targets += $( install-file)
2013-04-29 16:15:51 +04:00
$(install-file) : scripts /headers_install .sh $( input -files 1) $( input -files 2) $( input -files 3) FORCE
2008-06-15 23:41:09 +04:00
$( if $( unwanted) ,$( call cmd,remove) ,)
$( if $( wildcard $( dir $@ ) ) ,,$( shell mkdir -p $( dir $@ ) ) )
$( call if_changed,install)
2006-09-25 01:15:14 +04:00
2006-06-18 15:02:10 +04:00
e l s e
2008-06-15 23:41:09 +04:00
__headerscheck : $( subdirs ) $( check -file )
@:
2006-06-18 14:58:39 +04:00
2008-06-15 23:41:09 +04:00
targets += $( check-file)
$(check-file) : scripts /headers_check .pl $( output -files ) FORCE
$( call if_changed,check)
2006-06-18 14:58:39 +04:00
2008-06-15 23:41:09 +04:00
e n d i f
2006-09-25 01:15:14 +04:00
2008-06-15 23:41:09 +04:00
# Recursion
.PHONY : $( subdirs )
$(subdirs) :
$( Q) $( MAKE) $( hdr-inst) = $( obj) /$@ dst = $( _dst) /$@
2006-06-18 14:58:39 +04:00
2008-06-15 23:41:09 +04:00
targets := $( wildcard $( sort $( targets) ) )
cmd_files := $( wildcard \
$( foreach f,$( targets) ,$( dir $( f) ) .$( notdir $( f) ) .cmd) )
2008-06-05 18:52:15 +04:00
2008-06-15 23:41:09 +04:00
i f n e q ( $( cmd_files ) , )
include $( cmd_files)
2006-06-18 14:58:39 +04:00
e n d i f
2008-06-15 23:41:09 +04:00
.PHONY : $( PHONY )
PHONY += FORCE
FORCE : ;