Improved dependency tracking and cleaner make output.

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@1820 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
meep-eep
2005-05-30 02:47:28 +00:00
parent c6741b3502
commit 050b97c308
7 changed files with 243 additions and 198 deletions
+5 -11
View File
@@ -29,23 +29,17 @@ fi
# Read in the config settings that affect the build, if present.
# Don't reread for every dir when recursing.
if [ -r "$BUILD_WORK/build.vars" -a -z "$BUILD_COMMAND" ]; then
if [ -r "$BUILD_WORK/build.vars" ]; then
. "$BUILD_WORK/build.vars"
fi
# Read in the Makeinfo file for the dir currently being processed
. "${BUILD_REC_PATH:=./}Makeinfo"
# If we're recursing, go on.
if [ -n "$BUILD_COMMAND" ]; then
$BUILD_COMMAND
exit $?
fi
# Read in the Makeproject file
. ./Makeproject
for VAR in TARGETS "$BUILD_PROJECT_NAME" "$BUILD_PROJECT_OBJS"; do
eval VALUE="\$$VAR"
if [ -z "$VALUE" ]; then
echo "$VAR needs to be defined in the top Makeinfo file"
echo "$VAR needs to be defined in the top Makeproject file"
exit 1
fi
done
@@ -115,7 +109,7 @@ case "$2" in
;;
depend)
build_check_config
build_rec_dependencies
build_depend
;;
install)
build_check_config
+56
View File
@@ -0,0 +1,56 @@
#!/bin/sh
# Expected to be passed from the environment:
# BUILD_PROJECT - the name of the project
# BUILD_ROOT - The root of the source files.
# BUILD_WORK - The root of the work directory.
BUILD_ROOT=${BUILD_ROOT%/}/
BUILD_WORK=${BUILD_WORK%/}/
eval OBJDIR=\"${BUILD_WORK}\${${BUILD_PROJECT}_OBJS}\"
# $1 - The prefix up to this point
# $2 - The name of the current subdir
recurse_subdir() {
local REC_PREFIX SUBDIRS SUBDIR CFILES CXXFILES MFILES RCFILES FILE
eval local ${BUILD_PROJECT}_CFILES ${BUILD_PROJECT}_CXXFILES \
${BUILD_PROJECT}_MFILES ${BUILD_PROJECT}_RCFILES \
${BUILD_PROJECT}_SUBDIRS
REC_PREFIX="$1$2/"
if [ "$REC_PREFIX" = "/" ]; then
REC_PREFIX=
fi
eval ${BUILD_PROJECT}_CFILES=
eval ${BUILD_PROJECT}_CXXFILES=
eval ${BUILD_PROJECT}_MFILES=
eval ${BUILD_PROJECT}_RCFILES=
eval ${BUILD_PROJECT}_SUBDIRS=
. "${BUILD_ROOT}${REC_PREFIX}Makeinfo"
eval CFILES=\$${BUILD_PROJECT}_CFILES
eval CXXFILES=\$${BUILD_PROJECT}_CXXFILES
eval MFILES=\$${BUILD_PROJECT}_MFILES
eval RCFILES=\$${BUILD_PROJECT}_RCFILES
for FILE in $CFILES $CXXFILES $MFILES $RCFILES; do
rm -f -- "${OBJDIR}${REC_PREFIX}$FILE.d" \
"${OBJDIR}${REC_PREFIX}$FILE.o"
done
eval SUBDIRS=\$${BUILD_PROJECT}_SUBDIRS
for SUBDIR in $SUBDIRS; do
recurse_subdir "$REC_PREFIX" "$SUBDIR"
done
rmdir -- "${OBJDIR}${REC_PREFIX%/}" 2> /dev/null
}
. "${BUILD_ROOT}Makeproject"
recurse_subdir "" ""
+53
View File
@@ -0,0 +1,53 @@
#!/bin/sh
# Expected to be passed from the environment:
# BUILD_PROJECT - the name of the project
# BUILD_ROOT - The root of the source files.
# BUILD_WORK - The root of the work directory.
BUILD_ROOT=${BUILD_ROOT%/}/
BUILD_WORK=${BUILD_WORK%/}/
eval OBJDIR=\"${BUILD_WORK}\${${BUILD_PROJECT}_OBJS}\"
# $1 - The prefix up to this point
# $2 - The name of the current subdir
recurse_subdir() {
local REC_PREFIX SUBDIRS SUBDIR CFILES CXXFILES MFILES RCFILES FILE
eval local ${BUILD_PROJECT}_CFILES ${BUILD_PROJECT}_CXXFILES \
${BUILD_PROJECT}_MFILES ${BUILD_PROJECT}_RCFILES \
${BUILD_PROJECT}_SUBDIRS
REC_PREFIX="$1$2/"
if [ "$REC_PREFIX" = "/" ]; then
REC_PREFIX=
fi
eval ${BUILD_PROJECT}_CFILES=
eval ${BUILD_PROJECT}_CXXFILES=
eval ${BUILD_PROJECT}_MFILES=
eval ${BUILD_PROJECT}_RCFILES=
eval ${BUILD_PROJECT}_SUBDIRS=
. "${BUILD_ROOT}${REC_PREFIX}Makeinfo"
eval CFILES=\$${BUILD_PROJECT}_CFILES
eval CXXFILES=\$${BUILD_PROJECT}_CXXFILES
eval MFILES=\$${BUILD_PROJECT}_MFILES
eval RCFILES=\$${BUILD_PROJECT}_RCFILES
for FILE in $CFILES $CXXFILES $MFILES $RCFILES; do
echo "${OBJDIR}${REC_PREFIX}$FILE"
done
eval SUBDIRS=\$${BUILD_PROJECT}_SUBDIRS
for SUBDIR in $SUBDIRS; do
recurse_subdir "$REC_PREFIX" "$SUBDIR"
done
}
. "${BUILD_ROOT}Makeproject"
. "${BUILD_WORK}build.vars"
recurse_subdir "" ""
+43 -115
View File
@@ -15,6 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
DEPEND_NAME=make.depend
# Show usage information
usage() {
echo "Main build script"
@@ -41,98 +43,6 @@ $1
EOF
}
# The actual recursing function
build_recurse() {
local FILES SUBDIRS
# Perform an action for this dir
eval FILES="\${$BUILD_FILES_VAR}"
for FILE in $FILES; do
$BUILD_REC_COMMAND "$BUILD_REC_PATH$FILE"
done
# Recurse for all subdirs
eval SUBDIRS="\$${BUILD_PROJECT}_SUBDIRS"
for DIR in $SUBDIRS; do
BUILD_REC_PATH="$BUILD_REC_PATH$DIR/" $SH "$0"
$BUILD_REC_DIR_COMMAND "$BUILD_REC_PATH$DIR"
done
}
# Start the recursion
build_do_recursive() {
BUILD_COMMAND=build_recurse
BUILD_REC_COMMAND="$1"
BUILD_REC_DIR_COMMAND="$2"
export BUILD_COMMAND BUILD_REC_COMMAND BUILD_REC_DIR_COMMAND
build_recurse
}
# Build dependency information for one file
build_dependencies() {
eval $ECHON \$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}\$BUILD_REC_PATH
eval eval \\\$MKDEPEND \"\${${BUILD_PROJECT}_CFLAGS}\" \"\\\$1\" | \
grep -v '#'
}
# Recursively build dependency information
build_rec_dependencies() {
local DEPEND_FILE EXTRA_OFILES
echo "Building dependency information..." >&2
BUILD_WORK_ESC=`escape_string "$BUILD_WORK"`
export BUILD_WORK_ESC
eval mkdir -p "\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}"
eval DEPEND_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}.depend"
# Remove the old dependency file, if it exists.
# The .tmp file is used to detect interrupted dependency builds.
rm -f -- "$DEPEND_FILE".tmp "$DEPEND_FILE"
BUILD_FILES_VAR=${BUILD_PROJECT}_EXTRA_OFILES
export BUILD_FILES_VAR
EXTRA_OFILES=`build_do_recursive build_collect_extra_o_files :`
BUILD_FILES_VAR=${BUILD_PROJECT}_CFILES
OFILES=`build_do_recursive build_collect_o_files :`
{
eval $ECHON "\$BUILD_WORK_ESC/target-\${${BUILD_PROJECT}_NAME}:"
for OFILE in $OFILES $EXTRA_OFILES; do
$ECHON " $OFILE"
done
echo
build_do_recursive build_dependencies :
} > "$DEPEND_FILE".tmp
mv -f -- "$DEPEND_FILE".tmp "$DEPEND_FILE"
}
# Output the .o file for a given .c or .m (Objective-C) file
build_collect_o_files() {
eval echo "\$BUILD_WORK_ESC/\${${BUILD_PROJECT}_OBJS}\${1%.[cm]}.o"
}
# Output the extra .o file with the complete path
build_collect_extra_o_files() {
eval echo "\$BUILD_WORK_ESC/\${${BUILD_PROJECT}_OBJS}\$1"
}
# Recursively collect .o-files
build_rec_collect_o_files() {
local EXTRA_OFILES
BUILD_WORK_ESC=`escape_string "$BUILD_WORK"`
export BUILD_WORK_ESC
BUILD_FILES_VAR=${BUILD_PROJECT}_CFILES
export BUILD_FILES_VAR
build_do_recursive build_collect_o_files :
BUILD_FILES_VAR=${BUILD_PROJECT}_EXTRA_OFILES
build_do_recursive build_collect_extra_o_files :
}
# Start the configure program.
# $1 = target
build_config() {
@@ -173,36 +83,54 @@ build_process_config() {
eval "${TARGET}_process_config"
}
# Recursively build dependency index
build_depend() {
local DEPEND_FILE EXTRA_OFILES
echo "Building file dependency index..." >&2
eval mkdir -p "\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}"
eval DEPEND_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}\$DEPEND_NAME"
# Remove the old dependency file, if it exists.
# The .tmp file is used to detect interrupted dependency builds.
rm -f -- "$DEPEND_FILE".tmp "$DEPEND_FILE"
BUILD_ROOT=./ $SH ./build/unix/build_collect > "$DEPEND_FILE".tmp
mv -f -- "$DEPEND_FILE".tmp "$DEPEND_FILE"
}
# Compile the lot.
# With the depend info set up, we can leave everything to make.
build_compile() {
local CFLAGS LDFLAGS TARGET_FILE DEPEND_FILE OBJDIR
eval CFLAGS="\${${BUILD_PROJECT}_CFLAGS}"
eval LDFLAGS="\${${BUILD_PROJECT}_LDFLAGS}"
eval OBJDIR=\""\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}"\"
eval TARGET_FILE=\""\$BUILD_WORK/\${${BUILD_PROJECT}_NAME}"\"
DEPEND_FILE=$OBJDIR$DEPEND_NAME
eval "${TARGET}_pre_build"
eval CFLAGS="\${${BUILD_PROJECT}_CFLAGS}" \
LDFLAGS="\${${BUILD_PROJECT}_LDFLAGS}" \
DEPEND_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}.depend" \
\$MAKE -f Makefile.build \"\$BUILD_WORK/target-\${${BUILD_PROJECT}_NAME}\"
CFLAGS=$CFLAGS LDFLAGS=$LDFLAGS \
OBJDIR=$OBJDIR \
BUILD_ROOT= \
TARGET_FILE=$TARGET_FILE DEPEND_FILE=$DEPEND_FILE \
SED=$SED \
$MAKE -f Makefile.build "$TARGET_FILE"
eval "${TARGET}_post_build"
}
# Description: Remove the .o file for one .c file
# Arguments: $1 - the .c file
build_clean_file() {
eval rm -f -- "\"\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}\${1%.c}.o\""
}
build_clean_dir() {
eval rmdir -- "\"\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}\${1}\"" 2> /dev/null
return 0
}
build_clean() {
local DEPEND_FILE
eval DEPEND_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}.depend"
BUILD_ROOT=./ $SH ./build/unix/build_clean
eval DEPEND_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}${DEPEND_NAME}"
rm -f "$DEPEND_FILE" "$BUILD_WORK/build.vars" \
"$BUILD_WORK/config.state" "$BUILD_WORK/config_unix.h"
BUILD_FILES_VAR=${BUILD_PROJECT}_CFILES
export BUILD_FILES_VAR
build_do_recursive build_clean_file build_clean_dir
}
build_cleanall() {
@@ -227,16 +155,16 @@ build_check_config() {
build_process_config
fi
. "$BUILD_WORK/build.vars"
. "${BUILD_REC_PATH:=./}Makeinfo"
. "${BUILD_REC_PATH:=./}Makeproject"
}
# Description: check if the necessary .depend file is present,
# Description: check if the necessary depend file is present,
# if not, build it.
build_check_dependencies() {
eval DEPEND_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}.depend"
eval DEPEND_FILE="\$BUILD_WORK/\${${BUILD_PROJECT}_OBJS}${DEPEND_NAME}"
[ ! -e "$DEPEND_FILE" -o -n "$BUILD_RUN_DEPEND" ] || return
build_rec_dependencies || exit $?
build_depend || exit $?
}
# Description: check if the program is compiled, and otherwise compile