Module: wine Branch: master Commit: 58de2dec0813dc395dc78cff90636d2f82501df7 URL: https://gitlab.winehq.org/wine/wine/-/commit/58de2dec0813dc395dc78cff90636d2...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Jun 24 13:39:49 2024 +0200
makedep: Add a helper to get a root-relative directory path.
---
tools/makedep.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/tools/makedep.c b/tools/makedep.c index 58b77a3fd43..29c83e3f73f 100644 --- a/tools/makedep.c +++ b/tools/makedep.c @@ -539,6 +539,31 @@ static char *get_relative_path( const char *from, const char *dest ) }
+/******************************************************************* + * get_root_relative_path + * + * Get relative path from obj dir to root. + */ +static const char *get_root_relative_path( struct makefile *make ) +{ + const char *dir = make->obj_dir; + char *ret, *p; + unsigned int dotdots = 0; + + if (!dir) return "."; + while (*dir) + { + dotdots++; + while (*dir && *dir != '/') dir++; + while (*dir == '/') dir++; + } + ret = xmalloc( 3 * dotdots ); + for (p = ret; dotdots; dotdots--, p += 3) memcpy( p, "../", 3 ); + p[-1] = 0; /* remove trailing slash */ + return ret; +} + + /******************************************************************* * concat_paths */ @@ -2491,7 +2516,7 @@ static void output_srcdir_symlink( struct makefile *make, const char *obj )
src_name = src_file; if (src_name[0] != '/' && make->obj_dir) - src_name = concat_paths( get_relative_path( make->obj_dir, "" ), src_name ); + src_name = concat_paths( get_root_relative_path( make ), src_name );
output_symlink_rule( src_name, dst_file, 0 ); strarray_add( &make->all_targets[0], obj ); @@ -4159,7 +4184,7 @@ static void output_stub_makefile( struct makefile *make ) output_filenames( targets ); output_filenames( make->clean_files ); output( ":\n" ); - output( "\t@cd %s && $(MAKE) %s/$@\n", get_relative_path( make->obj_dir, "" ), make->obj_dir ); + output( "\t@cd %s && $(MAKE) %s/$@\n", get_root_relative_path( make ), make->obj_dir ); output( ".PHONY:" ); output_filenames( targets ); output( "\n" );