Changed the creation of rounding.h to use a set of compile-time checks
authorWayne Davison <wayned@samba.org>
Tue, 1 Jan 2008 18:27:19 +0000 (10:27 -0800)
committerWayne Davison <wayned@samba.org>
Tue, 1 Jan 2008 18:27:19 +0000 (10:27 -0800)
similar to how configure determines the size of variables.

.gitignore
Makefile.in
configure.in
mkrounding.c

index ec67fe3..40664d7 100644 (file)
@@ -29,7 +29,6 @@ config.status
 /t_unsafe
 /wildtest
 /getfsdev
-/mkrounding
 /rounding.h
 /doc/rsync.pdf
 /doc/rsync.ps
index a5bf03f..5323654 100644 (file)
@@ -80,21 +80,22 @@ $(CHECK_OBJS): $(HEADERS)
 
 flist.o: rounding.h
 
-rounding.h: mkrounding$(EXEEXT)
-       @if test x@cross_compiling@ = xno; then \
-           ./mkrounding$(EXEEXT) >rounding.h; \
-       else \
-           echo "Copy the mkrounding$(EXEEXT) command to the target machine and run it like this:"; \
-           echo "    ./mkrounding$(EXEEXT) >rounding.h"; \
-           echo "Then copy the resulting rounding.h file to this build machine and rerun \"make\"."; \
+rounding.h: mkrounding.c rsync.h
+       @for r in 0 1 3; do \
+           if $(CC) $(CFLAGS) $(LDFLAGS) -o mkrounding -DEXTRA_ROUNDING=$$r -I. $(srcdir)/mkrounding.c >/dev/null 2>&1; then \
+               echo "#define EXTRA_ROUNDING $$r" >rounding.h; \
+               if test -f "$$HOME/build_farm/build_test.fns"; then \
+                   echo "EXTRA_ROUNDING is $$r" >&2; \
+               fi; \
+               break; \
+           fi; \
+       done
+       @rm -f mkrounding
+       @if test -f rounding.h; then : ; else \
+           echo "Failed to create rounding.h!"; \
            exit 1; \
        fi
 
-mkrounding$(EXEEXT): mkrounding.c rsync.h
-       @sed '1,/^struct file_struct/d; /^}/,$$d' <$(srcdir)/rsync.h >mkrounding.h
-       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ -I. $(srcdir)/mkrounding.c
-       @rm mkrounding.h
-
 tls$(EXEEXT): $(TLS_OBJ)
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(TLS_OBJ) $(LIBS)
 
@@ -153,7 +154,7 @@ rsyncd.conf.5: rsyncd.conf.yo
 
 clean: cleantests
        rm -f *~ $(OBJS) $(CHECK_PROGS) $(CHECK_OBJS) $(CHECK_SYMLINKS) \
-               mkrounding mkrounding.h rounding.h
+               mkrounding rounding.h
 
 cleantests:
        rm -rf ./testtmp*
index 6c2c9ea..8e3402b 100644 (file)
@@ -824,7 +824,6 @@ AC_SUBST(OBJ_RESTORE)
 AC_SUBST(CC_SHOBJ_FLAG)
 AC_SUBST(BUILD_POPT)
 AC_SUBST(MAKE_MAN)
-AC_SUBST(cross_compiling)
 
 AC_CHECK_HEADERS(sys/acl.h acl/libacl.h)
 AC_CHECK_FUNCS(_acl __acl _facl __facl)
index d978d4b..9ad24f9 100644 (file)
 
 #include "rsync.h"
 
-struct test1 {
-    union file_extras extras1[1];
-    struct {
-#      include "mkrounding.h"
-    } file;
-};
-
-struct test2 {
-    union file_extras extras2[2];
-    struct {
-#      include "mkrounding.h"
-    } file;
-};
+#define ARRAY_LEN (EXTRA_ROUNDING+1)
+#define SIZEOF(x) ((long int)sizeof (x))
 
-struct test4 {
-    union file_extras extras4[4];
-    struct {
-#      include "mkrounding.h"
-    } file;
+struct test {
+    union file_extras extras[ARRAY_LEN];
+    struct file_struct file;
 };
 
-#define SIZE_TEST(n) (sizeof (struct test ## n) == EXTRA_LEN * n + sizeof (struct file_struct))
+#define ACTUAL_SIZE    SIZEOF(struct test)
+#define EXPECTED_SIZE  (SIZEOF(union file_extras) * ARRAY_LEN + SIZEOF(struct file_struct))
 
  int main(UNUSED(int argc), UNUSED(char *argv[]))
 {
-    int cnt;
-    if (SIZE_TEST(1))
-       cnt = 0;
-    else if (SIZE_TEST(2))
-       cnt = 1;
-    else if (SIZE_TEST(4))
-       cnt = 3;
-    else {
-       fprintf(stderr, "Unable to determine required file_extras rounding!\n");
-       cnt = 3;
-    }
-    if (cnt)
-       fprintf(stderr, "Rounding file_extras in multiples of %d", cnt + 1);
-    else
-       fprintf(stderr, "No rounding needed for file_extras");
-    fprintf(stderr, " (EXTRA_LEN=%d, FILE_STRUCT_LEN=%d)\n",
-           (int)EXTRA_LEN, (int)FILE_STRUCT_LEN);
-    printf("#define EXTRA_ROUNDING %d\n", cnt);
+    static int test_array[1 - 2 * (ACTUAL_SIZE != EXPECTED_SIZE)];
+    test_array[0] = 0;
     return 0;
 }