@ -51,12 +51,25 @@ class DirMaker:
for d in self . dirs :
append_to_log ( d )
def set_mode ( path , mode ) :
if mode is None :
# Keep mode unchanged
def is_executable ( path ) :
''' Checks whether any of the " x " bits are set in the source file mode. '''
return bool ( os . stat ( path ) . st_mode & 0o111 )
def sanitize_permissions ( path , umask ) :
if umask is None :
return
if ( mode . perms_s or mode . owner or mode . group ) is None :
# Nothing to set
new_perms = 0o777 if is_executable ( path ) else 0o666
new_perms & = ~ umask
try :
os . chmod ( path , new_perms )
except PermissionError as e :
msg = ' {!r} : Unable to set permissions {!r} : {} , ignoring... '
print ( msg . format ( path , new_perms , e . strerror ) )
def set_mode ( path , mode , default_umask ) :
if mode is None or ( mode . perms_s or mode . owner or mode . group ) is None :
# Just sanitize permissions with the default umask
sanitize_permissions ( path , default_umask )
return
# No chown() on Windows, and must set one of owner/group
if not is_windows ( ) and ( mode . owner or mode . group ) is not None :
@ -83,6 +96,8 @@ def set_mode(path, mode):
except PermissionError as e :
msg = ' {!r} : Unable to set permissions {!r} : {} , ignoring... '
print ( msg . format ( path , mode . perms_s , e . strerror ) )
else :
sanitize_permissions ( path , default_umask )
def restore_selinux_contexts ( ) :
'''
@ -180,6 +195,7 @@ def do_copydir(data, src_dir, dst_dir, exclude):
sys . exit ( 1 )
data . dirmaker . makedirs ( abs_dst )
shutil . copystat ( abs_src , abs_dst )
sanitize_permissions ( abs_dst , data . install_umask )
for f in files :
abs_src = os . path . join ( root , f )
filepart = os . path . relpath ( abs_src , start = src_dir )
@ -195,6 +211,7 @@ def do_copydir(data, src_dir, dst_dir, exclude):
os . mkdir ( parent_dir )
shutil . copystat ( os . path . dirname ( abs_src ) , parent_dir )
shutil . copy2 ( abs_src , abs_dst , follow_symlinks = False )
sanitize_permissions ( abs_dst , data . install_umask )
append_to_log ( abs_dst )
def get_destdir_path ( d , path ) :
@ -210,6 +227,8 @@ def do_install(datafilename):
d . destdir = os . environ . get ( ' DESTDIR ' , ' ' )
d . fullprefix = destdir_join ( d . destdir , d . prefix )
if d . install_umask is not None :
os . umask ( d . install_umask )
d . dirmaker = DirMaker ( )
with d . dirmaker :
install_subdirs ( d ) # Must be first, because it needs to delete the old subtree.
@ -226,7 +245,7 @@ def install_subdirs(d):
print ( ' Installing subdir %s to %s ' % ( src_dir , full_dst_dir ) )
d . dirmaker . makedirs ( full_dst_dir , exist_ok = True )
do_copydir ( d , src_dir , full_dst_dir , exclude )
set_mode ( full_dst_dir , mode )
set_mode ( full_dst_dir , mode , d . install_umask )
def install_data ( d ) :
for i in d . data :
@ -237,7 +256,7 @@ def install_data(d):
d . dirmaker . makedirs ( outdir , exist_ok = True )
print ( ' Installing %s to %s ' % ( fullfilename , outdir ) )
do_copyfile ( fullfilename , outfilename )
set_mode ( outfilename , mode )
set_mode ( outfilename , mode , d . install_umask )
def install_man ( d ) :
for m in d . man :
@ -256,6 +275,7 @@ def install_man(d):
append_to_log ( outfilename )
else :
do_copyfile ( full_source_filename , outfilename )
sanitize_permissions ( outfilename , d . install_umask )
def install_headers ( d ) :
for t in d . headers :
@ -266,6 +286,7 @@ def install_headers(d):
print ( ' Installing %s to %s ' % ( fname , outdir ) )
d . dirmaker . makedirs ( outdir , exist_ok = True )
do_copyfile ( fullfilename , outfilename )
sanitize_permissions ( outfilename , d . install_umask )
def run_install_script ( d ) :
env = { ' MESON_SOURCE_ROOT ' : d . source_dir ,
@ -330,6 +351,7 @@ def install_targets(d):
raise RuntimeError ( ' File {!r} could not be found ' . format ( fname ) )
elif os . path . isfile ( fname ) :
do_copyfile ( fname , outname )
sanitize_permissions ( outname , d . install_umask )
if should_strip and d . strip_bin is not None :
if fname . endswith ( ' .jar ' ) :
print ( ' Not stripping jar target: ' , os . path . basename ( fname ) )
@ -346,9 +368,12 @@ def install_targets(d):
pdb_outname = os . path . splitext ( outname ) [ 0 ] + ' .pdb '
print ( ' Installing pdb file %s to %s ' % ( pdb_filename , pdb_outname ) )
do_copyfile ( pdb_filename , pdb_outname )
sanitize_permissions ( pdb_outname , d . install_umask )
elif os . path . isdir ( fname ) :
fname = os . path . join ( d . build_dir , fname . rstrip ( ' / ' ) )
do_copydir ( d , fname , os . path . join ( outdir , os . path . basename ( fname ) ) , None )
outname = os . path . join ( outdir , os . path . basename ( fname ) )
do_copydir ( d , fname , outname , None )
sanitize_permissions ( outname , d . install_umask )
else :
raise RuntimeError ( ' Unknown file type for {!r} ' . format ( fname ) )
printed_symlink_error = False