public inbox for crossgcc@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/1] Add multilib build support for libc target. Libc is build <multilib>-times in seperate sysroot directories. In a last step links are created to reflect the expected multilib structure.
@ 2011-11-14 10:45 Konrad Eisele
  2011-12-12 23:07 ` [PATCH 1/1] Add multilib build support for libc target Yann E. MORIN
  2011-12-23 23:22 ` [PATCH 1/1] Add multilib build support for libc target. Libc is build <multilib>-times in seperate sysroot directories. In a last step links are created to reflect the expected multilib structure Yann E. MORIN
  0 siblings, 2 replies; 14+ messages in thread
From: Konrad Eisele @ 2011-11-14 10:45 UTC (permalink / raw)
  To: crossgcc; +Cc: yann.morin.1998, konrad

---
 scripts/build/binutils/binutils.sh        |   14 +++-
 scripts/build/cc/gcc.sh                   |   15 +++-
 scripts/build/libc/glibc-eglibc.sh-common |  124 +++++++++++++++++++++++++---
 3 files changed, 134 insertions(+), 19 deletions(-)

diff --git a/scripts/build/binutils/binutils.sh b/scripts/build/binutils/binutils.sh
index e082590..9c51a3d 100644
--- a/scripts/build/binutils/binutils.sh
+++ b/scripts/build/binutils/binutils.sh
@@ -59,6 +59,11 @@ do_binutils() {
         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
     fi
+    if [ "${CT_CC_MULTILIB}" = "n" ]; then
+        extra_config+=("--disable-multilib")
+    else
+        extra_config+=("--enable-multilib")
+    fi
 
     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
 
@@ -71,7 +76,6 @@ do_binutils() {
         --target=${CT_TARGET}                                   \
         --prefix=${CT_PREFIX_DIR}                               \
         --disable-nls                                           \
-        --disable-multilib                                      \
         --disable-werror                                        \
         "${extra_config[@]}"                                    \
         ${CT_ARCH_WITH_FLOAT}                                   \
@@ -151,7 +155,12 @@ do_binutils_target() {
             extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
             [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
         fi
-
+	if [ "${CT_CC_MULTILIB}" = "n" ]; then
+            extra_config+=("--disable-multilib")
+	else
+            extra_config+=("--enable-multilib")
+	fi
+    
         CT_DoExecLog CFG                                            \
         "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure"   \
             --build=${CT_BUILD}                                     \
@@ -162,7 +171,6 @@ do_binutils_target() {
             --enable-shared                                         \
             --enable-static                                         \
             --disable-nls                                           \
-            --disable-multilib                                      \
             "${extra_config[@]}"                                    \
             ${CT_ARCH_WITH_FLOAT}                                   \
             "${CT_BINUTILS_EXTRA_CONFIG[@]}"
diff --git a/scripts/build/cc/gcc.sh b/scripts/build/cc/gcc.sh
index 05df729..8804e85 100644
--- a/scripts/build/cc/gcc.sh
+++ b/scripts/build/cc/gcc.sh
@@ -288,6 +288,12 @@ do_cc_core() {
     extra_config+=(--disable-libgomp)
     extra_config+=(--disable-libmudflap)
 
+   if [ "${CT_CC_MULTILIB}" = "n" ]; then
+        extra_config+=("--disable-multilib")
+    else
+        extra_config+=("--enable-multilib")
+    fi
+
     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
 
     # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
@@ -301,7 +307,6 @@ do_cc_core() {
         --target=${CT_TARGET}                       \
         --prefix="${core_prefix_dir}"               \
         --with-local-prefix="${CT_SYSROOT_DIR}"     \
-        --disable-multilib                          \
         --disable-libmudflap                        \
         ${CC_CORE_SYSROOT_ARG}                      \
         "${extra_config[@]}"                        \
@@ -424,7 +429,13 @@ do_cc() {
     lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
 
     extra_config+=("--enable-languages=${lang_opt}")
-    extra_config+=("--disable-multilib")
+    
+    if [ "${CT_CC_MULTILIB}" = "n" ]; then
+        extra_config+=("--disable-multilib")
+    else
+        extra_config+=("--enable-multilib")
+    fi
+ 
     for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
         eval tmp="\${CT_ARCH_WITH_${tmp}}"
         if [ -n "${tmp}" ]; then
diff --git a/scripts/build/libc/glibc-eglibc.sh-common b/scripts/build/libc/glibc-eglibc.sh-common
index 2af3a9a..2c77fbf 100644
--- a/scripts/build/libc/glibc-eglibc.sh-common
+++ b/scripts/build/libc/glibc-eglibc.sh-common
@@ -57,18 +57,103 @@ do_libc_extract() {
 do_libc_start_files() {
     # Start files and Headers should be configured the same way as the
     # final libc, but built and installed differently.
-    do_libc_backend libc_mode=startfiles
+    do_libc_backend_multilib libc_mode=startfiles
 }
 
 # This function builds and install the full C library
 do_libc() {
-    do_libc_backend libc_mode=final
+    do_libc_backend_multilib libc_mode=final
 }
 
+# installation is done into ${CT_SYSROOT_DIR}/${dir}. The multilib prefix has to be included
+# to reflect the runtime setting.
+do_libc_backend_rearrange() {
+    local libc_mode
+    
+    while [ $# -ne 0 ]; do
+        eval "${1// /\\ }"
+        shift
+    done
+    
+    if [ "${libc_mode}" = "final" ]; then
+        cross_cc=$(CT_Which "${CT_TARGET}-gcc")
+        for i in `${cross_cc} --print-multi-lib 2>/dev/null`; do
+           dir="${i%%;*}"
+	   bdir="$(echo ${dir} | ${sed} -r -e 's:/:\\\\/:g')"
+           if [ "${dir}" != "." ]; then 
+               flags="$(echo $i | ${sed} -r -e 's/^[^;]*;//' -e 's/@/ -/g')";
+               CT_DoStep DEBUG "Fixing up multilib location ${CT_SYSROOT_DIR}/${dir}/lib to ${CT_SYSROOT_DIR}/lib/${dir}"
+               mkdir -p ${CT_SYSROOT_DIR}/lib/${dir}
+               mkdir -p ${CT_SYSROOT_DIR}/usr/lib/${dir}
+
+               # recreate the symbolic links for multilib 
+               for f in $(find ${CT_SYSROOT_DIR}/usr/lib/${dir}/ -type l -maxdepth 1); do
+                   fn=`basename $f`
+                   ln=`readlink $f`
+                   ln=`basename $ln`
+		   # go toward root. Count the numer of "/" and asseble a "../.." prefix 
+                   pre=$( echo ${dir} | awk '{r="";
+		       c=split($0,b,"/");
+		       for(i=0;i<c;i++){
+		           if(i!=0){r=r "/";}
+			   r=r "..";
+		       };
+		       printf("%s",r);
+		   }')
+		   CT_Pushd "${CT_SYSROOT_DIR}/usr/lib/${dir}/"
+                   ln -sf ../../${pre}/lib/${dir}/$ln $fn
+		   CT_Popd
+               done
+
+               # rewrite the library multiplexers
+               for l in libc libpthread libgcc_s; do
+                   for d in lib/${dir} usr/lib/${dir}; do
+                       if [ -f "${CT_SYSROOT_DIR}/${d}/${l}.so" -a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so ]; then
+                           if [ ! -f "${CT_SYSROOT_DIR}/${d}/${l}.so_ori_i" ]; then
+                               cp ${CT_SYSROOT_DIR}/${d}/${l}.so ${CT_SYSROOT_DIR}/${d}/${l}.so_ori_i
+                               cat ${CT_SYSROOT_DIR}/${d}/${l}.so_ori_i | ${sed} -r -e "s/\/lib\/$l/\/lib\/$bdir\/$l/g" > ${CT_SYSROOT_DIR}/${d}/${l}.so
+			   else
+			       CT_DoLog WARN "${CT_SYSROOT_DIR}/${d}/${l}.so has already been patched, skipping"
+                           fi
+                       fi
+                   done
+               done
+               CT_EndStep
+           fi
+        done;
+    fi
+}
+
+# call do_libc_backend <multilib> times with varying <extra_dir> and <extra_flags> options
+do_libc_backend_multilib() {
+    local flags=""
+    local i
+    local dir
+    # We need to call the backend at least once,
+    # with all settings set to the defaults
+    do_libc_backend "$@"
+    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
+    if [ "${CT_CC_MULTILIB}" = "y" ]; then
+       for i in `${cross_cc} --print-multi-lib 2>/dev/null`; do
+           dir="${i%%;*}"
+           if [ "${dir}" != "." ]; then 
+               flags="$(echo $i | ${sed} -r -e 's/^[^;]*;//' -e 's/@/ -/g')";
+               CT_DoStep INFO "C Library with multilib. Flags: \"${flags}\" Dir: \"${dir}\""
+               do_libc_backend "$@" extra_dir="/${dir}" extra_flags="${flags}" 
+               CT_EndStep
+           fi
+       done;
+       do_libc_backend_rearrange
+    fi
+}		       
+
 do_libc_backend() {
     local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
     local libc_mode=final
     local extra_cc_args
+    local extra_dir=""
+    local extra_dir_p
+    local extra_flags=""
     local -a extra_config
     local -a extra_make_args
     local glibc_cflags
@@ -77,15 +162,16 @@ do_libc_backend() {
         eval "${1// /\\ }"
         shift
     done
-
+    extra_dir_p="$(echo ${extra_dir} | ${sed} -r -e 's/\///g')"
+	
     if [ "${libc_mode}" = "startfiles" ]; then
         CT_DoStep INFO "Installing C library headers & start files"
-        mkdir -p "${CT_BUILD_DIR}/build-libc-start-files"
-        cd "${CT_BUILD_DIR}/build-libc-start-files"
+        mkdir -p "${CT_BUILD_DIR}/build-libc-start-files${extra_dir_p}"
+        cd "${CT_BUILD_DIR}/build-libc-start-files${extra_dir_p}"
     else # libc_mode = final
         CT_DoStep INFO "Installing C library"
-        mkdir -p "${CT_BUILD_DIR}/build-libc"
-        cd "${CT_BUILD_DIR}/build-libc"
+        mkdir -p "${CT_BUILD_DIR}/build-libc${extra_dir_p}"
+        cd "${CT_BUILD_DIR}/build-libc${extra_dir_p}"
     fi
 
     CT_DoLog EXTRA "Configuring C library"
@@ -133,7 +219,13 @@ do_libc_backend() {
     esac
 
     case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
-        y,) extra_config+=("--with-fp");;
+        y,) # if it is a <multilib> build then check if -msoft-float is given
+	    if [ "x`expr "${extra_flags}" : '.*-msoft-float.*'`" != "x0" ]; then
+	    	extra_config+=("--with-fp=no");
+	    else
+	    	extra_config+=("--with-fp");
+	    fi
+	    ;;
         ,y) extra_config+=("--without-fp");;
     esac
 
@@ -173,7 +265,7 @@ do_libc_backend() {
     CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
     CT_DoLog DEBUG "Extra CC args passed    : '${extra_cc_args}'"
 
-    glibc_cflags="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} ${OPTIMIZE}"
+    glibc_cflags="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} ${OPTIMIZE} ${extra_flags}"
     case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
         y)  ;;
         *)  glibc_cflags+=" -U_FORTIFY_SOURCE";;
@@ -236,7 +328,7 @@ do_libc_backend() {
         # use the 'install-headers' makefile target to install the
         # headers
         CT_DoExecLog ALL make ${JOBSFLAGS}              \
-                         install_root=${CT_SYSROOT_DIR} \
+                         install_root=${CT_SYSROOT_DIR}${extra_dir} \
                          install-bootstrap-headers=yes  \
                          "${extra_make_args[@]}"        \
                          install-headers
@@ -273,12 +365,12 @@ do_libc_backend() {
 
             # there are a few object files needed to link shared libraries,
             # which we build and install by hand
-            CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
+            CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
             CT_DoExecLog ALL make ${JOBSFLAGS}  \
                         "${extra_make_args[@]}" \
                         csu/subdir_lib
             CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
-                                "${CT_SYSROOT_DIR}/usr/lib"
+                                "${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
 
             # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
             # However, since we will never actually execute its code,
@@ -288,9 +380,13 @@ do_libc_backend() {
                                            -nostartfiles    \
                                            -shared          \
                                            -x c /dev/null   \
-                                           -o "${CT_SYSROOT_DIR}/usr/lib/libc.so"
+                                           -o "${CT_SYSROOT_DIR}${extra_dir}/usr/lib/libc.so"
         fi # threads == nptl
     else # libc_mode = final
+        CT_DoLog EXTRA "Prepare C library"
+        CT_DoExecLog ALL make ${JOBSFLAGS}                      \
+                              "${extra_make_args[@]}"           \
+                              clean
         CT_DoLog EXTRA "Building C library"
         CT_DoExecLog ALL make ${JOBSFLAGS}                      \
                               "${extra_make_args[@]}"           \
@@ -299,7 +395,7 @@ do_libc_backend() {
         CT_DoLog EXTRA "Installing C library"
         CT_DoExecLog ALL make ${JOBSFLAGS}                      \
                               "${extra_make_args[@]}"           \
-                              install_root="${CT_SYSROOT_DIR}"  \
+                              install_root="${CT_SYSROOT_DIR}${extra_dir}"  \
                               install
 
         if [ "${CT_LIBC_LOCALES}" = "y" ]; then
-- 
1.6.4.1


--
For unsubscribe information see http://sourceware.org/lists.html#faq

^ permalink raw reply	[flat|nested] 14+ messages in thread
* Re: simple multilib option
@ 2011-11-14 10:38 Konrad Eisele
  2011-11-14 10:55 ` [PATCH 1/1] Add multilib build support for libc target. Libc is build <multilib>-times in seperate sysroot directories. In a last step links are created to reflect the expected multilib structure Konrad Eisele
  0 siblings, 1 reply; 14+ messages in thread
From: Konrad Eisele @ 2011-11-14 10:38 UTC (permalink / raw)
  To: Yann E. MORIN; +Cc: crossgcc

I'll send revised patches as reply to this one, in the
meantime here are the comment-comments:

> Next time, could you send in the body rather in attachement, it's easier to
> review and comment...
> 
> First, the patch addresses different unrelated changes. For example, the
> Leon changes should go in a separate patch.
> 

I'll send the Multilib-patches only. I also skip the CC_MULTILIB option definition,
as for you have to decide where to put it.
The gcc-4.6 and glibc sparcleon toolchain patch I'll send some other time in the
future.
To get the multilib patches in would be nice as for without them none
of our toolchains can be built with crosstools.

> 
> 
>> diff --git a/build/lib/ct-ng-/scripts/build/libc/glibc-eglibc.sh-common b/build/lib/ct-ng-/scripts/build/libc/glibc-eglibc.sh-common
>> index 2af3a9a..3218656 100644
>> --- a/scripts/build/libc/glibc-eglibc.sh-common
>> +++ b/scripts/build/libc/glibc-eglibc.sh-common
>> @@ -57,18 +57,99 @@ do_libc_extract() {
>>
>>  do_libc_start_files() {
>>      # Start files and Headers should be configured the same way as the
>>      # final libc, but built and installed differently.
>> -    do_libc_backend libc_mode=startfiles
>> +    do_libc_backend_multilib libc_mode=startfiles
>>
>>  }
>>  
>>  # This function builds and install the full C library
>>  do_libc() {
>> -    do_libc_backend libc_mode=final
>> +    do_libc_backend_multilib libc_mode=final
>>  }
>>
>> +# installation is done into ${CT_SYSROOT_DIR}/${dir}. The multilib prefix has to be included
>> +# to reflect the runtime setting.
>> +do_libc_backend_rearrange() {
>> +
> 
> No empty line at start of function.

Done

> 
>> +    local libc_mode=final
> 
> No default.
> The 'libc_mode' is not optional, so every caller has to pass it.
> 
> But are you sure that it makes sense to pass the libc_mode when
> calling rearrange?

Because I use "$@" in do_libc_backend_multilib I think it the easiest way to let
do_libc_backend_rearrange check libc_mode.

> 
>> +    while [ $# -ne 0 ]; do
>> +        eval "${1// /\\ }"
>> +        shift
>> +    done
>> +
>> +    if [ "${libc_mode}" = "final" ]; then
>> +        cross_cc=$(CT_Which "${CT_TARGET}-gcc")
>> +        for i in `${cross_cc} --print-multi-lib 2>/dev/null`; do
>> +            dir=`echo $i | sed -e 's/;.*$//'`;
> 
> dir="${i%%;*}"
> Also, no trailing semi-column, it's useless in shell scripts
> ( this is not C! ;-) )

Done

> 
>> +           bdir=`echo ${dir} | sed -e 's/\//\\\\\//g'`
> 
> Why do you need to double-escape the '/' ?
> And for readability:
>   sed -e 's:/:\\\\/:g'

I use $bdir in a sed expression below: "s/\/lib\/$l/\/lib\/$bdir\/$l/g", so I have to
doublequote to get quotes.


> 
> Also, use ${sed} for portability reasons (eg. on MacOS-X, this is gsed,
> not sed, and this is detected by ./configure).
> 

Done

> And then, use the '-r' option to sed:
>   ${sed} -r -e 's:/:\\\\/:g'
> 
>> +           if [ "${dir}" = "." ]; then
>> +               true;
>> +           else
> 
> if [ "${dir}" != "." ]; then

Done

> 
>> +               flags=`echo $i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
>> +               CT_DoStep INFO "Fixing up multilib location ${CT_SYSROOT_DIR}/${dir}/lib to ${CT_SYSROOT_DIR}/lib/${dir}"
> 
> It does not belong to the 'INFO' log-level, but rather to 'EXTRA' or even
> better yet, to 'DEBUG'.

changed to DEBUG

> 
>> +               mkdir -p ${CT_SYSROOT_DIR}/lib/${dir}
>> +               mkdir -p ${CT_SYSROOT_DIR}/usr/lib/${dir}
>> +
>> +               # recreate the symbolic links for multilib
>> +               find ${CT_SYSROOT_DIR}/usr/lib/${dir}/ -type l -maxdepth 1 > ${CT_SYSROOT_DIR}/usr/lib/${dir}/links
>> +               for f in `cat ${CT_SYSROOT_DIR}/usr/lib/${dir}/links`; do
> 
> You could use an array variable, if you really want two lines:
>     links=( $(find blabla       \
>                    -type l      \
>                    -maxdepth 1  ) )
>     for f in "${links[@]}"; do
> 

Done.

> But you could also use a single call:
>     for f in $(find blabla      \
>                    -type l      \
>                    -maxdepth 1  )
>     do
>         [...]
>     done
> 
>> +                   fn=`basename $f`
>> +                   ln=`readlink $f`
>> +                   ln=`basename $ln`
>> +                   pre=`echo ${dir} | awk '{r="";c=split($0,b,"/");for(i=0;i<c;i++){if(i!=0){r=r "/";}r=r "..";}; printf("%s",r); }'`
> 
> Explain what you're doing here. Basically, you want to turn
>     foo/bar
> into
>     ../..
> 
> Also, try to get a shorter line, and use $(...) as everywhere else:
>     pre=$( echo ${dir}  \
>            |awk '{ r="";
>                    c=split($0, b, "/");
>                    for( i=0; i<c; i++ ) {
>                        if( i!=0 ) {
>                            r=r "/";
>                        }
>                        r = r "..";
>                    }
>                    printf("%s",r);
>                  }' )

Done

> 
>> +                   (cd ${CT_SYSROOT_DIR}/usr/lib/${dir}/; ln -sf ../../${pre}/lib/${dir}/$ln $fn)
> 
> I'm not fan of having a sub-shell here.
>     CT_Pushd "blabla"
>     ln -sf blabla blabla
>     CT_Popd
> 

Done

>> +               done
>> +
>> +                # rewrite the library multiplexers
>> +               for l in libc libpthread libgcc_s; do
>> +                   for d in lib/${dir} usr/lib/${dir}; do
>> +                       if [ -f "${CT_SYSROOT_DIR}/${d}/${l}.so" -a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so ]; then
>> +                           if [ ! -f "${CT_SYSROOT_DIR}/${d}/${l}.so_ori_i" ]; then
> 
> What if the the _ori_i file already exist?
> Surely, it should not happen, and if it does, we should consider this
> as an error.

I emit a Warning. If _iri_i exist it will already have been patched.

> 
>> +                               cp ${CT_SYSROOT_DIR}/${d}/${l}.so ${CT_SYSROOT_DIR}/${d}/${l}.so_ori_i
>> +                               cat ${CT_SYSROOT_DIR}/${d}/${l}.so_ori_i | sed -e "s/\/lib\/$l/\/lib\/$bdir\/$l/g" > ${CT_SYSROOT_DIR}/${d}/${l}.so
>> +                           fi
> 
> Transform that whole if..fi into:
>     ${sed} -r -i        \
>            -e "blabla"  \
>            foo.so
> 
>> +                       fi
>> +                   done
>> +               done
>> +               CT_EndStep
>> +           fi
>> +        done;
>> +    fi
>> +}
>> +
>> +# call do_libc_backend <multilib> times with varying <extra_dir> and <extra_flags> options
>> +do_libc_backend_multilib() {
>> +    local flags=""; local i; local dir;
>> +    cross_cc=$(CT_Which "${CT_TARGET}-gcc")
>> +    if [ "${CT_CC_MULTILIB}" = "y" ]; then
>> +       CT_DoStep INFO "C Library with multilib"
>> +       CT_DoStep INFO "C Library with multilib. Flags: \"\" Dir: \"\""
> 
> Redundant log line.
> Missing flags and dir.

Done

> 
>> +       # first create <non-multilib> to create ${CT_HEADERS_DIR} dir
>> +       do_libc_backend "$@"
>> +       CT_EndStep
>> +       for i in `${cross_cc} --print-multi-lib 2>/dev/null`; do
>> +           dir=`echo $i | sed -e 's/;.*$//'`;
> 
> dir="${i%%;*}"

Done

> 
>> +           if [ "${dir}" = "." ]; then
>> +               true;
>> +           else
> 
> if [ "${dir}" != "." ]; then

Done

> 
>> +               flags=`echo $i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
>> +               CT_DoStep INFO "C Library with multilib. Flags: \"${flags}\" Dir: \"${dir}\""
>> +               do_libc_backend "$@" extra_dir="/${dir}" extra_flags="${flags}"
>> +               CT_EndStep
>> +           fi
>> +       done;
>> +       do_libc_backend_rearrange
> 
> Missing the libc_mode.

Added "$@"

> 
>> +       CT_EndStep
>> +    else
>> +       do_libc_backend "$@"
>> +    fi
>> +}
> 
> This will install headers multiple times, right? Is this expected/wanted?

I do it for precaution.

> 
> Also, I'd do something like:
> 
>     do_libc_backend_multilib() {
>         # We need to call the backend at least once,
>         # with all settings set to the defaults
>         do_libc_backend "$@"
>         if [ "${CT_CC_MULTILIB}" = "y" ]; then
>             for i in $( "${cross_cc}" --print-multi-lib 2>/dev/null ); do
>                 dir="${i%%;*}"
>                 if [ "${dir}" != "." ]; then
>                     flags="${i#*;}"; flags="${flags//@/ -}"
>                     CT_DoStep INFO "C Library with multilib. Flags: '${flags}' Dir: '${dir}'"
>                     do_libc_backend "$@" extra_dir="/${dir}" extra_flags="${flags}"
>                     CT_EndStep
>                 fi
>             done
>         fi
>     }

Done.

> 
>>  do_libc_backend() {
>>      local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
>>      local libc_mode=final
>>      local extra_cc_args
>> +    local extra_dir=""; local extra_dir_p;
> 
> On two lines, no trailing semi-column.

Done

> 
>> +    local extra_flags=""
>>      local -a extra_config
>>      local -a extra_make_args
>>      local glibc_cflags
>>
>> @@ -77,15 +158,16 @@ do_libc_backend() {
>>          eval "${1// /\\ }"
>>          shift
>>      done
>> -
>> +    extra_dir_p=`echo ${extra_dir} | sed -e 's/\///g'`
> 
> Use $(...) instead of `...`, as everywhere else in the code.
> Also, do not forget to quote strings:
> 
>     extra_dir_p="$( echo "${extra_dir}" | sed -e 's/\///g' )"
> 
>> +
>>      if [ "${libc_mode}" = "startfiles" ]; then
>>          CT_DoStep INFO "Installing C library headers & start files"
>> -        mkdir -p "${CT_BUILD_DIR}/build-libc-start-files"
>> -        cd "${CT_BUILD_DIR}/build-libc-start-files"
>> +        mkdir -p "${CT_BUILD_DIR}/build-libc-start-files${extra_dir_p}"
>> +        cd "${CT_BUILD_DIR}/build-libc-start-files${extra_dir_p}"
>>      else # libc_mode = final
>>          CT_DoStep INFO "Installing C library"
>> -        mkdir -p "${CT_BUILD_DIR}/build-libc"
>> -        cd "${CT_BUILD_DIR}/build-libc"
>> +        mkdir -p "${CT_BUILD_DIR}/build-libc${extra_dir_p}"
>> +        cd "${CT_BUILD_DIR}/build-libc${extra_dir_p}"
>>      fi
> 
> I would prefer that there is only one 'top-level' build dir. Also, we
> could replace this whole fi..else.fi block with a single construct.
> Something like:
> 
>     mkdir -p "${CT_BUILD_DIR}/build-libc-${libc_mode}/${extra_dir_p:-base}"
>     cd "${CT_BUILD_DIR}/build-libc-${libc_mode}/${extra_dir_p:-base}"
> 

I'm not shure how to do it. Please decide yourself and change...


>>      CT_DoLog EXTRA "Configuring C library"
>> @@ -133,7 +215,13 @@ do_libc_backend() {
>>      esac
>>      
>>      case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
>> -        y,) extra_config+=("--with-fp");;
>> +        y,) # if it is a <multilib> build then check if -msoft-float is given
>> +           if [ "x`expr "${extra_flags}" : '.*-msoft-float.*'`" != "x0" ]; then
>> +               extra_config+=("--with-fp=no");
>> +           else
>> +               extra_config+=("--with-fp");
>> +           fi
>> +           ;;
>>          ,y) extra_config+=("--without-fp");;
>>      esac
> 
> The hunk above no longer applies to the tree. The soft/hard float selection
> now uses a string, because there might be a bunch of possibilities, not only
> 'soft' and 'hard', but also 'softfp' now.

Sorry, cant handle this. The scenario is modeled so that if multilib
issues "-msoft-float" then glibc is given "--with-fp=no". In fact I'm not shure
weather --with-fp=no is the same as --without-fp. In the
glibc Makefile snippet I use "ifeq ($(with-fp),no)", maybe the
configure is smart enough to define with-fp=no for "--without-fp"...

> 
> [--SNIP--]
>> @@ -288,9 +376,13 @@ do_libc_backend() {
>>                                             -nostartfiles    \
>>                                             -shared          \
>>                                             -x c /dev/null   \
>> -                                           -o "${CT_SYSROOT_DIR}/usr/lib/libc.so"
>> +                                           -o "${CT_SYSROOT_DIR}${extra_dir}/usr/lib/libc.so"
>>          fi # threads == nptl
>>      else # libc_mode = final
>> +        CT_DoLog EXTRA "Prepare C library"
>> +        CT_DoExecLog ALL make ${JOBSFLAGS}                      \
>> +                              "${extra_make_args[@]}"           \
>> +                              clean
> 
> Why do you need to clean here?
> The build dir should be brand new, as we just mkdir it a few lines above.
> In any way, do not reuse any existing dir.

I remember that it didnt proceed compiling without it when using the "RESTART, STOP" option,
maybe it can be removed, on the other hand it doesnt hurt.

> 
>>          CT_DoLog EXTRA "Building C library"
>>          CT_DoExecLog ALL make ${JOBSFLAGS}                      \
>>                                "${extra_make_args[@]}"           \
> 
> [--SNIP--]
>> diff --git a/config/cc/gcc.in.2 b/config/cc/gcc.in.2
>> index 35a1070..8fe3a2e 100644
>> --- a/config/cc/gcc.in.2
>> +++ b/config/cc/gcc.in.2
>> @@ -1,4 +1,10 @@
>>  # gcc configuration options
>> +config CC_MULTILIB
>> +    bool
>> +    prompt "enable multilib"
>> +    default n
>> +    help
>> +      Enable multilib build of libc
> 
> We need to find a place where to put that option, but I think the gcc
> sub-menu is not the proper place.

I didnt add this to the patchset this time. I think you have
to decide where to place CC_MULTILIB ...

> 
> Multi-lib is a property of the toolchain, that is implemented by many
> components, and gcc is only one of those. binutils also plays a role in
> multilib.
> 
> So, it makes more sense to put the option in a more global sub-menu, such
> as in the toolchain options sub-menu.
> 
>>  config CC_ENABLE_CXX_FLAGS
>>      string
>> @@ -11,6 +17,7 @@ config CC_ENABLE_CXX_FLAGS
>>        Note: just pass in the option _value_, that is only the part that
>>        goes after the '=' sign.
>>
>> +
> 
> Spurious empty line.
> 
>>  config CC_CORE_EXTRA_CONFIG_ARRAY
>>      string
>>      prompt "Core gcc extra config"
> 
> [--SNIP leon patches--]
> 
>> diff --git a/scripts/build/binutils/binutils.sh b/scripts/build/binutils/binutils.sh
>> index e082590..7969b13 100644
>> --- a/scripts/build/binutils/binutils.sh
>> +++ b/scripts/build/binutils/binutils.sh
> [--SNIP--]
>> @@ -151,7 +156,13 @@ do_binutils_target() {
>>              extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
>>              [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
>>          fi
>> -
>> +
> 
> Spurious empty-line change: space damage.
> 

Done

>> +       if [ "${CT_CC_MULTILIB}" = "n" ]; then
>> +            extra_config+=("--disable-multilib")
>> +       else
>> +            extra_config+=("--enable-multilib")
>> +       fi
>> +
>>          CT_DoExecLog CFG                                            \
>>          "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure"   \
>>              --build=${CT_BUILD}                                     \
>> @@ -162,7 +173,6 @@ do_binutils_target() {
>>              --enable-shared                                         \
>>              --enable-static                                         \
>>              --disable-nls                                           \
>> -            --disable-multilib                                      \
>>              "${extra_config[@]}"                                    \
>>              ${CT_ARCH_WITH_FLOAT}                                   \
>>              "${CT_BINUTILS_EXTRA_CONFIG[@]}"
> 
> Be careful with binutils for target. It only installs a pair of libraries,
> not the whole binutils. So, is it necessary to enable multilib for the
> target binutils?
> 
> [--SNIP gcc changes (OK)--]
> 
> Globally, I am very happy to see this patch coming in!
> There are a bunch of issues, but that's expected with such core changes.
> 
> Regards,
> Yann E. MORIN.
> 


--
For unsubscribe information see http://sourceware.org/lists.html#faq

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2012-01-02  7:17 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-14 10:45 [PATCH 1/1] Add multilib build support for libc target. Libc is build <multilib>-times in seperate sysroot directories. In a last step links are created to reflect the expected multilib structure Konrad Eisele
2011-12-12 23:07 ` [PATCH 1/1] Add multilib build support for libc target Yann E. MORIN
2011-12-13  8:38   ` Konrad Eisele
2011-12-13 17:15     ` Yann E. MORIN
2011-12-23 23:22 ` [PATCH 1/1] Add multilib build support for libc target. Libc is build <multilib>-times in seperate sysroot directories. In a last step links are created to reflect the expected multilib structure Yann E. MORIN
2011-12-24 21:10   ` konrad.gaisler
2011-12-26 16:57     ` Yann E. MORIN
2011-12-26 19:03       ` konrad.gaisler
2011-12-26 21:30         ` Yann E. MORIN
2011-12-26 17:29     ` Yann E. MORIN
2011-12-27 23:57   ` [PATCH 1/1] Add multilib build support [...] Yann E. MORIN
2011-12-31 18:01   ` Yann E. MORIN
2012-01-02  7:17     ` konrad.gaisler
  -- strict thread matches above, loose matches on Subject: below --
2011-11-14 10:38 simple multilib option Konrad Eisele
2011-11-14 10:55 ` [PATCH 1/1] Add multilib build support for libc target. Libc is build <multilib>-times in seperate sysroot directories. In a last step links are created to reflect the expected multilib structure Konrad Eisele

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).