mklib: Extract archives into temporary directories

When static libraries are created from other archives, objects are
extracted and then deleted when the static library is done. This can
race when there are multiple static libraries being created from the
same archives as with libmesa.a and libmesagallium.a.

Should fix this issue with parallel jobs:

make[5]: *** No rule to make target
> `../../../../../../src/mesa/libmesagallium.a', needed by
> `radeon_dri.so'. Stop

Signed-off-by: Dan Nicholson <dbn.lists@gmail.com>
Reported-and-Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
This commit is contained in:
Dan Nicholson 2010-01-07 17:11:37 -08:00
parent dddd5a36ac
commit a1de400e8d
1 changed files with 17 additions and 5 deletions

View File

@ -28,15 +28,26 @@
# Given a list of files, look for .a archives and unpack them.
# Return the original list of files minus the .a files plus the unpacked files.
expand_archives() {
DIR=$1
shift
FILES=$@
NEWFILES=""
ORIG_DIR=`pwd`
mkdir -p "$DIR"
cd "$DIR"
for FILE in $FILES ; do
case $FILE in
*.a)
# extract the .o files from this .a archive
case $FILE in
/*) ;;
*) FILE="$ORIG_DIR/$FILE" ;;
esac
MEMBERS=`ar t $FILE`
ar x $FILE
NEWFILES="$NEWFILES $MEMBERS"
for MEMBER in $MEMBERS ; do
NEWFILES="$NEWFILES $DIR/$MEMBER"
done
;;
*)
# other file type, just add to list
@ -44,6 +55,7 @@ expand_archives() {
;;
esac
done
cd "$ORIG_DIR"
echo $NEWFILES
}
@ -360,13 +372,13 @@ case $ARCH in
fi
# expand .a into .o files
NEW_OBJECTS=`expand_archives $OBJECTS`
NEW_OBJECTS=`expand_archives ${LIBNAME}.obj $OBJECTS`
# make static lib
FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
# remove temporary extracted .o files
rm -f `contents_of_archives $OBJECTS`
rm -rf ${LIBNAME}.obj
else
# make dynamic library
LIBNAME="lib${LIBNAME}" # prefix with "lib"
@ -553,12 +565,12 @@ case $ARCH in
echo "mklib: Making FreeBSD static library: " ${STLIB}
# expand .a into .o files
NEW_OBJECTS=`expand_archives $OBJECTS`
NEW_OBJECTS=`expand_archives ${STLIB}.obj $OBJECTS`
FINAL_LIBS=`make_ar_static_lib cq 1 ${STLIB} ${NEW_OBJECTS}`
# remove temporary extracted .o files
rm -f `contents_of_archives $OBJECTS`
rm -rf ${STLIB}.obj
else
# make dynamic library
SHLIB="lib${LIBNAME}.so.${MAJOR}"