Subversion Repositories tendra.SVN

Rev

Rev 7 | Blame | Compare with Previous | Last modification | View Log | RSS feed

# TenDRA make bootstrap infrastructure
#
# $Id$

.if !defined(_TENDRA_BOOTSTRAP_MK_)
_TENDRA_BOOTSTRAP_MK_=1

.include <tendra.base.mk>
.include <tendra.rules.mk>

# Do some pretty-printing.
WRKDIR=         ${.CURDIR:C/^${BASE_DIR}\///1}

# The main target is synthetised based upon actual needs.
.if !target(.MAIN)
.MAIN: all
.endif

# Do it all. Real workers, mutually exclusive, follow.

.if "${API}" != ""
#
# Build API dependencies.
#

api-depend:
        @${ECHO} "# Creating API source for ${API}"
        ${TSPEC} -I${BASE_DIR}/${APIS} -O./ -S./building ${API}

# Include Makefile generated by tspec during api-depend.
.sinclude "./building/${API}.api/Makefile"

#
# Build API.
#
_REALWORK: api-depend
        cd ${BASE_DIR}/${APIS}/${API}/ && ${.MAKE} makeapi
makeapi: ${APILIB}

${APILIB}: ${APIOBJS}
        @${ECHO} "# Linking ${API} API"
        ${TLD} -mc -o ${APILIB} ${APIOBJS}

CLEAN_EXTRA+= ${APILIB} ${APIOBJS} ${APIOBJS:S/.j/.c/} \
              ./building/${API}.api/Makefile

_objdir=        ${OBJ_DIR}/${APIS}
.elif "${ENVFILE}" != ""
#
# Build environments.
#
fixenv.sed:
        @${ECHO} "# Create ${.TARGET}"
        @${ECHO} "1,\$$s%-MACH-%${OSFAM}/${BLDARCH}%g"          \
                > ${OBJ_DIR}/${.TARGET}
        @${ECHO} "1,\$$s%-BLDARCH-%${BLDARCH}%g"                \
                >> ${OBJ_DIR}/${.TARGET}
        @${ECHO} "1,\$$s%-OSFAM-%${OSFAM}%g"                    \
                >> ${OBJ_DIR}/${.TARGET}
        @${ECHO} "1,\$$s%-MACHDIR-%${MACH_BASE}%g"              \
                >> ${OBJ_DIR}/${.TARGET}
        @${ECHO} "1,\$$s%-BINDIR-%${MACH_BASE}/bin%g"           \
                >> ${OBJ_DIR}/${.TARGET}
        @${ECHO} "1,\$$s%-ENVDIR-%${MACH_BASE}/env%g"           \
                >> ${OBJ_DIR}/${.TARGET}
        @${ECHO} "1,\$$s%-LIBDIR-%${MACH_BASE}/lib%g"           \
                >> ${OBJ_DIR}/${.TARGET}
        @${ECHO} "1,\$$s%-INCLDIR-%${COMMON_DIR}/include%g"     \
                >> ${OBJ_DIR}/${.TARGET}
        @${ECHO} "1,\$$s%-STARTUPDIR-%${COMMON_DIR}/startup%g"  \
                >> ${OBJ_DIR}/${.TARGET}
        @${ECHO} "1,\$$s%-TMPDIR-%${TMP_DIR}%g"                 \
                >> ${OBJ_DIR}/${.TARGET}

_REALWORK: fixenv.sed .USE
        @${ECHO} "# Fixing paths for ${ENVFILE} environments"
. for entry in ${ENVFILE}
        sed -f ${OBJ_DIR}/fixenv.sed ${.CURDIR}/${entry} > ${OBJ_DIR}/${ENVIRONMENT}/${entry}
. endfor
. if "${ENVEXTRA}" != ""
        cat ${.CURDIR}/${ENVEXTRA} >> ${OBJ_DIR}/${ENVIRONMENT}/build
        cat ${.CURDIR}/${ENVEXTRA} >> ${OBJ_DIR}/${ENVIRONMENT}/bootstrap
. endif

_objdir=        ${OBJ_DIR}/${ENVIRONMENT}
.elif "${SYS_FILES}" || "${TDFLIB}" != ""
#
# Build token definition.
#
_REALWORK: .USE
        @${ECHO} "# Building ${TDFLIB} token definition"

_objdir=        ${OBJ_SDIR}
.elif "${PROG}" != ""
#
# Build a program.
#
. if !defined(MAN) && exists(${.CURDIR}/${PROG}.1)
MAN=    ${PROG}.1
. endif

${PROG}: ${OBJS}
        echo "PROG Maker !!!!!!!!!!!!!!!!!"
        @${ECHO} "# Linking ${WRKDIR}/${PROG}"
        ${CC} ${LDOPTS} -o ${PROG} ${OBJS} ${LIBS}

_REALWORK: ${PROG} .USE
. if defined(WRAPPER)
        @${ECHO} "# Adjusting paths for ${WRAPPER}"
        sed -e 1,\$$s%@@MACH_BASE@@%${MACH_BASE}%g \
                -e 1,\$$s%@@PREFIX@@%${PREFIX}%g \
                ${.CURDIR}/${WRAPPER} > ${WRAPPER}
. endif

CLEAN_EXTRA+=   ${PROG} ${PROG}.core core ${OBJS}
_objdir=        ${OBJ_SDIR}
.elif "${LIB}" != ""
#
# Build a library
#
_REALWORK: lib${LIB}.a

lib${LIB}.a: ${OBJS}
        ${AR} cr ${.TARGET} ${OBJS}
        ${RANLIB} ${.TARGET}

_objdir=        ${OBJ_SDIR}
.else
#
# Nothing to do here.
#
_REALWORK:
.endif

# Suppport targets.

# Remove registered garbage.
clean:
.if "${CLEAN_EXTRA}" != ""
        @${ECHO} "# Cleaning ${.CURDIR}"
        ${REMOVE} ${CLEAN_EXTRA}
.endif

# Clean objdir blindly.
cleandir:
.if "${_objdir}" != ""
        ${REMOVE} ${_objdir}/* 2> /dev/null
.endif

# Remove obj symlink from curdir.
cleanobj:
.if "${_objdir}" != ""
        @if ${TEST} -h ${.CURDIR}/obj ; then \
                ${ECHO} "# Removing obj link ${WRKDIR}/obj" ; \
                ${REMOVE} ${.CURDIR}/obj ; \
                ${REMOVE} ${OBJ_DIR_INDICATOR} 2> /dev/null ; \
        fi
.endif

# Create objdir and its symlink.
obj:
.if "${_objdir}" != "" && (!exists(${_objdir}) || !exists(obj))
. if !exists(${_objdir})
        @${ECHO} "# Creating objdir ${_objdir}"
        @${MKDIR} -p ${_objdir}
. endif
.endif
.if "${_objdir}" != ""
        @${REMOVE} ${.CURDIR}/obj
        @${LN} -sf ${_objdir} ${.CURDIR}/obj
.endif

# Glue all the steps together.

all: _REALWORK

# Make sure subdirs are walked after real work is done.
.ORDER: _REALWORK _SUBDIR

# Proceed to subdirs.
_SUBDIR: .USE
.if defined(SUBDIR) && !empty(SUBDIR)
. for entry in ${SUBDIR}
        @cd ${.CURDIR}/${entry}; ${MAKE} ${.TARGET}
. endfor
.endif

# Ensure existence of basic targets.
.for target in obj all clean install cleanobj cleandir
${target}: _SUBDIR .PHONY
.endfor

.endif  # !defined(_TENDRA_BOOTSTRAP_MK_)