#!/bin/bash REP_CC=cc REP_CXX=c++ REP_INCLUDE='-I$(HOME)/projects/include -I/usr/include' REP_LIBRARIES= REP_TARGET=target SMAKE_DIR=~/dev/bash/smake/etc/smake ENV_FILE=$SMAKE_DIR/env.smk BUILD_FILE=$SMAKE_DIR/build.smk RULES_FILE=$SMAKE_DIR/rules.smk # Debug DEBUG=1 # Parameters processing TEMP=`getopt -o c:x:i:l:t: --long cc:,cxx:,include:,libraries:,target: -- "$@"` eval set -- "$TEMP" while true ; do case "$1" in -c|--cc) REP_CC=$2 ; echo "CC=$REP_CC" ; shift 2 ;; -x|--cxx) REP_CXX=$2 ; echo "CXX=$REP_CXX" ; shift 2 ;; -i|--include) REP_INCLUDE=$2 ; echo "INCLUDE=$REP_INCLUDE"; shift 2 ;; -l|--libraries) REP_LIBRARIES=$2 ; echo "LIBRARIES=$REP_LIBRARIES"; shift 2 ;; -t|--target) REP_TARGET=$2 ; echo "TARGET=$REP_TARGET"; shift 2 ;; --) shift ; break ;; *) echo "Internal error!" ; exit 1 ;; esac done # --- Environment --- sed "s~REP_CC~$REP_CC~ ; s~REP_CXX~$REP_CXX~ ; \ s~REP_LIBRARIES~$REP_LIBRARIES~ ; s~REP_TARGET~$REP_TARGET~" $ENV_FILE > Makefile # INCLUDE0, INCLUDE1, INCLUDE2, ... REP_INCLUDE=`echo $REP_INCLUDE | sed "s~-I~~g ; s~\\$(HOME)~${HOME}~"` i=1 for d in $REP_INCLUDE; do echo "INCLUDE$i=$d" >> Makefile i=$((i+1)) done for d in $REP_INCLUDE; do echo -n ' $(INCLUDE'$j')' >> Makefile done echo >> Makefile echo >> Makefile # --- Build --- cat $BUILD_FILE >> Makefile echo >> Makefile # --- Rules --- cat $RULES_FILE >> Makefile all_dep_lst=`grep ^\#include\ \" $REP_TARGET.c | sed 's~[^"]*"\([^"]*\)"~\1~' | sort -u` while [[ "$all_dep_lst" != "$old_all_dep_lst" ]]; do old_all_dep_lst=$all_dep_lst for f in $all_dep_lst; do F="" for d in . $REP_INCLUDE; do #echo "$d/$f" # | sed "s~^${HOME}~$\(HOME\)~" if [ -f "$d/$f" ]; then F="$d/$f" break fi done if [ "$F" == "" ]; then echo "file \"$f\" not found" exit -1 fi #echo "F=$F" all_dep_lst="$all_dep_lst "`grep ^\#include\ \" $F | sed 's~[^"]*"\([^"]*\)"~\1~'` all_dep_lst=`echo $all_dep_lst | sed 's~ ~\n~g' | sort -u` done done echo "all_dep_lst=$all_dep_lst"