uClibc-0.9.31をソースツリーの外でビルドしたとき、"include/bits", "include/sys" が "install_headers"ターゲットのmakeでコピーされない問題がある。
例:
$ tar jxf uClibc-0.9.31.tar.bz2 $ cd uClibc-0.9.31 $ make O=`pwd`/../build defconfig $ make O=`pwd`/../build all $ make O=`pwd`/../build PREFIX=`pwd`/../dev install_headers
この状態では
`pwd`/../dev/usr/(...)/include
以下に "bits", "sys" ディレクトリとその配下のヘッダーファイルがコピーされないため、uClibcのヘッダーファイルをincludeするアプリをコンパイルするときにエラーになる。
原因はソースツリーの "extra/scripts/install_headers.sh" にある。
O="..." オプションを使わない場合は、バイナリのビルド時にソースツリー内部の"include"以下に "bits", "sys" が適切にコピーされるため問題とならない。
O="..." オプションを使う場合は、"bits", "sys" はビルドディレクトリの "include" 以下にシンボリックリンクとして作成されるが、install_headers.sh はこのディレクトリを無視している。
下記patchはこの問題を解決する。Makefile.in内では "install_headers" ターゲットで
top_builddir=(ビルドディレクトリ) \ ./extra/scripts/install_headers.sh include (インストール先ディレクトリ)
の形でinstall_headers.sh を実行する。下記patchではtop_builddirのincludeもチェックし、もしソースツリーの外部にある場合はそちらもコピーするよう修正する。
--- install_headers.sh.bak 2011-04-10 16:16:42.000000000 +0900
+++ install_headers.sh 2011-04-10 17:41:30.000000000 +0900
@@ -32,19 +32,27 @@
exit 1
fi
+include_srcdir=`pwd`/${srcdir}
+include_srcdir=`readlink -f ${include_srcdir}`
+include_builddir=`readlink -f ${top_builddir}/include`
+
+function copy_ulibc_headers()
+{
+local srcdir_a=$1
+local dstdir_a=$2
# Sanitize and copy uclibc headers
(
# We must cd, or else we'll prepend "${srcdir}" to filenames!
-cd "${srcdir}" || exit 1
+cd "${srcdir_a}" || exit 1
find . ! -name '.' -a ! -path '*/.*' | sed -e 's/^\.\///' -e '/^config\//d' \
-e '/^config$/d'
) | \
(
IFS=''
while read -r filename; do
- if test -d "${srcdir}/$filename"; then
- mkdir -p "${dstdir}/$filename" 2>/dev/null
+ if test -d "${srcdir_a}/$filename"; then
+ mkdir -p "${dstdir_a}/$filename" 2>/dev/null
continue
fi
if test x"${filename##libc-*.h}" = x""; then
@@ -59,13 +67,18 @@
-U_LIBC \
-U__UCLIBC_GEN_LOCALE \
-U__NO_CTYPE \
- "${srcdir}/$filename" \
+ "${srcdir_a}/$filename" \
| sed -e '/^rtld_hidden_proto[ ]*([a-zA-Z0-9_]*)$/d' \
| sed -e '/^lib\(c\|m\|resolv\|dl\|intl\|rt\|nsl\|util\|crypt\|pthread\)_hidden_proto[ ]*([a-zA-Z0-9_]*)$/d' \
- >"${dstdir}/$filename"
+ >"${dstdir_a}/$filename"
done
)
+}
+copy_ulibc_headers ${srcdir} ${dstdir}
+if test x"${include_srcdir}" != x"${include_builddir}"; then
+ copy_ulibc_headers ${include_builddir} ${dstdir}
+fi
# Fix mode/owner bits
cd "${dstdir}" || exit 1