* preliminary autoconf-based cross-building support
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
diff --git a/ChangeLog b/ChangeLog
index ed029ce..bd8ca35 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2006-10-14 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+
+ * docs/INSTALL.CROSS: New document file for cross-building.
+
+ * builds/unix/configure.raw: Preliminary cross-building support.
+ Find native C compiler and pass it by CC_BUILD, and
+ find suffix for native executable and pass it by EXEEXT_BUILD.
+ Also suffix for target executable is passed by EXEEXT.
+
+ * builds/unix/unix-cc.in: CCraw_build and E_BUILD are introduced
+ to build apinames which runs on building system. They are set by
+ CC_BUILD and EXEEXT_BUILD.
+
+ * builds/exports.mk: Change the extension for apinames from the
+ suffix for target (E) to that for building host (E_BUILD).
+
2006-10-12 Werner Lemberg <wl@gnu.org>
* docs/INSTALL.UNX, docs/UPGRADE.UNX: Renamed to...
diff --git a/builds/exports.mk b/builds/exports.mk
index f8bf69a..3fad4b8 100644
--- a/builds/exports.mk
+++ b/builds/exports.mk
@@ -48,7 +48,7 @@ ifneq ($(EXPORTS_LIST),)
# Note that $(APINAMES_OPTIONS) is empty, except for Windows compilers.
#
APINAMES_SRC := $(TOP_DIR)/src/tools/apinames.c
- APINAMES_EXE := $(OBJ_DIR)/apinames$E
+ APINAMES_EXE := $(OBJ_DIR)/apinames$(E_BUILD)
$(APINAMES_EXE): $(APINAMES_SRC)
$(CCexe) $(TE)$@ $<
diff --git a/builds/unix/configure.raw b/builds/unix/configure.raw
index 7d1cd87..178e202 100644
--- a/builds/unix/configure.raw
+++ b/builds/unix/configure.raw
@@ -25,6 +25,8 @@ AC_SUBST([ft_version])
# checks for system type
+AC_CANONICAL_BUILD
+AC_CANONICAL_HOST
AC_CANONICAL_TARGET
@@ -32,6 +34,42 @@ AC_CANONICAL_TARGET
AC_PROG_CC
AC_PROG_CPP
+AC_SUBST(EXEEXT)
+
+
+# checks for native programs to generate building tool
+
+if test ${cross_compiling} = yes; then
+ AC_CHECK_PROG(CC_BUILD, ${build}-gcc, ${build-gcc})
+ test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, gcc, gcc)
+ test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, cc, cc, , , /usr/ucb/cc)
+ test -z "${CC_BUILD}" && AC_MSG_ERROR([cannot find native C compiler])
+
+ AC_MSG_CHECKING([for suffix of native executables])
+ rm -f a.* b.* a_out.exe conftest.*
+ echo > conftest.c "int main() { return 0;}"
+ ${CC_BUILD} conftest.c || AC_MSG_ERROR([native C compiler is not working])
+ rm -f conftest.c
+ if test -x a.out -o -x b.out -o -x conftest; then
+ EXEEXT_BUILD=""
+ elif test -x a_out.exe -o -x conftest.exe; then
+ EXEEXT_BUILD=".exe"
+ elif test -x conftest.* ; then
+ EXEEXT_BUILD=`echo conftest.* | sed -n '1s/^.*\.//g'`
+ fi
+ AC_MSG_RESULT($EXEEXT_BUILD)
+else
+ CC_BUILD=${CC}
+ EXEEXT_BUILD=${EXEEXT}
+fi
+
+
+if test ! -z ${EXEEXT_BUILD}; then
+ EXEEXT_BUILD=."${EXEEXT_BUILD}"
+fi
+AC_SUBST(CC_BUILD)
+AC_SUBST(EXEEXT_BUILD)
+
# get compiler flags right
diff --git a/builds/unix/unix-cc.in b/builds/unix/unix-cc.in
index a5b0859..b09aa35 100644
--- a/builds/unix/unix-cc.in
+++ b/builds/unix/unix-cc.in
@@ -25,6 +25,12 @@ O := lo
SO := o
+# The executable file extension. Although most Unix platform use no extension,
+# we copy the extension detected by autoconf, useful for cross building on
+# Unix system for non-Unix system.
+#
+E := @EXEEXT@
+
# The library file extension (for standard and static libraries). This can
# be .a, .lib, etc., depending on the platform.
#
@@ -88,10 +94,12 @@ CC := $(LIBTOOL) --mode=compile $(CCraw)
LDFLAGS := @LDFLAGS@
-# export symbols (XXX: HOW TO DEAL WITH CROSS COMPILATION ?)
+# export symbols
#
+CCraw_build := @CC_BUILD@ # native CC of building system
+E_BUILD := @EXEEXT_BUILD@ # extension for exexutable on building system
EXPORTS_LIST := $(OBJ_DIR)/ftexport.sym
-CCexe := $(CCraw) # used to compile "apinames" only
+CCexe := $(CCraw_build) # used to compile "apinames" only
# Library linking
diff --git a/docs/INSTALL.CROSS b/docs/INSTALL.CROSS
new file mode 100644
index 0000000..03de60c
--- /dev/null
+++ b/docs/INSTALL.CROSS
@@ -0,0 +1,135 @@
+This document contains instructions on how to cross-build the FreeType
+library on Unix systems, for example, building binaries for Linux/MIPS
+on FreeBSD/i386. Before reading this document, please consult
+INSTALL.UNIX for required tools and the basic self-building procedure.
+
+
+ 1. Required Tools
+ -----------------
+
+ For self-building the FreeType library on a Unix system, GNU Make
+ 3.78.1 or newer is required. INSTALL.UNIX contains hints how to
+ check the installed `make'.
+
+ The GNU C compiler to cross-build the target system is required.
+ At present, using non-GNU cross compiler is not tested. The cross
+ compiler is expected to be installed with a system prefix. For
+ example, if your building system is FreeBSD/i386 and the target
+ system is Linux/MIPS, the cross compiler should be installed with
+ the name `mips-ip22-linuxelf-gcc'.
+
+ A C compiler for a self-build is required also, to build a tool
+ that is executed during the building procedure. Non-GNU self
+ compilers are acceptable, but such a setup is not tested yet.
+
+
+ 2. Configuration
+ ----------------
+
+ 2.1. Building and target system
+
+ To configure for cross-build, the options `--host=<system>' and
+ `--build=<system>' must be passed to configure. For example, if
+ your building system is FreeBSD/i386 and the target system is
+ Linux/MIPS, say
+
+ ./configure \
+ --build=i386-unknown-freebsd \
+ --host=mips-ip22-linuxelf \
+ [other options]
+
+ It should be noted that `--host=<system>' specifies the system
+ where the built binaries will be executed, not the system where
+ the build actually happens. Older versions of GNU autoconf use
+ the option pair `--host=' and `--target='. This is broken and
+ doesn't work. Similarly, an explicit CC specification like
+
+ env CC=mips-ip22-linux-gcc ./configure
+
+ or
+
+ env CC=/usr/local/mips-ip22-linux/bin/gcc ./configure
+
+ doesn't work either; such a configuration confuses the
+ `configure' script while trying to find the cross and native C
+ compilers.
+
+
+ 2.2. The prefix to install FreeType2
+
+ Setting `--prefix=<prefix>' properly is important. The prefix
+ to install FreeType2 is written into the freetype-config script
+ and freetype2.pc configuration file.
+
+ If the built FreeType 2 library is used as a part of the
+ cross-building system, the prefix is expected to be different
+ from the self-building system. For example, configuration with
+ `--prefix=/usr/local' installs binaries into the system wide
+ `/usr/local' directory which then can't be executed. This
+ causes confusion in configuration of all applications which use
+ FreeType2. Instead, use a prefix to install the cross-build
+ into a separate system tree, for example,
+ `--prefix=/usr/local/mips-ip22-linux/'.
+
+ On the other hand, if the built FreeType2 is used as a part of
+ the target system, the prefix to install should reflect the file
+ system structure of the target system.
+
+
+ 3. Building command
+ -------------------
+
+ If the configuration finishes successfuly, invoking GNU make builds
+ FreeType2. Just say
+
+ make
+
+ or
+
+ gmake
+
+ depending on the name the GNU make binary actually has.
+
+
+ 4. Installation
+ ---------------
+
+ Saying
+
+ make install
+
+ as usual to install FreeType2 into the directory tree specified by
+ the argument of the `--prefix' option.
+
+ As noted in section 2.2, FreeType2 is sometimes configured to be
+ installed into the system directory of the target system, and
+ should not be installed in the cross-building system. In such
+ cases, the make variable `DESTDIR' is useful to change the root
+ directory in the installation. For example, after
+
+ make DESTDIR=/mnt/target_system_root/ install
+
+ the built FreeType2 library files are installed into the directory
+ `/mnt/target_system_root/<prefix_in_configure>/lib'.
+
+
+ 5. TODO
+ -------
+
+ Cross building between Cygwin (or MSys) and Unix must be tested.
+
+
+----------------------------------------------------------------------
+
+Copyright 2006 by suzuki toshiya
+David Turner, Robert Wilhelm, and Werner Lemberg.
+
+
+This file is part of the FreeType project, and may only be used,
+modified, and distributed under the terms of the FreeType project
+license, LICENSE.TXT. By continuing to use, modify, or distribute
+this file you indicate that you have read the license and understand
+and accept it fully.
+
+
+--- end of INSTALL.CROSS ---