Skip site navigation (1)Skip section navigation (2)
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>