2006-06-18 14:58:39 +04:00
# ==========================================================================
# Installing headers
#
2017-03-27 15:20:15 +03:00
# All headers under include/uapi, include/generated/uapi,
2017-03-27 15:20:16 +03:00
# arch/<arch>/include/uapi and arch/<arch>/include/generated/uapi are
2017-03-27 15:20:15 +03:00
# exported.
# They are preprocessed to remove __KERNEL__ section of the file.
2006-06-18 14:58:39 +04:00
#
# ==========================================================================
2017-05-16 08:15:03 +03:00
PHONY := __headers
__headers :
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
srcdir := $( srctree) /$( obj)
2017-06-15 11:36:22 +03:00
# When make is run under a fakechroot environment, the function
# $(wildcard $(srcdir)/*/.) doesn't only return directories, but also regular
# files. So, we are using a combination of sort/dir/wildcard which works
# with fakechroot.
subdirs := $( patsubst $( srcdir) /%/,%,\
$( filter-out $( srcdir) /,\
$( sort $( dir $( wildcard $( srcdir) /*/) ) ) ) )
2017-05-16 08:15:03 +03:00
# Recursion
__headers : $( subdirs )
.PHONY : $( subdirs )
$(subdirs) :
2017-07-09 21:32:35 +03:00
$( Q) $( MAKE) $( hdr-inst) = $( obj) /$@ dst = $( dst) /$@
2017-05-16 08:15:03 +03:00
2017-10-04 06:56:04 +03:00
# Skip header install/check for include/uapi and arch/$(SRCARCH)/include/uapi.
2017-05-16 08:15:03 +03:00
# We have only sub-directories there.
skip-inst := $( if $( filter %/uapi,$( obj) ) ,1)
i f e q ( $( skip -inst ) , )
2017-03-27 15:20:15 +03:00
# Kbuild file is optional
2008-06-05 21:19:47 +04:00
kbuild-file := $( srctree) /$( obj) /Kbuild
2017-03-27 15:20:15 +03:00
- i n c l u d e $( kbuild -file )
2006-06-18 14:58:39 +04:00
2017-07-09 21:32:35 +03:00
installdir := $( INSTALL_HDR_PATH) /$( dst)
2017-07-09 21:32:33 +03:00
gendir := $( objtree) /$( subst include/,include/generated/,$( obj) )
2017-03-27 15:20:15 +03:00
header-files := $( notdir $( wildcard $( srcdir) /*.h) )
header-files += $( notdir $( wildcard $( srcdir) /*.agh) )
header-files := $( filter-out $( no-export-headers) , $( header-files) )
genhdr-files := $( notdir $( wildcard $( gendir) /*.h) )
genhdr-files := $( filter-out $( header-files) , $( genhdr-files) )
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
2008-06-15 23:41:09 +04:00
# all headers files for this dir
2017-07-09 21:33:00 +03:00
all-files := $( header-files) $( genhdr-files)
2012-10-02 21:01:57 +04:00
output-files := $( addprefix $( installdir) /, $( all-files) )
2017-03-27 15:20:15 +03:00
i f n e q ( $( mandatory -y ) , )
missing := $( filter-out $( all-files) ,$( mandatory-y) )
i f n e q ( $( missing ) , )
$( error Some mandatory headers ( $ ( missing ) ) are missing in $ ( obj ) )
e n d i f
e n d i f
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 = \
2017-03-27 15:20:15 +03:00
$( CONFIG_SHELL) $< $( installdir) $( srcdir) $( header-files) ; \
$( CONFIG_SHELL) $< $( installdir) $( gendir) $( genhdr-files) ; \
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
i f n d e f H D R C H E C K
# Rules for installing headers
2017-05-16 08:15:03 +03:00
__headers : $( install -file )
2008-06-15 23:41:09 +04:00
@:
2006-09-25 01:15:14 +04:00
2008-06-15 23:41:09 +04:00
targets += $( install-file)
2017-03-27 15:20:09 +03:00
$(install-file) : scripts /headers_install .sh \
2017-03-27 15:20:15 +03:00
$( addprefix $( srcdir) /,$( header-files) ) \
$( addprefix $( gendir) /,$( genhdr-files) ) 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
2017-05-16 08:15:03 +03:00
__headers : $( check -file )
2008-06-15 23:41:09 +04:00
@:
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
cmd_files := $( wildcard \
2017-11-13 13:29:35 +03:00
$( foreach f,$( sort $( 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
2017-05-16 08:15:03 +03:00
e n d i f # skip-inst
2008-06-15 23:41:09 +04:00
.PHONY : $( PHONY )
PHONY += FORCE
FORCE : ;