aboutsummaryrefslogtreecommitdiff
path: root/genmake.sh
blob: f29a4f249e20780bdf127d645b353189970bbe80 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/bin/bash

# Makefile for the GL Object eXtensions library

# This bash file is used to generate the makefile
# to produce the library for the graphics library

BINARY_NAME="SonsOfSol"

obs=()
src=()
libs=()

function generate_depends {
	# get the dependencies of the dependencies
	if [ ! -f $1 ] ; then
		return ;
	fi

	next=$(cat $1 | gawk 'match($0, /#include "(.*)"/, m) { print m[1] }')
	deps=$1
	for i in $next ; do
		for canidate in $(generate_depends $i) ; do
			if [[ ! $deps =~ $i ]] && [[ -f $i ]] ; then
				deps="$deps \\$(echo -ne '\n                            ')$i"
			fi
		done
		if [[ $? -ne 0 ]] ; then
			echo "Failed to generate depends">&2
			return 1;
		fi
	done
	echo "$deps"
}

# Iterate through and find the
# c++ source files 
for i in $(find Main.cpp sons_of_sol/ | egrep '.*\.c(pp|xx)?$') ; do
	# add this file to the list of
	# sources
    echo "Generating from source file: $i"
	deps="$(generate_depends $i)"

	# add the resulting object file to
	# the objects
	src[$cnt]=$deps
	obs+=("obs/`basename $i | sed 's/\.c\(pp\|xx\)\?$/.o/g'`")
	cnt=$[cnt + 1]
done

# remove the Makefile if it exists
rm -f Makefile || true

# open Makefile
exec 3<> Makefile

# some commonly used files to generate
echo 'CPPC?=g++'>&3
echo 'AR?=ar'>&3
echo 'OPTFLAGS?=-g3 -ggdb'>&3
echo "CFLAGS=$CFLAGS -Wall -Wextra -I. "'$(OPTFLAGS)'" -D DEBUG_LEVEL_TRACE -Islox -Iglox -Iglox/compat">&3
echo "LDFLAGS=$LDFLAGS -Lslox -Lglox -lslox -lglox -lGL -lGLU -lSDL -lm -ljpeg -lSDL_image -lGLEW">&3
echo 'OBJECTS='${obs[@]}>&3
echo 'BINARY='$BINARY_NAME>&3

# Add all, setup and clean rules
echo -e \
'all: submodules setup $(OBJECTS)
	$(CPPC) -o $(BINARY) $(OBJECTS) $(LDFLAGS)
'>&3

echo -e 'genmake:\n\tfind . -name genmake.sh -exec {} \;\n'>&3
echo -e 'setup:\n\tmkdir -p obs/\n'>&3

echo -e \
'submodules:
	for i in $$(find */ -name Makefile) ; do \
		cd $$(dirname $$i) && make && cd ..; \
	done
'>&3

echo -e \
'clean:
	- rm -rf obs $(BINARY)
	for i in $$(find */ -name Makefile) ; do \
		cd $$(dirname $$i) && make clean && cd ..; \
	done'>&3

# iterate through all of the objects and 
# add a rule for the binary
for ((i=0;i<${#obs[@]};i++)) ; do
    echo "Object file: ${obs[$i]}"
    # add a rule for the new binary
	echo -e "${obs[$i]}: ${src[$i]}\n\t"'$(CPPC) $(CFLAGS) -o $@ -c $<\n'>&3
done

# close Makefile
exec 3>&-