Bump version to 0.36.9
[cygport.git] / cygclass / cross.cygclass
blobac8b5b1809694a00baaa7120b1dbde2a3c02f6ae
1 ################################################################################
3 # cross.cygclass - for building cross-compiled packages
5 # Part of cygport - Cygwin packaging application
6 # Copyright (C) 2006-2020 Cygport authors
7 # Provided by the Cygwin project <https://cygwin.com/>
9 # cygport is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
14 # cygport is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with cygport.  If not, see <https://www.gnu.org/licenses/>.
22 ################################################################################
24 #****h* Cygclasses/cross.cygclass
25 #  SYNOPSIS
26 #  CROSS_HOST="..."
27 #  inherit cross
28 #  DESCRIPTION
29 #  This cygclass assists in building libraries to be used by "cross-compilers",
30 #  which generate code to be run on a different platform (the "host" system)
31 #  then the one on which it was built (and, in most cases, NOT on the build
32 #  system), but can be used on the build system to cross-compile other software
33 #  which depends on it.
35 #  Supported build systems for cross-compiling are autotools, cmake, qmake, and
36 #  custom Makefiles.  When using cross.cygclass, cygconf, cygcmake, and cygqmake4
37 #  automatically use the necessary arguments for cross-compiling, and cyginstall
38 #  and most of the do* and new* installation functions install into the sysroot
39 #  instead of the native root.  Note that those installation functions which
40 #  accept an absolute path (dodir, exeinto, insinto, dosym) make no assumptions
41 #  about the sysroot.
42 #****
44 #****v* cross.cygclass/CROSS_HOST
45 #  DESCRIPTION
46 #  The CPU-VENDOR-OS[-TOOLCHAIN] triplet, or customary abbreviation thereof,
47 #  describing the system for which you are cross-compiling; for example:
48 #  * i686-linux [i686-pc-linux-gnu]: i686 GNU/Linux
49 #  * x86_64-w64-mingw32: Win64
50 #  * arm-eabi [arm-unknown-eabi]: Embedded ARM ELF system (e.g. with Newlib)
51 #  * avr [avr-unknown-none]: Atmel AVR bare metal (e.g. Arduino)
52 #  Note that while 'unknown' vendor tags are often omitted, particularly in
53 #  conjunction with a 'none' OS tag, as above, this does not apply to e.g.
54 #  'armv7hl-unknown-linux-gnueabi' and other systems.
55 #  NOTES
56 #  * CROSS_HOST must be defined before inherit()ing cross.cygclass.
57 #  * CROSS_HOST must match the prefix of the toolchain being used (in other
58 #    words, the TOOLCHAIN_TARGET used for building said toolchain).
59 #****
60 if ! defined CROSS_HOST
61 then
62         error "CROSS_HOST must be defined before 'inherit cross'"
65 __check_triplet ${CROSS_HOST}
66 CHOST=${CROSS_HOST}
67 CTARGET=${CHOST}
68 ARCH=noarch
69 unset ARCH_i686 ARCH_x86_64
72 #****d* cross.cygclass/CROSS_SYSROOT
73 #  DESCRIPTION
74 #  GCC cross-compilers provide the concept of a sysroot: a directory which
75 #  acts as the virtual root of the target filesystem, resulting in
76 #  CROSS_SYSROOT/$prefix/include and CROSS_SYSROOT/$prefix/lib being in the
77 #  default search paths without requiring -I or -L flags.
79 #  This means that software natively compiled for the host system can be
80 #  unpacked into the sysroot and used for cross-compiling.  This is
81 #  especially useful when bootstrapping a new toolchain; e.g. for Linux, one
82 #  can just download glibc and kernel headers packages from a Linux distro,
83 #  unpack them into the CROSS_SYSROOT, and use those to build a cross-GCC
84 #  for the first time.
86 #  If you do use natively-compiled host packages under the sysroot, you must
87 #  fix paths in all *-config scripts, .la libtool libraries, and .pc
88 #  pkg-config files so they do not erroneously point to Cygwin-native
89 #  headers and libraries.
90 #****
91 CROSS_SYSROOT="/usr/${CHOST}/sys-root"
93 #****d* cross.cygclass/CROSS_PREFIX
94 #  DESCRIPTION
95 #  The $prefix directory under the sysroot.  This definition is meant to
96 #  be used in configure or cmake arguments to avoid dealing with different
97 #  prefixes on various systems.
98 #****
99 CROSS_PREFIX="$(__host_prefix)"
101 #****d* cross.cygclass/CROSS_BINDIR
102 #  DESCRIPTION
103 #  The $prefix/bin directory under the sysroot.  This definition is meant to
104 #  be used in configure or cmake arguments to avoid dealing with different
105 #  prefixes on various systems.
106 #****
107 CROSS_BINDIR="$(__host_prefix)/bin"
109 #****d* cross.cygclass/CROSS_INCLUDEDIR
110 #  DESCRIPTION
111 #  The $prefix/include directory under the sysroot.  This definition is
112 #  meant to be used in configure or cmake arguments to avoid dealing with
113 #  different prefixes on various systems.
114 #****
115 CROSS_INCLUDEDIR="$(__host_prefix)/include"
117 #****d* cross.cygclass/CROSS_LIBDIR
118 #  DESCRIPTION
119 #  The $prefix/lib directory under the sysroot.  This definition is meant to
120 #  be used in configure or cmake arguments to avoid dealing with different
121 #  prefixes on various systems.
122 #****
123 CROSS_LIBDIR="$(__host_prefix)/lib"
125 #****d* cross.cygclass/CROSS_DATADIR
126 #  DESCRIPTION
127 #  The $prefix/share directory under the sysroot.  This definition is meant to
128 #  be used in configure or cmake arguments to avoid dealing with different
129 #  prefixes on various systems.
130 #****
131 CROSS_DATADIR="$(__host_prefix)/share"
133 CC="${CHOST}-gcc"
134 CXX="${CHOST}-g++"
135 F77="${CHOST}-gfortran"
136 FC="${CHOST}-gfortran"
137 GOC="${CHOST}-gccgo"
138 OBJC="${CHOST}-gcc"
139 OBJCXX="${CHOST}-g++"
140 PKG_CONFIG="${CHOST}-pkg-config"
142 CC_SYSROOT=$(${CC} -print-sysroot)
144 # native binutils do not install $host- prefixed equivalents, so we must not
145 # prefix them when "crossbacking" (e.g. building i686-cygwin sysroot libs on
146 # i686-cygwin for use on x86_64-cygwin)
147 if cross_compiling
148 then
149         AR="${CHOST}-ar"
150         NM="${CHOST}-nm"
151         OBJDUMP="${CHOST}-objdump"
152         RANLIB="${CHOST}-ranlib"
153         STRIP="${CHOST}-strip"
156 # windres is not provided for all platforms
157 case ${CHOST} in
158 *-cygwin*|*-mingw*|*-msys*|*-*-pe*|*-wince*|*-cegcc*|*-netbsdpe)
159         if cross_compiling
160         then
161                 DLLTOOL="${CHOST}-dlltool"
162                 RC="${CHOST}-windres"
163         fi ;;
164 *)      DLLTOOL="false"
165         RC="false"
166         ;;
167 esac
169 case ${CHOST} in
170 *-*-mingw*)
171         # GCC since 4.7 uses -mms-bitfields by default, but does not have
172         # builtin stack-smashing support
173         CFLAGS="-ggdb -O2 -pipe -Wall -Werror=format-security"
174         CXXFLAGS=${CFLAGS}
175         FFLAGS=${CFLAGS}
176         FCFLAGS=${CFLAGS}
177         OBJCFLAGS=${CFLAGS}
178         OBJCXXFLAGS=${CXXFLAGS}
179         ;;
180 *-*-linux-gnu)
181         LDFLAGS="${LDFLAGS} -Wl,--as-needed -Wl,--no-undefined"
182         ;;
183 esac
185 if ! check_tool gcc || ! check_tool strip
186 then
187         error "This package requires ${CHOST} binutils and gcc"
190 #****I* cross.cygclass/doelflib
191 #  SYNOPSIS
192 #  doelflib libfoo.so.X.Y.Z [...]
193 #  DESCRIPTION
194 #  Installs the given ELF libraries into the CROSS_SYSROOT libdir and creates
195 #  the symlinks for the SONAME (usually .so.X) and the link library (.so).
196 #  NOTE
197 #  Only the real library file should be passed to doelflib, not the symlinks
198 #  usually created in the build directory.
199 #****
200 doelflib() {
201         local clibdir="$(__host_prefix)/lib"
202         local i soname sonames
204         dodir ${clibdir}
206         for i
207         do
208                 if [ ! -e ${i} ]
209                 then
210                         error "file ${i} does not exist"
211                 fi
213                 case ${i##*/} in
214                 *.so*)  ;;
215                 *)      error "doelflib: ${i}: not an ELF shared object" ;;
216                 esac
218                 soname=$(${OBJDUMP} -p ${i} | sed -n -e 's| *SONAME *\([^ ]*\).*|\1|gp')
220                 # try to catch mistaken "doelflib libfoo.so*"
221                 if echo "${sonames}" | grep -q ${soname}
222                 then
223                         error "SONAME ${soname} has already been installed"
224                 else
225                         sonames+=" ${soname} "
226                 fi
228                 __doinstall 0755 ${i} ${clibdir} || error "doelflib ${i} failed"
230                 if test ${i##*/} != ${soname}
231                 then
232                         dosym ${i##*/} ${clibdir}/${soname}
233                 fi
234                 if test ${soname%.so*}.so != ${soname}
235                 then
236                         dosym ${i##*/} ${clibdir}/${soname%.so*}.so
237                 fi
238         done
241 #****I* cross.cygclass/cross_sysrootize
242 #  SYNOPSIS
243 #  cross_sysrootize FILE [FILE] ...
244 #  DESCRIPTION
245 #  Adds CROSS_SYSROOT to all paths in given text file(s).  Paths should
246 #  be specified as if on the system, without a leading $D.
247 #****
248 cross_sysrootize(){
249         local f
250         local prefix=$(__target_prefix)
252         for f in ${@}
253         do
254                 if [ ! -e ${D}${f#${D}} ]
255                 then
256                         error "cross_sysrootize: $f: file not found"
257                 fi
259                 # the [^t] should catch paths already containing the sysroot
260                 sed -i -e "s|\([^t]\)${prefix}|\1${CROSS_PREFIX}|g" ${D}${f#${D}} || error "$FUNCNAME: $f: sed failed"
261         done
264 #****I* cross.cygclass/cross_desysrootize
265 #  SYNOPSIS
266 #  cross_desysrootize FILE [FILE] ...
267 #  DESCRIPTION
268 #  Removes CROSS_SYSROOT from all paths in given text file(s).  Paths should
269 #  be specified as if on the system, without a leading $D.
270 #****
271 cross_desysrootize(){
272         local f
274         for f in ${@}
275         do
276                 if [ ! -e ${D}${f#${D}} ]
277                 then
278                         error "cross_desysrootize: $f: file not found"
279                 fi
281                 sed -i -e "s|${CROSS_SYSROOT}||g" ${D}${f#${D}} || error "$FUNCNAME: $f: sed failed"
282         done
285 readonly -f doelflib cross_sysrootize cross_desysrootize