From 067d3f0ddbbf651fba68557d3cec9a194bf8e91b Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 8 Nov 2013 21:11:59 +0100 Subject: [PATCH] makefiles: Merge the relpath functionality into makedep. --- .gitignore | 1 - Make.vars.in | 1 - configure | 12 +++--- configure.ac | 12 +++--- libs/wine/Makefile.in | 13 ++----- tools/Makefile.in | 7 +--- tools/makedep.c | 77 +++++++++++++++++++++++++++++++++++--- tools/relpath.c | 86 ------------------------------------------- 8 files changed, 88 insertions(+), 121 deletions(-) delete mode 100644 tools/relpath.c diff --git a/.gitignore b/.gitignore index e504aad7ee4..8a093ad63e1 100644 --- a/.gitignore +++ b/.gitignore @@ -306,7 +306,6 @@ tools/fnt2fon tools/make_ctests tools/make_xftmpl tools/makedep -tools/relpath tools/sfnt2fnt tools/widl/parser.tab.c tools/widl/parser.tab.h diff --git a/Make.vars.in b/Make.vars.in index 87c77a11c08..f02c9810d2d 100644 --- a/Make.vars.in +++ b/Make.vars.in @@ -59,7 +59,6 @@ RUNTEST = $(top_srcdir)/tools/runtest MAKECTESTS = $(TOOLSDIR)/tools/make_ctests$(TOOLSEXT) MAKEXFTMPL = $(TOOLSDIR)/tools/make_xftmpl$(TOOLSEXT) MAKEDEP = $(TOOLSDIR)/tools/makedep$(TOOLSEXT) -RELPATH = $(TOOLSDIR)/tools/relpath$(TOOLSEXT) SFNT2FNT = $(TOOLSDIR)/tools/sfnt2fnt$(TOOLSEXT) WIDL = $(TOOLSDIR)/tools/widl/widl$(TOOLSEXT) WINEBUILD = $(TOOLSDIR)/tools/winebuild/winebuild$(TOOLSEXT) diff --git a/configure b/configure index 5ef21e5c940..e396322bf3a 100755 --- a/configure +++ b/configure @@ -7284,7 +7284,7 @@ clean:: LIBEXT="dylib" DLLFLAGS="$DLLFLAGS -fPIC" LIBWINE_LDFLAGS="-multiply_defined suppress" - LDRPATH_INSTALL="-Wl,-rpath,@loader_path/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + LDRPATH_INSTALL="-Wl,-rpath,@loader_path/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,-rpath,@loader_path/\$(top_builddir)/libs/wine" COREFOUNDATIONLIB="-framework CoreFoundation" @@ -7454,7 +7454,7 @@ fi LIBWINE_RULES=" all: libwine.dylib -libwine.\$(VERSION).dylib: \$(OBJS) \$(RELPATH) Makefile.in +libwine.\$(VERSION).dylib: \$(OBJS) Makefile.in \$(CC) -dynamiclib -install_name @rpath/libwine.\$(SOVERSION).dylib -Wl,-rpath,@loader_path/ -compatibility_version \$(SOVERSION) -current_version \$(VERSION) \$(OBJS) \$(EXTRALIBS) \$(LDFLAGS) \$(LIBS) -o \$@ libwine.\$(SOVERSION).dylib: libwine.\$(VERSION).dylib @@ -7545,7 +7545,7 @@ eval ac_res=\$$as_ac_var { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if test `eval 'as_val=${'$as_ac_var'};$as_echo "$as_val"'` = yes; then : - LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,--rpath,\\\$\$ORIGIN/\$(top_builddir)/libs/wine" else as_ac_var=`$as_echo "ac_cv_cflags_-fPIC -Wl,-R,\\$ORIGIN/../lib" | $as_tr_sh` @@ -7573,7 +7573,7 @@ eval ac_res=\$$as_ac_var { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if test `eval 'as_val=${'$as_ac_var'};$as_echo "$as_val"'` = yes; then : - LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,-R,\\\$\$ORIGIN/\$(top_builddir)/libs/wine" fi fi @@ -7819,7 +7819,7 @@ eval ac_res=\$$as_ac_var { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if test `eval 'as_val=${'$as_ac_var'};$as_echo "$as_val"'` = yes; then : - LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,--rpath,\\\$\$ORIGIN/\$(top_builddir)/libs/wine" else as_ac_var=`$as_echo "ac_cv_cflags_-fPIC -Wl,-R,\\$ORIGIN/../lib" | $as_tr_sh` @@ -7847,7 +7847,7 @@ eval ac_res=\$$as_ac_var { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if test `eval 'as_val=${'$as_ac_var'};$as_echo "$as_val"'` = yes; then : - LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,-R,\\\$\$ORIGIN/\$(top_builddir)/libs/wine" fi fi diff --git a/configure.ac b/configure.ac index 63435d220cf..a74581894e3 100644 --- a/configure.ac +++ b/configure.ac @@ -745,7 +745,7 @@ clean:: LIBEXT="dylib" DLLFLAGS="$DLLFLAGS -fPIC" LIBWINE_LDFLAGS="-multiply_defined suppress" - LDRPATH_INSTALL="-Wl,-rpath,@loader_path/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + LDRPATH_INSTALL="-Wl,-rpath,@loader_path/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,-rpath,@loader_path/\$(top_builddir)/libs/wine" dnl declare needed frameworks AC_SUBST(COREFOUNDATIONLIB,"-framework CoreFoundation") @@ -848,7 +848,7 @@ clean:: AC_SUBST(LIBWINE_RULES,[" all: libwine.dylib -libwine.\$(VERSION).dylib: \$(OBJS) \$(RELPATH) Makefile.in +libwine.\$(VERSION).dylib: \$(OBJS) Makefile.in \$(CC) -dynamiclib -install_name @rpath/libwine.\$(SOVERSION).dylib -Wl,-rpath,@loader_path/ -compatibility_version \$(SOVERSION) -current_version \$(VERSION) \$(OBJS) \$(EXTRALIBS) \$(LDFLAGS) \$(LIBS) -o \$@ libwine.\$(SOVERSION).dylib: libwine.\$(VERSION).dylib @@ -891,10 +891,10 @@ wine_info.plist: wine_info.plist.in \$(top_builddir)/include/config.h WINE_TRY_CFLAGS([-fPIC -Wl,--export-dynamic], [LDEXECFLAGS="-Wl,--export-dynamic"]) WINE_TRY_CFLAGS([-fPIC -Wl,--rpath,\$ORIGIN/../lib], - [LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + [LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,--rpath,\\\$\$ORIGIN/\$(top_builddir)/libs/wine"], [WINE_TRY_CFLAGS([-fPIC -Wl,-R,\$ORIGIN/../lib], - [LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + [LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,-R,\\\$\$ORIGIN/\$(top_builddir)/libs/wine"])]) WINE_TRY_CFLAGS([-Wl,--enable-new-dtags], @@ -955,10 +955,10 @@ wine-installed: main.o Makefile.in [LDEXECFLAGS="-Wl,--export-dynamic"]) WINE_TRY_CFLAGS([-fPIC -Wl,--rpath,\$ORIGIN/../lib], - [LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + [LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,--rpath,\\\$\$ORIGIN/\$(top_builddir)/libs/wine"], [WINE_TRY_CFLAGS([-fPIC -Wl,-R,\$ORIGIN/../lib], - [LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(RELPATH) \$(bindir) \$(libdir)\`" + [LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,-R,\\\$\$ORIGIN/\$(top_builddir)/libs/wine"])]) WINE_TRY_CFLAGS([-Wl,--enable-new-dtags], diff --git a/libs/wine/Makefile.in b/libs/wine/Makefile.in index b958484e55e..b8bf68677a4 100644 --- a/libs/wine/Makefile.in +++ b/libs/wine/Makefile.in @@ -4,10 +4,10 @@ EXTRADEFS = -DWINE_UNICODE_API="" \ -DBINDIR='"$(bindir)"' \ -DDLLDIR='"$(dlldir)"' \ -DDLLPREFIX='"$(DLLPREFIX)"' \ - -DLIB_TO_BINDIR=\"`$(RELPATH) $(libdir) $(bindir)`\" \ - -DLIB_TO_DLLDIR=\"`$(RELPATH) $(libdir) $(dlldir)`\" \ - -DBIN_TO_DLLDIR=\"`$(RELPATH) $(bindir) $(dlldir)`\" \ - -DBIN_TO_DATADIR=\"`$(RELPATH) $(bindir) $(datadir)/wine`\" + -DLIB_TO_BINDIR=\"`$(MAKEDEP) -R $(libdir) $(bindir)`\" \ + -DLIB_TO_DLLDIR=\"`$(MAKEDEP) -R $(libdir) $(dlldir)`\" \ + -DBIN_TO_DLLDIR=\"`$(MAKEDEP) -R $(bindir) $(dlldir)`\" \ + -DBIN_TO_DATADIR=\"`$(MAKEDEP) -R $(bindir) $(datadir)/wine`\" STATICLIB = libwine_static.a VERSION = 1.0 @@ -113,11 +113,6 @@ EXTRA_OBJS = version.o version.c: dummy version=`(GIT_DIR=$(top_srcdir)/.git git describe HEAD 2>/dev/null || echo "wine-@PACKAGE_VERSION@") | sed -n -e '$$s/\(.*\)/const char wine_build[] = "\1";/p'` && (echo $$version | cmp -s - $@) || echo $$version >$@ || ($(RM) $@ && exit 1) -$(OBJS): $(RELPATH) - -$(RELPATH): - @cd $(TOOLSDIR)/tools && $(MAKE) relpath$(TOOLSEXT) - # Make sure that make_makefiles sees the generated rules install install-lib:: install install-dev:: diff --git a/tools/Makefile.in b/tools/Makefile.in index 271a3277b6e..36fd26d3052 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -5,7 +5,6 @@ PROGRAMS = \ fnt2fon$(EXEEXT) \ make_ctests$(EXEEXT) \ make_xftmpl$(EXEEXT) \ - relpath$(EXEEXT) \ sfnt2fnt$(EXEEXT) \ wineapploader @@ -20,7 +19,6 @@ C_SRCS = \ make_ctests.c \ make_xftmpl.c \ makedep.c \ - relpath.c \ sfnt2fnt.c EXTRASUBDIRS = winapi @@ -47,10 +45,7 @@ make_xftmpl$(EXEEXT): make_xftmpl.o fnt2fon$(EXEEXT): fnt2fon.o $(CC) $(CFLAGS) -o $@ fnt2fon.o $(LIBPORT) $(LDFLAGS) -relpath$(EXEEXT): relpath.o - $(CC) $(CFLAGS) -o $@ relpath.o $(LIBPORT) $(LDFLAGS) - -sfnt2fnt$(EXEEXT): sfnt2fnt.o relpath$(EXEEXT) +sfnt2fnt$(EXEEXT): sfnt2fnt.o $(CC) $(CFLAGS) -o $@ sfnt2fnt.o $(LIBWINE_STATIC) $(LIBPORT) $(LDFLAGS) $(FREETYPELIBS) wineapploader: wineapploader.in diff --git a/tools/makedep.c b/tools/makedep.c index 4c54c90f95a..1226bb3c7af 100644 --- a/tools/makedep.c +++ b/tools/makedep.c @@ -102,18 +102,20 @@ static const char *top_obj_dir; static const char *OutputFileName = "Makefile"; static const char *Separator = "### Dependencies"; static const char *input_file_name; +static int relative_dir_mode; static int input_line; static FILE *output_file; static const char Usage[] = "Usage: makedep [options] [files]\n" "Options:\n" - " -Idir Search for include files in directory 'dir'\n" - " -Cdir Search for source files in directory 'dir'\n" - " -Sdir Set the top source directory\n" - " -Tdir Set the top object directory\n" - " -fxxx Store output in file 'xxx' (default: Makefile)\n" - " -sxxx Use 'xxx' as separator (default: \"### Dependencies\")\n"; + " -Idir Search for include files in directory 'dir'\n" + " -Cdir Search for source files in directory 'dir'\n" + " -Sdir Set the top source directory\n" + " -Tdir Set the top object directory\n" + " -R from to Compute the relative path between two directories\n" + " -fxxx Store output in file 'xxx' (default: Makefile)\n" + " -sxxx Use 'xxx' as separator (default: \"### Dependencies\")\n"; #ifndef __GNUC__ @@ -289,6 +291,52 @@ static char *replace_extension( const char *name, unsigned int old_len, const ch } +/******************************************************************* + * get_relative_path + * + * Determine where the destination path is located relative to the 'from' path. + */ +static char *get_relative_path( const char *from, const char *dest ) +{ + const char *start; + char *ret, *p; + unsigned int dotdots = 0; + + /* a path of "." is equivalent to an empty path */ + if (!strcmp( from, "." )) from = ""; + + for (;;) + { + while (*from == '/') from++; + while (*dest == '/') dest++; + start = dest; /* save start of next path element */ + if (!*from) break; + + while (*from && *from != '/' && *from == *dest) { from++; dest++; } + if ((!*from || *from == '/') && (!*dest || *dest == '/')) continue; + + /* count remaining elements in 'from' */ + do + { + dotdots++; + while (*from && *from != '/') from++; + while (*from == '/') from++; + } + while (*from); + break; + } + + if (!start[0] && !dotdots) return NULL; /* empty path */ + + ret = xmalloc( 3 * dotdots + strlen( start ) + 1 ); + for (p = ret; dotdots; dotdots--, p += 3) memcpy( p, "../", 3 ); + + if (start[0]) strcpy( p, start ); + else p[-1] = 0; /* remove trailing slash */ + return ret; +} + + /******************************************************************* * get_line */ @@ -1304,6 +1352,9 @@ static void parse_option( const char *opt ) case 'f': if (opt[2]) OutputFileName = opt + 2; break; + case 'R': + relative_dir_mode = 1; + break; case 's': if (opt[2]) Separator = opt + 2; else Separator = NULL; @@ -1339,6 +1390,20 @@ int main( int argc, char *argv[] ) else i++; } + if (relative_dir_mode) + { + char *relpath; + + if (argc != 3) + { + fprintf( stderr, "Option -r needs two directories\n%s", Usage ); + exit( 1 ); + } + relpath = get_relative_path( argv[1], argv[2] ); + printf( "%s\n", relpath ? relpath : "." ); + exit( 0 ); + } + /* ignore redundant source paths */ if (src_dir && !strcmp( src_dir, "." )) src_dir = NULL; if (top_src_dir && top_obj_dir && !strcmp( top_src_dir, top_obj_dir )) top_src_dir = NULL; diff --git a/tools/relpath.c b/tools/relpath.c deleted file mode 100644 index 117ecef7a52..00000000000 --- a/tools/relpath.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Compute the relative path needed to go from one Unix dir to another - * - * Copyright 2006 Alexandre Julliard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" - -#include -#include -#include - -/* determine where the destination path is located relative to the 'from' path */ -static const char *get_relative_path( const char *from, const char *dest, unsigned int *dotdots ) -{ -#define DIR_END(p) (*(p) == 0 || *(p) == '/') - const char *start; - - /* a path of "." is equivalent to an empty path */ - if (!strcmp( from, "." )) from = ""; - - *dotdots = 0; - for (;;) - { - while (*from == '/') from++; - while (*dest == '/') dest++; - start = dest; /* save start of next path element */ - if (!*from) break; - - while (!DIR_END(from) && *from == *dest) { from++; dest++; } - if (DIR_END(from) && DIR_END(dest)) continue; - - /* count remaining elements in 'from' */ - do - { - (*dotdots)++; - while (!DIR_END(from)) from++; - while (*from == '/') from++; - } - while (*from); - break; - } - return start; -#undef DIR_END -} - - -int main( int argc, char *argv[] ) -{ - const char *start; - unsigned int dotdots = 0; - - if (argc != 3) - { - fprintf( stderr, "Usage: %s fromdir todir\n", argv[0] ); - exit(1); - } - start = get_relative_path( argv[1], argv[2], &dotdots ); - - if (!start[0] && !dotdots) printf( ".\n" ); - else - { - while (dotdots) - { - printf( ".." ); - dotdots--; - if (dotdots || start[0]) printf( "/" ); - } - printf( "%s\n", start ); - } - exit(0); -}