automake and autoconf aren't what I'm looking for, since they are just a templated makefile.
The current setup looks like
scripts/common.mk
Code:
VERSION = 1
PATCHLEVEL = 0
SUBLEVEL = 0
EXTRAVERSION = -rc1
NAME = Hop To It!
MAKEFLAGS += -rR --no-print-directory
OBJ_TREE_SPECIFIER := obj/
SRC_TREE_SPECIFIER := src/
INC_TREE_SPECIFIER := inc/
API_TREE_SPECIFIER := api/
CLI_SRC_TREE_SPECIFIER := cli/src/
CLI_INC_TREE_SPECIFIER := cli/inc/
HOSTCC = gcc
HOSTCXX = g++
HOSTCFLAGS = -Wall -g
HOSTCXXFLAGS = -Wall -g -fno-strict-aliasing
CC = $(HOSTCC)
CXX = $(HOSTCXX)
CFLAGS = $(HOSTCFLAGS)
CXXFLAGS = $(HOSTCXXFLAGS)
SS = $(topdir)SS/
OSAL = $(topdir)OSAL/
NET = $(topdir)NET/
RECURSE_CLEAN = make clean topdir=$(topdir) -C
RECURSE_COMPILE = make compile topdir=$(topdir) -C
RECURSE_LINK = make link topdir=$(topdir) -C
scripts/module.mk
Code:
include $(topdir)/scripts/common.mk
MODULE_DIR := $(shell pwd)
DIR_DEPS := $(addsuffix -d, $(COMPONENT_DIRS))
compile: pre-compile $(DIR_DEPS)
pre-compile:
echo === Building Module $(MODULE_NAME)
if [ ! -e $(MODULE_DIR)/obj ]; then mkdir $(MODULE_DIR)/obj; fi
%-d:
$(RECURSE_COMPILE) $(@:-d=) MODULE_DIR=$(MODULE_DIR)
link:
@echo === APPLICATIONS for $(MODULE_NAME)
@for d in $(COMPONENT_DIRS); do $(RECURSE_LINK) $$d MODULE_DIR=$(MODULE_DIR); done
clean:
@echo Cleaning module $(MODULE_NAME)
@rm -rf *~ obj/
@for d in $(COMPONENT_DIRS); do $(RECURSE_CLEAN) $$d MODULE_DIR=$(MODULE_DIR); done
scripts/component.mk
Code:
include $(topdir)/scripts/common.mk
SRCS_LIST = src/
RECURSIVE_SRC_BUILD = make topdir=$(topdir)
INCLUDE_LIST += -I$(CURRENT_DIRECTORY)/../api -I$(CURRENT_DIRECTORY)/../inc
CXXFLAGS += $(INCLUDE_LIST)
SRCS_DIRS := $(addsuffix -d, $(SRCS_LIST))
CURRENT_DIRECTORY := $(shell pwd)
compile: pre-compile $(SRCS_DIRS)
pre-compile:
@echo ========= Building $(COMPONENT_NAME)
%-d: pre-build
@echo ========= Built [$(@:-d=)] [$<][$@][$(patsubst %.cpp,%.cpp.dxx,$(wildcard $(@:-d=)*.cpp))]
pre-build:
@echo Determining dependancy info...
%.dxx:
@echo [CXX] `basename $@ .cpp.dxx`.o
link:
@if [ ! -e $(topdir)/executables ]; then mkdir $(topdir)/executables; fi
@if [ -e Make-App ]; then echo ========= Building Application $(APP_NAME); $(CXX) $(CXXFLAGS) -o $(topdir)/executables/$(APP_NAME) $(CURRENT_DIRECTORY)/src/$(APP_NAME).cpp $(OBJ_INC) $(LD_INC); fi
clean:
@echo Cleaning component $(COMPONENT_NAME)
@rm -rf *~ src/*~ inc/*~ api/*~
old-compile-crap:
# @echo ========= Building $(COMPONENT_NAME)
# @if [ ! -e Make-App ]; then for d in $(SRCS_LIST); do (cd $$d && (for f in *.cpp; do make topdir=$(topdir) component_dir=$(CURRENT_DIRECTORY) -f $(CURRENT_DIRECTORY)/Makefile $(MODULE_DIR)/obj/$$f.dxx; done) && cd $(CURRENT_DIRECTORY)); done; fi
old-dxx-crap:
# @cd $(component_dir)
# @$(CXX) $(CXXFLAGS) -c -o $(MODULE_DIR)/obj/`basename $@ .cpp.dxx`.o $(CURRENT_DIRECTORY)/`basename $@ .dxx`
# @cd $(CURRENT_DIRECTORY)
OSAL/Makefile
Code:
MODULE_NAME = OS Abstraction Layer
MODULE_LIB_NAME = libosal.so
COMPONENT_DIRS = BaseLib \
IOLib
include $(topdir)/scripts/module.mk
OSAL/BaseLib/Makefile
Code:
COMPONENT_NAME= Task Component
include $(topdir)/scripts/components.mk
INCLUDE_LIST += -I./api/ -I./inc/ \
-I$(SS)CollectionLib/api
Makefile
Code:
topdir := $(shell pwd)/
include scripts/common.mk
all: compile link
@echo Built All
compile: compile-osal compile-ss compile-net
@echo Compiled All
compile-osal:
@$(RECURSE_COMPILE) $(OSAL)
compile-ss:
@$(RECURSE_COMPILE) $(SS)
compile-net:
@$(RECURSE_COMPILE) $(NET)
link: link-osal link-ss link-net
@echo Link All
link-osal:
@$(RECURSE_LINK) $(OSAL)
link-ss:
@$(RECURSE_LINK) $(SS)
link-net:
@$(RECURSE_LINK) $(NET)
clean:
@rm -rf *~ *.o executables/
@$(RECURSE_CLEAN) $(SS)
@$(RECURSE_CLEAN) $(OSAL)
@$(RECURSE_CLEAN) $(NET)
That's how I've got it laid out. The only difficulty I'm having is making a dependancy style rather than iterative style(for-based) version of component.mk so that it will put all the obj/*.cpp.dxx as dependancies and build them.
-Aaron