diff options
Diffstat (limited to 'make/lib/compile-c.sh')
-rw-r--r-- | make/lib/compile-c.sh | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/make/lib/compile-c.sh b/make/lib/compile-c.sh new file mode 100644 index 000000000000..3558dd89ead4 --- /dev/null +++ b/make/lib/compile-c.sh @@ -0,0 +1,73 @@ +. $stdenv/setup + +mainName=$(basename $main | cut -c34-) + +echo "compiling \`$mainName'..." + +# Turn $localIncludes into an array. +localIncludes=($localIncludes) + +# Determine how many `..' levels appear in the header file references. +# E.g., if there is some reference `../../foo.h', then we have to +# insert two extra levels in the directory structure, so that `a.c' is +# stored at `dotdot/dotdot/a.c', and a reference from it to +# `../../foo.h' resolves to `dotdot/dotdot/../../foo.h' == `foo.h'. +n=0 +maxDepth=0 +for ((n = 0; n < ${#localIncludes[*]}; n += 2)); do + target=${localIncludes[$((n + 1))]} + + # Split the target name into path components using some IFS magic. + savedIFS="$IFS" + IFS=/ + components=($target) + depth=0 + for ((m = 0; m < ${#components[*]}; m++)); do + c=${components[m]} + if test "$c" = ".."; then + depth=$((depth + 1)) + fi + done + IFS="$savedIFS" + + if test $depth -gt $maxDepth; then + maxDepth=$depth; + fi +done + +# Create the extra levels in the directory hierarchy. +prefix= +for ((n = 0; n < maxDepth; n++)); do + prefix="dotdot/$prefix" +done + +# Create symlinks to the header files. +for ((n = 0; n < ${#localIncludes[*]}; n += 2)); do + source=${localIncludes[n]} + target=${localIncludes[$((n + 1))]} + + # Create missing directories. We use IFS magic to split the path + # into path components. + savedIFS="$IFS" + IFS=/ + components=($prefix$target) + fullPath=(.) + for ((m = 0; m < ${#components[*]} - 1; m++)); do + fullPath=("${fullPath[@]}" ${components[m]}) + if ! test -d "${fullPath[*]}"; then + mkdir "${fullPath[*]}" + fi + done + IFS="$savedIFS" + + ln -sf $source $prefix$target +done + +# Create a symlink to the main file. +if ! test "$(readlink $prefix$mainName)" = $main; then + ln -s $main $prefix$mainName +fi + +mkdir $out +test "$prefix" && cd $prefix +gcc -Wall $cFlags -c $mainName -o $out/$mainName.o |