Date: Sun, 19 Jul 2015 21:31:06 +1030 From: Michael Vale <m.vale@live.com.au> To: "freebsd-embedded@freebsd.org" <freebsd-embedded@freebsd.org>, "freebsd-arm@freebsd.org" <freebsd-arm@freebsd.org>, "freebsd-mips@freebsd.org" <freebsd-mips@freebsd.org>, "bapt@freebsd.org" <bapt@freebsd.org>, "portmgr@freebsd.org" <portmgr@freebsd.org> Subject: bsd.port.mk - cross compiling and target binary set Message-ID: <COL130-W22ADD618CE72B6BB71D922C4860@phx.gbl>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Okay, I've done a lot more work on this patch. It builds and installs build, lib and run depends, builds and installs the target port recursively. The only problem is if a build/install process wishes to run an executable that has been built for the target.
The patch assumes you have a src tree in ${HOME}/src, a WRKDIR=${HOME}/work, TARGETDIR=${HOME}/root and OBJDIR=${HOME}/obj. It also assumes you have built a target filesystem with freebsd-wifi-build or similar.
It will build and install as a user like so:
bmake TARGET_ARCH=mips BUILD_AS_USER= INSTALL_AS_USER= SRC_BASE=/home/masked/src install
---------------------------------------
Can anyone tell me or confirm if I don't set a target triple, and just a host triple, if the executables are compiled in a cross arch manner like the name cross-compiler implies? that the binaries will execute on both the build machine and the host machine assuming configure --host=${AN_ARCH_OTHER_THAN_THE_BUILD_MACHINE}?
I doubt it, but it'd be nice if thats what's actually going on here.
[-- Attachment #2 --]
--- bsd.port.mk 2015-07-11 03:25:50.184416000 +1000
+++ bsd.port.mk.nearcompletion 2015-07-19 20:32:27.580568000 +1000
@@ -1,7 +1,7 @@
#-*- tab-width: 4; -*-
# ex:ts=4
#
-# $FreeBSD$
+# $FreeBSD: head/Mk/bsd.port.mk 392322 2015-07-16 20:53:28Z kwm $
# $NetBSD: $
#
# bsd.port.mk - 940820 Jordan K. Hubbard.
@@ -342,27 +342,6 @@
# CXXFLAGS_${ARCH}
# Append the cxxflags to CXXFLAGS only on the specified architecture
##
-# USE_GHOSTSCRIPT
-# - If set, this port needs ghostscript to both
-# build and run. If a number is specified,
-# the specified version will be used.
-# The valid value is '7', '8', or '9' in that case.
-# USE_GHOSTSCRIPT_BUILD
-# - If set, this port needs ghostscript to build.
-# USE_GHOSTSCRIPT_RUN
-# - If set, this port needs ghostscript to run.
-# GHOSTSCRIPT_PORT
-# - The port that provides postscript functionality.
-# Some installations may wish to override the default
-# to specify a version without X11 and/or localized
-# versions for their nationality.
-# Default: print/ghostscript9
-# WITH_GHOSTSCRIPT_VER
-# - If set, the specified version of ghostscript will be
-# used. The valid value is "7", "8", or "9". Note that
-# this is for users, not for port maintainers. This
-# should not be used in Makefile.
-##
# USE_GL - A list of Mesa or GL related dependencies needed by the port.
# Supported components are: egl, glesv2, glut, glu, glw, and gl.
# If set to "yes", this is equivalent to "glu". Note that
@@ -1074,29 +1053,36 @@
.include "${PORTSDIR}/Mk/bsd.commands.mk"
-.if defined(X_BUILD_FOR)
+.if defined(TARGET_ARCH)
.if !defined(.PARSEDIR)
IGNORE= Cross building can only be done when using bmake(1) as make(1)
.endif
+.if !defined(ARCH)
+ARCH= ${TARGET_ARCH}
+.endif
# Do not define CPP on purpose
.if !defined(HOSTCC)
HOSTCC:= ${CC}
HOSTCXX:= ${CXX}
.endif
-.if !exists(/usr/${X_BUILD_FOR}/usr/bin/cc)
-X_SYSROOT= ${LOCALBASE}/${X_BUILD_FOR}
-.else
-X_SYSROOT= /usr/${X_BUILD_FOR}
+
+.if defined(BUILD_AS_USER)
+WRKDIR= ${HOME}/work
+SRC_BASE?= ${HOME}/src
+TARGETDIR?= ${HOME}/root
+MAKEOBJDIRPREFIX?= ${HOME}/obj
+STAGEDIR= ${TARGETDIR}/${ARCH}
+SYSROOT= ${STAGEDIR}
+#LOCALBASE= ${SYSROOT}
+DISTDIR= ${HOME}/distfiles
+DESTDIR= ${STAGEDIR}
+CHROOTED= yes
+NO_MAN= yes
.endif
-CC= ${X_SYSROOT}/usr/bin/cc
-CXX= ${X_SYSROOT}/usr/bin/c++
-NM= ${X_BUILD_FOR}-nm
-STRIP_CMD= ${X_BUILD_FOR}-strip
-# only bmake support the below
-STRIPBIN= ${STRIP_CMD}
-.export.env STRIPBIN
+
.endif
+
#
# DESTDIR section to start a chrooted process if invoked with DESTDIR set
#
@@ -1540,13 +1526,44 @@
PORT_OPTIONS="${PORT_OPTIONS}" \
PORTSDIR="${PORTSDIR}"
-.if defined(X_BUILD_FOR)
-BUILD_DEPENDS+= ${X_BUILD_FOR}-cc:${PORTSDIR}/devel/${X_BUILD_FOR}-xdev
-PKG_ENV+= ABI_FILE=${X_SYSROOT}/usr/lib/crt1.o
-MAKE_ENV+= NM=${NM} \
- STRIPBIN=${X_BUILD_FOR}-strip \
- PKG_CONFIG_SYSROOT_DIR="${X_SYSROOT}"
-CONFIGURE_ENV+= PKG_CONFIG_SYSROOT_DIR="${X_SYSROOT}"
+.if defined(TARGET_ARCH)
+.if ${CC} == gcc
+BUILD_DEPENDS+= ${ARCH}-portbld-${OPSYS:tl}${OSREL}-gcc:${PORTSDIR}/devel/${ARCH}-gcc
+CC= ${ARCH}-portbld-${OPSYS:tl}${OSREL}-gcc
+CXX= ${ARCH}-portbld-${OPSYS:tl}${OSREL}-g++
+ @if [ ! -h /usr/local/bin/mips-portbld-freebsd11.0-ar ]; then \
+ ln -sf /usr/local/bin/mips-freebsd-ar /usr/local/bin/mips-portbld-freebsd11.0-ar ; \
+ fi ;
+ if [ ! -h /usr/local/bin/mips-portbld-freebsd11.0-nm ]; then \
+ ln -sf /usr/local/bin/mips-freebsd-nm /usr/local/bin/mips-portbld-freebsd11.0-nm ; \
+ fi ;
+ if [ ! -h /usr/local/bin/mips-portbld-freebsd11.0-ranlib ]; then \
+ ln -sf /usr/local/bin/mips-freebsd-ranlib /usr/local/bin/mips-portbld-freebsd11.0-ranlib ; \
+ fi ;
+ if [ ! -h /usr/local/bin/mips-portbld-freebsd11.0-strip ]; then \
+ ln -sf /usr/local/bin/mips-freebsd-strip /usr/local/bin/mips-portbld-freebsd11.0-strip ; \
+ fi
+
+.endif
+.if ${CC} == cc || ${CC} == clang
+CFLAGS+= --target=${CONFIGURE_TARGET}
+.endif
+
+PKG_ENV+= ABI_FILE=${SYSROOT}/usr/lib/crt1.o
+NM= ${CONFIGURE_TARGET}-gcc-nm
+LD= ${CONFIGURE_TARGET}-gcc-ld
+CCLD= ${CONFIGURE_TARGET}-gcc-ld
+AR= ${CONFIGURE_TARGET}-gcc-ar
+RANLIB= ${CONFIGURE_TARGET}-gcc-ranlib
+#STRIP= ${CONFIGURE_TARGET}-strip
+INCS= -I${SYSROOT}/usr/include
+CROSS_COMPILE= ${ARCH}-portbld-freebsd${OS_REL}
+CFLAGS+= --sysroot=${SYSROOT} ${CPU_ARGS} ${INCS} -O
+CXXFLAGS+= --sysroot=${SYSROOT} ${CPU_ARGS} ${INCS} -O
+LDFLAGS+= --sysroot=${SYSROOT}
+STRIPBIN= ${STRIP}
+PKG_CONFIG_SYSROOT_DIR= "${SYSROOT}"
+CONFIGURE_ENV+= PKG_CONFIG_SYSROOT_DIR="${SYSROOT}"
.endif
WRKDIR?= ${WRKDIRPREFIX}${.CURDIR}/work
@@ -1673,7 +1690,7 @@
.endif
.if !defined(PKG_DEPENDS) && !defined(CLEAN_FETCH_ENV)
-PKG_DEPENDS+= ${LOCALBASE}/sbin/pkg:${PORTSDIR}/${PKG_ORIGIN}
+PKG_DEPENDS+= ${SYSROOT}/${LOCALBASE}/sbin/pkg:${PORTSDIR}/${PKG_ORIGIN}
.endif
.if defined(USE_GCC)
@@ -1681,7 +1698,7 @@
.endif
.if defined(USE_BINUTILS) && !defined(DISABLE_BINUTILS)
-BUILD_DEPENDS+= ${LOCALBASE}/bin/as:${PORTSDIR}/devel/binutils
+BUILD_DEPENDS+= ${SYSROOT}/${LOCALBASE}/bin/as:${PORTSDIR}/devel/binutils
BINUTILS?= ADDR2LINE AR AS CPPFILT GPROF LD NM OBJCOPY OBJDUMP RANLIB \
READELF SIZE STRINGS
BINUTILS_NO_MAKE_ENV?=
@@ -1927,58 +1944,6 @@
.endif
.endif
-# Set the default for the installation of Postscript(TM)-
-# compatible functionality.
-.if !defined(USE_GHOSTSCRIPT)
-. if defined(USE_GHOSTSCRIPT_BUILD)
-_USE_GHOSTSCRIPT= ${USE_GHOSTSCRIPT_BUILD}
-. elif defined(USE_GHOSTSCRIPT_RUN)
-_USE_GHOSTSCRIPT= ${USE_GHOSTSCRIPT_RUN}
-. endif
-.else
-_USE_GHOSTSCRIPT= ${USE_GHOSTSCRIPT}
-.endif
-
-.if defined(WITH_GHOSTSCRIPT_VER) && !empty(WITH_GHOSTSCRIPT_VER:M[789])
-_USE_GHOSTSCRIPT_DEFAULT_VER= ${WITH_GHOSTSCRIPT_VER}
-.else
-_USE_GHOSTSCRIPT_DEFAULT_VER= 9
-.endif
-
-.if defined(_USE_GHOSTSCRIPT)
-. if !defined(WITHOUT_X11)
-_USE_GHOSTSCRIPT_PKGNAME_SUFFIX=
-. else
-_USE_GHOSTSCRIPT_PKGNAME_SUFFIX=-nox11
-. endif
-. if !empty(_USE_GHOSTSCRIPT:M[789])
-_USE_GHOSTSCRIPT_VER=${_USE_GHOSTSCRIPT:M[789]}
-. else
-_USE_GHOSTSCRIPT_VER=${_USE_GHOSTSCRIPT_DEFAULT_VER}
-. endif
-.else
-_USE_GHOSTSCRIPT_VER=${_USE_GHOSTSCRIPT_DEFAULT_VER}
-.endif
-
-# Sanity check
-.if defined(_USE_GHOSTSCRIPT) && defined(WITH_GHOSTSCRIPT_VER)
-. if empty(WITH_GHOSTSCRIPT_VER:M[789])
-. error You set an invalid value "${WITH_GHOSTSCRIPT_VER}" in WITH_GHOSTSCRIPT_VER. Abort.
-. elif ${_USE_GHOSTSCRIPT_VER} != ${WITH_GHOSTSCRIPT_VER}
-. error You set WITH_GHOSTSCRIPT_VER as ${WITH_GHOSTSCRIPT_VER} but ${PKGNAME} requires print/ghostscript${_USE_GHOSTSCRIPT_VER}. Abort.
-. endif
-.endif
-
-GHOSTSCRIPT_PORT?= print/ghostscript${_USE_GHOSTSCRIPT_VER}${_USE_GHOSTSCRIPT_PKGNAME_SUFFIX}
-
-# Set up the ghostscript dependencies.
-.if defined(USE_GHOSTSCRIPT) || defined(USE_GHOSTSCRIPT_BUILD)
-BUILD_DEPENDS+= gs:${PORTSDIR}/${GHOSTSCRIPT_PORT}
-.endif
-.if defined(USE_GHOSTSCRIPT) || defined(USE_GHOSTSCRIPT_RUN)
-RUN_DEPENDS+= gs:${PORTSDIR}/${GHOSTSCRIPT_PORT}
-.endif
-
# Macro for doing in-place file editing using regexps
REINPLACE_ARGS?= -i.bak
REINPLACE_CMD?= ${SED} ${REINPLACE_ARGS}
@@ -2183,6 +2148,9 @@
.endif
# where pkg_add records its dirty deeds.
PKG_DBDIR?= /var/db/pkg
+.if defined(TARGET_ARCH)
+PKG_DBDIR= ${SYSROOT}/var/db/pkg
+.endif
ALL_TARGET?= all
INSTALL_TARGET?= install
@@ -2621,8 +2589,16 @@
CONFIGURE_SCRIPT?= configure
CONFIGURE_CMD?= ./${CONFIGURE_SCRIPT}
-CONFIGURE_TARGET?= ${ARCH}-portbld-${OPSYS:tl}${OSREL}
-CONFIGURE_TARGET:= ${CONFIGURE_TARGET:S/--build=//}
+BUILD_ARCH!= ${UNAME} -p
+CONFIGURE_BUILD?= ${BUILD_ARCH}-portbld-${OPSYS:tl}${OSREL}
+CONFIGURE_BUILD:= ${CONFIGURE_BUILD:S/--build=//}
+#HOST_ARCH!= ${UNAME} -m
+CONFIGURE_HOST?= ${ARCH}-portbld-${OPSYS:tl}${OSREL}
+CONFIGURE_HOST:= ${CONFIGURE_HOST:S/--host=//}
+.if defined(TARGET_ARCH)
+CONFIGURE_TARGET?= ${ARCH}-portbld-${OPSYS:tl}${OSREL}
+CONFIGURE_TARGET:= ${CONFIGURE_TARGET:S/--target=//}
+.endif
CONFIGURE_LOG?= config.log
# A default message to print if do-configure fails.
@@ -2637,9 +2613,6 @@
GNU_CONFIGURE_MANPREFIX?= ${MANPREFIX}
CONFIG_SITE?= ${PORTSDIR}/Templates/config.site
CONFIGURE_ARGS+= --prefix=${GNU_CONFIGURE_PREFIX} $${_LATE_CONFIGURE_ARGS}
-.if defined(X_BUILD_FOR)
-CONFIGURE_ARGS+= --host=${X_BUILD_FOR}
-.endif
CONFIGURE_ENV+= CONFIG_SITE=${CONFIG_SITE} lt_cv_sys_max_cmd_len=${CONFIGURE_MAX_CMD_LEN}
HAS_CONFIGURE= yes
@@ -2656,7 +2629,7 @@
_LATE_CONFIGURE_ARGS="$${_LATE_CONFIGURE_ARGS} --infodir=${GNU_CONFIGURE_PREFIX}/${INFO_PATH}/${INFO_SUBDIR}" ; \
fi ; \
if [ -z "`./${CONFIGURE_SCRIPT} --version 2>&1 | ${EGREP} -i '(autoconf.*2\.13|Unrecognized option)'`" ]; then \
- _LATE_CONFIGURE_ARGS="$${_LATE_CONFIGURE_ARGS} --build=${CONFIGURE_TARGET}" ; \
+ _LATE_CONFIGURE_ARGS="$${_LATE_CONFIGURE_ARGS} --build=${CONFIGURE_BUILD} --host=${CONFIGURE_HOST} --target=${CONFIGURE_TARGET}" ; \
else \
_LATE_CONFIGURE_ARGS="$${_LATE_CONFIGURE_ARGS} ${CONFIGURE_TARGET}" ; \
fi ;
@@ -3570,7 +3543,7 @@
_INSTALL_PKG_ARGS+= -A
.endif
install-package:
- @if [ -f "${WRKDIR}/pkg/${PKGNAME}${PKG_SUFX}" ]; then \
+ @if [ -f "${WRKDIR}/pkg/${PKGNAME}${ARCH}${PKG_SUFX}" ]; then \
_pkgfile="${WRKDIR_PKGFILE}"; \
else \
_pkgfile="${PKGFILE}"; \
@@ -3583,6 +3556,9 @@
.if !target(check-already-installed)
.if !defined(NO_PKG_REGISTER) && !defined(FORCE_PKG_REGISTER)
+.if defined(TARGET_ARCH)
+PKG_BIN= ${LOCALBASE}/sbin/pkg-static
+.endif
check-already-installed:
@${ECHO_MSG} "===> Checking if ${PKGBASE} already installed"; \
pkgname=`${PKG_INFO} -q -O ${PKGBASE}`; \
@@ -4495,8 +4471,8 @@
RUN-DEPENDS-LIST= \
for dir in $$(${ECHO_CMD} "${_LIB_RUN_DEPENDS:C,.*:([^:]*).*,\1,}" | ${SED} -e 'y/ /\n/' | ${SORT} -u); do \
- if [ -d $$dir ]; then \
- ${ECHO_CMD} $$dir; \
+ if [ -d ${SYSROOT}/$$dir ]; then \
+ ${ECHO_CMD} ${SYSROOT}/$$dir; \
else \
${ECHO_MSG} "${PKGNAME}: \"$$dir\" non-existent -- dependency list incomplete" >&2; \
fi; \
@@ -4527,7 +4503,7 @@
fi; \
checked="${PARENT_CHECKED}"; \
for dir in ${_LIB_RUN_DEPENDS:C,[^:]*:([^:]*):?.*,\1,}; do \
- dir=$$(${REALPATH} $$dir); \
+ dir=$$(${SYSROOT}/${REALPATH} $$dir); \
if [ -d $$dir ]; then \
case $$checked in \
$$dir|$$dir\ *|*\ $$dir|*\ $$dir\ *) continue;; \
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?COL130-W22ADD618CE72B6BB71D922C4860>
