#!/bin/sh
# make a Makefile for libmpeg, and a make.inc for compiling libmpeg
# as part of other projects.  The make.inc version will expect certain
# variables to be defined:
#
#    LIBMPEG_CC -- the command to use to compile files
#    LIBMPEG_CFLAGS -- extra command-line flags to use
#    LIBMPEG_SOURCE_DIR -- the directory libmpeg is in
#    LIBMPEG_LINKLIB -- command to link a library (normally "ar rcs")
#    LIBMPEG_BUILD_DIR -- the location to use for building libmpeg
#
#    LIBMPEG_OBJECT_EXT -- the extension for object files (normally ".o")
#    LIBMPEG_LIBRARY_EXT -- the extension for library files (normally ".a")
#


commonPart=make.tmp
makefileName=Makefile
makeincName=make.inc


### parse arguments
USE_MMX=0
USE_PTHREADS=0
for ac_option
do
case "$ac_option" in
	--mmx)
		USE_MMX=1
		;;


        --pthreads)
		USE_PTHREADS=1
		;;

	-h | --help | -help | *)
	cat << EOF
Options:
	--mmx           Compile libmpeg3 with MMX support.
	--pthreads      Compile libmpeg3 to use pthreads.
EOF
		exit 0
		;;

esac
done


### generate the common parts first

echo "#### automatically generated by $0"  > $commonPart


cat >> $commonPart <<EOF
# flags for compiling libmpeg
LIBMPEG_CFLAGS += -I\$(LIBMPEG_SOURCE_DIR) -I\$(LIBMPEG_SOURCE_DIR)/audio -I\$(LIBMPEG_SOURCE_DIR)/video

# a file that indicates the build tree has been created
LIBMPEG_BUILD_DIR_CREATED=\$(LIBMPEG_BUILD_DIR)/tree.created

EOF


if [ $USE_MMX = 1 ]
then
    echo "LIBMPEG_CFLAGS += -DHAVE_MMX" >> $commonPart
fi
if [ $USE_PTHREADS = 0 ]
then
    echo "LIBMPEG_CFLAGS += -DNOPTHREADS" >> $commonPart
fi
echo >> $commonPart



# write rule to create the build tree
echo "\$(LIBMPEG_BUILD_DIR_CREATED):" >> $commonPart

dirs="\$(LIBMPEG_BUILD_DIR) \$(LIBMPEG_BUILD_DIR)/audio \$(LIBMPEG_BUILD_DIR)/video"
for dir in $dirs
do
    echo "	mkdir -p $dir" >> $commonPart
done
echo "	touch \$(LIBMPEG_BUILD_DIR_CREATED)" >> $commonPart
echo



LIBMPEG_TOP_MODULES="bitstream libmpeg3 mpeg3atrack mpeg3demux mpeg3io mpeg3title mpeg3vtrack changesForSqueak"

LIBMPEG_AUDIO_MODULES="dct header layer2 layer3  mpeg3audio pcm synthesizers tables"

LIBMPEG_VIDEO_MODULES="getpicture headers idct macroblocks mmxtest motion mpeg3video output reconstruct seek slice vlc"


# doDirModule: export the rule for building a particular module in a
# particular subdirectory, and add the target file to LIBMPEG_LOS

doDirModule() {
    # $1 is the directory, $2 is the module

    mod_src="\$(LIBMPEG_SOURCE_DIR)$1/$2.c"
    mod_dest="\$(LIBMPEG_BUILD_DIR)$1/$2.\$(LIBMPEG_OBJECT_EXT)"
    mod_destdir="\$(LIBMPEG_BUILD_DIR)$1"

    echo "$mod_dest: \$(LIBMPEG_BUILD_DIR_CREATED) $mod_src"  >> $commonPart
    echo "	\$(LIBMPEG_CC) -o $mod_dest -c $mod_src  \$(LIBMPEG_CFLAGS) " >> $commonPart
    echo  >> $commonPart

    LIBMPEG_OBJECTS="$LIBMPEG_OBJECTS $mod_dest"
}


# write rules to build each module in libmpeg
for module in $LIBMPEG_TOP_MODULES
do
    doDirModule "" $module
done
for module in $LIBMPEG_AUDIO_MODULES
do
    doDirModule "/audio" $module
done
for module in $LIBMPEG_VIDEO_MODULES
do
    doDirModule "/video" $module
done


# write rules for optional MMX modules
if [ $USE_MMX = 1 ]
then
cat >> $commonPart <<EOF
\$(LIBMPEG_BUILD_DIR)/video/mmxidct.\$(LIBMPEG_OBJECT_EXT) : \$(LIBMPEG_BUILD_DIR_CREATED) \$(LIBMPEG_SOURCE_DIR)/video/mmxidct.S
	\$(LIBMPEG_CC) -c \$(LIBMPEG_SOURCE_DIR)/video/mmxidct.S -o \$(LIBMPEG_BUILD_DIR)/video/mmxidct.\$(LIBMPEG_OBJECT_EXT)

\$(LIBMPEG_BUILD_DIR)/video/reconmmx.\$(LIBMPEG_OBJECT_EXT) : \$(LIBMPEG_BUILD_DIR_CREATED) \$(LIBMPEG_SOURCE_DIR)/video/reconmmx.s
	\$(LIBMPEG_NASM) \$(LIBMPEG_SOURCE_DIR)/video/reconmmx.s -o \$(LIBMPEG_BUILD_DIR)/video/reconmmx.\$(LIBMPEG_OBJECT_EXT)

EOF

LIBMPEG_OBJECTS="$LIBMPEG_OBJECTS \$(LIBMPEG_BUILD_DIR)/video/mmxidct.\$(LIBMPEG_OBJECT_EXT) \$(LIBMPEG_BUILD_DIR)/video/reconmmx.\$(LIBMPEG_OBJECT_EXT)"
fi


## write rule to build the libmpeg library
echo "\$(LIBMPEG_BUILD_DIR)/libmpeg3.\$(LIBMPEG_LIBRARY_EXT): $LIBMPEG_OBJECTS"  >> $commonPart
echo "	\$(LIBMPEG_LINKLIB) \$(LIBMPEG_BUILD_DIR)/libmpeg3.\$(LIBMPEG_LIBRARY_EXT) $LIBMPEG_OBJECTS"  >> $commonPart

echo >> $commonPart


# write rule to clean up
echo "clean: clean_libmpeg" >> $commonPart
echo >> $commonPart
echo "clean_libmpeg:" >> $commonPart
echo "	rm -f \$(LIBMPEG_BUILD_DIR)/*.\$(LIBMPEG_OBJECT_EXT) \$(LIBMPEG_BUILD_DIR)/*/*.\$(LIBMPEG_OBJECT_EXT) \$(LIBMPEG_BUILD_DIR)/libmpeg3.\$(LIBMPEG_LIBRARY_EXT) \$(LIBMPEG_BUILD_DIR_CREATED)" >> $commonPart
echo >> $commonPart




echo "#### end of rules generated by $0" >> $commonPart


### generate Makefile
cat > $makefileName <<EOF
### automatically generated by $0
### settings for building libmpeg by itself

LIBMPEG_CC=cc
LIBMPEG_CFLAGS=
LIBMPEG_LINKLIB=ar rcs
LIBMPEG_NASM=nasm -f elf
LIBMPEG_SOURCE_DIR=.
LIBMPEG_BUILD_DIR=.
LIBMPEG_OBJECT_EXT=o
LIBMPEG_LIBRARY_EXT=a


### default rule: build the library
default : libmpeg3.a


### Update the makefile when needed
Makefile : mkMakefile
	./mkMakefile $@

EOF

cat $commonPart >> $makefileName




### generate make.inc
cat $commonPart > $makeincName



### remove the temp file
rm -f $commonPart
