All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH/RFC] Improve cross-compile support
@ 2013-03-13  2:40 Aaron Carroll
  2013-03-13 14:59 ` Jens Axboe
  0 siblings, 1 reply; 3+ messages in thread
From: Aaron Carroll @ 2013-03-13  2:40 UTC (permalink / raw)
  To: fio

[-- Attachment #1: Type: text/plain, Size: 779 bytes --]

A first attempt at making cross-compile viable is attached.

Specifically we:
 - Propagate the target OS from configure to Makefile so we dont need uname
 - Allow CROSS_COMPILE for toolchain prefix, which is common (e.g. Linux)
 - Allow wordsize and bigendian to be set statically.  These are
usually determined by executing a test program, which obviously
doesn't work for cross compiles.
 - Make the Android config dynamic (but set wordsize/bigendian)

Now the wordsize/bigendian handling is not ideal but I can't think of
a better approach right now.

Also I've changed the #includes in the socklet_t check.  sys/socket.h
appears to be the right thing, but please check.

Compile tested on Linux/i386 native, Linux/i386 to Android cross
compile, and OS X native.


  -- Aaron

[-- Attachment #2: 0001-Improve-cross-compile-support.patch --]
[-- Type: application/octet-stream, Size: 5899 bytes --]

From f79b66fb89739ba8b834584ffa23ef4079074683 Mon Sep 17 00:00:00 2001
From: Aaron Carroll <aaronc@cse.unsw.edu.au>
Date: Wed, 13 Mar 2013 13:24:12 +1100
Subject: [PATCH] Improve cross-compile support

 - Propagate the target OS from configure to Makefile so we dont need uname
 - Allow CROSS_COMPILE for toolchain prefix, which is common (e.g. Linux)
 - Allow wordsize and bigendian to be set statically.  These are usually
   determined by executing a test program, which obviously doesn't work for
   cross compiles.
 - Make the Android config dynamic (but set wordsize/bigendian)

Signed-off-by: Aaron Carroll <aaronc@cse.unsw.edu.au>
---
 Makefile  |   21 ++++++++++-----------
 configure |   49 +++++++++++++++++++++++++------------------------
 2 files changed, 35 insertions(+), 35 deletions(-)

diff --git a/Makefile b/Makefile
index 7a17555..ea96a89 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,6 @@ CFLAGS	= -std=gnu99 -Wwrite-strings -Wall $(OPTFLAGS)
 LIBS	= -lm $(EXTLIBS)
 PROGS	= fio
 SCRIPTS = fio_generate_plots
-UNAME  := $(shell uname)
 
 ifneq ($(wildcard config-host.mak),)
 all:
@@ -80,42 +79,42 @@ ifndef CONFIG_INET_ATON
   SOURCE += lib/inet_aton.c
 endif
 
-ifeq ($(UNAME), Linux)
+ifeq ($(CONFIG_TARGET_OS), Linux)
   SOURCE += diskutil.c fifo.c blktrace.c cgroup.c trim.c engines/sg.c \
 		engines/binject.c profiles/tiobench.c
   LIBS += -lpthread -ldl
   LDFLAGS += -rdynamic
 endif
-ifeq ($(UNAME), Android)
+ifeq ($(CONFIG_TARGET_OS), Android)
   SOURCE += diskutil.c fifo.c blktrace.c trim.c profiles/tiobench.c
   LIBS += -ldl
   LDFLAGS += -rdynamic
 endif
-ifeq ($(UNAME), SunOS)
+ifeq ($(CONFIG_TARGET_OS), SunOS)
   LIBS	 += -lpthread -ldl
   CPPFLAGS += -D__EXTENSIONS__
 endif
-ifeq ($(UNAME), FreeBSD)
+ifeq ($(CONFIG_TARGET_OS), FreeBSD)
   LIBS	 += -lpthread -lrt
   LDFLAGS += -rdynamic
 endif
-ifeq ($(UNAME), NetBSD)
+ifeq ($(CONFIG_TARGET_OS), NetBSD)
   LIBS	 += -lpthread -lrt
   LDFLAGS += -rdynamic
 endif
-ifeq ($(UNAME), AIX)
+ifeq ($(CONFIG_TARGET_OS), AIX)
   LIBS	 += -lpthread -ldl -lrt
   CPPFLAGS += -D_LARGE_FILES -D__ppc__
   LDFLAGS += -L/opt/freeware/lib -Wl,-blibpath:/opt/freeware/lib:/usr/lib:/lib -Wl,-bmaxdata:0x80000000
 endif
-ifeq ($(UNAME), HP-UX)
+ifeq ($(CONFIG_TARGET_OS), HP-UX)
   LIBS   += -lpthread -ldl -lrt
   CFLAGS += -D_LARGEFILE64_SOURCE -D_XOPEN_SOURCE_EXTENDED
 endif
-ifeq ($(UNAME), Darwin)
+ifeq ($(CONFIG_TARGET_OS), Darwin)
   LIBS	 += -lpthread -ldl
 endif
-ifneq (,$(findstring CYGWIN,$(UNAME)))
+ifneq (,$(findstring CYGWIN,$(CONFIG_TARGET_OS)))
   SOURCE := $(filter-out engines/mmap.c,$(SOURCE))
   SOURCE += os/windows/posix.c
   LIBS	 += -lpthread -lpsapi -lws2_32
@@ -169,7 +168,7 @@ INSTALL = install
 prefix = /usr/local
 bindir = $(prefix)/bin
 
-ifeq ($(UNAME), Darwin)
+ifeq ($(CONFIG_TARGET_OS), Darwin)
 mandir = /usr/share/man
 else
 mandir = $(prefix)/man
diff --git a/configure b/configure
index d1f277d..13cc3e7 100755
--- a/configure
+++ b/configure
@@ -126,6 +126,7 @@ output_sym() {
 targetos=""
 cpu=""
 
+cross_prefix=${cross_prefix-${CROSS_COMPILE}}
 cc="${CC-${cross_prefix}gcc}"
 
 show_help="no"
@@ -173,6 +174,13 @@ else
   targetos=`uname -s`
 fi
 
+echo "# Automatically generated by configure - do not modify" > $config_host_mak
+printf "# Configured with:" >> $config_host_mak
+printf " '%s'" "$0" "$@" >> $config_host_mak
+echo >> $config_host_mak
+
+echo "CONFIG_TARGET_OS=$targetos" >> $config_host_mak
+
 # Some host OSes need non-standard checks for which CPU to use.
 # Note that these checks are broken for cross-compilation: if you're
 # cross-compiling to one of these OSes then you'll need to specify
@@ -227,15 +235,10 @@ CYGWIN*)
   exit 0
   ;;
 Android)
-  output_sym "CONFIG_32BIT"
-  output_sym "CONFIG_LITTLE_ENDIAN"
-  output_sym "CONFIG_SOCKLEN_T"
-  output_sym "CONFIG_GETTIMEOFDAY"
-  output_sym "CONFIG_CLOCK_GETTIME"
-  output_sym "CONFIG_CLOCK_MONOTONIC"
-  echo "CC=$cc" >> $config_host_mak
-  echo "EXTFLAGS=$CFLAGS -include config-host.h -DFIO_NO_HAVE_SHM_H -D_GNU_SOURCE" >> $config_host_mak
-  exit 0
+  # Android is always cross-compile, so force known CPU features
+  wordsize="32"
+  bigendian="no"
+  ;;
 esac
 
 if test ! -z "$cpu" ; then
@@ -317,8 +320,9 @@ cc="${CC-${cross_prefix}gcc}"
 
 ##########################################
 # check endianness
-bigendian="no"
-cat > $TMPC <<EOF
+if test -z "$bigendian" ; then
+  bigendian="no"
+  cat > $TMPC <<EOF
 #include <inttypes.h>
 int main(void)
 {
@@ -326,8 +330,9 @@ int main(void)
   return (*((uint8_t*)(&i))) == 0x67;
 }
 EOF
-if compile_prog "" "" "endian"; then
-  $TMPE && bigendian="yes"
+  if compile_prog "" "" "endian"; then
+    $TMPE && bigendian="yes"
+  fi
 fi
 
 
@@ -339,8 +344,9 @@ echo
 
 ##########################################
 # check for wordsize
-wordsize="0"
-cat > $TMPC <<EOF
+if test -z "$wordsize" ; then
+  wordsize="0"
+  cat > $TMPC <<EOF
 #include <stdio.h>
 int main(void)
 {
@@ -349,8 +355,9 @@ int main(void)
   return 0;
 }
 EOF
-if compile_prog "" "" "wordsize"; then
-  wordsize=`$TMPE`
+  if compile_prog "" "" "wordsize"; then
+    wordsize=`$TMPE`
+  fi
 fi
 echo "Wordsize                      $wordsize"
 
@@ -829,8 +836,7 @@ echo "inet_aton                     $inet_aton"
 # socklen_t probe
 socklen_t="no"
 cat > $TMPC << EOF
-#include <string.h>
-#include <netinet/in.h>
+#include <sys/socket.h>
 int main(int argc, char **argv)
 {
   socklen_t len = 0;
@@ -929,11 +935,6 @@ echo "RLIMIT_MEMLOCK                $rlimit_memlock"
 
 #############################################################################
 
-echo "# Automatically generated by configure - do not modify" > $config_host_mak
-printf "# Configured with:" >> $config_host_mak
-printf " '%s'" "$0" "$@" >> $config_host_mak
-echo >> $config_host_mak
-
 if test "$wordsize" = "64" ; then
   output_sym "CONFIG_64BIT"
 elif test "$wordsize" = "32" ; then
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH/RFC] Improve cross-compile support
  2013-03-13  2:40 [PATCH/RFC] Improve cross-compile support Aaron Carroll
@ 2013-03-13 14:59 ` Jens Axboe
  2013-03-14  0:09   ` Aaron Carroll
  0 siblings, 1 reply; 3+ messages in thread
From: Jens Axboe @ 2013-03-13 14:59 UTC (permalink / raw)
  To: Aaron Carroll; +Cc: fio

On Wed, Mar 13 2013, Aaron Carroll wrote:
> A first attempt at making cross-compile viable is attached.
> 
> Specifically we:
>  - Propagate the target OS from configure to Makefile so we dont need uname
>  - Allow CROSS_COMPILE for toolchain prefix, which is common (e.g. Linux)
>  - Allow wordsize and bigendian to be set statically.  These are
> usually determined by executing a test program, which obviously
> doesn't work for cross compiles.
>  - Make the Android config dynamic (but set wordsize/bigendian)
> 
> Now the wordsize/bigendian handling is not ideal but I can't think of
> a better approach right now.
> 
> Also I've changed the #includes in the socklet_t check.  sys/socket.h
> appears to be the right thing, but please check.
> 
> Compile tested on Linux/i386 native, Linux/i386 to Android cross
> compile, and OS X native.

Looks OK to me, I can test on other platforms too. But it does not apply
against current -git:

patching file Makefile
patching file configure
Hunk #3 FAILED at 235.
1 out of 9 hunks FAILED -- saving rejects to file configure.rej

Can you update and resend? Thanks!

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH/RFC] Improve cross-compile support
  2013-03-13 14:59 ` Jens Axboe
@ 2013-03-14  0:09   ` Aaron Carroll
  0 siblings, 0 replies; 3+ messages in thread
From: Aaron Carroll @ 2013-03-14  0:09 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio

On 14/03/13 1:59 AM, Jens Axboe wrote:
> On Wed, Mar 13 2013, Aaron Carroll wrote:
>> A first attempt at making cross-compile viable is attached.
>> [..]
> 
> Looks OK to me, I can test on other platforms too. But it does not apply
> against current -git:
> 
> patching file Makefile
> patching file configure
> Hunk #3 FAILED at 235.
> 1 out of 9 hunks FAILED -- saving rejects to file configure.rej
> 
> Can you update and resend? Thanks!

I've made more progress with this, so I'll send a new/updated series
through soon.


Thanks,
  -- Aaron



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-03-14  0:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-13  2:40 [PATCH/RFC] Improve cross-compile support Aaron Carroll
2013-03-13 14:59 ` Jens Axboe
2013-03-14  0:09   ` Aaron Carroll

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.