Changeset 158ad68 in rtems-source-builder


Ignore:
Timestamp:
Oct 3, 2020, 11:53:04 AM (8 weeks ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.11
Parents:
8af551c
git-author:
Chris Johns <chrisj@…> (10/03/20 11:53:04)
git-committer:
Chris Johns <chrisj@…> (10/06/20 01:00:21)
Message:

sb: Back port the RTEMS 5 and 6 RSB engine.

  • Build GDb first as we do for RTEMS 5 and later
  • Update GDB to 9.1 for all archs expect SPARC. The SIS patches only apply to 7.9. Disable Python for SPARC

Closes #4111

Files:
12 added
83 edited

Legend:

Unmodified
Added
Removed
  • rtems/config/4.11/rtems-arm.bset

    r8af551c r158ad68  
    35354.11/rtems-autotools
    3636devel/expat-2.1.0-1
     37tools/rtems-gdb-9.1-1
    3738tools/rtems-binutils-2.26-1
    3839tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    39 tools/rtems-gdb-7.9-1
    4040tools/rtems-tools-4.11-1
    4141tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-avr.bset

    r8af551c r158ad68  
    35354.11/rtems-autotools
    3636devel/expat-2.1.0-1
     37tools/rtems-gdb-9.1-1
    3738tools/rtems-binutils-2.26-1
    3839tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    39 tools/rtems-gdb-7.9-1
    4040tools/rtems-tools-4.11-1
    4141tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-bfin.bset

    r8af551c r158ad68  
    17174.11/rtems-autotools
    1818devel/expat-2.1.0-1
     19tools/rtems-gdb-9.1-1
    1920tools/rtems-binutils-2.26-1
    2021tools/rtems-gcc-4.8.3-newlib-2.2.0-20150423-1
    21 tools/rtems-gdb-7.9-1
    2222tools/rtems-tools-4.11-1
    2323tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-h8300.bset

    r8af551c r158ad68  
    29294.11/rtems-autotools
    3030devel/expat-2.1.0-1
     31tools/rtems-gdb-9.1-1
    3132tools/rtems-binutils-2.26-1
    3233tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    33 tools/rtems-gdb-7.9-1
    3434tools/rtems-tools-4.11-1
    3535tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-i386.bset

    r8af551c r158ad68  
    17174.11/rtems-autotools
    1818devel/expat-2.1.0-1
     19tools/rtems-gdb-9.1-1
    1920tools/rtems-binutils-2.26-1
    2021tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    21 tools/rtems-gdb-7.9-1
    2222tools/rtems-tools-4.11-1
    2323tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-lm32.bset

    r8af551c r158ad68  
    23234.11/rtems-autotools
    2424devel/expat-2.1.0-1
     25tools/rtems-gdb-9.1-1
    2526tools/rtems-binutils-2.26-1
    2627tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    27 tools/rtems-gdb-7.9-1
    2828tools/rtems-tools-4.11-1
    2929tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-m32c.bset

    r8af551c r158ad68  
    41414.11/rtems-autotools
    4242devel/expat-2.1.0-1
     43tools/rtems-gdb-9.1-1
    4344tools/rtems-binutils-2.26-1
    4445tools/rtems-gcc-4.8.3-newlib-2.2.0-20150423-1
    45 tools/rtems-gdb-7.9-1
    4646tools/rtems-tools-4.11-1
    4747tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-m32r.bset

    r8af551c r158ad68  
    17174.11/rtems-autotools
    1818devel/expat-2.1.0-1
     19tools/rtems-gdb-9.1-1
    1920tools/rtems-binutils-2.26-1
    2021tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    21 tools/rtems-gdb-7.9-1
    2222tools/rtems-tools-4.11-1
    2323tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-m68k.bset

    r8af551c r158ad68  
    17174.11/rtems-autotools
    1818devel/expat-2.1.0-1
     19tools/rtems-gdb-9.1-1
    1920tools/rtems-binutils-2.26-1
    2021tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    21 tools/rtems-gdb-7.9-1
    2222tools/rtems-tools-4.11-1
    2323tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-microblaze.bset

    r8af551c r158ad68  
    28284.11/rtems-autotools
    2929devel/expat-2.1.0-1
     30tools/rtems-gdb-9.1-1
    3031tools/rtems-binutils-2.26-1
    3132tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    32 tools/rtems-gdb-7.9-1
    3333tools/rtems-tools-4.11-1
    3434tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-mips.bset

    r8af551c r158ad68  
    27274.11/rtems-autotools
    2828devel/expat-2.1.0-1
     29tools/rtems-gdb-9.1-1
    2930tools/rtems-binutils-2.26-1
    3031tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    31 tools/rtems-gdb-7.9-1
    3232tools/rtems-mipstx39-gdb-7.9-1
    3333tools/rtems-tools-4.11-1
  • rtems/config/4.11/rtems-moxie.bset

    r8af551c r158ad68  
    2323devel/expat-2.1.0-1
    2424devel/dtc-1.4.1-1
     25tools/rtems-gdb-9.1-1
    2526tools/rtems-binutils-2.25-1
    2627tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    27 tools/rtems-gdb-7.9-1
    2828tools/rtems-tools-4.11-1
    2929tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-nios2.bset

    r8af551c r158ad68  
    17174.11/rtems-autotools
    1818devel/expat-2.1.0-1
     19tools/rtems-gdb-9.1-1
    1920tools/rtems-binutils-2.26-1
    2021tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    21 tools/rtems-gdb-7.9-1
    2222tools/rtems-tools-4.11-1
    2323tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-or1k.bset

    r8af551c r158ad68  
    38384.11/rtems-autotools
    3939devel/expat-2.1.0-1
     40tools/rtems-gdb-9.1-1
    4041tools/rtems-binutils-2.26-1
    4142tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1.cfg
    4243tools/rtems-tools-4.11-1
    43 tools/rtems-gdb-7.9-1
  • rtems/config/4.11/rtems-powerpc.bset

    r8af551c r158ad68  
    32324.11/rtems-autotools
    3333devel/expat-2.1.0-1
     34tools/rtems-gdb-9.1-1
    3435tools/rtems-binutils-2.26-1
    3536tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    36 tools/rtems-gdb-7.9-1
    3737tools/rtems-tools-4.11-1
    3838tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-sh.bset

    r8af551c r158ad68  
    17174.11/rtems-autotools
    1818devel/expat-2.1.0-1
     19tools/rtems-gdb-9.1-1
    1920tools/rtems-binutils-2.26-1
    2021tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    21 tools/rtems-gdb-7.9-1
    2222tools/rtems-tools-4.11-1
    2323tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-sparc.bset

    r8af551c r158ad68  
    77774.11/rtems-autotools
    7878devel/expat-2.1.0-1
     79tools/rtems-gdb-7.9-1
    7980tools/rtems-binutils-2.26-1
    8081tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    81 tools/rtems-gdb-7.9-1
    8282tools/rtems-tools-4.11-1
    8383tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-sparc64.bset

    r8af551c r158ad68  
    17174.11/rtems-autotools
    1818devel/expat-2.1.0-1
     19tools/rtems-gdb-9.1-1
    1920tools/rtems-binutils-2.26-1
    2021tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    21 tools/rtems-gdb-7.9-1
    2222tools/rtems-tools-4.11-1
    2323tools/rtems-kernel-4.11
  • rtems/config/4.11/rtems-v850.bset

    r8af551c r158ad68  
    22224.11/rtems-autotools
    2323devel/expat-2.1.0-1
     24tools/rtems-gdb-9.1-1
    2425tools/rtems-binutils-2.26-1
    2526tools/rtems-gcc-4.9.3-newlib-2.2.0-20150423-1
    26 tools/rtems-gdb-7.9-1
    2727tools/rtems-tools-4.11-1
    2828tools/rtems-kernel-4.11
  • rtems/config/tools/rtems-gdb-7.9-1.cfg

    r8af551c r158ad68  
    2424
    2525#
     26# Disable python because 7.9 needs python2 and that is now end-of-life and
     27# available on some hosts
     28#
     29%define without_python
     30
     31#
    2632# The gdb build instructions. We use 7.xx Release 1.
    2733#
  • source-builder/config/autoconf-2-1.cfg

    r8af551c r158ad68  
    77%ifn %{defined _internal_autotools}
    88  %define _internal_autotools no
    9   %ifn %{defined _internal_autotools_path}
    10     %define _internal_autotools_path %{nil}
    11   %endif
     9%endif
     10%ifn %{defined _internal_autotools_path}
     11  %define _internal_autotools_path %{_prefix}
    1212%endif
    1313
     
    1717Release:   %{release}
    1818URL:       http://www.gnu.org/software/autoconf/
    19 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    2019
    2120#
    2221# Source
    2322#
    24 %source set autoconf ftp://ftp.gnu.org/gnu/autoconf/autoconf-%{autoconf_version}.tar.gz
     23%source set autoconf https://ftp.gnu.org/gnu/autoconf/autoconf-%{autoconf_version}.tar.gz
    2524
    2625#
  • source-builder/config/automake-1-1.cfg

    r8af551c r158ad68  
    77%ifn %{defined _internal_autotools}
    88  %define _internal_autotools no
    9   %ifn %{defined _internal_autotools_path}
    10     %define _internal_autotools_path %{nil}
    11   %endif
     9%endif
     10%ifn %{defined _internal_autotools_path}
     11  %define _internal_autotools_path %{_prefix}
    1212%endif
    1313
     
    1717Release:   %{release}
    1818URL:       http://www.gnu.org/software/automake/
    19 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    2019
    2120#
    2221# Source
    2322#
    24 %source set automake ftp://ftp.gnu.org/gnu/automake/automake-%{automake_version}.tar.gz
     23%source set automake https://ftp.gnu.org/gnu/automake/automake-%{automake_version}.tar.gz
    2524
    2625#
  • source-builder/config/binutils-2-1.cfg

    r8af551c r158ad68  
    2020Release:   %{release}
    2121URL:       http://sources.redhat.com/binutils
    22 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    2322
    2423#
     
    2827
    2928#
     29# Default gold and LTO to disable.
     30#
     31%ifn %{defined with_gold}
     32 %define with_gold 0
     33%endif
     34%ifn %{defined with_lto}
     35 %define with_lto 0
     36%endif
     37
     38#
    3039# Source
    3140#
    32 %source set binutils ftp://ftp.gnu.org/gnu/binutils/binutils-%{binutils_version}.tar.bz2
     41%source set binutils https://ftp.gnu.org/gnu/binutils/binutils-%{binutils_version}.tar.bz2
    3342
    3443#
     
    6069    --target=%{_target} \
    6170    --verbose --disable-nls \
     71    --disable-gdb --disable-libdecnumber --disable-readline --disable-sim \
    6272    %{?with_deterministic_archives:--enable-deterministic-archives} \
     73    %{?with_64_bit_bfd:--enable-64-bit-bfd} \
     74    %{?with_gold:--enable-gold=yes} \
     75    %{?with_lto:--enable-lto --enable-plugins}%{!?with_lto:--disable-lto} \
    6376    --without-included-gettext \
    6477    --disable-win32-registry \
  • source-builder/config/dtc-1-1.cfg

    r8af551c r158ad68  
    1313Version:   %{dtc_version}
    1414Release:   %{release}
    15 URL:       http://www.jdl.com/software/
    16 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
     15URL:       https://www.devicetree.org/
    1716
    1817#
  • source-builder/config/expat-2-1.cfg

    r8af551c r158ad68  
    1414Release:   %{release}
    1515URL:       http://expat.sourceforge.net/
    16 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1716
    1817#
  • source-builder/config/gcc-4.3-1.cfg

    r8af551c r158ad68  
    11#
    2 # GCC 4.7 Version 1.
     2# GCC 4.3.1 Version 1.
    33#
    44# This configuration file configure's, make's and install's gcc. It uses
    55# newlib, MPFR, MPC, and GMP in a one-tree build configuration.
    66#
     7
     8#
     9# Force the standard of C code for GCC.
     10#
     11%define build_cflags %{build_cflags} --std=gnu89
    712
    813#
     
    1217# GCC core and G++
    1318#
    14 %source set gcc ftp://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
     19%source set gcc https://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
    1520
    1621#
    1722# Newlib
    1823#
    19 %source set newlib ftp://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
     24%source set newlib https://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
    2025
    2126#
    2227# Packages GCC requires
    2328#
    24 %source set mpfr https://ftp.gnu.org/gnu/mpfr/mpfr-%{mpfr_version}.tar.bz2
    25 %source set mpc https://ftp.gnu.org/gnu/mpc/mpc-%{mpc_version}.tar.gz
     29%source set mpfr http://www.mpfr.org/mpfr-%{mpfr_version}/mpfr-%{mpfr_version}.tar.bz2
     30%source set mpc http://www.multiprecision.org/mpc/download/mpc-%{mpc_version}.tar.gz
    2631%source set gmp https://ftp.gnu.org/gnu/gmp/gmp-%{gmp_version}.tar.bz2
    2732
  • source-builder/config/gcc-4.4-1.cfg

    r8af551c r158ad68  
    1212# GCC core and G++
    1313#
    14 %source set gcc ftp://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-core-%{gcc_version}.tar.bz2
     14%source set gcc https://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-core-%{gcc_version}.tar.bz2
    1515
    1616%if %{enable_cxx}
    17  %source add gcc ftp://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-g++-%{gcc_version}.tar.gz
     17 %source add gcc https://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-g++-%{gcc_version}.tar.gz
    1818%endif
    1919
     
    2121# Newlib
    2222#
    23 %source set newlib ftp://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
     23%source set newlib https://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
    2424
    2525#
    2626# Packages GCC requires
    2727#
    28 %source set mpfr https://ftp.gnu.org/gnu/mpfr/mpfr-%{mpfr_version}.tar.bz2
    29 %source set mpc https://ftp.gnu.org/gnu/mpc/mpc-%{mpc_version}.tar.gz
     28%source set mpfr http://www.mpfr.org/mpfr-%{mpfr_version}/mpfr-%{mpfr_version}.tar.bz2
     29%source set mpc http://www.multiprecision.org/mpc/download/mpc-%{mpc_version}.tar.gz
    3030%source set gmp https://ftp.gnu.org/gnu/gmp/gmp-%{gmp_version}.tar.bz2
    3131
  • source-builder/config/gcc-4.5-1.cfg

    r8af551c r158ad68  
    1212# GCC core and G++
    1313#
    14 %source set gcc ftp://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
     14%source set gcc https://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
    1515
    1616#
    1717# Newlib
    1818#
    19 %source set newlib ftp://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
     19%source set newlib https://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
    2020
    2121#
    2222# Packages GCC requires
    2323#
    24 %source set mpfr https://ftp.gnu.org/gnu/mpfr/mpfr-%{mpfr_version}.tar.bz2
    25 %source set mpc https://ftp.gnu.org/gnu/mpc/mpc-%{mpc_version}.tar.gz
     24%source set mpfr http://www.mpfr.org/mpfr-%{mpfr_version}/mpfr-%{mpfr_version}.tar.bz2
     25%source set mpc http://www.multiprecision.org/mpc/download/mpc-%{mpc_version}.tar.gz
    2626%source set gmp https://ftp.gnu.org/gnu/gmp/gmp-%{gmp_version}.tar.bz2
    2727
  • source-builder/config/gcc-4.6-1.cfg

    r8af551c r158ad68  
    1212# GCC core and G++
    1313#
    14 %source set gcc ftp://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-core-%{gcc_version}.tar.bz2
     14%source set gcc https://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-core-%{gcc_version}.tar.bz2
    1515
    1616%if %{enable_cxx}
    17  %source add gcc ftp://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-g++-%{gcc_version}.tar.gz
     17 %source add gcc https://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-g++-%{gcc_version}.tar.gz
    1818%endif
    1919
     
    2121# Newlib
    2222#
    23 %source set newlib ftp://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
     23%source set newlib https://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
    2424
    2525#
    2626# Packages GCC requires
    2727#
    28 %source set mpfr https://ftp.gnu.org/gnu/mpfr/mpfr-%{mpfr_version}.tar.bz2
    29 %source set mpc https://ftp.gnu.org/gnu/mpc/mpc-%{mpc_version}.tar.gz
     28%source set mpfr http://www.mpfr.org/mpfr-%{mpfr_version}/mpfr-%{mpfr_version}.tar.bz2
     29%source set mpc http://www.multiprecision.org/mpc/download/mpc-%{mpc_version}.tar.gz
    3030%source set gmp https://ftp.gnu.org/gnu/gmp/gmp-%{gmp_version}.tar.bz2
    3131
  • source-builder/config/gcc-4.7-1.cfg

    r8af551c r158ad68  
    2121# GCC core and G++
    2222#
    23 %source set gcc ftp://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
     23%source set gcc https://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
    2424
    2525#
    2626# Newlib
    2727#
    28 %source set newlib ftp://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
     28%source set newlib https://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
    2929
    3030#
    3131# Packages GCC requires
    3232#
    33 %source set mpfr https://ftp.gnu.org/gnu/mpfr/mpfr-%{mpfr_version}.tar.bz2
    34 %source set mpc https://ftp.gnu.org/gnu/mpc/mpc-%{mpc_version}.tar.gz
     33%source set mpfr http://www.mpfr.org/mpfr-%{mpfr_version}/mpfr-%{mpfr_version}.tar.bz2
     34%source set mpc http://www.multiprecision.org/mpc/download/mpc-%{mpc_version}.tar.gz
    3535%source set gmp https://ftp.gnu.org/gnu/gmp/gmp-%{gmp_version}.tar.bz2
    3636
  • source-builder/config/gcc-4.8-1.cfg

    r8af551c r158ad68  
    1212# GCC core and G++
    1313#
    14 %source set gcc ftp://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
     14%source set gcc https://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
    1515
    1616#
    1717# Newlib
    1818#
    19 %source set newlib ftp://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
     19%source set newlib https://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
    2020
    2121#
    2222# Packages GCC requires
    2323#
    24 %source set mpfr https://ftp.gnu.org/gnu/mpfr/mpfr-%{mpfr_version}.tar.bz2
    25 %source set mpc https://ftp.gnu.org/gnu/mpc/mpc-%{mpc_version}.tar.gz
     24%source set mpfr http://www.mpfr.org/mpfr-%{mpfr_version}/mpfr-%{mpfr_version}.tar.bz2
     25%source set mpc http://www.multiprecision.org/downloads/mpc-%{mpc_version}.tar.gz
    2626%source set gmp https://ftp.gnu.org/gnu/gmp/gmp-%{gmp_version}.tar.bz2
    2727
  • source-builder/config/gcc-4.9-1.cfg

    r8af551c r158ad68  
    1212# GCC core and G++
    1313#
    14 %source set gcc ftp://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
     14%source set gcc https://ftp.gnu.org/gnu/gcc/gcc-%{gcc_version}/gcc-%{gcc_version}.tar.bz2
    1515
    1616#
    1717# Newlib
    1818#
    19 %source set newlib ftp://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
     19%source set newlib https://sourceware.org/pub/newlib/newlib-%{newlib_version}.tar.gz
    2020
    2121#
    2222# Packages GCC requires
    2323#
    24 %source set mpfr https://ftp.gnu.org/gnu/mpfr/mpfr-%{mpfr_version}.tar.bz2
    25 %source set mpc https://ftp.gnu.org/gnu/mpc/mpc-%{mpc_version}.tar.gz
     24%source set mpfr http://www.mpfr.org/mpfr-%{mpfr_version}/mpfr-%{mpfr_version}.tar.bz2
     25%source set mpc http://www.multiprecision.org/mpc/download/mpc-%{mpc_version}.tar.gz
    2626%source set gmp https://ftp.gnu.org/gnu/gmp/gmp-%{gmp_version}.tar.bz2
    2727
  • source-builder/config/gcc-common-1.cfg

    r8af551c r158ad68  
    2020Release:   %{release}
    2121URL:       http://gcc.gnu.org/
    22 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    2322
    2423#
     
    3130#
    3231%global _gcclibdir %{_prefix}/lib
     32
     33#
     34# Default LTO to off.
     35#
     36%ifn %{defined with_lto}
     37 %define with_lto 0
     38%endif
    3339
    3440#
     
    3945%else
    4046 %define rtems_gcc_version %{rtems_version}
     47%endif
     48
     49#
     50# Packages GCC requires
     51#
     52%if %{defined cloog_version}
     53%source set cloog https://gcc.gnu.org/pub/gcc/infrastructure/cloog-%{cloog_version}.tar.gz
     54%endif
     55%if %{defined isl_version}
     56%source set isl https://gcc.gnu.org/pub/gcc/infrastructure/isl-%{isl_version}.tar.bz2
    4157%endif
    4258
     
    6076
    6177  # newlib
    62   source_dir_newlib="newlib-%{newlib_version}"
    63   %source setup newlib -q -D -n newlib-%{newlib_version}
     78  source_dir_newlib=%{?newlib_external:%{newlib_expand_name}}%{!?newlib_external:"newlib-%{newlib_version}"}
     79  %source setup newlib -q -D -n ${source_dir_newlib}
    6480  %patch setup newlib -p1
    6581  cd ${build_top}
     
    6884  %{__rmfile} ${source_dir_gcc}/newlib
    6985  %{__ln_s} $PWD/${source_dir_newlib}/newlib ${source_dir_gcc}/newlib
     86
     87%if %{defined cloog_version}
     88  # CLooG
     89  source_dir_cloog="cloog-%{cloog_version}"
     90  %source setup cloog -q -D -n cloog-%{cloog_version}
     91  %patch setup cloog -p1
     92  cd ${build_top}
     93  # Build MPFR one-tree style
     94  %{__rmfile} ${source_dir_gcc}/cloog
     95  %{__ln_s} $PWD/${source_dir_cloog} ${source_dir_gcc}/cloog
     96%endif
     97
     98%if %{defined isl_version}
     99  # ISL
     100  source_dir_isl="isl-%{isl_version}"
     101  %source setup isl -q -D -n isl-%{isl_version}
     102  %patch setup isl -p1
     103  cd ${build_top}
     104  # Build MPFR one-tree style
     105  %{__rmfile} ${source_dir_gcc}/isl
     106  %{__ln_s} $PWD/${source_dir_isl} ${source_dir_gcc}/isl
     107%endif
    70108
    71109  # MPFR
     
    130168%if %{enable_objc}
    131169  languages="$languages,objc"
    132 %endif
    133 
    134 %if %{_host_os} == mingw32
    135   zlib_option=""
    136 %else
    137   zlib_option="--with-system-zlib"
    138170%endif
    139171
     
    155187    --with-gnu-as --with-gnu-ld --verbose \
    156188    --with-newlib \
    157     "$zlib_option" \
    158189    --disable-nls --without-included-gettext \
    159190    --disable-win32-registry \
    160191    --enable-version-specific-runtime-libs \
    161     --disable-lto \
     192    %{?with_lto:--enable-lto}%{!?with_lto:--disable-lto} \
    162193    --enable-newlib-io-c99-formats \
    163194    %{?disable_MAKEINFO:MAKEINFO=missing} \
  • source-builder/config/gdb-6-1.cfg

    r8af551c r158ad68  
    44# This configuration file configure's, make's and install's gdb.
    55#
     6
     7#
     8# See if the simulator has been disabled for Windows.
     9#
     10%if %{_host_os} == win32
     11 %if %{defined win32-gdb-disable-sim}
     12  %define gdb-disable-sim 1
     13  %endif
     14%endif
     15
     16#
     17# Default to building simulators.
     18#
     19%ifn %{defined gdb-disable-sim}
     20 %define gdb-disable-sim 0
     21%else
     22 %undefine gdb-sim-options
     23%endif
    624
    725%include %{_configdir}/checks.cfg
     
    1230Release:   %{release}
    1331URL:       http://www.gnu.org/software/gdb/
    14 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1532
    1633#
     
    2037
    2138#
     39# Disable Python on Cxc builds for now.
     40#
     41%if "%{_build}" != "%{_host}"
     42  %define without_python
     43%endif
     44
     45#
    2246# Prepare the source code.
    2347#
    2448%prep
    25   %source setup gdb -q -c -n %{name}-%{version}
    26   cd gdb-%{gdb_version}
     49  build_top=$(pwd)
     50
     51  gdb_source=%{?gdb_external:%{gdb_expand_name}}%{!?gdb_external:"gdb-%{gdb_version}"}
     52
     53  source_dir_gdb=${gdb_source}
     54  %source setup gdb -q -n ${gdb_source}
    2755  %patch setup gdb -p1
    28   cd ..
     56
     57  cd ${build_top}
    2958
    3059%build
    31   export PATH="%{_bindir}:${PATH}"
    32   mkdir -p build
    33   cd build
    34 %if "%{_build}" != "%{_host}"
    35   CFLAGS_FOR_BUILD="-g -O2 -Wall" \
    36 %endif
    37   CFLAGS="$SB_CFLAGS" \
    38   ../gdb-%{gdb_version}/configure \
     60  build_top=$(pwd)
     61
     62  %{build_directory}
     63
     64  mkdir -p ${build_dir}
     65  cd ${build_dir}
     66
     67  %{host_build_flags}
     68
     69  if test "%{_build}" != "%{_host}" ; then
     70    GDB_LIBS_STATIC="-lexpat"
     71  else
     72    GDB_LIBS_STATIC="-lexpat"
     73    GDB_LIBS="%{_forced_static}"
     74  fi
     75
     76  LIBS_STATIC=${GDB_LIBS_STATIC} \
     77  LIBS=${GDB_LIBS} \
     78  ../${source_dir_gdb}/configure \
    3979    --build=%{_build} --host=%{_host} \
    4080    --target=%{_target} \
     
    4383    --disable-win32-registry \
    4484    --disable-werror \
    45     --enable-sim \
     85    %{!?gdb-disable-sim:--enable-sim}%{?gdb-disable-sim:--disable-sim} \
     86    %{?gdb-sim-options:%{gdb-sim-options}} \
     87    --without-zlib \
    4688    --with-expat \
    4789    %{!?without_python:--with-python} \
     
    5294
    5395  %{__make} %{?_smp_mflags} all
    54   cd ..
     96
     97  cd ${build_top}
    5598
    5699%install
    57   export PATH="%{_bindir}:${PATH}"
    58   rm -rf $SB_BUILD_ROOT
     100  build_top=$(pwd)
    59101
    60   cd build
     102  %{__rmdir} $SB_BUILD_ROOT
     103
     104  cd ${build_dir}
    61105  %{__make} DESTDIR=$SB_BUILD_ROOT install
    62106
    63107  # Dropped in FSF-binutils-2.9.5, but Cygwin still ships it.
    64   rm -rf $SB_BUILD_ROOT%{_infodir}/configure.info*
     108  %{__rmdir} $SB_BUILD_ROOT%{_infodir}/configure.info*
    65109
    66   rm -f $SB_BUILD_ROOT%{_infodir}/dir
     110  %{__rmfile} $SB_BUILD_ROOT%{_infodir}/dir
    67111  touch $SB_BUILD_ROOT%{_infodir}/dir
    68112
    69   cd ..
     113  cd ${build_top}
  • source-builder/config/gdb-7-1.cfg

    r8af551c r158ad68  
    55#
    66
    7 #
    8 # See if the simulator has been disabled for Windows.
    9 #
    10 # Build using the system's readline, it is in better shape
    11 # than GDB's one with MSYS2.
    12 #
    13 %if %{_host_os} == win32
    14  %if %{defined win32-gdb-disable-sim}
    15   %define gdb-disable-sim 1
    16  %endif
    17  %define with_system_readline 1
    18 %endif
    19 
    20 #
    21 # Default to building simulators.
    22 #
    23 %ifn %{defined gdb-disable-sim}
    24  %define gdb-disable-sim 0
    25 %else
    26  %undefine gdb-sim-options
    27 %endif
    28 
    29 %include %{_configdir}/checks.cfg
    30 
    31 #
    32 # Select Snapshot Macro Maps
    33 #
    34 %select gdb-snapshot
    35 %select expat-snapshot
    36 
    37 #
    38 # The description.
    39 #
    40 Name:      %{_target}-gdb-%{gdb_version}-%{_host}-%{release}
    41 Summary:   GDB v%{gdb_version} for target %{_target} on host %{_host}
    42 Version:   %{gdb_version}
    43 Release:   %{release}
    44 URL:       http://www.gnu.org/software/gdb/
    45 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    46 
    47 #
    48 # GDB has changed it default extension.
    49 #
    50 %ifn %{defined gdb_src_ext}
    51   %define gdb_src_ext gz
    52 %endif
    53 
    54 #
    55 # Source
    56 #
    57 %source set gdb http://ftp.gnu.org/gnu/gdb/gdb-%{gdb_version}.tar.%{gdb_src_ext}
    58 
    59 #
    60 # Disable Python on Cxc builds for now.
    61 #
    62 %if "%{_build}" != "%{_host}"
    63   %define without_python
    64 %endif
    65 
    66 #
    67 # The --with-python option is either the default which is auto or the path to
    68 # the specific python to be used.
    69 #
    70 %if %{defined with_python_path}
    71   %define with_python_option --with-python=%{with_python_path}
    72 %else
    73   %define with_python_option --with-python
    74 %endif
    75 
    76 #
    77 #
    78 # Prepare the source code.
    79 #
    80 %prep
    81   build_top=$(pwd)
    82 
    83   gdb_source=%{?gdb_external:%{gdb_expand_name}}%{!?gdb_external:"gdb-%{gdb_version}"}
    84 
    85   source_dir_gdb=${gdb_source}
    86   %source setup gdb -q -n ${gdb_source}
    87   %patch setup gdb -p1
    88 
    89   cd ${build_top}
    90 
    91 %build
    92   build_top=$(pwd)
    93 
    94   %{build_directory}
    95 
    96   mkdir -p ${build_dir}
    97   cd ${build_dir}
    98 
    99   %{host_build_flags}
    100 
    101   if test "%{_build}" != "%{_host}" ; then
    102     GDB_LIBS_STATIC="-lexpat"
    103   else
    104     GDB_LIBS_STATIC="-lexpat"
    105     GDB_LIBS="%{_forced_static}"
    106   fi
    107 
    108   LIBS_STATIC=${GDB_LIBS_STATIC} \
    109   LIBS=${GDB_LIBS} \
    110   ../${source_dir_gdb}/configure \
    111     --build=%{_build} --host=%{_host} \
    112     --target=%{_target} \
    113     --verbose --disable-nls \
    114     %{?with_system_readline:--with-system-readline} \
    115     --without-included-gettext \
    116     --disable-win32-registry \
    117     --disable-werror \
    118     %{!?gdb-disable-sim:--enable-sim}%{?gdb-disable-sim:--disable-sim} \
    119     %{?gdb-sim-options:%{gdb-sim-options}} \
    120     --without-zlib \
    121     --with-expat \
    122     %{!?without_python:%{with_python_option}} \
    123     --prefix=%{_prefix} --bindir=%{_bindir} \
    124     --exec-prefix=%{_exec_prefix} \
    125     --includedir=%{_includedir} --libdir=%{_libdir} \
    126     --mandir=%{_mandir} --infodir=%{_infodir}
    127 
    128   %{__make} %{?_smp_mflags} all
    129 
    130   cd ${build_top}
    131 
    132 %install
    133   build_top=$(pwd)
    134 
    135   %{__rmdir} $SB_BUILD_ROOT
    136 
    137   cd ${build_dir}
    138   %{__make} DESTDIR=$SB_BUILD_ROOT install
    139 
    140   # Dropped in FSF-binutils-2.9.5, but Cygwin still ships it.
    141   %{__rmdir} $SB_BUILD_ROOT%{_infodir}/configure.info*
    142 
    143   %{__rmfile} $SB_BUILD_ROOT%{_infodir}/dir
    144   touch $SB_BUILD_ROOT%{_infodir}/dir
    145 
    146   cd ${build_top}
     7%include %{_configdir}/gdb-common-1.cfg
  • source-builder/config/gettext-0-1.cfg

    r8af551c r158ad68  
    1515Release:   %{release}
    1616URL:       http://www.gnu.org/software/gettext/
    17 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1817
    1918#
  • source-builder/config/glib-2-1.cfg

    r8af551c r158ad68  
    1515Release:   %{release}
    1616URL:       https://developer.gnome.org/glib/
    17 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1817
    1918#
     
    6160    --build=%{_build} --host=%{_host} \
    6261    --with-sysroot=$SYSROOT \
    63     --disable-dtrace
     62    --disable-dtrace \
     63    --with-pcre=internal
    6464
    6565  %{_ld_library_path}=$SYSROOT/lib \
  • source-builder/config/libffi-3-1.cfg

    r8af551c r158ad68  
    1515Release:   %{release}
    1616URL:       https://sourceware.org/libffi/
    17 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1817
    1918#
    2019# Source
    2120#
    22 %source set libffi ftp://sourceware.org/pub/libffi/libffi-%{libffi_version}.tar.gz
     21%source set libffi https://sourceware.org/pub/libffi/libffi-%{libffi_version}.tar.gz
    2322
    2423#
  • source-builder/config/libiconv-1-1.cfg

    r8af551c r158ad68  
    1616Release:   %{release}
    1717URL:       http://www.gnu.org/software/libiconv/
    18 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1918
    2019#
  • source-builder/config/libjpeg-1.cfg

    r8af551c r158ad68  
    1010
    1111Name:      libjpeg-v%{libjpeg_version}-%{_host}-%{release}
    12 Summary:   libjpeg is the Independent JPEG Group jpeg library 
     12Summary:   libjpeg is the Independent JPEG Group jpeg library
    1313Version:   %{libjpeg_version}
    1414Release:   %{release}
    1515URL:       http://www.ijg.org/
    16 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1716
    1817#
     
    5453    --infodir=%{_infodir} \
    5554    --datadir=%{_datadir} \
    56     --disable-shared \
    57     --disable-programs
     55    --disable-shared
    5856
    5957  %{__make} %{?_smp_mflags} all
  • source-builder/config/libtool-2-1.cfg

    r8af551c r158ad68  
    1717Release:   %{release}
    1818URL:       http://www.gnu.org/software/libtool/
    19 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    2019
    2120#
    2221# Source
    2322#
    24 %source set libtool ftp://ftp.gnu.org/gnu/libtool/libtool-%{libtool_version}.tar.gz
     23%source set libtool https://ftp.gnu.org/gnu/libtool/libtool-%{libtool_version}.tar.gz
    2524
    2625#
     
    5554  export CFLAGS CFLAGS_FOR_BUILD CC
    5655
     56  CC=%{__cc} \
    5757  CFLAGS="$SB_CFLAGS" \
    5858  ./configure \
  • source-builder/config/libusb-1-1.cfg

    r8af551c r158ad68  
    1313Release:   %{release}
    1414URL:       http://libusb.org/
    15 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1615
    1716#
     
    3534
    3635%if "%{_build}" != "%{_host}"
    37   CFLAGS_FOR_BUILD="-g -O2 -Wall" \
     36  LIBUSB_CFLAGS_FOR_BUILD="-g -O2 -Wall"
    3837%endif
     38
     39  CFLAGS_FOR_BUILD=${LIBUSB_CFLAGS_FOR_BUILD} \
    3940  CFLAGS="$SB_CFLAGS" \
    4041  ./configure \
  • source-builder/config/m4-1-1.cfg

    r8af551c r158ad68  
    1313Release:   %{release}
    1414URL:       http://www.gnu.org/software/m4/
    15 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1615
    1716#
    1817# Source
    1918#
    20 %source set m4 ftp://ftp.gnu.org/gnu/m4/m4-%{m4_version}.tar.gz
     19%source set m4 https://ftp.gnu.org/gnu/m4/m4-%{m4_version}.tar.gz
    2120
    2221#
  • source-builder/config/net-snmp-5-1.cfg

    r8af551c r158ad68  
    1414Release:   %{release}
    1515URL:       http://www.net-snmp.org/
    16 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1716
    1817#
    1918# NetSNMP Source
    2019#
    21 %source set net-snmp https://downloads.sourceforge.net/project/net-snmp/net-snmp/%{net_snmp_version}/net-snmp-%{net_snmp_version}.tar.gz
     20%source set net-snmp http://downloads.sourceforge.net/project/net-snmp/net-snmp/%{net_snmp_version}/net-snmp-%{net_snmp_version}.tar.gz
    2221
    2322#
     
    4544  CFLAGS="${CFLAGS} %{net_snmp_cflags}"
    4645
     46  LIBS="-lbsd -lm -lz -lrtemsdefaultconfig" \
    4747  ../${source_dir_net_snmp}/configure \
    4848    --host=%{_host} \
  • source-builder/config/ntp-4-1.cfg

    r8af551c r158ad68  
    1414Release:   %{release}
    1515URL:       http://www.ntp.org/
    16 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1716
    1817#
  • source-builder/config/or1ksim-1-1.cfg

    r8af551c r158ad68  
    1414Release:   %{release}
    1515URL:       https://github.com/openrisc/or1ksim
    16 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1716
    1817#
  • source-builder/config/pixman-0-1.cfg

    r8af551c r158ad68  
    1616Release:   %{release}
    1717URL:       http://www.pixman.org/
    18 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1918
    2019#
  • source-builder/config/protobuf-2-1.cfg

    r8af551c r158ad68  
    1616Release:   %{release}
    1717URL:       https://developers.google.com/protocol-buffers/
    18 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    1918
    2019#
    2120# Protocol Buffers Source
    2221#
    23 %source set protobuf https://github.com/google/protobuf/releases/download/v%{protobuf_version}/protobuf-%{protobuf_version}.tar.gz
     22%source set protobuf https://github.com/protocolbuffers/protobuf/releases/download/v%{protobuf_version}/protobuf-%{protobuf_version}.tar.gz
    2423
    2524#
  • source-builder/config/qemu-1-1.cfg

    r8af551c r158ad68  
    55#
    66
    7 %if %{release} == %{nil}
    8 %define release 1
    9 %endif
     7%define qemu_disables --disable-smartcard-nss
    108
    11 #
    12 # Select Snapshot Macro Maps
    13 #
    14 %select qemu-snapshot
    15 
    16 #
    17 # The description.
    18 #
    19 Name:      qemu-%{qemu_version}-%{_host}-%{release}
    20 Summary:   Qemu is a simulator of various processors.
    21 Version:   %{qemu_version}
    22 Release:   %{release}
    23 URL:       http://www.qemu.org/
    24 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
    25 
    26 #
    27 # Source
    28 #
    29 %source set qemu http://wiki.qemu-project.org/download/qemu-%{qemu_version}.tar.bz2
    30 
    31 #
    32 # Prepare the source code.
    33 #
    34 %prep
    35   build_top=$(pwd)
    36 
    37   source_dir_qemu="qemu-%{qemu_version}"
    38   %source setup qemu -q -n qemu-%{qemu_version}
    39   %patch setup qemu -p1
    40 
    41   cd ${build_top}
    42 
    43 %build
    44   build_top=$(pwd)
    45 
    46   %{build_directory}
    47 
    48   mkdir -p ${build_dir}
    49   cd ${build_dir}
    50 
    51   %if %{pkgconfig check vdeplug}
    52     VDE_CONFIG="--enable-vde"
    53     VDE_CFLAGS="%{pkgconfig cflags vdeplug}"
    54     VDE_LDFLAGS="%{pkgconfig ldflags vdeplug} %{pkgconfig libs vdeplug}"
    55   %endif
    56 
    57   %{host_build_flags}
    58 
    59   if test "%{_build}" != "%{_host}" ; then
    60     CROSS_PREFIX_OPTION="--cross-prefix=%{_host}-"
    61   fi
    62 
    63   SYSROOT=$SB_TMPPREFIX
    64 
    65   #
    66   # The --extra-cflags and --extra-ldflags do not work as expected.
    67   #
    68   # Hack warning: MSYS2 does not seem to convert the path to
    69   #               a shell path from Windows so we keep them
    70   #               separate and handle it in the pkgconfig tool.
    71   #
    72   PKG_CONFIG_DEFAULT_PATH=${PKG_CONFIG_PATH} \
    73   PKG_CONFIG_PATH=$SYSROOT/lib/pkgconfig \
    74   PKG_CONFIG_BUILD_TOP_DIR=$SB_TMPROOT \
    75   %{_ld_library_path}=$SYSROOT/lib \
    76   LDFLAGS="-Wl,-rpath -Wl,/$SB_PREFIX_CLEAN/lib ${VDE_LDFLAGS}" \
    77   CFLAGS="${CFLAGS} ${VDE_CFLAGS}" \
    78   ../${source_dir_qemu}/configure \
    79     --prefix=%{_prefix} \
    80     ${CROSS_PREFIX_OPTION} \
    81     --make=%{__make} \
    82     ${VDE_CONFIG} \
    83     --disable-smartcard-nss \
    84     --disable-werror \
    85     --disable-tools \
    86     --disable-pie \
    87     --disable-vnc \
    88     --disable-sdl \
    89     --disable-gtk \
    90     --disable-opengl \
    91     --disable-netmap
    92 
    93   %{_ld_library_path}=$SYSROOT/lib \
    94   %{__make} %{?_smp_mflags} all
    95 
    96   cd ${build_top}
    97 
    98 %install
    99   build_top=$(pwd)
    100 
    101   %{__rmdir} $SB_BUILD_ROOT
    102 
    103   cd ${build_dir}
    104   %{_ld_library_path}=$SYSROOT/lib \
    105   %{__make} DESTDIR=$SB_BUILD_ROOT install
    106   cd ${build_top}
     9%include %{_configdir}/qemu-common-1.cfg
  • source-builder/config/sqlite-3-1.cfg

    r8af551c r158ad68  
    1212Summary:   SQLite is an in-process library that implements a
    1313           self-contained, serverless, zero-configuration,
    14            transactional SQL database engine.
     14           transactional SQL database engine.
    1515Version:   %{sqlite_version}
    1616Release:   %{release}
    17 URL:       http://www.sqlite.org/
    18 BuildRoot: %{_tmppath}/%{name}-root-%(%{__id_u} -n)
     17URL:       https://www.sqlite.org/
    1918
    2019#
    2120# Sqlite Source
    2221#
    23 %source set sqlite http://www.sqlite.org/%{sqlite_src_year}/sqlite-src-%{sqlite_src_version}.zip
     22%source set sqlite \
     23    https://www.sqlite.org/%{sqlite_src_year}/sqlite-autoconf-%{sqlite_src_version}.tar.gz
    2424
    2525#
     
    2929  build_top=$(pwd)
    3030
    31   source_dir_sqlite="sqlite-src-%{sqlite_src_version}"
    32   %source setup sqlite -q -n sqlite-src-%{sqlite_src_version}
     31  source_dir_sqlite="sqlite-autoconf-%{sqlite_src_version}"
     32  %source setup sqlite -q -n sqlite-autoconf-%{sqlite_src_version}
    3333  %patch setup sqlite -p1
    3434
     
    4545  %{host_build_flags}
    4646
    47   CFLAGS="${CFLAGS} -DSQLITE_OMIT_WAL=1 -DSQLITE_ENABLE_COLUMN_METADATA=1"
     47  # RTEMS-specific SQLite configuration options.
     48  # See also
     49  # - https://sqlite.org/wal.html#noshm
     50  # - https://sqlite.org/malloc.html
     51  #
     52  # Many other compile-time options may be passed in via CFLAGS.
     53  #   See also https://sqlite.org/compile.html
     54  #
     55  # RTEMS filesystems do not support POSIX advisory file locks.  Applications
     56  # must choose an appropriate SQLite VFS which avoids them, such as unix-none
     57  # (no locking at all: Application logic must avoid collisions) or
     58  # unix-dotfile.  This step must be performed at application startup time.
     59  #   See also https://sqlite.org/c3ref/vfs_find.html
     60  #
     61  CFLAGS="${CFLAGS} -DSQLITE_MAX_MMAP_SIZE=0 -DSQLITE_DEFAULT_LOCKING_MODE=1 -DSQLITE_ENABLE_MEMSYS5"
    4862
    4963  ../${source_dir_sqlite}/configure \
     
    5973    --datadir=%{_datadir} \
    6074    --disable-largefile \
    61     --disable-tcl \
    62     --disable-readline \
    63     --disable-amalgamation
     75    --disable-readline
    6476
    6577  %{__make} %{?_smp_mflags} sqlite3.h libsqlite3.la
    66 
    67   #
    68   # Create the sqlite shell executable so the install works.
    69   #
    70   touch sqlite3
    7178
    7279  cd ${build_top}
     
    7885
    7986  cd ${build_dir}
    80   %{__make} DESTDIR=$SB_BUILD_ROOT install
     87  # Warning: The unusual install targets avoid attempting to compile and link
     88  # the SQLite3 command-line shell.  The SQLite3 shell is not supported by
     89  # RTEMS.
     90  %{__make} DESTDIR=$SB_BUILD_ROOT install-data install-libLTLIBRARIES
    8191  cd ${build_top}
    82 
    83   #
    84   # Remove the sqlite shell as it is just a touch.
    85   #
    86   %{__rm} $SB_BUILD_ROOT%{_bindir}/sqlite3
  • source-builder/defaults.mc

    r8af551c r158ad68  
    4141# Set to invalid values.
    4242_bset:               none,    none,     ''
     43_bset_tmp:           none,    none,     ''
    4344name:                none,    none,     ''
    4445version:             none,    none,     ''
     
    5657
    5758# RTEMS release URL
    58 rtems_release_url:   none,    none,     'ftp://ftp.rtems.org/pub/rtems/releases/%{rtems_version}'
     59rtems_release_url:   none,    none,     'https://ftp.rtems.org/pub/rtems/releases/%{rtems_version}'
    5960
    6061# The user
    61 _uid:                none,    convert,  '%(%{__id_u} -n)'
     62_uid:                none,    convert,  '%(%{__id_u})'
    6263
    6364# Default flags that can be overridded to supply specific host or build
    6465# flags and include paths to the tools. The host is the final platform
    6566# the tools will run on and build is the host building the tools.
    66 host_cflags:         none,    convert,  '-O2 -pipe'
    67 host_cxxflags:       none,    convert,  '-O2 -pipe'
     67host_cflags:         none,    convert,  '-O2 -g -pipe'
     68host_cxxflags:       none,    convert,  '-O2 -g -pipe'
     69host_ldflags:        none,    convert,  ''
    6870host_includes:       none,    convert,  ''
    69 build_cflags:        none,    convert,  '-O2 -pipe'
    70 build_cxxflags:      none,    convert,  '-O2 -pipe'
     71host_libs:           none,    convert,  ''
     72build_cflags:        none,    convert,  '-O2 -g -pipe'
     73build_cxxflags:      none,    convert,  '-O2 -g -pipe'
     74build_ldflags:       none,    convert,  ''
    7175build_includes:      none,    convert,  ''
     76build_libs:          none,    convert,  ''
     77
     78#
     79# Build and staging paths.
     80#
     81buildroot:           dir,     none,     '%{_tmppath}/%{buildname}-%{_uid}'
     82buildcxcroot:        dir,     none,     '%{_tmppath}/%{buildname}-%{_uid}-cxc'
     83buildxcroot:         dir,     none,     '%{_tmppath}/%{buildname}-%{_uid}-xx'
     84stagingroot:         dir,     none,     '%{_tmppath}/sb-%{_uid}-staging'
     85
     86#
     87# Install mode can be installing or staging. Defaults to installing.
     88#
     89install_mode:        none,    none,     'installing'
    7290
    7391# Extra path a platform can override.
     
    90108_docdir:             dir,     none,     '%{_defaultdocdir}'
    91109_tmppath:            dir,     none,     '%{_topdir}/build/tmp'
    92 _tmproot:            dir,     none,     '%{_tmppath}/sb-%{_uid}/%{_bset}'
    93 _tmpcxcroot:         dir,     none,     '%{_tmppath}/sb-%{_uid}-cxc/%{_bset}'
    94 buildroot:           dir,     none,     '%{_tmppath}/%{buildname}-%{_uid}'
    95 buildcxcroot:        dir,     none,     '%{_tmppath}/%{buildname}-%{_uid}-cxc'
    96 buildxcroot:         dir,     none,     '%{_tmppath}/%{buildname}-%{_uid}-xx'
     110_tmproot:            dir,     none,     '%{_tmppath}/sb-%{_uid}/%{_bset_tmp}'
     111_tmpcxcroot:         dir,     none,     '%{_tmppath}/sb-%{_uid}-cxc/%{_bset_tmp}'
    97112_datadir:            dir,     none,     '%{_prefix}/share'
    98113_defaultdocdir:      dir,     none,     '%{_prefix}/share/doc'
     114_dry_run:            none,    none,     '0'
    99115_exeext:             none,    none,     ''
    100116_exec_prefix:        dir,     none,     '%{_prefix}'
     
    124140_varrun:             dir,     none,     '%{_var}/run'
    125141
     142# Get source state
     143_rsb_getting_source: none,    none,     '0'
     144
    126145# Defaults, override in platform specific modules.
    127146___setup_shell:      exe,     required, '/bin/sh'
     
    139158__bzip2:             exe,     required, '/usr/bin/bzip2'
    140159__cat:               exe,     required, '/bin/cat'
    141 __cc:                exe,     required, '/usr/bin/gcc'
     160__cc:                exe,     required, 'gcc'
    142161__chgrp:             exe,     required, '/usr/bin/chgrp'
    143162__chmod:             exe,     required, '/bin/chmod'
    144163__chown:             exe,     required, '/usr/sbin/chown'
     164__cmake:             exe,     optional, '/usr/bin/cmake'
    145165__cp:                exe,     required, '/bin/cp'
    146166__cpp:               exe,     none,     '%{__cc} -E'
    147167__cvs:               exe,     optional, '/usr/bin/cvs'
    148168__cvs_z:             none,    none,     '%{__cvs} -z 9'
    149 __cxx:               exe,     required, '/usr/bin/g++'
     169__cxx:               exe,     required, 'g++'
    150170__flex:              exe,     required, '/usr/bin/flex'
    151171__git:               exe,     required, '/usr/bin/git'
     
    180200__sh:                exe,     required, '/bin/sh'
    181201__tar:               exe,     required, '/usr/bin/tar'
    182 __tar_extract:       exe,     none,     '%{__tar} -xvvf'
     202__tar_extract:       exe,     none,     '%{__tar} -xvv'
    183203__touch:             exe,     required, '/usr/bin/touch'
    184204__unzip:             exe,     required, '/usr/bin/unzip'
     
    191211
    192212# Prebuild set up script.
    193 ___build_pre:        none,    none,     '''# ___build_pre in as set up in defaults.py
     213___build_pre:        none,    none,     '''# ___build_pre as set up in defaults.py
    194214# Save the original path away.
    195215export SB_ORIG_PATH=${PATH}
     
    199219SB_SOURCE_DIR="%{_sourcedir}"
    200220SB_BUILD_DIR="%{_builddir}"
    201 # host == build, use build; host != build , host uses host and build uses build
    202 SB_HOST_CFLAGS="%{host_cflags} %{host_includes}"
    203 SB_HOST_CXXFLAGS="%{host_cxxflags} %{host_includes}"
    204 SB_HOST_LDFLAGS="%{?host_ldflags:%{host_ldflags}}%{?_tmproot:-L%{_tmproot}/${SB_PREFIX_CLEAN}/lib}"
     221# host == build, use build; host != build, host uses host and build uses build
     222SB_HOST_CPPFLAGS="%{host_includes}"
     223# Optionally do not add includes to c/cxx flags as newer configure's complain
     224SB_HOST_CFLAGS="%{host_cflags} %{!?host_cflags_no_includes %{host_includes}}"
     225SB_HOST_CXXFLAGS="%{host_cxxflags} %{!?host_cflags_no_includes %{host_includes}}"
     226SB_HOST_LDFLAGS="%{host_ldflags} %{?_tmproot:-L%{_tmproot}/${SB_PREFIX_CLEAN}/lib}"
     227SB_HOST_LIBS="%{host_libs}"
    205228SB_BUILD_CFLAGS="%{build_cflags} %{?_tmproot:-I%{_tmproot}/${SB_PREFIX_CLEAN}/include}"
    206229SB_BUILD_CXXFLAGS="%{build_cxxflags} %{?_tmproot:-I%{_tmproot}/${SB_PREFIX_CLEAN}/include}"
    207 SB_BUILD_LDFLAGS="%{?build_ldflags:%{build_ldflags}}%{?_tmproot:-L%{_tmproot}/${SB_PREFIX_CLEAN}/lib}"
     230SB_BUILD_LDFLAGS="%{build_ldflags} %{?_tmproot:-L%{_tmproot}/${SB_PREFIX_CLEAN}/lib}"
     231SB_BUILD_LBS="%{build_libs}"
    208232SB_CFLAGS="${SB_BUILD_CFLAGS} %{build_includes}"
    209233SB_CXXFLAGS="${SB_BUILD_CXXFLAGS} %{build_includes}"
     
    211235SB_OS="%{_os}"
    212236export SB_SOURCE_DIR SB_BUILD_DIR SB_ARCH SB_OS
    213 export SB_HOST_CFLAGS SB_HOST_CXXFLAGS SB_HOST_LDFLAGS
    214 export SB_BUILD_CFLAGS SB_BUILD_CXXFLAGS SB_BUILD_LDFLAGS
     237export SB_HOST_CPPFLAGS SB_HOST_CFLAGS SB_HOST_CXXFLAGS SB_HOST_LDFLAGS SB_HOST_LIBS
     238export SB_BUILD_CFLAGS SB_BUILD_CXXFLAGS SB_BUILD_LDFLAGS SB_BUILD_LIBS
    215239export SB_CFLAGS SB_CXXFLAGS
    216240# Documentation
     
    299323build_directory:     none,    none,     '''
    300324if test "%{_build}" != "%{_host}" ; then
    301   if test -z "%{_target}" ; then
     325  # Cross-build (Xc) if no target or the host and target match.
     326  # Canadian-cross (Cxc) if build, host and target are all different.
     327  if test -z "%{_target}" -o "%{_host}" == "%{_target}" ; then
    302328    build_dir="build-xc"
    303329  else
     
    317343  CC=$(echo "%{_host}-%{_host_cc}" | sed -e 's,-std=gnu99 ,,')
    318344  CXX=$(echo "%{_host}-%{_host_cxx}" | sed -e 's,-std=gnu99 ,,')
     345  CPPFLAGS="${SB_HOST_CPPFLAGS}"
    319346  CFLAGS="${SB_HOST_CFLAGS}"
    320347  CXXFLAGS="${SB_HOST_CXXFLAGS}"
    321348  LDFLAGS="${SB_HOST_LDFLAGS}"
     349  LDLIBS="${SB_HOST_LIBS}"
     350  LIBS="${SB_HOST_LIBS}"
    322351  # Host
     352  CPPFLAGS_FOR_HOST="${SB_HOST_CPPFLAGS}"
    323353  CFLAGS_FOR_HOST="${SB_HOST_CFLAGS}"
    324354  CXXFLAGS_FOR_HOST="${SB_HOST_CXXFLAGS}"
    325355  LDFLAGS_FOR_HOST="${SB_HOST_LDFLAGS}"
     356  LDLIBS_FOR_HOST="${SB_HOST_LIBS}"
     357  LIBS_FOR_HOST="${SB_HOST_LIBS}"
    326358  CXXFLAGS_FOR_HOST="${SB_HOST_CFLAGS}"
    327359  CC_FOR_HOST=$(echo "%{_host_cc} ${SB_HOST_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
     
    331363  CXXFLAGS_FOR_BUILD="${SB_BUILD_CXXFLAGS}"
    332364  LDFLAGS_FOR_BUILD="${SB_BUILD_LDFLAGS}"
     365  LDLIBS_FOR_BUILD="${SB_BUILD_LIBS}"
     366  LIBS_FOR_BUILD="${SB_BUILD_LIBS}"
    333367  CXXFLAGS_FOR_BUILD="${SB_BUILD_CFLAGS}"
    334368  CC_FOR_BUILD=$(echo "%{__cc} ${SB_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
     
    336370else
    337371  LDFLAGS="${SB_BUILD_LDFLAGS}"
     372  LDLIBS="${SB_BUILD_LIBS}"
     373  LIBS="${SB_BUILD_LIBS}"
    338374  CC=$(echo "%{__cc} ${SB_BUILD_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
    339375  CXX=$(echo "%{__cxx} ${SB_BUILD_CXXFLAGS}" | sed -e 's,-std=gnu99 ,,')
     
    341377  CXX_FOR_BUILD=${CXX}
    342378fi
    343 export CC CXX CFLAGS CXXFLAGS LDFLAGS
    344 export CC_FOR_HOST CXX_FOR_HOST CFLAGS_FOR_HOST CXXFLAGS_FOR_HOST LDFLAGS_FOR_HOST
    345 export CC_FOR_BUILD CXX_FOR_BUILD CFLAGS_FOR_BUILD CXXFLAGS_FOR_BUILD LDFLAGS_FOR_BUILD'''
     379export CC CXX CPPFLAGS CFLAGS CXXFLAGS LDFLAGS LIBS LDLIBS
     380export CC_FOR_HOST CXX_FOR_HOST CPPFLAGS_FOR_HOST CFLAGS_FOR_HOST CXXFLAGS_FOR_HOST LDFLAGS_FOR_HOST LDLIBS_FOR_HOST LIBS_FOR_HOST
     381export CC_FOR_BUILD CXX_FOR_BUILD CFLAGS_FOR_BUILD CXXFLAGS_FOR_BUILD LDFLAGS_FOR_BUILD LDLIBS_FOR_BUILS LIBS_FOR_BUILS'''
    346382
    347383# Build/build flags.
     
    350386# gcc is not ready to be compiled with -std=gnu99
    351387LDFLAGS="${SB_HOST_LDFLAGS}"
     388LIBS="${SB_HOST_LIBS}"
    352389CC=$(echo "%{__cc} ${SB_CFLAGS}" | sed -e 's,-std=gnu99 ,,')
    353390CXX=$(echo "%{__cxx} ${SB_CXXFLAGS}" | sed -e 's,-std=gnu99 ,,')
    354391CC_FOR_BUILD=${CC}
    355392CXX_FOR_BUILD=${CXX}
    356 export CC CXX CC_FOR_BUILD CXX_FOR_BUILD CFLAGS LDFLAGS'''
     393export CC CXX CC_FOR_BUILD CXX_FOR_BUILD CFLAGS LDFLAGS LIBS'''
    357394
    358395# Default package settings
     
    362399# Mail Support
    363400_mail_smtp_host:   none,         none, 'localhost'
    364 _mail_tools_to:    none,         none, 'rtems-tooltestresults@rtems.org'
     401_mail_tools_to:    none,         none, 'build@rtems.org'
    365402
    366403# Newlib ICONV encodings
     
    373410utf_16,utf_16be,utf_16le,utf_8,win_1250,win_1251,win_1252,\
    374411win_1253,win_1254,win_1255,win_1256,win_1257,win_1258'''
     412
     413# Waf build root suffix, only use for win32 mingw ming32 OSs
     414#
     415# If on Windows we need to add the driver prefix to the built root as waf
     416# strips the driver prefix from the prefix path when joining it to the
     417# destdir path. Waf is correct in doing this and the RSB is design to match
     418# the configure behaviour which treats the whole path including the drive
     419# prefix as part of the path as just a path.
     420#
     421waf_build_root_suffix:   none,  none, ' %(echo %{_prefix} | cut -c 1-2)'
     422
     423# Makefile.inc support for staging
     424rtems_makefile_inc:      none,  none, '''
     425export RTEMS_ROOT=%{rtems_bsp_rtems_root}
     426export PROJECT_RELEASE=%{rtems_bsp_prefix}
     427export RTEMS_MAKEFILE_PATH=%{rtems_bsp_prefix}
     428'''
  • source-builder/pkg-config

    r8af551c r158ad68  
    3636
    3737base = os.path.dirname(sys.argv[0])
    38 sys.path.insert(0, base + '/sb')
    3938
    4039try:
     
    4847        sys.exit(1)
    4948
    50 try:
    51     import pkgconfig
    52 except ImportError:
    53     print("Incorrect Source Builder installation", file = sys.stderr)
    54     sys.exit(1)
     49import sb.pkgconfig
    5550
    5651#
    5752# Make trace true to get a file of what happens and what is being asked.
    5853#
    59 trace = True
     54trace = False
    6055trace_stdout = False
    6156logfile = 'pkg-config.log'
     
    6661# Write all the package source parsed to a single file.
    6762#
    68 trace_src = True
     63trace_src = False
    6964if trace_src:
    7065    srcfd = open('pkg-src.txt', 'w')
     
    165160                      help = 'Ignored')
    166161    opts.add_argument('--prefix-variable', dest = 'prefix', action = 'store',
    167                       nargs = 1, default = pkgconfig.default_prefix(),
     162                      nargs = 1, default = sb.pkgconfig.default_prefix(),
    168163                      help = 'Define the prefix.')
    169164    opts.add_argument('--static', dest = 'static', action = 'store_true',
     
    174169                      help = 'Dump the package if one is found.')
    175170
    176     args = opts.parse_args(argv[1:])
     171    args = opts.parse_args(argv)
    177172
    178173    if (args.exists and (args.exact_version or args.max_version)) or \
     
    182177
    183178    if args.dont_define_prefix:
    184         args.prefix = pkgconfig.default_prefix(False)
     179        args.prefix = sb.pkgconfig.default_prefix(False)
    185180
    186181    exists = False
     
    191186        ec = 0
    192187    else:
    193         ec, pkg, flags = pkgconfig.check_package(args.libraries, args, log, src)
     188        ec, pkg, flags = sb.pkgconfig.check_package(args.libraries, args, log, src)
    194189        if ec == 0:
    195190            if args.cflags:
     
    213208    log('-' * 40)
    214209    log('pkg-config', lf = False)
    215     for a in sys.argv[1:]:
     210    for a in sys.argv[2:]:
    216211        log(' "%s"' % (a), lf = False)
    217212    log('')
    218     ec = run(sys.argv)
     213    ec = run(sys.argv[1:])
    219214    log('ec = %d' % (ec))
    220215except ImportError:
    221216    print("incorrect package config installation", file = sys.stderr)
    222217    sys.exit(1)
    223 except pkgconfig.error as e:
     218except sb.pkgconfig.error as e:
    224219    print('error: %s' % (e), file = sys.stderr)
    225220    sys.exit(1)
  • source-builder/sb-check

    r8af551c r158ad68  
    2121from __future__ import print_function
    2222
    23 import sys, os
    24 base = os.path.dirname(sys.argv[0])
    25 sys.path.insert(0, base + '/sb')
    2623try:
    27     import check
    28     check.run()
     24    import sb.check
     25    sb.check.run()
    2926except ImportError:
     27    import sys
    3028    print("Incorrect Source Builder installation", file = sys.stderr)
    3129    sys.exit(1)
  • source-builder/sb-defaults

    r8af551c r158ad68  
    2121from __future__ import print_function
    2222
    23 import sys, os
    24 base = os.path.dirname(sys.argv[0])
    25 sys.path.insert(0, base + '/sb')
     23import sys
     24
    2625try:
    27     import options
    28     options.run(sys.argv)
     26    import sb.options
     27    sb.options.run(sys.argv)
    2928except ImportError:
    3029    print("Incorrect Source Builder installation", file = sys.stderr)
  • source-builder/sb-reports

    r8af551c r158ad68  
    2121from __future__ import print_function
    2222
    23 import sys, os
    24 base = os.path.dirname(sys.argv[0])
    25 sys.path.insert(0, base + '/sb')
     23import sys
     24
    2625try:
    27     import reports
    28     reports.run(sys.argv)
     26    import sb.reports
     27    sb.reports.run(sys.argv)
    2928except ImportError:
    3029    print("Incorrect Source Builder installation", file = sys.stderr)
  • source-builder/sb-rtems-config

    r8af551c r158ad68  
    2121from __future__ import print_function
    2222
    23 import sys, os
    24 base = os.path.dirname(sys.argv[0])
    25 sys.path.insert(0, base + '/sb')
     23import sys
     24
    2625try:
    27     import rtemsconfig
    28     rtemsconfig.run(sys.argv)
     26    import sb.rtemsconfig
     27    sb.rtemsconfig.run(sys.argv)
    2928except ImportError:
    3029    print("Incorrect Source Builder installation", file = sys.stderr)
  • source-builder/sb-set-builder

    r8af551c r158ad68  
    2121from __future__ import print_function
    2222
    23 import sys, os
    24 base = os.path.dirname(sys.argv[0])
    25 sys.path.insert(0, base + '/sb')
    26 
    2723try:
    28     import setbuilder
    29     setbuilder.run()
     24    import sb.setbuilder
     25    sb.setbuilder.run()
    3026except ImportError:
     27    import sys
    3128    print("Incorrect Source Builder installation", file = sys.stderr)
    3229    sys.exit(1)
  • source-builder/sb/build.py

    r8af551c r158ad68  
    11#
    22# RTEMS Tools Project (http://www.rtems.org/)
    3 # Copyright 2010-2013 Chris Johns (chrisj@rtems.org)
     3# Copyright 2010-2018 Chris Johns (chrisj@rtems.org)
    44# All rights reserved.
    55#
     
    3434
    3535try:
    36     import check
    37     import config
    38     import download
    39     import error
    40     import ereport
    41     import execute
    42     import log
    43     import options
    44     import path
    45     import sources
    46     import version
     36    from . import check
     37    from . import config
     38    from . import download
     39    from . import error
     40    from . import ereport
     41    from . import execute
     42    from . import log
     43    from . import options
     44    from . import path
     45    from . import sources
     46    from . import version
    4747except KeyboardInterrupt:
    4848    print('abort: user terminated')
    4949    sys.exit(1)
    5050except:
    51     print('error: unknown application load error')
    52     sys.exit(1)
     51    raise
     52
     53def humanize_number(num, suffix):
     54    for unit in ['','K','M','G','T','P','E','Z']:
     55        if abs(num) < 1024.0:
     56            return "%5.3f%s%s" % (num, unit, suffix)
     57        num /= 1024.0
     58    return "%.3f%s%s" % (size, 'Y', suffix)
     59
     60def short_name(name):
     61    #
     62    # If on Windows use short names to keep the build paths as short as possible.
     63    #
     64    if options.host_windows:
     65        buildname = ''
     66        add = True
     67        for n in name.split('-'):
     68            buildname += n[0]
     69        return buildname
     70    else:
     71        return name
    5372
    5473class script:
     
    6382
    6483    def append(self, text):
     84        is_str = False
    6585        if type(text) is str:
     86            is_str = True
     87        try:
     88            if type(text) is unicode:
     89                is_str = True
     90        except:
     91            pass
     92        if is_str:
    6693            text = text.splitlines()
    6794        if not log.quiet:
     
    94121    """Build a package given a config file."""
    95122
    96     def _name_(self, name):
    97         #
    98         # If on Windows use shorter names to keep the build paths.
    99         #
    100         if options.host_windows:
    101             buildname = ''
    102             add = True
    103             for c in name:
    104                 if c == '-':
    105                     add = True
    106                 elif add:
    107                     buildname += c
    108                     add = False
    109             return buildname
    110         else:
    111             return name
    112 
    113123    def _generate_report_(self, header, footer = None):
    114         label, result = self.opts.with_arg('error-report')
    115         if (label.startswith('without_') and result != 'yes') or \
    116            (label.startswith('with_') and result != 'no'):
    117             ereport.generate('rsb-report-%s.txt' % self.macros['name'],
    118                              self.opts, header, footer)
     124        ereport.generate('rsb-report-%s.txt' % self.macros['name'],
     125                         self.opts, header, footer)
    119126
    120127    def __init__(self, name, create_tar_files, opts, macros = None):
     
    128135            self.set_macros(macros)
    129136            self.config = config.file(name, opts, self.macros)
    130             self.script = script()
    131             self.macros['buildname'] = self._name_(self.macros['name'])
     137            self.script_build = script()
     138            self.script_clean = script()
     139            self.macros['buildname'] = short_name(self.macros['name'])
    132140        except error.general as gerr:
    133141            log.notice(str(gerr))
     
    195203            not _canadian_cross
    196204
    197     def source(self, name):
     205    def source(self, name, strip_components, download_only):
    198206        #
    199207        # Return the list of sources. Merge in any macro defined sources as
     
    230238                       os_ = o.split('=')
    231239                       if len(os_) != 2:
    232                            raise error.general('invalid --rsb-file option: %s' % (' '.join(args)))
     240                           raise error.general('invalid --rsb-file option: %s' % \
     241                                               (' '.join(args)))
    233242                       if os_[0] != '--rsb-file':
    234                            raise error.general('invalid --rsb-file option: %s' % (' '.join(args)))
     243                           raise error.general('invalid --rsb-file option: %s' % \
     244                                               (' '.join(args)))
    235245                       file_override = os_[1]
    236246                opts = [o for o in opts if not o.startswith('--rsb-')]
    237247            url = self.config.expand(' '.join(url))
    238             src = download.parse_url(url, '_sourcedir', self.config, self.opts, file_override)
     248            src = download.parse_url(url, '_sourcedir',
     249                                     self.config, self.opts, file_override)
    239250            download.get_file(src['url'], src['local'], self.opts, self.config)
    240             if 'symlink' in src:
    241                 sname = name.replace('-', '_')
    242                 src['script'] = '%%{__ln_s} %s ${source_dir_%s}' % (src['symlink'], sname)
    243             elif 'compressed' in src:
    244                 #
    245                 # Zip files unpack as well so do not use tar.
    246                 #
    247                 src['script'] = '%s %s' % (src['compressed'], src['local'])
    248                 if src['compressed-type'] != 'zip':
    249                     src['script'] += ' | %{__tar_extract} -'
    250             else:
    251                 src['script'] = '%%{__tar_extract} %s' % (src['local'])
    252             srcs += [src]
     251            if not download_only:
     252                if strip_components > 0:
     253                    tar_extract = '%%{__tar_extract} --strip-components %d' % \
     254                        (strip_components)
     255                else:
     256                    tar_extract = '%{__tar_extract}'
     257                if 'symlink' in src:
     258                    sname = name.replace('-', '_')
     259                    src['script'] = '%%{__ln_s} %s ${source_dir_%s}' % \
     260                        (src['symlink'], sname)
     261                elif 'compressed' in src:
     262                    #
     263                    # Zip files unpack as well so do not use tar.
     264                    #
     265                    src['script'] = '%s %s' % (src['compressed'], src['local'])
     266                    if src['compressed-type'] != 'zip':
     267                        src['script'] += ' | %s -f -' % (tar_extract)
     268                else:
     269                    src['script'] = '%s -f %s' % (tar_extract, src['local'])
     270                srcs += [src]
    253271        return srcs
    254272
     
    258276        args = args[1:]
    259277        try:
    260             opts, args = getopt.getopt(args[1:], 'qDcn:ba')
     278            opts, args = getopt.getopt(args[1:], 'qDcn:bas:gE')
    261279        except getopt.GetoptError as ge:
    262280            raise error.general('source setup error: %s' % str(ge))
     
    268286        created_dir = False
    269287        changed_dir = False
     288        no_errors = False
     289        strip_components = 0
    270290        opt_name = None
     291        download_only = False
    271292        for o in opts:
    272293            if o[0] == '-q':
     
    282303            elif o[0] == '-a':
    283304                unpack_before_chdir = False
     305            elif o[0] == '-E':
     306                no_errors = True
     307            elif o[0] == '-s':
     308                if not o[1].isdigit():
     309                    raise error.general('source setup error: invalid strip count: %s' % \
     310                                        (o[1]))
     311                strip_components = int(o[1])
     312            elif o[0] == '-g':
     313                download_only = True
    284314        name = None
    285         for source in self.source(setup_name):
     315        for source in self.source(setup_name, strip_components, download_only):
    286316            if name is None:
    287317                if opt_name is None:
     
    289319                        opt_name = source['name']
    290320                    else:
    291                         raise error.general('setup source tag not found: %d' % (source_tag))
     321                        raise error.general('setup source tag not found: %d' % \
     322                                            (source_tag))
    292323                else:
    293324                    name = opt_name
    294             self.script.append(self.config.expand('cd %{_builddir}'))
    295             if not deleted_dir and  delete_before_unpack:
    296                 self.script.append(self.config.expand('%{__rm} -rf ' + name))
    297                 deleted_dir = True
    298             if not created_dir and create_dir:
    299                 self.script.append(self.config.expand('%{__mkdir_p} ' + name))
    300                 created_dir = True
    301             if not changed_dir and (not unpack_before_chdir or create_dir):
    302                 self.script.append(self.config.expand('cd ' + name))
    303                 changed_dir = True
    304             self.script.append(self.config.expand(source['script']))
    305         if not changed_dir and (unpack_before_chdir and not create_dir):
    306             self.script.append(self.config.expand('cd ' + name))
     325            if not download_only:
     326                self.script_build.append(self.config.expand('cd %{_builddir}'))
     327                if not deleted_dir and delete_before_unpack and name is not None:
     328                    self.script_build.append(self.config.expand('%{__rm} -rf ' + name))
     329                    deleted_dir = True
     330                if not created_dir and create_dir and name is not None:
     331                    self.script_build.append(self.config.expand('%{__mkdir_p} ' + name))
     332                    created_dir = True
     333                if not changed_dir and (not unpack_before_chdir or create_dir) and \
     334                   name is not None:
     335                    self.script_build.append(self.config.expand('cd ' + name))
     336                    changed_dir = True
     337                #
     338                # On Windows tar can fail on links if the link appears in the
     339                # tar file before the target of the link exists. We can assume the
     340                # tar file is correct, that is all files and links are valid,
     341                # so on error redo the untar a second time.
     342                #
     343                if options.host_windows or no_errors:
     344                    self.script_build.append('set +e')
     345                self.script_build.append(self.config.expand(source['script']))
     346                if options.host_windows or not no_errors:
     347                    self.script_build.append('tar_exit=$?')
     348                if options.host_windows or no_errors:
     349                    self.script_build.append('set -e')
     350                if options.host_windows:
     351                    if no_errors:
     352                        self.script_build.append(' set +e')
     353                        self.script_build.append(' ' + self.config.expand(source['script']))
     354                        self.script_build.append(' set -e')
     355                    else:
     356                        self.script_build.append('if test $tar_exit != 0; then')
     357                        self.script_build.append(' ' + self.config.expand(source['script']))
     358                        self.script_build.append('fi')
     359        if not changed_dir and (unpack_before_chdir and not create_dir) and \
     360           name is not None and not download_only:
     361            self.script_build.append(self.config.expand('cd ' + name))
    307362            changed_dir = True
    308         self.script.append(self.config.expand('%{__setup_post}'))
     363        self.script_build.append(self.config.expand('%{__setup_post}'))
    309364
    310365    def patch_setup(self, package, args):
     
    328383                    url += [pp]
    329384            if len(url) == 0:
    330                 raise error.general('patch URL not found: %s' % (' '.join(args)))
     385                raise error.general('patch URL not found: %s' % (' '.join(opts)))
    331386            #
    332387            # Look for --rsb-file as an option we use as a local file name.
     
    340395                       os_ = o.split('=')
    341396                       if len(os_) != 2:
    342                            raise error.general('invalid --rsb-file option: %s' % (' '.join(args)))
     397                           raise error.general('invalid --rsb-file option: %s' % \
     398                                               (' '.join(opts)))
    343399                       if os_[0] != '--rsb-file':
    344                            raise error.general('invalid --rsb-file option: %s' % (' '.join(args)))
     400                           raise error.general('invalid --rsb-file option: %s' % \
     401                                               (' '.join(opts)))
    345402                       file_override = os_[1]
    346403                opts = [o for o in opts if not o.startswith('--rsb-')]
     
    354411            # Parse the URL first in the source builder's patch directory.
    355412            #
    356             patch = download.parse_url(url, '_patchdir', self.config, self.opts, file_override)
     413            patch = download.parse_url(url, '_patchdir', self.config,
     414                                       self.opts, file_override)
    357415            #
    358416            # Download the patch
     
    364422                patch['script'] = '%{__cat} ' + patch['local']
    365423            patch['script'] += ' | %%{__patch} %s' % (opts)
    366             self.script.append(self.config.expand(patch['script']))
     424            self.script_build.append(self.config.expand(patch['script']))
    367425
    368426    def run(self, command, shell_opts = '', cwd = None):
     
    382440
    383441    def prep(self, package):
    384         self.script.append('echo "==> %prep:"')
     442        self.script_build.append('echo "==> %prep:"')
    385443        _prep = package.prep()
    386444        if _prep:
     
    404462                        self.hash(package, args)
    405463                    else:
    406                         self.script.append(' '.join(args))
     464                        self.script_build.append(' '.join(args))
    407465
    408466    def build(self, package):
    409         self.script.append('echo "==> clean %{buildroot}: ${SB_BUILD_ROOT}"')
    410         self.script.append('%s ${SB_BUILD_ROOT}' %
    411                            (self.config.expand('%{__rmdir}')))
    412         self.script.append('%s ${SB_BUILD_ROOT}' %
    413                            (self.config.expand('%{__mkdir_p}')))
    414         self.script.append('echo "==> %build:"')
     467        self.script_build.append('echo "==> clean %{buildroot}: ${SB_BUILD_ROOT}"')
     468        self.script_build.append('%s ${SB_BUILD_ROOT}' %
     469                                 (self.config.expand('%{__rmdir}')))
     470        self.script_build.append('%s ${SB_BUILD_ROOT}' %
     471                                 (self.config.expand('%{__mkdir_p}')))
     472        self.script_build.append('echo "==> %build:"')
    415473        _build = package.build()
    416474        if _build:
    417475            for l in _build:
    418                 self.script.append(l)
     476                self.script_build.append(l)
    419477
    420478    def install(self, package):
    421         self.script.append('echo "==> %install:"')
     479        self.script_build.append('echo "==> %install:"')
    422480        _install = package.install()
    423481        if _install:
    424482            for l in _install:
    425483                args = l.split()
    426                 self.script.append(' '.join(args))
     484                self.script_build.append(' '.join(args))
    427485
    428486    def files(self, package):
    429487        if self.create_tar_files \
    430488           and not self.macros.get('%{_disable_packaging'):
    431             self.script.append('echo "==> %files:"')
     489            self.script_build.append('echo "==> %files:"')
    432490            inpath = path.abspath(self.config.expand('%{buildroot}'))
    433491            tardir = path.abspath(self.config.expand('%{_tardir}'))
    434             self.script.append(self.config.expand('if test -d %s; then' % (inpath)))
    435             self.script.append(self.config.expand('  %%{__mkdir_p} %s' % tardir))
    436             self.script.append(self.config.expand('  cd ' + inpath))
     492            self.script_build.append(self.config.expand('if test -d %s; then' % (inpath)))
     493            self.script_build.append(self.config.expand('  %%{__mkdir_p} %s' % tardir))
     494            self.script_build.append(self.config.expand('  cd ' + inpath))
    437495            tar = path.join(tardir, package.long_name() + '.tar.bz2')
    438496            cmd = self.config.expand('  %{__tar} -cf - . ' + '| %{__bzip2} > ' + tar)
    439             self.script.append(cmd)
    440             self.script.append(self.config.expand('  cd %{_builddir}'))
    441             self.script.append('fi')
     497            self.script_build.append(cmd)
     498            self.script_build.append(self.config.expand('  cd %{_builddir}'))
     499            self.script_build.append('fi')
    442500
    443501    def clean(self, package):
    444         self.script.append('echo "==> %clean:"')
     502        self.script_clean.reset()
     503        self.script_clean.append(self.config.expand('%{___build_template}'))
     504        self.script_clean.append('echo "=> ' + package.name() + ': CLEAN"')
     505        self.script_clean.append('echo "==> %clean:"')
    445506        _clean = package.clean()
    446507        if _clean is not None:
    447508            for l in _clean:
    448509                args = l.split()
    449                 self.script.append(' '.join(args))
     510                self.script_clean.append(' '.join(args))
     511
     512    def sizes(self, package):
     513        def _sizes(package, what, path):
     514            package.set_size(what, path)
     515            s = humanize_number(package.get_size(what), 'B')
     516            log.trace('size: %s (%s): %s (%d)' % (what, path, s, package.get_size(what)))
     517            return s
     518        s = {}
     519        for p in [('build', '%{_builddir}'),
     520                  ('build', '%{buildroot}'),
     521                  ('installed', '%{buildroot}')]:
     522            hs = _sizes(package, p[0], self.config.expand(p[1]))
     523            s[p[0]] = hs
     524        log.notice('sizes: %s: %s (installed: %s)' % (package.name(),
     525                                                      s['build'],
     526                                                      s['installed']))
    450527
    451528    def build_package(self, package):
     
    453530            if not self.config.defined('%{allow_cxc}'):
    454531                raise error.general('Canadian Cross is not allowed')
    455             self.script.append('echo "==> Candian-cross build/target:"')
    456             self.script.append('SB_CXC="yes"')
     532            self.script_build.append('echo "==> Candian-cross build/target:"')
     533            self.script_build.append('SB_CXC="yes"')
    457534        else:
    458             self.script.append('SB_CXC="no"')
     535            self.script_build.append('SB_CXC="no"')
    459536        self.build(package)
    460537        self.install(package)
     
    502579                log.trace('%s' % (str(self.config.macros)))
    503580                log.trace('-' * 70)
    504                 self.script.reset()
    505                 self.script.append(self.config.expand('%{___build_template}'))
    506                 self.script.append('echo "=> ' + name + ':"')
     581                self.script_build.reset()
     582                self.script_build.append(self.config.expand('%{___build_template}'))
     583                self.script_build.append('echo "=> ' + name + ': BUILD"')
    507584                self.prep(package)
    508585                self.build_package(package)
    509586                if not self.opts.dry_run():
    510587                    self.builddir()
    511                     sn = path.join(self.config.expand('%{_builddir}'), 'doit')
    512                     log.output('write script: ' + sn)
    513                     self.script.write(sn)
     588                    build_sn = path.join(self.config.expand('%{_builddir}'), 'do-build')
     589                    log.output('write script: ' + build_sn)
     590                    self.script_build.write(build_sn)
     591                    clean_sn = path.join(self.config.expand('%{_builddir}'), 'do-clean')
     592                    log.output('write script: ' + clean_sn)
     593                    self.script_clean.write(clean_sn)
    514594                    log.notice('building: %s%s' % (cxc_label, name))
    515                     self.run(sn)
     595                    self.run(build_sn)
     596                    self.sizes(package)
     597                    log.notice('cleaning: %s%s' % (cxc_label, name))
     598                    self.run(clean_sn)
    516599            except error.general as gerr:
    517600                log.notice(str(gerr))
     
    540623        return package.disabled()
    541624
     625    def get_build_size(self):
     626        package = self.main_package()
     627        if package.disabled():
     628            return 0
     629        return package.get_size('build')
     630
     631    def get_installed_size(self):
     632        package = self.main_package()
     633        if package.disabled():
     634            return 0
     635        return package.get_size('installed')
     636
     637    def includes(self):
     638        if self.config:
     639            return self.config.includes()
     640
    542641def get_configs(opts):
    543642
     
    553652
    554653    configs = { 'paths': [], 'files': [] }
    555     for cp in opts.defaults.expand('%{_configdir}').split(':'):
     654    paths = opts.defaults.expand('%{_configdir}').split(':')
     655    root = path.host(os.path.commonprefix(paths))
     656    configs['root'] = root
     657    configs['localpaths'] = [lp[len(root):] for lp in paths]
     658    for cp in paths:
    556659        hcp = path.host(path.abspath(cp))
    557660        configs['paths'] += [hcp]
    558         configs['files'] += _scan(hcp, ['.cfg', '.bset'])
     661        hpconfigs = sorted(set(_scan(hcp, ['.cfg', '.bset'])))
     662        hcplocal = hcp[len(root):]
     663        configs[hcplocal] = [path.join(hcplocal, c) for c in hpconfigs]
     664        configs['files'] += hpconfigs
    559665    configs['files'] = sorted(set(configs['files']))
    560666    return configs
     
    577683        optargs = { '--list-configs': 'List available configurations' }
    578684        opts = options.load(args, optargs)
    579         log.notice('RTEMS Source Builder, Package Builder, %s' % (version.str()))
     685        log.notice('RTEMS Source Builder, Package Builder, %s' % (version.string()))
    580686        opts.log_info()
    581687        if not check.host_setup(opts):
  • source-builder/sb/check.py

    r8af551c r158ad68  
    2424from __future__ import print_function
    2525
     26import fnmatch
    2627import os
    27 
    28 import error
    29 import execute
    30 import fnmatch
    31 import log
    32 import options
    33 import path
    3428import re
    35 import version
     29
     30from . import error
     31from . import execute
     32from . import log
     33from . import options
     34from . import path
     35from . import version
    3636
    3737def _check_none(_opts, macro, value, constraint):
     
    105105        paths = os.environ['PATH'].split(os.pathsep)
    106106        for p in paths:
    107             if len(p.strip()) == 0:
     107            try:
     108                if len(p.strip()) == 0:
     109                    if not silent:
     110                        log.notice('error: environment PATH contains an empty path')
     111                    return False
     112                elif not options.host_windows and (p.strip() == '.' or p.strip() == '..'):
     113                    if not silent:
     114                        log.notice('error: environment PATH invalid path: %s' % (p))
     115                    return False
     116                elif not path.exists(p):
     117                    if not silent and opts.warn_all():
     118                        log.notice('warning: environment PATH not found: %s' % (p))
     119                elif not path.isdir(p):
     120                    if not silent and opts.warn_all():
     121                        log.notice('warning: environment PATH not a directory: %s' % (p))
     122            except Exception as e:
    108123                if not silent:
    109                     log.notice('error: environment PATH contains an empty path')
    110                 return False
    111             elif not options.host_windows and (p.strip() == '.' or p.strip() == '..'):
    112                 if not silent:
    113                     log.notice('error: environment PATH invalid path: %s' % (p))
    114                 return False
    115             elif not path.exists(p):
    116                 if not silent and opts.warn_all():
    117                     log.notice('warning: environment PATH not found: %s' % (p))
    118             elif not path.isdir(p):
    119                 if not silent and opts.warn_all():
    120                     log.notice('warning: environment PATH not a directory: %s' % (p))
     124                    log.notice('warning: environment PATH suspicious path: %s' % (e))
    121125    return True
    122126
     
    265269    try:
    266270        _opts = options.load(args = sys.argv, logfile = False)
    267         log.notice('RTEMS Source Builder - Check, %s' % (version.str()))
     271        log.notice('RTEMS Source Builder - Check, %s' % (version.string()))
    268272
    269273        orphans = _opts.parse_args('--check-orphans', error = False, extra = False)
  • source-builder/sb/config.py

    r8af551c r158ad68  
    11#
    22# RTEMS Tools Project (http://www.rtems.org/)
    3 # Copyright 2010-2016 Chris Johns (chrisj@rtems.org)
     3# Copyright 2010-2018 Chris Johns (chrisj@rtems.org)
    44# All rights reserved.
    55#
     
    3535
    3636try:
    37     import error
    38     import execute
    39     import log
    40     import options
    41     import path
    42     import pkgconfig
    43     import sources
     37    from . import error
     38    from . import execute
     39    from . import log
     40    from . import options
     41    from . import path
     42    from . import pkgconfig
     43    from . import sources
    4444except KeyboardInterrupt:
    4545    print('user terminated', file = sys.stderr)
    4646    sys.exit(1)
    4747except:
    48     print('error: unknown application load error', file = sys.stderr)
    49     sys.exit(1)
     48    raise
    5049
    5150def _check_bool(value):
     51    istrue = None
    5252    if value.isdigit():
    5353        if int(value) == 0:
     
    5656            istrue = True
    5757    else:
    58         istrue = None
     58        if type(value) is str and len(value) == 2 and value[0] == '!':
     59            istrue = _check_bool(value[1])
     60            if type(istrue) is bool:
     61                istrue = not istrue
    5962    return istrue
    6063
     
    7477        self.directives = {}
    7578        self.infos = {}
     79        self.sizes = {}
    7680
    7781    def __str__(self):
     
    219223        return len(self.name()) == 0
    220224
     225    def set_size(self, what, path_):
     226        if what not in self.sizes:
     227            self.sizes[what] = 0
     228        self.sizes[what] += path.get_size(path_)
     229
     230    def get_size(self, what):
     231        if what in self.sizes:
     232            return self.sizes[what]
     233        return 0
     234
    221235class file:
    222236    """Parse a config file."""
     
    269283
    270284    def _reset(self, name):
     285        self.parent = 'root'
    271286        self.name = name
    272287        self.load_depth = 0
     
    313328
    314329    def _error(self, msg):
    315         err = 'error: %s' % (self._name_line_msg(msg))
    316         log.stderr(err)
    317         log.output(err)
    318         self.in_error = True
    319330        if not self.opts.dry_run():
    320             log.stderr('warning: switched to dry run due to errors')
    321             self.opts.set_dry_run()
     331            if self.opts.keep_going():
     332                err = 'error: %s' % (self._name_line_msg(msg))
     333                log.stderr(err)
     334                log.output(err)
     335                self.in_error = True
     336                log.stderr('warning: switched to dry run due to errors')
     337                self.opts.set_dry_run()
     338        raise error.general(self._name_line_msg(msg))
    322339
    323340    def _label(self, name):
    324         if name.startswith('%{') and name[-1] is '}':
     341        if name.startswith('%{') and name[-1] == '}':
    325342            return name
    326343        return '%{' + name.lower() + '}'
     
    403420        return macros
    404421
    405     def _shell(self, line):
    406         sl = self.sf.findall(line)
    407         if len(sl):
    408             e = execute.capture_execution()
    409             for s in sl:
     422    def _shell(self, line, nesting = 0):
     423        #
     424        # Parse the line and handle nesting '()' pairs. If on Windows
     425        # handle embedded '"' (double quotes) as the command is run as
     426        # a double quoted string.
     427        #
     428        def _exec(shell_macro):
     429            output = ''
     430            if len(shell_macro) > 3:
     431                e = execute.capture_execution()
    410432                if options.host_windows:
    411                     cmd = '%s -c "%s"' % (self.macros.expand('%{__sh}'), s[2:-1])
     433                    shell_cmd = \
     434                        ''.join([c if c != '"' else '\\' + c for c in shell_macro[2:-1]])
     435                    cmd = '%s -c "%s"' % (self.macros.expand('%{__sh}'), shell_cmd)
    412436                else:
    413                     cmd = s[2:-1]
     437                    cmd = shell_macro[2:-1]
    414438                exit_code, proc, output = e.shell(cmd)
    415439                log.trace('shell-output: %d %s' % (exit_code, output))
    416                 if exit_code == 0:
    417                     line = line.replace(s, output)
    418                 else:
    419                     raise error.general('shell macro failed: %s:%d: %s' % (s, exit_code, output))
     440                if exit_code != 0:
     441                    raise error.general('shell macro failed: %s: %d: %s' % (cmd,
     442                                                                            exit_code,
     443                                                                            output))
     444            return output
     445
     446        if nesting > 200:
     447            raise error.general('shell macro failed: too many nesting levels')
     448
     449        updating = True
     450        while updating:
     451            updating = False
     452            pos = line.find('%(')
     453            if pos >= 0:
     454                braces = 0
     455                for p in range(pos + 2, len(line)):
     456                    if line[p] == '(':
     457                        braces += 1
     458                    elif line[p] == ')':
     459                        if braces > 0:
     460                            braces -= 1
     461                        else:
     462                            shell_cmd = '%(' + \
     463                                self._shell(line[pos + 2:p], nesting + 1) + ')'
     464                            line = line[:pos] + _exec(shell_cmd) + line[p + 1:]
     465                            updating = True
     466                            break
     467
    420468        return line
    421469
     
    423471        # Hack to by pass pkgconfig checks when just wanting to download the
    424472        # source.
    425         if self.macros['_dry_run'] == '1' and self.macros['with_download'] == '1':
     473        if self.macros['_dry_run'] == '1' and \
     474           ('with_download' in self.macros and self.macros['with_download'] == '1'):
    426475            return '0'
    427476        ok = False
     477        log.trace('pkgconfig: check: crossc=%d pkg_crossc=%d prefix=%s'
     478                  % ( self._cross_compile(),
     479                      self.pkgconfig_crosscompile,
     480                      self.pkgconfig_prefix))
     481        log.trace('pkgconfig: check: test=%s' % (test))
    428482        if type(test) == str:
    429483            test = test.split()
     
    446500                self._error('pkgconfig: check: %s' % (pe))
    447501            except:
     502                raise
    448503                raise error.internal('pkgconfig failure')
    449504        if ok:
     
    463518                    fflags = []
    464519                    for f in pkg_flags.split():
    465                         if not f.startswith('-f') and not f.startswith('-W'):
     520                        if not f.startswith('-W'):
    466521                            fflags += [f]
    467522                    pkg_flags = ' '.join(fflags)
    468                 log.trace('pkgconfig: %s: %s' % (flags, pkg_flags))
     523                log.trace('pkgconfig: %s:  %s' % (flags, pkg_flags))
    469524            except pkgconfig.error as pe:
    470                 self._error('pkgconfig: %s: %s' % (flags, pe))
     525                self._error('pkgconfig: %s:  %s' % (flags, pe))
    471526            except:
     527                raise
    472528                raise error.internal('pkgconfig failure')
    473529        if pkg_flags is None:
     
    544600                    colon = m.find(':')
    545601                    if colon < 8:
    546                         log.warning('malformed expand macro, no colon found')
     602                        log.warning(self._name_line_msg('malformed expand macro, ' \
     603                                                        'no colon found'))
    547604                    else:
    548605                        e = self._expand(m[colon + 1:-1].strip())
     
    563620                elif m.startswith('%{echo'):
    564621                    if not m.endswith('}'):
    565                         log.warning("malformed conditional macro '%s'" % (m))
     622                        log.warning(self._name_line_msg("malformed conditional macro '%s'" % (m)))
    566623                        mn = None
    567624                    else:
     
    587644                    expanded = True
    588645                    mn = None
     646                elif m.startswith('%{triplet'):
     647                    triplet = m[len('%{triplet'):-1].strip().split()
     648                    ok = False
     649                    if len(triplet) == 2:
     650                        macro = self._expand(triplet[0])
     651                        value = self._expand(triplet[1])
     652                        vorig = value
     653                        arch_value = ''
     654                        vendor_value = ''
     655                        os_value = ''
     656                        dash = value.find('-')
     657                        if dash >= 0:
     658                            arch_value = value[:dash]
     659                            value = value[dash + 1:]
     660                        dash = value.find('-')
     661                        if dash >= 0:
     662                            vendor_value = value[:dash]
     663                            value = value[dash + 1:]
     664                        if len(value):
     665                            os_value = value
     666                        self.macros[macro] = vorig
     667                        self.macros[macro + '_cpu'] = arch_value
     668                        self.macros[macro + '_arch'] = arch_value
     669                        self.macros[macro + '_vendor'] = vendor_value
     670                        self.macros[macro + '_os'] = os_value
     671                        ok = True
     672                    if ok:
     673                        s = s.replace(m, '')
     674                    else:
     675                        self._error('triplet error: %s' % (' '.join(triplet)))
     676                    mn = None
    589677                elif m.startswith('%{path '):
    590678                    pl = m[7:-1].strip().split()
    591679                    ok = False
    592                     if len(pl) == 2:
    593                         ok = True
    594                         epl = []
    595                         for p in pl[1:]:
    596                             epl += [self._expand(p)]
    597                         p = ' '.join(epl)
    598                         if pl[0].lower() == 'prepend':
     680                    result = ''
     681                    pl_0 = pl[0].lower()
     682                    if pl_0 == 'prepend':
     683                        if len(pl) == 2:
     684                            ok = True
     685                            p = ' '.join([self._expand(pp) for pp in pl[1:]])
    599686                            if len(self.macros['_pathprepend']):
    600687                                self.macros['_pathprepend'] = \
     
    602689                            else:
    603690                                self.macros['_pathprepend'] = p
    604                         elif pl[0].lower() == 'postpend':
     691                    elif pl_0 == 'postpend':
     692                        if len(pl) == 2:
     693                            ok = True
     694                            p = ' '.join([self._expand(pp) for pp in pl[1:]])
    605695                            if len(self.macros['_pathprepend']):
    606696                                self.macros['_pathprepend'] = \
     
    608698                            else:
    609699                                self.macros['_pathprepend'] = p
    610                         else:
    611                             ok = False
     700                    elif pl_0 == 'check':
     701                        if len(pl) == 3:
     702                            pl_1 = pl[1].lower()
     703                            p = ' '.join([self._expand(pp) for pp in pl[2:]])
     704                            if pl_1 == 'exists':
     705                                ok = True
     706                                if path.exists(p):
     707                                    result = '1'
     708                                else:
     709                                    result = '0'
     710                            elif pl_1 == 'isdir':
     711                                ok = True
     712                                if path.isdir(p):
     713                                    result = '1'
     714                                else:
     715                                    result = '0'
     716                            elif pl_1 == 'isfile':
     717                                ok = True
     718                                if path.isfile(p):
     719                                    result = '1'
     720                                else:
     721                                    result = '0'
    612722                    if ok:
    613                         s = s.replace(m, '')
     723                        s = s.replace(m, result)
    614724                    else:
    615725                        self._error('path error: %s' % (' '.join(pl)))
     
    635745                    if colon < 0:
    636746                        if not m.endswith('}'):
    637                             log.warning("malformed conditional macro '%s'" % (m))
     747                            log.warning(self._name_line_msg("malformed conditional macro '%s'" % (m)))
    638748                            mn = None
    639749                        else:
     
    677787    def _disable(self, config, ls):
    678788        if len(ls) != 2:
    679             log.warning('invalid disable statement')
     789            log.warning(self._name_line_msg('invalid disable statement'))
    680790        else:
    681791            if ls[1] == 'select':
    682792                self.macros.lock_read_map()
    683                 log.trace('config: %s: %3d: _disable_select: %s' % (self.name, self.lc,
     793                log.trace('config: %s: %3d:  _disable_select: %s' % (self.name, self.lc,
    684794                                                                     ls[1]))
    685795            else:
    686                 log.warning('invalid disable statement: %s' % (ls[1]))
     796                log.warning(self._name_line_msg('invalid disable statement: %s' % (ls[1])))
    687797
    688798    def _select(self, config, ls):
    689799        if len(ls) != 2:
    690             log.warning('invalid select statement')
     800            log.warning(self._name_line_msg('invalid select statement'))
    691801        else:
    692802            r = self.macros.set_read_map(ls[1])
    693             log.trace('config: %s: %3d: _select: %s %s %r' % \
     803            log.trace('config: %s: %3d:  _select: %s %s %r' % \
    694804                          (self.name, self.lc,
    695805                           r, ls[1], self.macros.maps()))
     
    703813    def _define(self, config, ls):
    704814        if len(ls) <= 1:
    705             log.warning('invalid macro definition')
     815            log.warning(self._name_line_msg('invalid macro definition'))
    706816        else:
    707817            d = self._label(ls[1])
     
    714824                        self.macros[d] = ' '.join([f.strip() for f in ls[2:]])
    715825                else:
    716                     log.warning("macro '%s' already defined" % (d))
     826                    log.warning(self._name_line_msg("macro '%s' already defined" % (d)))
    717827            else:
    718828                if len(ls) == 2:
     
    723833    def _undefine(self, config, ls):
    724834        if len(ls) <= 1:
    725             log.warning('invalid macro definition')
     835            log.warning(self._name_line_msg('invalid macro definition'))
    726836        else:
    727837            mn = self._label(ls[1])
     
    730840
    731841    def _ifs(self, config, ls, label, iftrue, isvalid, dir, info):
    732         log.trace('config: %s: %3d: _ifs[%i]: dir=%s %i %r' % \
     842        log.trace('config: %s: %3d:  _ifs[%i]: dir=%s %i %r' % \
    733843                  (self.name, self.lc, self.if_depth, str(dir), len(ls), ls))
    734844        in_dir = dir
     
    750860                    raise error.general('terminating build')
    751861                if r[1] == '%endif':
    752                     log.trace('config: %s: %3d: _ifs[%i]: %%endif: dir=%s %s %s %r' % \
     862                    log.trace('config: %s: %3d:  _ifs[%i]: %%endif: dir=%s %s %s %r' % \
    753863                              (self.name, self.lc, self.if_depth,
    754864                               str(dir), r[1], this_isvalid, data))
     
    758868                    else:
    759869                        if in_dir != dir:
    760                             self._error('directives cannot change scope across if statements')
     870                            self._error('directives cannot change' \
     871                                        ' scope across if statements')
    761872
    762873                    return data
     
    786897        cls = sls
    787898
    788         log.trace('config: %s: %3d: _if[%i]: %s' % (self.name, self.lc,
     899        log.trace('config: %s: %3d:  _if[%i]: %s' % (self.name, self.lc,
    789900                                                    self.if_depth, sls))
    790901
     
    801912                    join_op = 'and'
    802913                cls = cls[1:]
    803                 log.trace('config: %s: %3d: _if[%i]: joining: %s' % (self.name, self.lc,
    804                                                                      self.if_depth,
    805                                                                      join_op))
     914                log.trace('config: %s: %3d:  _if[%i]: joining: %s' % \
     915                          (self.name, self.lc,
     916                           self.if_depth,
     917                           join_op))
    806918            ori = 0
    807919            andi = 0
     
    809921            if '||' in cls:
    810922                ori = cls.index('||')
    811                 log.trace('config: %s: %3d: _if[%i}: OR found at %i' % (self.name, self.lc,
    812                                                                         self.if_depth,
    813                                                                         ori))
     923                log.trace('config: %s: %3d:  _if[%i}: OR found at %i' % \
     924                          (self.name, self.lc,
     925                           self.if_depth,
     926                           ori))
    814927            if '&&' in cls:
    815928                andi = cls.index('&&')
    816                 log.trace('config: %s: %3d: _if[%i]: AND found at %i' % (self.name, self.lc,
    817                                                                          self.if_depth,
    818                                                                          andi))
     929                log.trace('config: %s: %3d:  _if[%i]: AND found at %i' % \
     930                          (self.name, self.lc,
     931                           self.if_depth,
     932                           andi))
    819933            if ori > 0 or andi > 0:
    820934                if ori == 0:
     
    826940                else:
    827941                    i = andi
    828                 log.trace('config: %s: %3d: _if[%i]: next OP found at %i' % (self.name, self.lc,
    829                                                                              self.if_depth,
    830                 i))
     942                log.trace('config: %s: %3d:  _if[%i]: next OP found at %i' % \
     943                          (self.name, self.lc,
     944                           self.if_depth,
     945                           i))
    831946            ls = cls[:i]
    832947            if len(ls) == 0:
     
    9251040                cistrue = istrue
    9261041
    927             log.trace('config: %s: %3d: _if[%i]:  %s %s %s %s' % (self.name, self.lc,
    928                                                                   self.if_depth,
    929                                                                   ifls, str(cistrue),
    930                                                                   join_op, str(istrue)))
     1042            log.trace('config: %s: %3d:  _if[%i]:  %s %s %s %s' % (self.name, self.lc,
     1043                                                                   self.if_depth,
     1044                                                                   ifls, str(cistrue),
     1045                                                                   join_op, str(istrue)))
    9311046
    9321047        if invert:
     
    9371052        self.if_depth -= 1
    9381053
    939         log.trace('config: %s: %3d: _if[%i]: %r' % (self.name, self.lc,
    940                                                     self.if_depth, ifs_return))
     1054        log.trace('config: %s: %3d:  _if[%i]: %r' % (self.name, self.lc,
     1055                                                     self.if_depth, ifs_return))
    9411056
    9421057        return ifs_return
     
    9461061        if isvalid:
    9471062            os = self.define('_os')
    948             for l in ls:
     1063            ls = ' '.join(ls).split()
     1064            for l in ls[1:]:
    9491065                if l in os:
    9501066                    isos = True
     
    9521068        return self._ifs(config, ls, '%ifos', isos, isvalid, dir, info)
    9531069
     1070    def _ifnos(self, config, ls, isvalid, dir, info):
     1071        isnos = True
     1072        if isvalid:
     1073            os = self.define('_os')
     1074            ls = ' '.join(ls).split()
     1075            for l in ls[1:]:
     1076                if l in os:
     1077                    isnos = False
     1078                    break
     1079        return self._ifs(config, ls, '%ifnos', isnos, isvalid, dir, info)
     1080
    9541081    def _ifarch(self, config, positive, ls, isvalid, dir, info):
    9551082        isarch = False
    9561083        if isvalid:
    9571084            arch = self.define('_arch')
    958             for l in ls:
     1085            ls = ' '.join(ls).split()
     1086            for l in ls[1:]:
    9591087                if l in arch:
    9601088                    isarch = True
     
    9711099            b = line.find('#')
    9721100            if b >= 0:
    973                 line = line[1:b]
     1101                line = line[1:b] + ('\\' if line[-1] == '\\' else '')
    9741102            return line.strip()
     1103
     1104        def _clean_and_pack(line, last_line):
     1105            leading_ws = ' ' if len(line) > 0 and line[0].isspace() else ''
     1106            line = _clean(line)
     1107            if len(last_line) > 0:
     1108                line = last_line + leading_ws + line
     1109            return line
    9751110
    9761111        #
     
    9801115        # line.
    9811116        #
     1117        ll = ''
    9821118        for l in config:
    9831119            self.lc += 1
    984             l = _clean(l)
     1120            l = _clean_and_pack(l, ll)
    9851121            if len(l) == 0:
    9861122                continue
    987             log.trace('config: %s: %0d: %s %s' % \
    988                           (self.name, self.lc, str(isvalid), l))
     1123            if l[-1] == '\\':
     1124                ll = l[0:-1]
     1125                continue
     1126            ll = ''
     1127            if isvalid:
     1128                indicator = '>'
     1129            else:
     1130                indicator = ' '
     1131            log.trace('config: %s: %3d:%s%s [%s]' % \
     1132                          (self.name, self.lc, indicator, l, str(isvalid)))
    9891133            lo = l
    9901134            if isvalid:
     
    10391183                    d = self._if(config, ls, isvalid, dir, info)
    10401184                    if len(d):
    1041                         log.trace('config: %s: %3d: %%if: %s' % (self.name, self.lc, d))
     1185                        log.trace('config: %s: %3d:  %%if: %s' % (self.name, self.lc, d))
    10421186                        return ('data', d)
    10431187                elif ls[0] == '%ifn':
    10441188                    d = self._if(config, ls, isvalid, dir, info, True)
    10451189                    if len(d):
    1046                         log.trace('config: %s: %3d: %%ifn: %s' % (self.name, self.lc, d))
     1190                        log.trace('config: %s: %3d:  %%ifn: %s' % (self.name, self.lc, d))
    10471191                        return ('data', d)
    10481192                elif ls[0] == '%ifos':
    10491193                    d = self._ifos(config, ls, isvalid, dir, info)
     1194                    if len(d):
     1195                        return ('data', d)
     1196                elif ls[0] == '%ifnos':
     1197                    d = self._ifnos(config, ls, isvalid, dir, info)
    10501198                    if len(d):
    10511199                        return ('data', d)
     
    10611209                    if roc:
    10621210                        return ('control', '%endif', '%endif')
    1063                     log.warning("unexpected '" + ls[0] + "'")
     1211                    log.warning(self._name_line_msg("unexpected '" + ls[0] + "'"))
    10641212                elif ls[0] == '%else':
    10651213                    if roc:
    10661214                        return ('control', '%else', '%else')
    1067                     log.warning("unexpected '" + ls[0] + "'")
     1215                    log.warning(self._name_line_msg("unexpected '" + ls[0] + "'"))
    10681216                elif ls[0].startswith('%defattr'):
    10691217                    return ('data', [l])
     
    10871235                        for d in self._directive:
    10881236                            if ls[0].strip() == d:
    1089                                 log.trace('config: %s: %0d: _parse: directive: %s' % \
     1237                                log.trace('config: %s: %3d: _parse: directive: %s' % \
    10901238                                          (self.name, self.lc, ls[0].strip()))
    10911239                                return ('directive', ls[0].strip(), ls[1:])
    1092                         log.warning("unknown directive: '" + ls[0] + "'")
     1240                        log.warning(self._name_line_msg("unknown directive: '" + \
     1241                                                        ls[0] + "'"))
    10931242                        return ('data', [lo])
    10941243            else:
     
    11111260            else:
    11121261                if results[2][0].strip() != '-n':
    1113                     log.warning("unknown directive option: '%s'" % (' '.join(results[2])))
     1262                    log.warning(self._name_line_msg("unknown directive option: '%s'" % \
     1263                                                    (' '.join(results[2]))))
    11141264                _package = results[2][1].strip()
    11151265            self._set_package(_package)
     
    11211271
    11221272    def _process_data(self, results, directive, info, data):
    1123         log.trace('config: %s: %3d: _process_data: result=#%r# directive=#%s# info=#%r# data=#%r#' % \
     1273        log.trace('config: %s: %3d:  _process_data: result=#%r# ' \
     1274                  'directive=#%s# info=#%r# data=#%r#' % \
    11241275                  (self.name, self.lc, results, directive, info, data))
    11251276        new_data = []
     
    11331284            elif l.startswith('%warning'):
    11341285                l = self._expand(l)
    1135                 log.warning(l[9:])
     1286                log.warning(self._name_line_msg(l[9:]))
    11361287            if not directive:
    11371288                l = self._expand(l)
    11381289                ls = self.tags.split(l, 1)
    1139                 log.trace('config: %s: %3d: _tag: %s %s' % (self.name, self.lc, l, ls))
     1290                log.trace('config: %s: %3d:  _tag: %s %s' % (self.name, self.lc, l, ls))
    11401291                if len(ls) > 1:
    11411292                    info = ls[0].lower()
     
    11481299                    self._info_append(info, info_data)
    11491300                else:
    1150                     log.warning("invalid format: '%s'" % (info_data[:-1]))
     1301                    log.warning(self._name_line_msg("invalid format: '%s'" % \
     1302                                                    (info_data[:-1])))
    11511303            else:
    11521304                l = self._expand(l)
    1153                 log.trace('config: %s: %3d: _data: %s %s' % (self.name, self.lc, l, new_data))
     1305                log.trace('config: %s: %3d:  _data: %s %s' % \
     1306                          (self.name, self.lc, l, new_data))
    11541307                new_data.append(l)
    11551308        return (directive, info, data + new_data)
     
    11671320
    11681321    def _directive_extend(self, dir, data):
    1169         log.trace('config: %s: %3d: _directive_extend: %s: %r' % (self.name, self.lc, dir, data))
     1322        log.trace('config: %s: %3d:  _directive_extend: %s: %r' % \
     1323                  (self.name, self.lc, dir, data))
    11701324        self._packages[self.package].directive_extend(dir, data)
    11711325
     
    11921346
    11931347        if self.load_depth == 0:
    1194             self._reset(name)
    11951348            self._packages[self.package] = package(self.package,
    11961349                                                   self.define('%{_arch}'),
     
    12001353
    12011354        save_name = self.name
     1355        save_parent = self.parent
    12021356        save_lc = self.lc
    12031357
     
    12401394
    12411395        try:
    1242             log.trace('config: %s: _open: %s' % (self.name, path.host(configname)))
     1396            log.trace('config: %s:  _open: %s' % (self.name, path.host(configname)))
    12431397            config = open(path.host(configname), 'r')
    12441398        except IOError as err:
     
    12461400
    12471401        self.configpath += [configname]
    1248         self._includes += [configname]
     1402
     1403        self._includes += [configname + ':' + self.parent]
     1404        self.parent = configname
    12491405
    12501406        self.name = self._relative_path(configname)
     
    12621418                    if r[1] == '%end':
    12631419                        break
    1264                     log.warning("unexpected '%s'" % (r[1]))
     1420                    log.warning(self._name_line_msg("unexpected '%s'" % (r[1])))
    12651421                elif r[0] == 'directive':
    12661422                    if r[1] == '%include':
     
    12771433            config.close()
    12781434            raise
    1279 
    1280         config.close()
    1281 
    1282         self.name = save_name
    1283         self.lc = save_lc
    1284 
    1285         self.load_depth -= 1
     1435        finally:
     1436            config.close()
     1437            self.name = save_name
     1438            self.parent = save_parent
     1439            self.lc = save_lc
     1440            self.load_depth -= 1
    12861441
    12871442    def defined(self, name):
     
    13201475        if name not in self._packages[_package].directives:
    13211476            raise error.general('directive "' + name + \
    1322                                     '" not found in package "' + _package + '"')
     1477                                '" not found in package "' + _package + '"')
    13231478        return self._packages[_package].directives[name]
    13241479
  • source-builder/sb/cvs.py

    r8af551c r158ad68  
    2626import os
    2727
    28 import error
    29 import execute
    30 import log
    31 import options
    32 import path
     28from . import error
     29from . import execute
     30from . import log
     31from . import path
    3332
    3433class repo:
     
    148147if __name__ == '__main__':
    149148    import sys
     149    from . import options
    150150    opts = options.load(sys.argv, defaults = 'defaults.mc')
    151151    ldir = 'cvs-test-rm-me'
  • source-builder/sb/darwin.py

    r8af551c r158ad68  
    2525import os
    2626
    27 import execute
     27from . import execute
    2828
    2929def load():
     
    5353        '_prefix':          ('dir',     'optional', '%{_usr}'),
    5454        '__ldconfig':       ('exe',     'none',     ''),
     55        '__cmake':          ('exe',     'optional', 'cmake'),
    5556        '__cvs':            ('exe',     'optional', 'cvs'),
    5657        '__xz':             ('exe',     'required', 'xz'),
  • source-builder/sb/download.py

    r8af551c r158ad68  
    2525from __future__ import print_function
    2626
     27import base64
    2728import hashlib
    2829import os
     
    3738    import urlparse as urllib_parse
    3839
    39 import cvs
    40 import error
    41 import git
    42 import log
    43 import path
    44 import sources
    45 import version
     40from . import cvs
     41from . import error
     42from . import git
     43from . import log
     44from . import path
     45from . import sources
     46from . import version
    4647
    4748def _do_download(opts):
     
    109110        if _in is not None:
    110111            _in.close()
    111         log.output('checksums: %s: %s => %s' % (file_, hasher.hexdigest(), hash[1]))
    112         if hasher.hexdigest() != hash[1]:
     112        hash_hex = hasher.hexdigest()
     113        hash_base64 = base64.b64encode(hasher.digest()).decode('utf-8')
     114        log.output('checksums: %s: (hex: %s) (b64: %s) => %s' % (file_,
     115                                                                 hash_hex,
     116                                                                 hash_base64,
     117                                                                 hash[1]))
     118        if hash_hex != hash[1] and hash_base64 != hash[1]:
    113119            log.warning('checksum error: %s' % (file_))
    114120            failed = True
     
    182188            source['file'] = '%s-%s.patch' % (p, h)
    183189        #
    184         # Check the source file name for any extra request query data and remove if
    185         # found. Some hosts do not like file names containing them.
     190        # Wipe out everything special in the file name.
    186191        #
    187         if '?' in source['file']:
    188             qmark = source['file'].find('?')
    189             source['file'] = source['file'][:qmark]
     192        source['file'] = re.sub(r'[^a-zA-Z0-9.\-]+', '-', source['file'])
     193        max_file_len = 127
     194        if len(source['file']) > max_file_len:
     195            raise error.general('file name length is greater than %i (maybe use --rsb-file=FILE option): %s' % \
     196                                (max_file_len, source['file']))
    190197    #
    191198    # Check local path
     
    328335        source['file'] = file_override
    329336        source['options'] += ['file-override']
     337    question_mark = source['file'].find('?')
     338    if question_mark >= 0:
     339        source['file'] = source['file'][:question_mark]
    330340    source['name'], source['ext'] = path.splitext(source['file'])
    331341    if source['name'].endswith('.tar'):
     
    507517            if _do_download(opts):
    508518                repo.reset(arg)
     519                repo.submodule_foreach(['reset'] + arg)
     520        elif _as[0] == 'clean':
     521            arg = []
     522            if len(_as) > 1:
     523                arg = ['--%s' % (_as[1])]
     524            log.notice('git: clean: %s' % (us[0]))
     525            if _do_download(opts):
     526                repo.clean(arg)
     527                repo.submodule_foreach(['clean'] + arg)
    509528        elif _as[0] == 'protocol':
    510529            pass
     
    591610    #
    592611    # Check if a URL has been provided on the command line. If the package is
    593     # released push to the start the RTEMS URL unless overrided by the command
    594     # line option --with-release-url. The variant --without-release-url can
    595     # override the released check.
     612    # released push the release path URLs to the start the RTEMS URL list
     613    # unless overriden by the command line option --without-release-url. The
     614    # variant --without-release-url can override the released check.
    596615    #
    597616    url_bases = opts.urls()
     617    if url_bases is None:
     618        url_bases = []
    598619    try:
    599620        rtems_release_url_value = config.macros.expand('%{release_path}')
     
    601622        rtems_release_url_value = None
    602623    rtems_release_url = None
     624    rtems_release_urls = []
    603625    if version.released() and rtems_release_url_value:
    604626        rtems_release_url = rtems_release_url_value
     
    619641        rtems_release_url = None
    620642    if rtems_release_url is not None:
    621         log.trace('release url: %s' % (rtems_release_url))
    622         #
    623         # If the URL being fetched is under the release path do not add the
    624         # sources release path because it is already there.
    625         #
    626         if not url.startswith(rtems_release_url):
    627             if url_bases is None:
    628                 url_bases = [rtems_release_url]
    629             else:
    630                 url_bases.append(rtems_release_url)
     643        rtems_release_urls = rtems_release_url.split(',')
     644        for release_url in rtems_release_urls:
     645            log.trace('release url: %s' % (release_url))
     646            #
     647            # If the URL being fetched is under the release path do not add
     648            # the sources release path because it is already there.
     649            #
     650            if not url.startswith(release_url):
     651                url_bases = [release_url] + url_bases
    631652    urls = []
    632     if url_bases is not None:
     653    if len(url_bases) > 0:
    633654        #
    634655        # Split up the URL we are being asked to download.
     
    646667            # mess and should be refactored.
    647668            #
    648             if version.released() and base == rtems_release_url:
     669            if version.released() and base in rtems_release_urls:
    649670                url_file = path.basename(local)
    650671            if base[-1:] != '/':
  • source-builder/sb/ereport.py

    r8af551c r158ad68  
    11#
    22# RTEMS Tools Project (http://www.rtems.org/)
    3 # Copyright 2010-2014 Chris Johns (chrisj@rtems.org)
     3# Copyright 2010-2017 Chris Johns (chrisj@rtems.org)
    44# All rights reserved.
    55#
     
    2222#
    2323
     24from __future__ import print_function
     25
    2426import os
    2527
    26 import error
    27 import log
     28from . import error
     29from . import log
    2830
    2931def generate(name, opts, header = None, footer = None):
    30     r = ['RTEMS Tools Project - Source Builder Error Report'] + []
    31     if header:
    32         r += [' %s' % (header)]
    33     r += [opts.info()]
    34     if opts.defaults.get_value('%{_sbgit_valid}') == '1':
    35         r += [' %s/%s' % (opts.defaults.get_value('%{_sbgit_remotes}'),
    36                           opts.defaults.get_value('%{_sbgit_id}'))]
    37     else:
    38         r += [' RSB: not a valid repo']
    39     if os.name == 'nt':
    40         r += [' Windows']
    41     else:
    42         r += [' %s' % (' '.join(os.uname()))]
    43     r += []
    44     r += ['Tail of the build log:']
    45     r += log.tail()
    46     if footer:
    47         r += [footer]
    48     try:
    49         name = name.replace('/', '-')
    50         l = open(name, 'w')
    51         l.write(os.linesep.join(r))
    52         l.close()
    53         log.notice('  See error report: %s' % (name))
    54     except:
    55         log.stderr('error: failure to create error report')
    56         raise
     32    label, result = opts.with_arg('error-report')
     33    if (label.startswith('without_') and result != 'yes') or \
     34       (label.startswith('with_') and result != 'no'):
     35        r = ['RTEMS Tools Project - Source Builder Error Report'] + []
     36        if header:
     37            r += [' %s' % (header)]
     38        r += [opts.info()]
     39        if opts.defaults.get_value('%{_sbgit_valid}') == '1':
     40            r += [' %s/%s' % (opts.defaults.get_value('%{_sbgit_remotes}'),
     41                              opts.defaults.get_value('%{_sbgit_id}'))]
     42        else:
     43            r += [' RSB: not a valid repo']
     44        if os.name == 'nt':
     45            r += [' Windows']
     46        else:
     47            r += [' %s' % (' '.join(os.uname()))]
     48        r += []
     49        r += ['Tail of the build log:']
     50        r += log.tail()
     51        if footer:
     52            r += [footer]
     53        try:
     54            name = name.replace('/', '-')
     55            with open(name, 'w') as l:
     56                l.write(os.linesep.join(r))
     57            log.notice('  See error report: %s' % (name))
     58        except:
     59            log.stderr('error: failure to create error report')
     60            raise
  • source-builder/sb/error.py

    r8af551c r158ad68  
    3434    """Raise for a general error."""
    3535    def __init__(self, what):
    36         self.set_output('error: ' + what)
     36        self.set_output('error: ' + str(what))
    3737
    3838class internal(error):
    3939    """Raise for an internal error."""
    4040    def __init__(self, what):
    41         self.set_output('internal error: ' + what)
     41        self.set_output('internal error: ' + str(what))
    4242
    4343class exit(error):
  • source-builder/sb/execute.py

    r8af551c r158ad68  
    11#
    22# RTEMS Tools Project (http://www.rtems.org/)
    3 # Copyright 2010-2016 Chris Johns (chrisj@rtems.org)
     3# Copyright 2010-2017 Chris Johns (chrisj@rtems.org)
    44# All rights reserved.
    55#
     
    99# purpose with or without fee is hereby granted, provided that the above
    1010# copyright notice and this permission notice appear in all copies.
    11 #
     11 #
    1212# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    1313# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     
    1717# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    1818# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     19#
    1920
    2021#
     
    2728
    2829import functools
     30import io
    2931import os
    3032import re
     
    3234import subprocess
    3335import threading
    34 
    35 import error
    36 import log
     36import time
     37import traceback
     38
     39from . import error
     40from . import log
     41
     42# Trace exceptions
     43trace_threads = False
    3744
    3845# Redefine the PIPE from subprocess
     
    8794    return functools.reduce(add, cmd, '')
    8895
    89 class execute:
    90     """Execute commands or scripts. The 'output' is a funtion
    91     that handles the output from the process."""
    92     def __init__(self, output = None, error_prefix = '', verbose = False):
     96class execute(object):
     97    """Execute commands or scripts. The 'output' is a funtion that handles the
     98    output from the process. The 'input' is a function that blocks and returns
     99    data to be written to stdin"""
     100    def __init__(self, output = None, input = None, cleanup = None,
     101                 error_prefix = '', verbose = False):
     102        self.lock = threading.Lock()
    93103        self.output = output
     104        self.input = input
     105        self.cleanup = cleanup
    94106        self.error_prefix = error_prefix
    95107        self.verbose = verbose
     
    98110        self.path = None
    99111        self.environment = None
    100 
    101     def capture(self, proc, timeout = None):
    102         """Create 2 threads to read stdout and stderr and send to the
    103         output handler. Based on the 'communicate' code in the subprocess
    104         module."""
    105         def _readthread(fh, out, prefix = ''):
     112        self.outputting = False
     113        self.timing_out = False
     114        self.proc = None
     115
     116    def capture(self, proc, command = 'pipe', timeout = None):
     117        """Create 3 threads to read stdout and stderr and send to the output handler
     118        and call an input handler is provided. Based on the 'communicate' code
     119        in the subprocess module."""
     120        def _writethread(exe, fh, input):
     121            """Call the input handler and write it to the stdin. The input handler should
     122            block and return None or False if this thread is to exit and True if this
     123            is a timeout check."""
     124            if trace_threads:
     125                print('execute:_writethread: start')
     126            encoding = True
     127            try:
     128                tmp = bytes('temp', sys.stdin.encoding)
     129            except:
     130                encoding = False
     131            input_types = [str, bytes]
     132            try:
     133                # Unicode is not valid in python3, not added to the list
     134                input_types += [unicode]
     135            except:
     136                pass
     137            try:
     138                while True:
     139                    if trace_threads:
     140                        print('execute:_writethread: call input', input)
     141                    lines = input()
     142                    if trace_threads:
     143                        print('execute:_writethread: input returned:', type(lines))
     144                    if type(lines) in input_types:
     145                        try:
     146                            if encoding:
     147                                lines = bytes(lines, sys.stdin.encoding)
     148                            fh.write(lines)
     149                            fh.flush()
     150                        except:
     151                            break
     152                    if lines == None or \
     153                       lines == False or \
     154                       (lines == True and fh.closed):
     155                        break
     156            except:
     157                if trace_threads:
     158                    print('execute:_writethread: exception')
     159                    print(traceback.format_exc())
     160                pass
     161            try:
     162                fh.close()
     163            except:
     164                pass
     165            if trace_threads:
     166                print('execute:_writethread: finished')
     167
     168        def _readthread(exe, fh, out, prefix = ''):
    106169            """Read from a file handle and write to the output handler
    107170            until the file closes."""
    108             count = 0
    109             while True:
    110                 line = fh.readline()
    111                 # str and bytes are the same type in Python2
    112                 if type(line) is not str and type(line) is bytes:
    113                     line = line.decode(sys.stdout.encoding)
    114                 count += 1
    115                 if len(line) == 0:
    116                     break
     171            def _output_line(line, exe, prefix, out, count):
     172                #exe.lock.acquire()
     173                #exe.outputting = True
     174                #exe.lock.release()
    117175                if out:
    118176                    out(prefix + line)
     
    121179                    if count > 10:
    122180                        log.flush()
    123                         count = 0
    124 
    125         def _timerthread(proc, timer):
    126             """Timer thread calls the timer handler if one
    127             is present once a second. The user provides a handler
    128             and returns False to kill the process or True continue."""
    129             while True:
     181
     182            if trace_threads:
     183                print('execute:_readthread: start')
     184            count = 0
     185            line = ''
     186            try:
     187                while True:
     188                    #
     189                    # The io module file handling return up to the size passed
     190                    # in to the read call. The io handle has the default
     191                    # buffering size. On any error assume the handle has gone
     192                    # and the process is shutting down.
     193                    #
     194                    try:
     195                        data = fh.read1(4096)
     196                    except:
     197                        data = ''
     198                    if len(data) == 0:
     199                        if len(line) > 0:
     200                            _output_line(line + '\n', exe, prefix, out, count)
     201                        break
     202                    # str and bytes are the same type in Python2
     203                    if type(data) is not str and type(data) is bytes:
     204                        data = data.decode(sys.stdout.encoding)
     205                    last_ch = data[-1]
     206                    sd = (line + data).split('\n')
     207                    if last_ch != '\n':
     208                        line = sd[-1]
     209                    else:
     210                        line = ''
     211                    sd = sd[:-1]
     212                    if len(sd) > 0:
     213                        for l in sd:
     214                            if trace_threads:
     215                                print('execute:_readthread: output-line:',
     216                                      count, type(l))
     217                            _output_line(l + '\n', exe, prefix, out, count)
     218                            count += 1
     219                        if count > 10:
     220                            count -= 10
     221            except:
     222                raise
     223                if trace_threads:
     224                    print('execute:_readthread: exception')
     225                    print(traceback.format_exc())
     226                pass
     227            try:
     228                fh.close()
     229            except:
     230                pass
     231            if len(line):
     232                _output_line(line, exe, prefix, out, 100)
     233            if trace_threads:
     234                print('execute:_readthread: finished')
     235
     236        def _timerthread(exe, interval, function):
     237            """Timer thread is used to timeout a process if no output is
     238            produced for the timeout interval."""
     239            count = interval
     240            while exe.timing_out:
    130241                time.sleep(1)
    131                 if not timer(proc):
    132                     proc.stdout.close()
    133                     proc.stderr.close()
     242                if count > 0:
     243                    count -= 1
     244                exe.lock.acquire()
     245                if exe.outputting:
     246                    count = interval
     247                    exe.outputting = False
     248                exe.lock.release()
     249                if count == 0:
     250                    try:
     251                        proc.kill()
     252                    except:
     253                        pass
     254                    else:
     255                        function()
     256                    break
     257
     258        name = os.path.basename(command[0])
     259
     260        stdin_thread = None
     261        stdout_thread = None
     262        stderr_thread = None
     263        timeout_thread = None
    134264
    135265        if proc.stdout:
    136266            stdout_thread = threading.Thread(target = _readthread,
    137                                              args = (proc.stdout,
     267                                             name = '_stdout[%s]' % (name),
     268                                             args = (self,
     269                                                     io.open(proc.stdout.fileno(),
     270                                                             mode = 'rb',
     271                                                             closefd = False),
    138272                                                     self.output,
    139273                                                     ''))
    140             stdout_thread.setDaemon(True)
     274            stdout_thread.daemon = True
    141275            stdout_thread.start()
    142276        if proc.stderr:
    143277            stderr_thread = threading.Thread(target = _readthread,
    144                                              args = (proc.stderr,
     278                                             name = '_stderr[%s]' % (name),
     279                                             args = (self,
     280                                                     io.open(proc.stderr.fileno(),
     281                                                             mode = 'rb',
     282                                                             closefd = False),
    145283                                                     self.output,
    146284                                                     self.error_prefix))
    147             stderr_thread.setDaemon(True)
     285            stderr_thread.daemon = True
    148286            stderr_thread.start()
    149         if proc.stdout:
    150             stdout_thread.join()
    151         if proc.stderr:
    152             stderr_thread.join()
    153         return proc.wait()
     287        if self.input and proc.stdin:
     288            stdin_thread = threading.Thread(target = _writethread,
     289                                            name = '_stdin[%s]' % (name),
     290                                            args = (self,
     291                                                    proc.stdin,
     292                                                    self.input))
     293            stdin_thread.daemon = True
     294            stdin_thread.start()
     295        if timeout:
     296            self.timing_out = True
     297            timeout_thread = threading.Thread(target = _timerthread,
     298                                              name = '_timeout[%s]' % (name),
     299                                              args = (self,
     300                                                      timeout[0],
     301                                                      timeout[1]))
     302            timeout_thread.daemon = True
     303            timeout_thread.start()
     304        try:
     305            self.lock.acquire()
     306            try:
     307                self.proc = proc
     308            except:
     309                raise
     310            finally:
     311                self.lock.release()
     312            exitcode = proc.wait()
     313        except:
     314            proc.kill()
     315            raise
     316        finally:
     317            self.lock.acquire()
     318            try:
     319                self.proc = None
     320            except:
     321                raise
     322            finally:
     323                self.lock.release()
     324            if self.cleanup:
     325                self.cleanup(proc)
     326            if timeout_thread:
     327                self.timing_out = False
     328                timeout_thread.join(10)
     329            if stdin_thread:
     330                stdin_thread.join(2)
     331            if stdout_thread:
     332                stdout_thread.join(2)
     333            if stderr_thread:
     334                stderr_thread.join(2)
     335        return exitcode
    154336
    155337    def open(self, command, capture = True, shell = False,
    156338             cwd = None, env = None,
    157              stdin = None, stdout = None, stderr = None):
     339             stdin = None, stdout = None, stderr = None,
     340             timeout = None):
    158341        """Open a command with arguments. Provide the arguments as a list or
    159342        a string."""
     343        if self.output is None:
     344            raise error.general('capture needs an output handler')
     345        cs = command
     346        if type(command) is list:
     347            def add(x, y): return x + ' ' + str(y)
     348            cs = functools.reduce(add, command, '')[1:]
     349        what = 'spawn'
     350        if shell:
     351            what = 'shell'
     352        cs = what + ': ' + cs
    160353        if self.verbose:
    161             s = command
    162             if type(command) is list:
    163                 def add(x, y): return x + ' ' + str(y)
    164                 s = functools.reduce(add, command, '')[1:]
    165             what = 'spawn'
    166             if shell:
    167                 what = 'shell'
    168             log.output(what + ': ' + s)
     354            log.output(what + ': ' + cs)
     355        log.trace('exe: %s' % (cs))
    169356        if shell and self.shell_exe:
    170357            command = arg_list(command)
    171358            command[:0] = self.shell_exe
     359        if not stdin and self.input:
     360            stdin = subprocess.PIPE
    172361        if not stdout:
    173362            stdout = subprocess.PIPE
     
    192381                                    cwd = cwd, env = env,
    193382                                    stdin = stdin, stdout = stdout,
    194                                     stderr = stderr)
     383                                    stderr = stderr,
     384                                    close_fds = False)
    195385            if not capture:
    196386                return (0, proc)
    197             exit_code = self.capture(proc)
     387            if self.output is None:
     388                raise error.general('capture needs an output handler')
     389            exit_code = self.capture(proc, command, timeout)
    198390            if self.verbose:
    199391                log.output('exit: ' + str(exit_code))
     
    205397
    206398    def spawn(self, command, capture = True, cwd = None, env = None,
    207               stdin = None, stdout = None, stderr = None):
     399              stdin = None, stdout = None, stderr = None,
     400              timeout = None):
    208401        """Spawn a command with arguments. Provide the arguments as a list or
    209402        a string."""
    210403        return self.open(command, capture, False, cwd, env,
    211                          stdin, stdout, stderr)
     404                         stdin, stdout, stderr, timeout)
    212405
    213406    def shell(self, command, capture = True, cwd = None, env = None,
    214               stdin = None, stdout = None, stderr = None):
     407              stdin = None, stdout = None, stderr = None,
     408              timeout = None):
    215409        """Execute a command within a shell context. The command can contain
    216410        argumments. The shell is specific to the operating system. For example
    217411        it is cmd.exe on Windows XP."""
    218412        return self.open(command, capture, True, cwd, env,
    219                          stdin, stdout, stderr)
     413                         stdin, stdout, stderr, timeout)
    220414
    221415    def command(self, command, args = None, capture = True, shell = False,
    222416                cwd = None, env = None,
    223                 stdin = None, stdout = None, stderr = None):
     417                stdin = None, stdout = None, stderr = None,
     418                timeout = None):
    224419        """Run the command with the args. The args can be a list
    225420        or a string."""
     
    231426        return self.open(cmd, capture = capture, shell = shell,
    232427                         cwd = cwd, env = env,
    233                          stdin = stdin, stdout = stdout, stderr = stderr)
     428                         stdin = stdin, stdout = stdout, stderr = stderr,
     429                         timeout = timeout)
    234430
    235431    def command_subst(self, command, substs, capture = True, shell = False,
    236432                      cwd = None, env = None,
    237                       stdin = None, stdout = None, stderr = None):
     433                      stdin = None, stdout = None, stderr = None,
     434                      timeout = None):
    238435        """Run the command from the config data with the
    239436        option format string subsituted with the subst variables."""
     
    242439                            shell = shell or self.shell_commands,
    243440                            cwd = cwd, env = env,
    244                             stdin = stdin, stdout = stdout, stderr = stderr)
     441                            stdin = stdin, stdout = stdout, stderr = stderr,
     442                            timeout = timeout)
    245443
    246444    def set_shell(self, execute):
     
    276474        return old_environment
    277475
     476    def kill(self):
     477        self.lock.acquire()
     478        try:
     479            if self.proc is not None:
     480                self.proc.kill()
     481        except:
     482            raise
     483        finally:
     484            self.lock.release()
     485
     486    def terminate(self):
     487        self.lock.acquire()
     488        try:
     489            if self.proc is not None:
     490                self.proc.terminate()
     491        except:
     492            raise
     493        finally:
     494            self.lock.release()
     495
     496    def send_signal(self, signal):
     497        self.lock.acquire()
     498        try:
     499            if self.proc is not None:
     500                print("sending sig")
     501                self.proc.send_signal(signal)
     502        except:
     503            raise
     504        finally:
     505            self.lock.release()
     506
    278507class capture_execution(execute):
    279508    """Capture all output as a string and return it."""
     
    304533
    305534    def open(self, command, capture = True, shell = False, cwd = None, env = None,
    306              stdin = None, stdout = None, stderr = None):
     535             stdin = None, stdout = None, stderr = None, timeout = None):
    307536        if not capture:
    308537            raise error.general('output capture must be true; leave as default')
     
    310539        exit_code, proc = execute.open(self, command, capture = True, shell = shell,
    311540                                       cwd = cwd, env = env,
    312                                        stdin = stdin, stdout = stdout, stderr = stderr)
     541                                       stdin = stdin, stdout = stdout, stderr = stderr,
     542                                       timeout = timeout)
    313543        return (exit_code, proc, self.snapper.get_and_clear())
    314544
     
    334564            print('piping input into ' + commands['pipe'][0] + ': ' + \
    335565                  commands['pipe'][2])
    336             proc.stdin.write(bytes(commands['pipe'][2], sys.stdin.encoding))
     566            try:
     567                out = bytes(commands['pipe'][2], sys.stdin.encoding)
     568            except:
     569                out = commands['pipe'][2]
     570            proc.stdin.write(out)
    337571            proc.stdin.close()
    338572            e.capture(proc)
    339573            del proc
     574
     575    def capture_output(text):
     576        print(text, end = '')
    340577
    341578    cmd_shell_test = 'if "%OS%" == "Windows_NT" (echo It is WinNT) else echo Is is not WinNT'
     
    364601                    ['subst0', 'subst1', 'subst2']))
    365602
    366     e = execute(error_prefix = 'ERR: ', verbose = True)
     603    e = execute(error_prefix = 'ERR: ', output = capture_output, verbose = True)
    367604    if sys.platform == "win32":
    368605        run_tests(e, commands['windows'], False)
  • source-builder/sb/freebsd.py

    r8af551c r158ad68  
    2828import os
    2929
    30 import check
    31 import error
    32 import execute
     30from . import check
     31from . import error
     32from . import execute
    3333
    3434def load():
     
    5858        '_host_alias':      ('none',    'none',     '%{nil}'),
    5959        '_host_arch':       ('none',    'none',     cpu),
     60        'host_includes':    ('none',    'convert',  '-I%{_usr}/include'),
     61        'host_ldflags':     ('none',    'convert',  '-L%{_usr}/lib'),
    6062        '_usr':             ('dir',     'required', '/usr/local'),
    6163        '_var':             ('dir',     'optional', '/usr/local/var'),
    6264        '__bash':           ('exe',     'optional', '/usr/local/bin/bash'),
    6365        '__bison':          ('exe',     'required', '/usr/local/bin/bison'),
     66        '__cmake':          ('exe',     'optional', '/usr/local/bin/cmake'),
    6467        '__git':            ('exe',     'required', '/usr/local/bin/git'),
    65         '__svn':            ('exe',     'required', '/usr/local/bin/svn'),
     68        '__svn':            ('exe',     'optional', '/usr/local/bin/svn'),
     69        '__unzip':          ('exe',     'optional', '/usr/local/bin/unzip'),
    6670        '__xz':             ('exe',     'optional', '/usr/bin/xz'),
    6771        '__make':           ('exe',     'required', 'gmake'),
    6872        '__patch_opts':     ('none',     'none',    '-E')
    69         }
     73    }
    7074
    7175    defines['_build']        = defines['_host']
     
    108112            defines['__cvs'] = cvs
    109113        #
    110         # Fix the mess iconv is on FreeBSD 10.0.
     114        # Fix the mess iconv is on FreeBSD 10.0 and higher.
    111115        #
    112         defines['iconv_includes'] = ('none', 'none', '-I/usr/local/include -L/usr/local/lib')
     116        defines['iconv_includes'] = ('none', 'none', '%{host_includes} %{host_ldflags}')
     117        if fb_version >= 12:
     118            defines['iconv_prefix'] = ('none', 'none', '%{_usr}')
    113119
    114120        #
     
    118124            defines['__install_info'] = ('exe', 'optional', '/usr/local/bin/install-info')
    119125            defines['__makeinfo']     = ('exe', 'required', '/usr/local/bin/makeinfo')
     126        #
     127        # On 12.0+ unzip is in /usr/bin
     128        #
     129        if fb_version >= 12:
     130            defines['__unzip'] = ('exe', 'optional', '/usr/bin/unzip')
    120131    else:
    121132        for gv in ['49', '48', '47']:
  • source-builder/sb/git.py

    r8af551c r158ad68  
    2626import os
    2727
    28 import error
    29 import execute
    30 import log
    31 import options
    32 import path
     28from . import error
     29from . import execute
     30from . import log
     31from . import path
    3332
    3433class repo:
     
    7170            raise error.general('invalid version string from git: %s' % (output))
    7271        vs = gvs[2].split('.')
    73         if len(vs) != 4:
     72        if len(vs) not in [3, 4]:
    7473            raise error.general('invalid version number from git: %s' % (gvs[2]))
    75         return (int(vs[0]), int(vs[1]), int(vs[2]), int(vs[3]))
     74        return tuple(map(int, vs))
    7675
    7776    def clone(self, url, _path):
     
    106105        ec, output = self._run(['submodule', 'update', '--init', module], check = True)
    107106
     107    def submodule_foreach(self, args = []):
     108        if type(args) == str:
     109            args = [args.split(args)]
     110        ec, output = self._run(['submodule',
     111                                'foreach',
     112                                '--recursive',
     113                                self.git] + args, check = True)
     114
     115    def submodules(self):
     116        smodules = {}
     117        ec, output = self._run(['submodule'], check = True)
     118        if ec == 0:
     119            for l in output.split('\n'):
     120                ms = l.split()
     121                if len(ms) == 3:
     122                    smodules[ms[1]] = (ms[0], ms[2][1:-1])
     123        return smodules
     124
    108125    def clean(self, args = []):
    109126        if type(args) == str:
     
    111128        ec, output = self._run(['clean'] + args, check = True)
    112129
    113     def status(self):
     130    def status(self, submodules_always_clean = False):
    114131        _status = {}
    115132        if path.exists(self.path):
     133            if submodules_always_clean:
     134                submodules = self.submodules()
     135            else:
     136                submodules = {}
    116137            ec, output = self._run(['status'])
    117138            if ec == 0:
     
    134155                            l = l.strip()
    135156                            if l[0] != '(':
    136                                 if state not in _status:
    137                                     _status[state] = []
    138                                 l = l[1:]
    139157                                if ':' in l:
    140158                                    l = l.split(':')[1]
    141                                 _status[state] += [l.strip()]
     159                                if len(l.strip()) > 0:
     160                                    l = l.strip()
     161                                    ls = l.split()
     162                                    if state != 'unstaged' or ls[0] not in submodules:
     163                                        if state not in _status:
     164                                            _status[state] = [l]
     165                                        else:
     166                                            _status[state] += [l]
    142167        return _status
    143168
    144169    def dirty(self):
    145170        _status = self.status()
     171        _status.pop('untracked', None)
     172        _status.pop('detached', None)
    146173        return not (len(_status) == 1 and 'branch' in _status)
    147174
     
    201228
    202229if __name__ == '__main__':
     230    import os.path
    203231    import sys
    204     opts = options.load(sys.argv)
     232    from . import options
     233    defaults = path.join(path.dirname(path.dirname(path.shell(sys.argv[0]))),
     234                         'defaults.mc')
     235    opts = options.load(sys.argv, defaults = defaults)
    205236    g = repo('.', opts)
    206     print(g.git_version())
    207     print(g.valid())
    208     print(g.status())
    209     print(g.clean())
    210     print(g.remotes())
    211     print(g.email())
    212     print(g.head())
     237    print('g.git_version():', g.git_version())
     238    print('g.valid():', g.valid())
     239    print('g.submodules():', g.submodules())
     240    print('g.status():', g.status())
     241    print('g.status():', g.status(True))
     242    print('g.dirty():', g.dirty())
     243    print('g.remotes():', g.remotes())
     244    print('g.email():', g.email())
     245    print('g.head():', g.head())
  • source-builder/sb/linux.py

    r8af551c r158ad68  
    2323#
    2424
     25import multiprocessing
     26import platform
    2527import pprint
    2628import os
    2729
    28 import platform
    29 import execute
    30 import path
     30from . import path
    3131
    3232def load():
    3333    uname = os.uname()
    34     smp_mflags = ''
    35     processors = '/bin/grep processor /proc/cpuinfo'
    36     e = execute.capture_execution()
    37     exit_code, proc, output = e.shell(processors)
    38     ncpus = 0
    39     if exit_code == 0:
    40         try:
    41             for l in output.split('\n'):
    42                 count = l.split(':')[1].strip()
    43                 if int(count) > ncpus:
    44                     ncpus = int(count)
    45         except:
    46             pass
    47     ncpus = str(ncpus + 1)
    4834    if uname[4].startswith('arm'):
    4935        cpu = 'arm'
     
    5339    version = uname[2]
    5440    defines = {
    55         '_ncpus':           ('none',    'none',     ncpus),
     41        '_ncpus':           ('none',    'none',     str(multiprocessing.cpu_count())),
    5642        '_os':              ('none',    'none',     'linux'),
    5743        '_host':            ('triplet', 'required', cpu + '-linux-gnu'),
     
    7056        }
    7157
    72     # Works for LSB distros
    73     try:
    74         distro = platform.dist()[0]
    75         distro_ver = float(platform.dist()[1])
    76     except ValueError:
    77         # Non LSB distro found, use failover"
    78         pass
     58    # platform.dist() was removed in Python 3.8
     59    if hasattr(platform, 'dist'):
     60        # Works for LSB distros
     61        try:
     62            distro = platform.dist()[0]
     63            distro_ver = float(platform.dist()[1])
     64        except ValueError:
     65         # Non LSB distro found, use failover"
     66         pass
     67    else:
     68         distro = ''
    7969
    8070    # Non LSB - fail over to issue
     
    9585    elif distro in ['centos', 'fedora']:
    9686        distro = 'redhat'
    97     elif distro in ['Ubuntu', 'ubuntu', 'LinuxMint', 'linuxmint']:
     87    elif distro in ['Ubuntu', 'ubuntu', 'MX', 'LinuxMint', 'linuxmint']:
    9888        distro = 'debian'
    9989    elif distro in ['Arch']:
     
    121111        'suse'   : { '__chgrp':        ('exe',     'required', '/usr/bin/chgrp'),
    122112                     '__chown':        ('exe',     'required', '/usr/sbin/chown') },
     113        'gentoo' : { '__bzip2':        ('exe',     'required', '/bin/bzip2'),
     114                     '__chgrp':        ('exe',     'required', '/bin/chgrp'),
     115                     '__chown':        ('exe',     'required', '/bin/chown'),
     116                     '__gzip':         ('exe',     'required', '/bin/gzip'),
     117                     '__grep':         ('exe',     'required', '/bin/grep'),
     118                     '__sed':          ('exe',     'required', '/bin/sed') },
    123119        }
    124120
  • source-builder/sb/log.py

    r8af551c r158ad68  
    11#
    22# RTEMS Tools Project (http://www.rtems.org/)
    3 # Copyright 2010-2012 Chris Johns (chrisj@rtems.org)
     3# Copyright 2010-2017 Chris Johns (chrisj@rtems.org)
    44# All rights reserved.
    55#
     
    2727import sys
    2828
    29 import error
     29from . import error
    3030
    3131#
     
    3333#
    3434default = None
     35
     36#
     37# A global capture handler.
     38#
     39capture = None
    3540
    3641#
     
    7176        print(l, file = sys.stderr)
    7277        sys.stderr.flush()
     78    if capture is not None:
     79        capture(text)
    7380
    7481def output(text = os.linesep, log = None):
     
    8188            print(l)
    8289        sys.stdout.flush()
     90        if capture is not None:
     91            capture(text)
    8392    _output(text, log)
    8493
    8594def trace(text = os.linesep, log = None):
    86     if tracing:
     95    if not quiet and tracing:
    8796        _output(text, log)
    8897
     
    106115class log:
    107116    """Log output to stdout or a file."""
    108     def __init__(self, streams = None, tail_size = 200):
     117    def __init__(self, streams = None, tail_size = 400):
    109118        self.tail = []
    110119        self.tail_size = tail_size
  • source-builder/sb/macros.py

    r8af551c r158ad68  
    2828import string
    2929
    30 import error
    31 import path
     30from . import error
     31from . import path
    3232
    3333#
     
    5454            return self.keys
    5555
    56     def _unicode_to_str(self, us):
     56    @staticmethod
     57    def _unicode_to_str(us):
    5758        try:
    5859            if type(us) == unicode:
     
    123124                for l in ds:
    124125                    lc += 1
     126                    l = self._unicode_to_str(l)
    125127                    while len(l):
    126128                        if indent:
     
    175177            raise TypeError('bad value tuple (attrib field): %s' % (value[1]))
    176178        if value[1] == 'convert':
    177             value = self.expand(value)
     179            value = (value[0], value[1], self.expand(value[2]))
    178180        self.macros[self.write_map][self.key_filter(key)] = value
    179181
     
    182184
    183185    def __contains__(self, key):
    184         return self.has_key(key)
     186        return self.has_key(self._unicode_to_str(key))
    185187
    186188    def __len__(self):
     
    202204
    203205    def has_key(self, key):
     206        key = self._unicode_to_str(key)
    204207        if type(key) is not str:
    205208            raise TypeError('bad key type (want str): %s' % (type(key)))
     
    231234
    232235    def key_filter(self, key):
    233         if key.startswith('%{') and key[-1] is '}':
     236        if key.startswith('%{') and key[-1] == '}':
    234237            key = key[2:-1]
    235238        return key.lower()
     
    267270                        (c, ord(c), state, token, macro, map))
    268271                l_remaining = l_remaining[1:]
    269                 if c is '#' and not state.startswith('value'):
     272                if c == '#' and not state.startswith('value'):
    270273                    break
    271274                if c == '\n' or c == '\r':
    272                     if not (state is 'key' and len(token) == 0) and \
     275                    if not (state == 'key' and len(token) == 0) and \
    273276                            not state.startswith('value-multiline'):
    274277                        raise error.general('malformed macro line:%d: %s' % (lc, l))
    275                 if state is 'key':
     278                if state == 'key':
    276279                    if c not in string.whitespace:
    277                         if c is '[':
     280                        if c == '[':
    278281                            state = 'map'
    279                         elif c is '%':
     282                        elif c == '%':
    280283                            state = 'directive'
    281                         elif c is ':':
     284                        elif c == ':':
    282285                            macro += [token]
    283286                            token = ''
    284287                            state = 'attribs'
    285                         elif c is '#':
     288                        elif c == '#':
    286289                            break
    287290                        else:
    288291                            token += c
    289                 elif state is 'map':
    290                     if c is ']':
     292                elif state == 'map':
     293                    if c == ']':
    291294                        if token not in macros:
    292295                            macros[token] = {}
     
    298301                    else:
    299302                        raise error.general('invalid macro map:%d: %s' % (lc, l))
    300                 elif state is 'directive':
     303                elif state == 'directive':
    301304                    if c in string.whitespace:
    302305                        if token == 'include':
     
    309312                    else:
    310313                        raise error.general('invalid macro directive:%d: %s' % (lc, l))
    311                 elif state is 'include':
     314                elif state == 'include':
    312315                    if c is string.whitespace:
    313316                        if token == 'include':
     
    317320                    else:
    318321                        raise error.general('invalid macro directive:%d: %s' % (lc, l))
    319                 elif state is 'attribs':
     322                elif state == 'attribs':
    320323                    if c not in string.whitespace:
    321                         if c is ',':
     324                        if c == ',':
    322325                            macro += [token]
    323326                            token = ''
     
    326329                        else:
    327330                            token += c
    328                 elif state is 'value-start':
    329                     if c is "'":
     331                elif state == 'value-start':
     332                    if c == "'":
    330333                        state = 'value-line-start'
    331                 elif state is 'value-line-start':
    332                     if c is "'":
     334                elif state == 'value-line-start':
     335                    if c == "'":
    333336                        state = 'value-multiline-start'
    334337                    else:
    335338                        state = 'value-line'
    336339                        token += c
    337                 elif state is 'value-multiline-start':
    338                     if c is "'":
     340                elif state == 'value-multiline-start':
     341                    if c == "'":
    339342                        state = 'value-multiline'
    340343                    else:
    341344                        macro += [token]
    342345                        state = 'macro'
    343                 elif state is 'value-line':
    344                     if c is "'":
     346                elif state == 'value-line':
     347                    if c == "'":
    345348                        macro += [token]
    346349                        state = 'macro'
    347350                    else:
    348351                        token += c
    349                 elif state is 'value-multiline':
    350                     if c is "'":
     352                elif state == 'value-multiline':
     353                    if c == "'":
    351354                        state = 'value-multiline-end'
    352355                    else:
    353356                        token += c
    354                 elif state is 'value-multiline-end':
    355                     if c is "'":
     357                elif state == 'value-multiline-end':
     358                    if c == "'":
    356359                        state = 'value-multiline-end-end'
    357360                    else:
    358361                        state = 'value-multiline'
    359362                        token += "'" + c
    360                 elif state is 'value-multiline-end-end':
    361                     if c is "'":
     363                elif state == 'value-multiline-end-end':
     364                    if c == "'":
    362365                        macro += [token]
    363366                        state = 'macro'
     
    367370                else:
    368371                    raise error.internal('bad state: %s' % (state))
    369                 if state is 'macro':
     372                if state == 'macro':
    370373                    macros[map][self._unicode_to_str(macro[0].lower())] = \
    371374                                (self._unicode_to_str(macro[1]),
     
    453456    def expand(self, _str):
    454457        """Simple basic expander of config file macros."""
     458        _str = self._unicode_to_str(_str)
    455459        expanded = True
    456460        while expanded:
  • source-builder/sb/mailer.py

    r8af551c r158ad68  
    2828import socket
    2929
    30 import error
    31 import options
    32 import path
     30from . import error
     31from . import options
     32from . import path
    3333
    3434def append_options(opts):
     
    9393        msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % \
    9494            (from_addr, to_addr, subject) + body
     95        if type(to_addr) is str:
     96            to_addr = to_addr.split(',')
     97        if type(to_addr) is not list:
     98            raise error.general('invalid to_addr type')
    9599        try:
    96100            s = smtplib.SMTP(self.smtp_host())
    97             s.sendmail(from_addr, [to_addr], msg)
     101            s.sendmail(from_addr, to_addr, msg)
    98102        except smtplib.SMTPException as se:
    99103            raise error.general('sending mail: %s' % (str(se)))
  • source-builder/sb/netbsd.py

    r8af551c r158ad68  
    2828import os
    2929
    30 import check
    31 import execute
     30from . import check
     31from . import execute
    3232
    3333def load():
  • source-builder/sb/options.py

    r8af551c r158ad68  
    3030import os
    3131import string
    32 
    33 import error
    34 import execute
    35 import git
    36 import log
    37 import macros
    38 import path
    3932import sys
    4033
    41 import version
     34from . import download
     35from . import error
     36from . import execute
     37from . import git
     38from . import log
     39from . import macros
     40from . import path
     41from . import sources
     42from . import version
    4243
    4344basepath = 'sb'
     
    5455    def __init__(self, argv, optargs, _defaults, command_path):
    5556        self._long_opts = {
    56             # key                 macro                handler            param  defs   init
     57            # key                       macro                handler            param  defs   init
    5758            '--prefix'               : ('_prefix',           self._lo_path,     True,  None,  False),
    5859            '--topdir'               : ('_topdir',           self._lo_path,     True,  None,  False),
     
    6061            '--builddir'             : ('_builddir',         self._lo_path,     True,  None,  False),
    6162            '--sourcedir'            : ('_sourcedir',        self._lo_path,     True,  None,  False),
     63            '--patchdir'             : ('_patchdir',         self._lo_path,     True,  None,  False),
    6264            '--tmppath'              : ('_tmppath',          self._lo_path,     True,  None,  False),
    6365            '--jobs'                 : ('_jobs',             self._lo_jobs,     True,  'max', True),
     
    8385            '--build'                : ('_build',            self._lo_triplets, True,  None,  False),
    8486            '--target'               : ('_target',           self._lo_triplets, True,  None,  False),
     87            '--rtems-tools'          : ('_rtems_tools',      self._lo_string,   True,  None,  False),
     88            '--rtems-bsp'            : ('_rtems_bsp',        self._lo_string,   True,  None,  False),
     89            '--rtems-version'        : ('_rtems_version',    self._lo_string,   True,  None,  False),
    8590            '--help'                 : (None,                self._lo_help,     False, None,  False)
    8691            }
     
    96101            self.opts[lo[2:]] = self._long_opts[lo][3]
    97102            if self._long_opts[lo][4]:
    98                 self.defaults[self._long_opts[lo][0]] = ('none', 'none', self._long_opts[lo][3])
     103                self.defaults[self._long_opts[lo][0]] = ('none',
     104                                                         'none',
     105                                                         self._long_opts[lo][3])
    99106
    100107    def __str__(self):
     
    195202    def help(self):
    196203        print('%s: [options] [args]' % (self.command_name))
    197         print('RTEMS Source Builder, an RTEMS Tools Project (c) 2012-2015 Chris Johns')
     204        print('RTEMS Source Builder, an RTEMS Tools Project (c) 2012-2019 Chris Johns')
    198205        print('Options and arguments:')
    199206        print('--force                : Force the build to proceed')
     
    215222        print('--builddir path        : Path to the build directory, default: ./build')
    216223        print('--sourcedir path       : Path to the source directory, default: ./source')
     224        print('--patchdir path        : Path to the patches directory, default: ./patches')
    217225        print('--tmppath path         : Path to the temp directory, default: ./tmp')
    218226        print('--macros file[,[file]  : Macro format files to load after the defaults')
     
    236244
    237245    def process(self):
     246        for a in self.args:
     247            if a == '-?' or a == '--help':
     248                self.help()
    238249        arg = 0
    239250        while arg < len(self.args):
    240251            a = self.args[arg]
    241             if a == '-?':
    242                 self.help()
    243             elif a.startswith('--'):
    244                 los = a.split('=')
     252            if a.startswith('--'):
     253                los = a.split('=', 1)
    245254                lo = los[0]
    246255                if lo in self._long_opts:
     
    249258                        if long_opt[2]:
    250259                            if arg == len(self.args) - 1:
    251                                 raise error.general('option requires a parameter: %s' % (lo))
     260                                raise error.general('option requires a parameter: %s' % \
     261                                                    (lo))
    252262                            arg += 1
    253263                            value = self.args[arg]
     
    263273                        else:
    264274                            value = '1'
    265                         self.defaults[los[0][2:].replace('-', '_').lower()] = ('none', 'none', value)
     275                        self.defaults[los[0][2:].replace('-', '_').lower()] = \
     276                            ('none', 'none', value)
     277                    else:
     278                        if lo not in self.optargs:
     279                            raise error.general('unknown option: %s' % (lo))
    266280            else:
     281                if a.startswith('-'):
     282                    raise error.general('short options not supported; only "-?"')
    267283                self.opts['params'].append(a)
    268284            arg += 1
     
    277293                              '--quiet',
    278294                              '--without-log',
    279                               '--without-error-report',
    280                               '--without-release-url']
     295                              '--without-error-report']
     296            if a == '--dry-run':
     297                self.args += ['--without-error-report']
    281298            arg += 1
    282299
     
    303320        prefix = self.parse_args('--prefix')
    304321        if prefix is None:
    305             value = path.join(self.defaults['_prefix'], 'rtems', str(version.version()))
     322            value = path.join(self.defaults['_prefix'],
     323                              'rtems',
     324                              str(self.defaults['rtems_version']))
    306325            self.opts['prefix'] = value
    307326            self.defaults['_prefix'] = value
     
    327346            checked = path.exists(um)
    328347            if False in checked:
    329                 raise error.general('macro file not found: %s' % (um[checked.index(False)]))
     348                raise error.general('macro file not found: %s' % \
     349                                    (um[checked.index(False)]))
    330350            for m in um:
    331351                self.defaults.load(m)
     
    342362        if version.released():
    343363            self.defaults['rsb_released'] = '1'
    344         self.defaults['rsb_version'] = version.str()
     364        self.defaults['rsb_version'] = version.string()
    345365
    346366    def sb_git(self):
     
    410430        _build = self.defaults.expand('%{_build}')
    411431        _target = self.defaults.expand('%{_target}')
    412         if len(_target):
    413             return len(_host) and len(_build) and (_target) and \
    414                 _host != _build and _host != _target
    415         return len(_host) and len(_build) and _host != _build
     432        #
     433        # The removed fix has been put back. I suspect
     434        # this was done as a result of another issue that
     435        # has been fixed.
     436        #
     437        return len(_target) and len(_host) and len(_build) \
     438            and _host != _build and _host != _target
    416439
    417440    def user_macros(self):
     
    475498                rhs = None
    476499                if '=' in self.args[a]:
    477                     eqs = self.args[a].split('=')
     500                    eqs = self.args[a].split('=', 1)
    478501                    lhs = eqs[0]
    479502                    if len(eqs) > 2:
     
    574597                raise error.general('--rtems-tools and --with-tools cannot be used together')
    575598            self.args.append('--with-tools=%s' % (rtems_tools[1]))
     599        rtems_version = self.parse_args('--rtems-version')
     600        if rtems_version is None:
     601            rtems_version = str(version.version())
     602        else:
     603            rtems_version = rtems_version[1]
     604        self.defaults['rtems_version'] = rtems_version
    576605        rtems_arch_bsp = self.parse_args('--rtems-bsp')
    577606        if rtems_arch_bsp is not None:
     
    581610            if len(ab) != 2:
    582611                raise error.general('invalid --rtems-bsp option')
    583             rtems_version = self.parse_args('--rtems-version')
    584             if rtems_version is None:
    585                 rtems_version = version.version()
    586             else:
    587                 rtems_version = rtems_version[1]
    588612            self.args.append('--target=%s-rtems%s' % (ab[0], rtems_version))
    589613            self.args.append('--with-rtems-bsp=%s' % (ab[1]))
     
    603627    # The path to this command.
    604628    #
    605     command_path = path.dirname(args[0])
     629    command_path = path.dirname(path.abspath(args[0]))
    606630    if len(command_path) == 0:
    607631        command_path = '.'
     
    620644    if os.name == 'nt':
    621645        try:
    622             import windows
     646            from . import windows
    623647            overrides = windows.load()
    624648            host_windows = True
     
    630654        try:
    631655            if uname[0].startswith('MINGW64_NT'):
    632                 import windows
     656                from . import windows
    633657                overrides = windows.load()
    634658                host_windows = True
    635659            elif uname[0].startswith('CYGWIN_NT'):
    636                 import windows
     660                from . import windows
    637661                overrides = windows.load()
    638662            elif uname[0] == 'Darwin':
    639                 import darwin
     663                from . import darwin
    640664                overrides = darwin.load()
    641665            elif uname[0] == 'FreeBSD':
    642                 import freebsd
     666                from . import freebsd
    643667                overrides = freebsd.load()
    644668            elif uname[0] == 'NetBSD':
    645                 import netbsd
     669                from . import netbsd
    646670                overrides = netbsd.load()
    647671            elif uname[0] == 'Linux':
    648                 import linux
     672                from . import linux
    649673                overrides = linux.load()
    650674            elif uname[0] == 'SunOS':
    651                 import solaris
     675                from . import solaris
    652676                overrides = solaris.load()
    653677        except error.general as ge:
     
    672696    # Load the release settings
    673697    #
    674     version.load_release_settings(o.defaults)
    675 
     698    def setting_error(msg):
     699        raise error.general(msg)
     700    hashes = version.load_release_settings('hashes')
     701    for hash in hashes:
     702        hs = hash[1].split()
     703        if len(hs) != 2:
     704            raise error.general('invalid release hash in VERSION')
     705        sources.hash((hs[0], hash[0], hs[1]), o.defaults, setting_error)
     706    release_path = version.load_release_setting('version', 'release_path',
     707                                                raw = True)
     708    if release_path is not None:
     709        try:
     710            release_path = ','.join([rp.strip() for rp in release_path.split(',')])
     711        except:
     712            raise error.general('invalid release path in VERSION')
     713        download.set_release_path(release_path, o.defaults)
    676714    return o
    677715
    678716def run(args):
    679717    try:
    680         _opts = load(args = args, defaults = 'defaults.mc')
    681         log.notice('RTEMS Source Builder - Defaults, %s' % (version.str()))
     718        dpath = path.dirname(args[0])
     719        _opts = load(args = args,
     720                     defaults = path.join(dpath, 'defaults.mc'))
     721        log.notice('RTEMS Source Builder - Defaults, %s' % (version.string()))
    682722        _opts.log_info()
    683723        log.notice('Options:')
  • source-builder/sb/path.py

    r8af551c r158ad68  
    11#
    22# RTEMS Tools Project (http://www.rtems.org/)
    3 # Copyright 2010-2016 Chris Johns (chrisj@rtems.org)
     3# Copyright 2010-2018 Chris Johns (chrisj@rtems.org)
    44# All rights reserved.
    55#
     
    2626from __future__ import print_function
    2727
    28 import log
    2928import os
    3029import shutil
    3130import stat
    3231import string
    33 
    34 import error
    35 
     32import sys
     33
     34from . import error
     35from . import log
     36
     37windows_posix = sys.platform == 'msys'
    3638windows = os.name == 'nt'
     39
    3740win_maxpath = 254
    3841
     
    5457    return path
    5558
    56 def is_abspath(path):
     59def shell(path):
     60    if isinstance(path, bytes):
     61        path = path.decode('ascii')
    5762    if path is not None:
    58         return '/' == path[0]
    59     return False
    60 
    61 def shell(path):
    62     if path is not None:
    63         if windows:
    64             path = path.encode('ascii', 'ignore')
     63        if windows or windows_posix:
     64            path = path.encode('ascii', 'ignore').decode('ascii')
    6565            if path.startswith('\\\\?\\'):
    6666                path = path[4:]
    6767            if len(path) > 1 and path[1] == ':':
    68                 path = '/%s%s' % (path[0], path[2:])
     68                path = '/%s%s' % (path[0].lower(), path[2:])
    6969            path = path.replace('\\', '/')
    7070        while '//' in path:
     
    7979    path = shell(path)
    8080    return shell(os.path.dirname(path))
     81
     82def is_abspath(path):
     83    if path is not None and len(path) > 0:
     84        return '/' == path[0]
     85    return False
    8186
    8287def join(path, *args):
     
    219224
    220225def expand(name, paths):
    221     path = shell(path)
    222226    l = []
    223227    for p in paths:
     
    306310            raise error.general('copying tree (4): %s -> %s: %s' % (hsrc, hdst, str(why)))
    307311
     312def get_size(path, depth = -1):
     313    #
     314    # Get the size the directory tree manually to the required depth.
     315    # This makes sure on Windows the files are correctly encoded to avoid
     316    # the file name size limit. On Windows the os.walk fails once we
     317    # get to the max path length on Windows.
     318    #
     319    def _isdir(path):
     320        hpath = host(path)
     321        return os.path.isdir(hpath) and not os.path.islink(hpath)
     322
     323    def _node_size(path):
     324        hpath = host(path)
     325        size = 0
     326        if not os.path.islink(hpath):
     327            size = os.path.getsize(hpath)
     328        return size
     329
     330    def _get_size(path, depth, level = 0):
     331        level += 1
     332        dirs = []
     333        size = 0
     334        for name in listdir(path):
     335            path_ = join(path, shell(name))
     336            hname = host(path_)
     337            if _isdir(path_):
     338                dirs += [shell(name)]
     339            else:
     340                size += _node_size(path_)
     341        if depth < 0 or level < depth:
     342            for name in dirs:
     343                dir = join(path, name)
     344                size += _get_size(dir, depth, level)
     345        return size
     346
     347    path = shell(path)
     348    hpath = host(path)
     349    size = 0
     350
     351    if os.path.exists(hpath):
     352        size = _get_size(path, depth)
     353
     354    return size
     355
     356def get_humanize_size(path, depth = -1):
     357    size = get_size(path, depth)
     358    for unit in ['','K','M','G','T','P','E','Z']:
     359        if abs(size) < 1024.0:
     360            return "%5.3f%sB" % (size, unit)
     361        size /= 1024.0
     362    return "%.3f%sB" % (size, 'Y')
     363
    308364if __name__ == '__main__':
    309365    print(host('/a/b/c/d-e-f'))
     
    313369    print(dirname('/as/sd/df/fg/me.txt'))
    314370    print(join('/d', 'g', '/tyty/fgfg'))
     371    print('size of . depth all: ', get_size('.'))
     372    print('size of . depth   1: ', get_size('.', 1))
     373    print('size of . depth   2: ', get_size('.', 2))
     374    print('size of . as human : ', get_humanize_size('.'))
    315375    windows = True
    316376    print(host('/a/b/c/d-e-f'))
  • source-builder/sb/pkgconfig.py

    r8af551c r158ad68  
    4444import sys
    4545
    46 import path
     46from . import path
    4747
    4848def default_prefix(common = True):
     
    9292    dual_opts = ['-D', '-U', '-I', '-l', '-L']
    9393    lib_list_splitter = re.compile('[\s,]+')
     94    loaded_prefixes = None
    9495    loaded = {}
    9596
     
    101102        dst.fields = copy.copy(src.fields)
    102103        dst.nodes = copy.copy(src.nodes)
     104
     105    @staticmethod
     106    def _is_string(us):
     107        if type(us) == str:
     108            return True
     109        try:
     110            if type(us) == unicode:
     111                return True
     112        except:
     113            pass
     114        try:
     115            if type(us) == bytes:
     116                return True
     117        except:
     118            pass
     119        return False
    103120
    104121    @staticmethod
     
    214231        if prefix:
    215232            self._log('prefix: %s' % (prefix))
    216             if type(prefix) is str:
     233            if self._is_string(prefix):
     234                prefix = str(prefix)
    217235                self.prefix = []
    218236                for p in prefix.split(os.pathsep):