summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2014-06-15 17:40:34 +1200
committerChris Johns <chrisj@rtems.org>2014-06-15 17:40:34 +1200
commit0ffee1931680e92757a4d91199e2517f05e7364d (patch)
tree0a0447a40008a02e238bfa55ab0c7a413de4b47a
parentsb: Tighten the canadian cross compile detection. (diff)
downloadrtems-source-builder-0ffee1931680e92757a4d91199e2517f05e7364d.tar.bz2
sb: Add support for building RTEMS 3rd party packages.
Remove the 'opt' from various macros and shell variables. Add pkgconfig to the checks to make it clear the check is a pkgconfig check. Add NTP support as the first package to be built using the RSB. Split the RTEMS URL's out from the base bset file into a separate file that be included by other files. Add an RTEMS BSP configuration file to help abstract the process of building 3rd party packages. Clean the cross and canadian cross support up so we can cleanly support cross and canadian cross building. Refactor the pkgconfig support and clean up the PC file handling of loading modules. Add support for %{?..} to return false if a macro is %{nil}. Add %{pkgconfig ..} support to allow better control of access RTEMS pkgconfig files.
-rw-r--r--bare/config/devel/gettext-0.18.3.1-1.cfg2
-rw-r--r--bare/config/devel/glib-2.39.3-1.cfg2
-rw-r--r--bare/config/devel/libffi-3.0.13-1.cfg2
-rw-r--r--bare/config/devel/libiconv-1.14-1.cfg2
-rw-r--r--bare/config/devel/pixman-0.32.4-1.cfg2
-rw-r--r--bare/config/devel/texane-stlink-1.cfg2
-rw-r--r--rtems/config/4.11/net/ntp.bset20
-rw-r--r--rtems/config/net/ntp-4.2.6p5-1.cfg24
-rw-r--r--rtems/config/rtems-base.bset11
-rw-r--r--rtems/config/rtems-bsp.cfg55
-rw-r--r--rtems/config/rtems-urls.bset13
-rw-r--r--source-builder/config/autoconf-2-1.cfg2
-rw-r--r--source-builder/config/automake-1-1.cfg2
-rw-r--r--source-builder/config/gdb-6-1.cfg2
-rw-r--r--source-builder/config/gettext-0-1.cfg4
-rw-r--r--source-builder/config/libtool-2-1.cfg2
-rw-r--r--source-builder/config/libusb-1-1.cfg2
-rw-r--r--source-builder/config/m4-1-1.cfg2
-rw-r--r--source-builder/config/ntp-4-1.cfg62
-rw-r--r--source-builder/defaults.mc73
-rwxr-xr-xsource-builder/pkg-config51
-rw-r--r--source-builder/sb/config.py201
-rw-r--r--source-builder/sb/freebsd.py4
-rwxr-xr-xsource-builder/sb/pkgconfig.py65
24 files changed, 442 insertions, 165 deletions
diff --git a/bare/config/devel/gettext-0.18.3.1-1.cfg b/bare/config/devel/gettext-0.18.3.1-1.cfg
index debdb0a..42a6e74 100644
--- a/bare/config/devel/gettext-0.18.3.1-1.cfg
+++ b/bare/config/devel/gettext-0.18.3.1-1.cfg
@@ -13,6 +13,6 @@
#
# The GetText build instructions. We use 0.x.x Release 1.
#
-%ifn %{check gettext}
+%ifn %{pkgconfig check gettext}
%include %{_configdir}/gettext-0-1.cfg
%endif
diff --git a/bare/config/devel/glib-2.39.3-1.cfg b/bare/config/devel/glib-2.39.3-1.cfg
index 8812343..405e511 100644
--- a/bare/config/devel/glib-2.39.3-1.cfg
+++ b/bare/config/devel/glib-2.39.3-1.cfg
@@ -15,6 +15,6 @@
#
# The GLib build instructions. We use 2.x.x Release 1.
#
-%ifn %{check glib-2.0}
+%ifn %{pkgconfig check glib-2.0}
%include %{_configdir}/glib-2-1.cfg
%endif
diff --git a/bare/config/devel/libffi-3.0.13-1.cfg b/bare/config/devel/libffi-3.0.13-1.cfg
index f609003..acb145d 100644
--- a/bare/config/devel/libffi-3.0.13-1.cfg
+++ b/bare/config/devel/libffi-3.0.13-1.cfg
@@ -24,6 +24,6 @@
#
# The LibFFI build instructions. We use 3.x.x Release 1.
#
-%ifn %{check libffi >= 3}
+%ifn %{pkgconfig check libffi >= 3}
%include %{_configdir}/libffi-3-1.cfg
%endif
diff --git a/bare/config/devel/libiconv-1.14-1.cfg b/bare/config/devel/libiconv-1.14-1.cfg
index 4943fe0..fb064c8 100644
--- a/bare/config/devel/libiconv-1.14-1.cfg
+++ b/bare/config/devel/libiconv-1.14-1.cfg
@@ -14,7 +14,7 @@
# The Libiconv build instructions. We use 0.x.x Release 1.
#
%if %{_host_os} == win32
- %ifn %{check iconv >= %{libiconv_version}}
+ %ifn %{pkgconfig check iconv >= %{libiconv_version}}
%include %{_configdir}/libiconv-1-1.cfg
%endif
%endif
diff --git a/bare/config/devel/pixman-0.32.4-1.cfg b/bare/config/devel/pixman-0.32.4-1.cfg
index ec7d4c9..de0d8e4 100644
--- a/bare/config/devel/pixman-0.32.4-1.cfg
+++ b/bare/config/devel/pixman-0.32.4-1.cfg
@@ -13,6 +13,6 @@
#
# The Pixman build instructions. We use 0.x.x Release 1.
#
-%ifn %{check pixman-1}
+%ifn %{pkgconfig check pixman-1}
%include %{_configdir}/pixman-0-1.cfg
%endif
diff --git a/bare/config/devel/texane-stlink-1.cfg b/bare/config/devel/texane-stlink-1.cfg
index e071789..2f102cc 100644
--- a/bare/config/devel/texane-stlink-1.cfg
+++ b/bare/config/devel/texane-stlink-1.cfg
@@ -45,7 +45,7 @@ BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
CFLAGS_FOR_BUILD="-g -O2 -Wall" \
%endif
CPPFLAGS="-I $SB_TMPPREFIX/include/libusb-1.0" \
- CFLAGS="$SB_OPT_FLAGS" \
+ CFLAGS="$SB_CFLAGS" \
LDFLAGS="-L $SB_TMPPREFIX/lib" \
./configure \
--build=%{_build} --host=%{_host} \
diff --git a/rtems/config/4.11/net/ntp.bset b/rtems/config/4.11/net/ntp.bset
new file mode 100644
index 0000000..c0a7568
--- /dev/null
+++ b/rtems/config/4.11/net/ntp.bset
@@ -0,0 +1,20 @@
+#
+# Build set for NTP
+#
+
+%define release 1
+
+#
+# RTEMS Version
+#
+%define rtems_version 4.11
+
+#
+# The RTEMS URL paths.
+#
+%include rtems-urls.bset
+
+#
+# Build NTP.
+#
+net/ntp-4.2.6p5-1
diff --git a/rtems/config/net/ntp-4.2.6p5-1.cfg b/rtems/config/net/ntp-4.2.6p5-1.cfg
new file mode 100644
index 0000000..8cf02be
--- /dev/null
+++ b/rtems/config/net/ntp-4.2.6p5-1.cfg
@@ -0,0 +1,24 @@
+#
+# NTP 4.2.6p5
+#
+
+%if %{release} == %{nil}
+ %define release 1
+%endif
+
+%include %{_configdir}/rtems-bsp.cfg
+
+#
+# NTP Version
+#
+%define ntp_version 4.2.6p5
+
+#
+# Patch for RTEMS support.
+#
+%patch add ntp %{rtems_git_tools}/ntp/rtems-ntp-4.2.6p5.diff
+
+#
+# NTP Build configuration
+#
+%include %{_configdir}/ntp-4-1.cfg
diff --git a/rtems/config/rtems-base.bset b/rtems/config/rtems-base.bset
index 211635e..704d66f 100644
--- a/rtems/config/rtems-base.bset
+++ b/rtems/config/rtems-base.bset
@@ -18,11 +18,6 @@ package: rtems-%{rtems_version}-%{_target}-%{release}
%define gcc_version_message RTEMS %{rtems_version}-RSB-%{_sbgit_id}-%{release},gcc-%{gcc_version}/newlib-%{newlib_version}
#
-# The RTEMS http git URL.
-#
-%define rtems_http_git http://git.rtems.org
-%define rtems_git_tools %{rtems_http_git}/rtems-tools/plain/tools/%{rtems_version}
-%define rtems_binutils_patches %{rtems_git_tools}/binutils
-%define rtems_gcc_patches %{rtems_git_tools}/gcc
-%define rtems_newlib_patches %{rtems_git_tools}/newlib
-%define rtems_gdb_patches %{rtems_git_tools}/gdb
+# Pick up the RTEMS URLs.
+#
+%include rtems-urls.bset
diff --git a/rtems/config/rtems-bsp.cfg b/rtems/config/rtems-bsp.cfg
new file mode 100644
index 0000000..dd34b0a
--- /dev/null
+++ b/rtems/config/rtems-bsp.cfg
@@ -0,0 +1,55 @@
+#
+# RTEMS BSP Support
+#
+
+#
+# The RTEMS BSP support requires the host turple, the RTEMS BSP
+# and the path to the tools. The prefix is set to an installed
+# RTEMS. The built package is installed into the prefix.
+#
+# Keeping the package's installed path in the RTEMS install path
+# and separate to the tools lets the tools version vary
+# independently.
+#
+
+%if %{_host} == %{nil}
+ %error No RTEMS target specified: --host=host
+%endif
+
+%ifn %{defined with_rtems_bsp}
+ %error No RTEMS BSP specified: --with-rtems-bsp=bsp
+%endif
+
+%ifn %{defined with_tools}
+ %error No RTEMS tools specified: --with-tools=path
+%endif
+
+#
+# Set the path to the tools.
+#
+%{path prepend %{with_tools}/bin}
+
+#
+# Set up how we manage pkgconfig. Set the prefix path to the RTEMS prefix,
+# enable support when crosscompiling, and filter specific optimisation and
+# warning from the flags that RTEMS exports.
+#
+%{pkgconfig prefix %{_prefix}/lib/pkgconfig}
+%{pkgconfig crosscompile yes}
+%{pkgconfig filter-flags yes}
+
+#
+# The RTEMS BSP Flags
+#
+%define rtems_bsp %{with_rtems_bsp}
+%define rtems_bsp_ccflags %{pkgconfig ccflags %{_host}-%{rtems_bsp}}
+%define rtems_bsp_cflags %{pkgconfig cflags %{_host}-%{rtems_bsp}}
+%define rtems_bsp_ldflags %{pkgconfig ldflags %{_host}-%{rtems_bsp}}
+%define rtems_bsp_libs %{pkgconfig libs %{_host}-%{rtems_bsp}}
+
+#
+# Map to names used for cross compiling.
+#
+%define host_cflags %{rtems_bsp_cflags}
+%define host_ldflags %{rtems_bsp_ldflags}
+%define host_libs %{rtems_bsp_libs}
diff --git a/rtems/config/rtems-urls.bset b/rtems/config/rtems-urls.bset
new file mode 100644
index 0000000..42336b7
--- /dev/null
+++ b/rtems/config/rtems-urls.bset
@@ -0,0 +1,13 @@
+#
+# The URLs for RTEMS
+#
+
+#
+# The RTEMS http git URL.
+#
+%define rtems_http_git http://git.rtems.org
+%define rtems_git_tools %{rtems_http_git}/rtems-tools/plain/tools/%{rtems_version}
+%define rtems_binutils_patches %{rtems_git_tools}/binutils
+%define rtems_gcc_patches %{rtems_git_tools}/gcc
+%define rtems_newlib_patches %{rtems_git_tools}/newlib
+%define rtems_gdb_patches %{rtems_git_tools}/gdb
diff --git a/source-builder/config/autoconf-2-1.cfg b/source-builder/config/autoconf-2-1.cfg
index c08d062..5061cfd 100644
--- a/source-builder/config/autoconf-2-1.cfg
+++ b/source-builder/config/autoconf-2-1.cfg
@@ -54,7 +54,7 @@ BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
fi
export CFLAGS CFLAGS_FOR_BUILD CC
- CFLAGS="$SB_OPT_FLAGS" \
+ CFLAGS="$SB_CFLAGS" \
./configure \
--build=%{_build} --host=%{_host} \
--verbose --disable-nls \
diff --git a/source-builder/config/automake-1-1.cfg b/source-builder/config/automake-1-1.cfg
index d97c949..6f45928 100644
--- a/source-builder/config/automake-1-1.cfg
+++ b/source-builder/config/automake-1-1.cfg
@@ -54,7 +54,7 @@ BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
fi
export CFLAGS CFLAGS_FOR_BUILD CC
- CFLAGS="$SB_OPT_FLAGS" \
+ CFLAGS="$SB_CFLAGS" \
./configure \
--build=%{_build} --host=%{_host} \
--verbose \
diff --git a/source-builder/config/gdb-6-1.cfg b/source-builder/config/gdb-6-1.cfg
index db76ca3..ae1f877 100644
--- a/source-builder/config/gdb-6-1.cfg
+++ b/source-builder/config/gdb-6-1.cfg
@@ -34,7 +34,7 @@ BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
%if "%{_build}" != "%{_host}"
CFLAGS_FOR_BUILD="-g -O2 -Wall" \
%endif
- CFLAGS="$SB_OPT_FLAGS" \
+ CFLAGS="$SB_CFLAGS" \
../gdb-%{gdb_version}/configure \
--build=%{_build} --host=%{_host} \
--target=%{_target} \
diff --git a/source-builder/config/gettext-0-1.cfg b/source-builder/config/gettext-0-1.cfg
index 67d978d..7758d7b 100644
--- a/source-builder/config/gettext-0-1.cfg
+++ b/source-builder/config/gettext-0-1.cfg
@@ -24,8 +24,8 @@ BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
#
# Fix the mess iconv is on FreeBSD 10.0.
#
-%if %{defined iconv_optincludes}
- %define optincludes %{iconv_optincludes}
+%if %{defined iconv_includes}
+ %define includes %{iconv_includes}
%endif
#
diff --git a/source-builder/config/libtool-2-1.cfg b/source-builder/config/libtool-2-1.cfg
index 9b5a236..0d1f972 100644
--- a/source-builder/config/libtool-2-1.cfg
+++ b/source-builder/config/libtool-2-1.cfg
@@ -54,7 +54,7 @@ BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
fi
export CFLAGS CFLAGS_FOR_BUILD CC
- CFLAGS="$SB_OPT_FLAGS" \
+ CFLAGS="$SB_CFLAGS" \
./configure \
--build=%{_build} --host=%{_host} \
--verbose --disable-nls \
diff --git a/source-builder/config/libusb-1-1.cfg b/source-builder/config/libusb-1-1.cfg
index 4e961ca..271d5e0 100644
--- a/source-builder/config/libusb-1-1.cfg
+++ b/source-builder/config/libusb-1-1.cfg
@@ -36,7 +36,7 @@ BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
%if "%{_build}" != "%{_host}"
CFLAGS_FOR_BUILD="-g -O2 -Wall" \
%endif
- CFLAGS="$SB_OPT_FLAGS" \
+ CFLAGS="$SB_CFLAGS" \
./configure \
--build=%{_build} --host=%{_host} \
--verbose --disable-nls \
diff --git a/source-builder/config/m4-1-1.cfg b/source-builder/config/m4-1-1.cfg
index 3aae1f4..c77e4a3 100644
--- a/source-builder/config/m4-1-1.cfg
+++ b/source-builder/config/m4-1-1.cfg
@@ -35,7 +35,7 @@ BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
%if "%{_build}" != "%{_host}"
CFLAGS_FOR_BUILD="-g -O2 -Wall" \
%endif
- CFLAGS="$SB_OPT_FLAGS" \
+ CFLAGS="$SB_CxsFLAGS" \
./configure \
--build=%{_build} --host=%{_host} \
--verbose --disable-nls \
diff --git a/source-builder/config/ntp-4-1.cfg b/source-builder/config/ntp-4-1.cfg
new file mode 100644
index 0000000..5347e83
--- /dev/null
+++ b/source-builder/config/ntp-4-1.cfg
@@ -0,0 +1,62 @@
+#
+# NTP 4.x.x Version 1.
+#
+# This configuration file configure's, make's and install's NTP.
+#
+
+%if %{release} == %{nil}
+%define release 1
+%endif
+
+Name: ntp-%{ntp_version}-%{_host}-%{release}
+Summary: NTP is the Network Time Protocol.
+Version: %{ntp_version}
+Release: %{release}
+URL: http://www.ntp.org/
+BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
+
+#
+# NTP Source
+#
+%source set ntp http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{ntp_version}.tar.gz
+
+#
+# Prepare the source code.
+#
+%prep
+ build_top=$(pwd)
+
+ source_dir_ntp="ntp-%{ntp_version}"
+ %source setup ntp -q -n ntp-%{ntp_version}
+ %patch setup ntp -p1
+
+ cd ${build_top}
+
+%build
+ build_top=$(pwd)
+
+ %{build_directory}
+
+ mkdir -p ${build_dir}
+ cd ${build_dir}
+
+ %{host_build_flags}
+
+ ../${source_dir_ntp}/configure \
+ --host=%{_host} \
+ --prefix=%{_prefix} \
+ --disable-ipv6 \
+ --disable-HOPFPCI
+
+ %{__make} %{?_smp_mflags} all
+
+ cd ${build_top}
+
+%install
+ build_top=$(pwd)
+
+ %{__rmdir} $SB_BUILD_ROOT
+
+ cd ${build_dir}
+ %{__make} DESTDIR=$SB_BUILD_ROOT install
+ cd ${build_top}
diff --git a/source-builder/defaults.mc b/source-builder/defaults.mc
index bea51a6..965ebf1 100644
--- a/source-builder/defaults.mc
+++ b/source-builder/defaults.mc
@@ -56,10 +56,10 @@ _uid: none, convert, '%(%{__id_u} -n)'
# Default flags that can be overridded to supply specific host or build
# flags and include paths to the tools. The host is the final platform
# the tools will run on and build is the host building the tools.
-optflags_host: none, convert, '-O2 -pipe'
-optincludes_host: none, convert, ''
-optflags_build: none, convert, '-O2 -pipe'
-optincludes_build: none, convert, ''
+host_cflags: none, convert, '-O2 -pipe'
+host_includes: none, convert, ''
+build_cflags: none, convert, '-O2 -pipe'
+build_includes: none, convert, ''
# Extra path a platform can override.
_extra_path: none, none, '%{_sbdir}'
@@ -67,6 +67,8 @@ _ld_library_path: none, none, 'LD_LIBRARY_PATH'
# Paths
_host_platform: none, none, '%{_host_cpu}-%{_host_vendor}-%{_host_os}%{?_gnu}'
+_host_cc: none, none, 'gcc'
+_host_cxx: none, none, 'g++'
_arch: none, none, '%{_host_arch}'
_topdir: dir, required, '%{_cwd}'
_configdir: dir, optional, '%{_topdir}/config:%{_sbdir}/config:%{_sbtop}/bare/config'
@@ -102,6 +104,8 @@ _infodir: dir, none, '%{_datarootdir}/info'
_localedir: dir, none, '%{_datarootdir}/locale'
_localedir: dir, none, '%{_datadir}/locale'
_localstatedir: dir, none, '%{_prefix}/var'
+_pathprepend: none, none, ''
+_pathpostpend: none, none, ''
_prefix: dir, none, '%{_usr}'
_usr: dir, none, '/usr/local'
_usrsrc: dir, none, '%{_usr}/src'
@@ -184,15 +188,15 @@ export SB_ORIG_PATH=${PATH}
SB_SOURCE_DIR="%{_sourcedir}"
SB_BUILD_DIR="%{_builddir}"
# host == build, use build; host != build , host uses host and build uses build
-SB_OPT_HOST_CFLAGS="%{optflags_host} %{optincludes_host}"
-SB_OPT_HOST_LDFLAGS="%{?_tmproot:-L%{_tmproot}/${SB_PREFIX_CLEAN}/lib}"
-SB_OPT_BUILD_CFLAGS="%{optflags_build} %{?_tmproot:-I%{_tmproot}/${SB_PREFIX_CLEAN}/include}"
-SB_OPT_BUILD_LDFLAGS="%{?_tmproot:-L%{_tmproot}/${SB_PREFIX_CLEAN}/lib}"
-SB_OPT_CFLAGS="${SB_OPT_BUILD_CFLAGS} %{optincludes_build}"
+SB_HOST_CFLAGS="%{host_cflags} %{host_includes}"
+SB_HOST_LDFLAGS="%{?host_ldflags:%{host_ldflags}}%{?_tmproot:-L%{_tmproot}/${SB_PREFIX_CLEAN}/lib}"
+SB_BUILD_CFLAGS="%{build_cflags} %{?_tmproot:-I%{_tmproot}/${SB_PREFIX_CLEAN}/include}"
+SB_BUILD_LDFLAGS="%{?build_ldflags:%{build_ldflags}}%{?_tmproot:-L%{_tmproot}/${SB_PREFIX_CLEAN}/lib}"
+SB_CFLAGS="${SB_BUILD_CFLAGS} %{build_includes}"
SB_ARCH="%{_arch}"
SB_OS="%{_os}"
export SB_SOURCE_DIR SB_BUILD_DIR SB_ARCH SB_OS
-export SB_OPT_HOST_CFLAGS SB_OPT_HOST_LDFLAGS SB_OPT_BUILD_CFLAGS SB_OPT_BUILD_LDFLAGS SB_OPT_CFLAGS
+export SB_HOST_CFLAGS SB_HOST_LDFLAGS SB_BUILD_CFLAGS SB_BUILD_LDFLAGS SB_CFLAGS
# Documentation
SB_DOC_DIR="%{_docdir}"
export SB_DOC_DIR
@@ -237,6 +241,8 @@ fi
if test -n "${SB_EXTRAPATH}" ; then
PATH="${SB_EXTRAPATH}:$PATH"
fi
+%{?_pathprepend:PATH="%{_pathprepend}:$PATH"}
+%{?_pathpostpend:PATH="$PATH:%{_pathpostpend}"}
export PATH
# Default environment set up.
LANG=C
@@ -253,9 +259,9 @@ ___build_template: none, none, '''#!%{___build_shell}
# Configure command
configure: none, none, '''
-CFLAGS="${CFLAGS:-${SB_OPT_CFLAGS}" ; export CFLAGS ;
-CXXFLAGS="${CXXFLAGS:-${SB_OPT_CFLAGS}}" ; export CXXFLAGS ;
-FFLAGS="${FFLAGS:-${SB_OPT_CFLAGS}}" ; export FFLAGS ;
+CFLAGS="${CFLAGS:-${SB_CFLAGS}" ; export CFLAGS ;
+CXXFLAGS="${CXXFLAGS:-${SB_CFLAGS}}" ; export CXXFLAGS ;
+FFLAGS="${FFLAGS:-${SB_CFLAGS}}" ; export FFLAGS ;
./configure --build=%{_build} --host=%{_host} \
--target=%{_target_platform} \
--program-prefix=%{?_program_prefix} \
@@ -276,30 +282,35 @@ FFLAGS="${FFLAGS:-${SB_OPT_CFLAGS}}" ; export FFLAGS ;
# Build script support.
build_directory: none, none, '''
if test "%{_build}" != "%{_host}" ; then
- build_dir="build-cxc"
+ if test -z "%{_target}" ; then
+ build_dir="build-xc"
+ else
+ build_dir="build-cxc"
+ fi
else
build_dir="build"
fi'''
# Host/build flags.
host_build_flags: none, none, '''
-# Host and build flags, Cxc build if host and build are different.
+# Host and build flags, Cross build if host and build are different and
+# Cxc build idf target is deifned and also different.
# Note, gcc is not ready to be compiled with -std=gnu99 (this needs to be checked).
if test "%{_build}" != "%{_host}" ; then
- # Canadian cross build
- CC=$(echo "%{_host}-gcc ${SB_OPT_HOST_CFLAGS} ${SB_OPT_HOST_LDFLAGS}" | sed -e 's,-std=gnu99 ,,')
- CXX=$(echo "%{_host}-g++ ${SB_OPT_HOST_CFLAGS} ${SB_OPT_HOST_LDFLAGS}" | sed -e 's,-std=gnu99 ,,')
- CFLAGS="${SB_OPT_HOST_CFLAGS}"
- LDFLAGS="${SB_OPT_HOST_LDFLAGS}"
- CFLAGS_FOR_BUILD="${SB_OPT_BUILD_CFLAGS}"
- LDFLAGS_FOR_BUILD="${SB_OPT_BUILD_LDFLAGS}"
- CXXFLAGS_FOR_BUILD="${SB_OPT_BUILD_CFLAGS}"
- CC_FOR_BUILD=$(echo "%{__cc} ${SB_OPT_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
- CXX_FOR_BUILD=$(echo "%{__cxx} ${SB_OPT_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
+ # Cross build
+ CC=$(echo "%{_host}-%{_host_cc}" | sed -e 's,-std=gnu99 ,,')
+ CXX=$(echo "%{_host}-%{_host_cxx}" | sed -e 's,-std=gnu99 ,,')
+ CFLAGS="${SB_HOST_CFLAGS}"
+ LDFLAGS="${SB_HOST_LDFLAGS}"
+ CFLAGS_FOR_BUILD="${SB_BUILD_CFLAGS}"
+ LDFLAGS_FOR_BUILD="${SB_BUILD_LDFLAGS}"
+ CXXFLAGS_FOR_BUILD="${SB_BUILD_CFLAGS}"
+ CC_FOR_BUILD=$(echo "%{__cc} ${SB_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
+ CXX_FOR_BUILD=$(echo "%{__cxx} ${SB_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
else
- LDFLAGS="${SB_OPT_BUILD_LDFLAGS}"
- CC=$(echo "%{__cc} ${SB_OPT_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
- CXX=$(echo "%{__cxx} ${SB_OPT_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
+ LDFLAGS="${SB_BUILD_LDFLAGS}"
+ CC=$(echo "%{__cc} ${SB_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
+ CXX=$(echo "%{__cxx} ${SB_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
CC_FOR_BUILD=${CC}
CXX_FOR_BUILD=${CXX}
fi
@@ -309,9 +320,9 @@ export CC CXX CC_FOR_BUILD CXX_FOR_BUILD CFLAGS CFLAGS_FOR_BUILD CXXFLAGS_FOR_BU
build_build_flags: none, none, '''
# Build and build flags means force build == host
# gcc is not ready to be compiled with -std=gnu99
-LDFLAGS="${SB_OPT_HOST_LDFLAGS}"
-CC=$(echo "%{__cc} ${SB_OPT_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
-CXX=$(echo "%{__cxx} ${SB_OPT_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
+LDFLAGS="${SB_HOST_LDFLAGS}"
+CC=$(echo "%{__cc} ${SB_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
+CXX=$(echo "%{__cxx} ${SB_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
CC_FOR_BUILD=${CC}
CXX_FOR_BUILD=${CXX}
export CC CXX CC_FOR_BUILD CXX_FOR_BUILD CFLAGS LDFLAGS'''
diff --git a/source-builder/pkg-config b/source-builder/pkg-config
index 21c63d7..a10dc9b 100755
--- a/source-builder/pkg-config
+++ b/source-builder/pkg-config
@@ -58,13 +58,18 @@ trace = True
trace_stdout = False
logfile = 'pkg-config.log'
out = None
+srcfd = None
#
# Write all the package source parsed to a single file.
#
trace_src = True
if trace_src:
- src = open('pkg-src.txt', 'w')
+ srcfd = open('pkg-src.txt', 'w')
+
+def src(text):
+ if srcfd:
+ srcfs.writelines(text)
def log(s, lf = True):
global trace, logfile, out
@@ -83,48 +88,6 @@ def log(s, lf = True):
print s,
print >> out, s,
-def _check_package(libraries, args):
- ec = 1
- pkg = None
- flags = { 'cflags': '',
- 'libs': '' }
- log('libraries: %s' % (libraries))
- libs = pkgconfig.package.splitter(libraries)
- for lib in libs:
- log('pkg: %s' % (lib))
- pkg = pkgconfig.package(lib[0], prefix = args.prefix, output = log, src = src)
- if args.dump:
- log(pkg)
- if pkg.exists():
- if len(lib) == 1:
- if args.exact_version:
- if pkg.check('=', args.exact_version):
- ec = 0
- elif args.atleast_version:
- if pkg.check('>=', args.atleast_version):
- ec = 0
- elif args.max_version:
- if pkg.check('<=', args.max_version):
- ec = 0
- else:
- ec = 0
- else:
- if len(lib) != 3:
- raise error('invalid package check: %s' % (' '.join(lib)))
- if pkg.check(lib[1], lib[2]):
- ec = 0
- if ec == 0:
- cflags = pkg.get('cflags')
- if cflags:
- flags['cflags'] += cflags
- libs = pkg.get('libs', private = False)
- if libs:
- flags['libs'] += libs
- break
- if ec > 0:
- break
- return ec, pkg, flags
-
def run(argv):
class version_action(argparse.Action):
@@ -224,7 +187,7 @@ def run(argv):
if args.atleast_pkgconfig_version:
ec = 0
else:
- ec, pkg, flags = _check_package(args.libraries, args)
+ ec, pkg, flags = pkgconfig.check_package(args.libraries, args, log, src)
if ec == 0:
if args.cflags:
if len(flags['cflags']):
diff --git a/source-builder/sb/config.py b/source-builder/sb/config.py
index 9a70155..c139ea2 100644
--- a/source-builder/sb/config.py
+++ b/source-builder/sb/config.py
@@ -55,6 +55,13 @@ def _check_bool(value):
istrue = None
return istrue
+def _check_nil(value):
+ if len(value):
+ istrue = True
+ else:
+ istrue = False
+ return istrue
+
class package:
def __init__(self, name, arch, config):
@@ -242,10 +249,21 @@ class file:
self.sf = re.compile(r'%\([^\)]+\)')
for arg in self.opts.args:
if arg.startswith('--with-') or arg.startswith('--without-'):
- label = arg[2:].lower().replace('-', '_')
- self.macros.define(label)
+ if '=' in arg:
+ label, value = arg.split('=', 1)
+ else:
+ label = arg
+ value = None
+ label = label[2:].lower().replace('-', '_')
+ if value:
+ self.macros.define(label, value)
+ else:
+ self.macros.define(label)
self._includes = []
self.load_depth = 0
+ self.pkgconfig_prefix = None
+ self.pkgconfig_crosscompile = False
+ self.pkgconfig_filter_flags = False
self.load(name)
def __str__(self):
@@ -383,37 +401,97 @@ class file:
def _pkgconfig_check(self, test):
ok = False
- if not self._cross_compile():
- ts = test.split()
- pkg = pkgconfig.package(ts[0], output = log.output)
- if len(ts) != 1 and len(ts) != 3:
- self._error('malformed check')
- else:
- op = '>='
- ver = '0'
- if len(ts) == 3:
- op = ts[1]
- ver = self.macros.expand(ts[2])
- try:
+ if type(test) == str:
+ test = test.split()
+ if not self._cross_compile() or self.pkgconfig_crosscompile:
+ try:
+ pkg = pkgconfig.package(test[0],
+ prefix = self.pkgconfig_prefix,
+ output = self._output,
+ src = log.trace)
+ if len(test) != 1 and len(test) != 3:
+ self._error('malformed check: %s' % (' '.join(test)))
+ else:
+ op = '>='
+ ver = '0'
+ if len(test) == 3:
+ op = test[1]
+ ver = self.macros.expand(test[2])
ok = pkg.check(op, ver)
- except pkgconfig.error, pe:
- self._error('check: %s' % (pe))
- except:
- raise error.interal('pkgconfig failure')
- return ok
+ except pkgconfig.error, pe:
+ self._error('pkgconfig: check: %s' % (pe))
+ except:
+ raise error.internal('pkgconfig failure')
+ if ok:
+ return '1'
+ return '0'
def _pkgconfig_flags(self, package, flags):
pkg_flags = None
- if not self._cross_compile():
- pkg = pkgconfig.package(package, output = log.output)
+ if not self._cross_compile() or self.pkgconfig_crosscompile:
try:
+ pkg = pkgconfig.package(package,
+ prefix = self.pkgconfig_prefix,
+ output = self._output,
+ src = log.trace)
pkg_flags = pkg.get(flags)
+ if pkg_flags and self.pkgconfig_filter_flags:
+ fflags = []
+ for f in pkg_flags.split():
+ if not f.startswith('-f') and not f.startswith('-W'):
+ fflags += [f]
+ pkg_flags = ' '.join(fflags)
+ log.trace('pkgconfig: %s: %s' % (flags, pkg_flags))
except pkgconfig.error, pe:
- self._error('flags:%s: %s' % (flags, pe))
+ self._error('pkgconfig: %s: %s' % (flags, pe))
except:
- raise error.interal('pkgconfig failure')
+ raise error.internal('pkgconfig failure')
+ if pkg_flags is None:
+ pkg_flags = ''
return pkg_flags
+ def _pkgconfig(self, pcl):
+ ok = False
+ ps = ''
+ if pcl[0] == 'check':
+ ps = self._pkgconfig_check(pcl[1:])
+ elif pcl[0] == 'prefix':
+ if len(pcl) == 2:
+ self.pkgconfig_prefix = pcl[1]
+ else:
+ self._error('prefix error: %s' % (' '.join(pcl)))
+ elif pcl[0] == 'crosscompile':
+ ok = True
+ if len(pcl) == 2:
+ if pcl[1].lower() == 'yes':
+ self.pkgconfig_crosscompile = True
+ elif pcl[1].lower() == 'no':
+ self.pkgconfig_crosscompile = False
+ else:
+ ok = False
+ else:
+ ok = False
+ if not ok:
+ self._error('crosscompile error: %s' % (' '.join(pcl)))
+ elif pcl[0] == 'filter-flags':
+ ok = True
+ if len(pcl) == 2:
+ if pcl[1].lower() == 'yes':
+ self.pkgconfig_filter_flags = True
+ elif pcl[1].lower() == 'no':
+ self.pkgconfig_filter_flags = False
+ else:
+ ok = False
+ else:
+ ok = False
+ if not ok:
+ self._error('crosscompile error: %s' % (' '.join(pcl)))
+ elif pcl[0] in ['ccflags', 'cflags', 'ldflags', 'libs']:
+ ps = self._pkgconfig_flags(pcl[1], pcl[0])
+ else:
+ self._error('pkgconfig error: %s' % (' '.join(pcl)))
+ return ps
+
def _expand(self, s):
expand_count = 0
expanded = True
@@ -464,7 +542,7 @@ class file:
mn = None
else:
e = self._expand(m[6:-1].strip())
- log.output('%s' % (self._name_line_msg(e)))
+ log.notice('%s' % (self._name_line_msg(e)))
s = ''
expanded = True
mn = None
@@ -476,44 +554,45 @@ class file:
s = s.replace(m, '0')
expanded = True
mn = None
- elif m.startswith('%{check'):
- if self._pkgconfig_check(m[7:-1].strip()):
- s = s.replace(m, '1')
- else:
- s = s.replace(m, '0')
- expanded = True
- mn = None
- elif m.startswith('%{ccflags'):
- flags = self._pkgconfig_flags(m[9:-1].strip(), 'ccflags')
- if flags:
- s = s.replace(m, flags)
- else:
- self._error('ccflags error: %s' % (m[9:-1].strip()))
- expanded = True
- mn = None
- elif m.startswith('%{cflags'):
- flags = self._pkgconfig_flags(m[8:-1].strip(), 'cflags')
- if flags:
- s = s.replace(m, flags)
- else:
- self._error('cflags error: %s' % (m[8:-1].strip()))
- expanded = True
- mn = None
- elif m.startswith('%{ldflags'):
- flags = self._pkgconfig_flags(m[9:-1].strip(), 'ldflags')
- if flags:
- s = s.replace(m, flags)
+ elif m.startswith('%{path '):
+ pl = m[7:-1].strip().split()
+ ok = False
+ if len(pl) == 2:
+ ok = True
+ epl = []
+ for p in pl[1:]:
+ epl += [self._expand(p)]
+ p = ' '.join(epl)
+ if pl[0].lower() == 'prepend':
+ if len(self.macros['_pathprepend']):
+ self.macros['_pathprepend'] = \
+ '%s:%s' % (p, self.macros['_pathprepend'])
+ else:
+ self.macros['_pathprepend'] = p
+ elif pl[0].lower() == 'postpend':
+ if len(self.macros['_pathprepend']):
+ self.macros['_pathprepend'] = \
+ '%s:%s' % (self.macros['_pathprepend'], p)
+ else:
+ self.macros['_pathprepend'] = p
+ else:
+ ok = False
+ if ok:
+ s = s.replace(m, '')
else:
- self._error('ldflags error: %s' % (m[9:-1].strip()))
- expanded = True
+ self._error('path error: %s' % (' '.join(pl)))
mn = None
- elif m.startswith('%{libs'):
- flags = self._pkgconfig_flags(m[6:-1].strip(), 'libs')
- if flags:
- s = s.replace(m, flags)
+ elif m.startswith('%{pkgconfig '):
+ pcl = m[11:-1].strip().split()
+ if len(pcl):
+ epcl = []
+ for pc in pcl:
+ epcl += [self._expand(pc)]
+ ps = self._pkgconfig(epcl)
+ s = s.replace(m, ps)
+ expanded = True
else:
- self._error('libs error: %s' % (m[6:-1].strip()))
- expanded = True
+ self._error('pkgconfig error: %s' % (m[11:-1].strip()))
mn = None
elif m.startswith('%{?') or m.startswith('%{!?'):
if m[2] == '!':
@@ -533,10 +612,10 @@ class file:
if m.startswith('%{?'):
istrue = False
if mn in self.macros:
- # If defined and 0 then it is false.
+ # If defined and 0 or '' then it is false.
istrue = _check_bool(self.macros[mn])
if istrue is None:
- istrue = True
+ istrue = _check_nil(self.macros[mn])
if colon >= 0 and istrue:
s = s.replace(m, m[start + colon + 1:-1])
expanded = True
diff --git a/source-builder/sb/freebsd.py b/source-builder/sb/freebsd.py
index 7108791..626a2a8 100644
--- a/source-builder/sb/freebsd.py
+++ b/source-builder/sb/freebsd.py
@@ -96,14 +96,14 @@ def load():
cxx = '/usr/bin/clang++'
if check.check_exe(cxx, cxx):
raise error.general('no valid c++ not found')
- defines['optflags_build'] = '-O2 -pipe -fbracket-depth=1024'
+ defines['build_cflags'] = '-O2 -pipe -fbracket-depth=1024'
cvs = 'cvs'
if check.check_exe(cvs, cvs):
defines['__cvs'] = cvs
#
# Fix the mess iconv is on FreeBSD 10.0.
#
- defines['iconv_optincludes'] = ('none', 'none', '-I/usr/local/include -L/usr/local/lib')
+ defines['iconv_includes'] = ('none', 'none', '-I/usr/local/include -L/usr/local/lib')
for gv in ['47', '48', '49']:
gcc = '%s-portbld-freebsd%s-gcc%s' % (cpu, version, gv)
diff --git a/source-builder/sb/pkgconfig.py b/source-builder/sb/pkgconfig.py
index 8427777..1299178 100755
--- a/source-builder/sb/pkgconfig.py
+++ b/source-builder/sb/pkgconfig.py
@@ -34,6 +34,7 @@
# provided by the full pkg-config so packages can configure and build.
#
+import copy
import os
import os.path
import re
@@ -73,6 +74,14 @@ class package(object):
loaded = {}
@staticmethod
+ def _copy(src, dst):
+ dst.name_ = src.name_
+ dst.file_ = src.file_
+ dst.defines = copy.copy(src.defines)
+ dst.fields = copy.copy(src.fields)
+ dst.nodes = copy.copy(src.nodes)
+
+ @staticmethod
def is_version(v):
for n in v.split('.'):
if not n.isdigit():
@@ -384,7 +393,9 @@ class package(object):
def load(self, name):
if name in package.loaded:
- raise error('package already loaded: %s' % (name))
+ package._copy(package.loaded[name], self)
+ return
+ self._log('loading: %s' % (name))
if self.name_:
self._clean()
self.name_ = name
@@ -392,14 +403,14 @@ class package(object):
if file:
self._log('load: %s (%s)' % (name, file))
if self.src:
- self.src.writelines('==%s%s' % ('=' * 80, os.linesep))
- self.src.writelines(' %s %s%s' % (file, '=' * (80 - len(file)), os.linesep))
- self.src.writelines('==%s%s' % ('=' * 80, os.linesep))
+ self.src('==%s%s' % ('=' * 80, os.linesep))
+ self.src(' %s %s%s' % (file, '=' * (80 - len(file)), os.linesep))
+ self.src('==%s%s' % ('=' * 80, os.linesep))
f = open(file)
tm = False
for l in f.readlines():
if self.src:
- self.src.writelines(l)
+ self.src(l)
l = l[:-1]
hash = l.find('#')
if hash >= 0:
@@ -455,6 +466,7 @@ class package(object):
package.loaded[name] = self
def get(self, label, private = True):
+ self._log('get: %s (%s)' % (label, ','.join(self.fields)))
if label.lower() not in self.fields:
return None
s = ''
@@ -504,3 +516,46 @@ class package(object):
else:
self._log('check: %s not found' % (self.name_))
return ok
+
+def check_package(libraries, args, output, src):
+ ec = 1
+ pkg = None
+ flags = { 'cflags': '',
+ 'libs': '' }
+ output('libraries: %s' % (libraries))
+ libs = package.splitter(libraries)
+ for lib in libs:
+ output('pkg: %s' % (lib))
+ pkg = package(lib[0], prefix = args.prefix, output = output, src = src)
+ if args.dump:
+ output(pkg)
+ if pkg.exists():
+ if len(lib) == 1:
+ if args.exact_version:
+ if pkg.check('=', args.exact_version):
+ ec = 0
+ elif args.atleast_version:
+ if pkg.check('>=', args.atleast_version):
+ ec = 0
+ elif args.max_version:
+ if pkg.check('<=', args.max_version):
+ ec = 0
+ else:
+ ec = 0
+ else:
+ if len(lib) != 3:
+ raise error('invalid package check: %s' % (' '.join(lib)))
+ if pkg.check(lib[1], lib[2]):
+ ec = 0
+ if ec == 0:
+ cflags = pkg.get('cflags')
+ if cflags:
+ flags['cflags'] += cflags
+ libs = pkg.get('libs', private = False)
+ if libs:
+ flags['libs'] += libs
+ break
+ if ec > 0:
+ break
+ return ec, pkg, flags
+