Jump to content

  • Log In with Google      Sign In   
  • Create Account


#ActualShannon Barber

Posted 01 February 2014 - 11:54 AM

I have setup several GNU-based build systems primary via cygwin.

I don't see much of a need for autoconf or automake anymore. They are legacy tools designed to support a wide range of broken POSIX systems.

I presume targeting IRIX & HP-UX are not priorities for you.

 

GNU make v4.0 corrects a number of subtle defects in the way make has worked in the past and it can handle complex projects pretty easy now.

I make sub-makefiles to handle stuff I resuse over-and-over.

 

I have a program.mk that knows how to build the current directory as a program.

I break out the toolchains into their own sub-makefiles. I target embedded stuff so this will need a bit of work for it to make sense for PC toolchains.

 

This is an excerpt from my program.mk file

PROGRAM=$(strip $(notdir $(CURDIR)))

# Find the source
ifeq ($(SRC_DIRS),)
SRC_DIRS=src $(patsubst %/.,%,$(wilcard src/*/.))
endif

ifeq ($(INC_DIRS),)
INC_DIRS=inc $(SRC_DIRS)
endif


CC_SRCS=$(filter-out $(XSRC_LIST),$(foreach SRC_DIR,$(SRC_DIRS), $(wildcard $(SRC_DIR)/*.c)))
AS_SRCS=$(filter-out $(XSRC_LIST),$(foreach SRC_DIR,$(SRC_DIRS), $(wildcard $(SRC_DIR)/*.s)))


SRCS=$(AS_SRCS) $(CC_SRCS)
CC_OBJS=$(subst src/,obj/,$(patsubst %.c,%.o,$(CC_SRCS)))
AS_OBJS=$(subst src/,obj/,$(patsubst %.s,%.o,$(AS_SRCS)))
OBJS=$(AS_OBJS) $(CC_OBJS)
OBJ_DIRS=$(sort $(dir $(OBJS)))
DEPS=$(patsubst obj/%.o,dep/%.dep,$(OBJS))
DEP_DIRS=$(subst obj/,dep/,$(OBJ_DIRS))


# Compiler/Toolchain selection
ifeq ($(VENDOR),)
$(warning Vendor is not set, choose from VENDOR={demo, microsoft, gnu}
include ../../sweng/toolchain/demo.mk
else
include ../../sweng/toolchain/$(VENDOR)-$(ARCH).mk
endif

OUTPUTS += $(PROGRAM).$(BINEXT): $(OBJS) OUTPUTS: $(OBJS)PHONY+=clean
XDEPGOALS+=clean
clean:
@rm -rf out obj lst log lnt dep
@printf "Cleaned $(BRED)%s$(NORMAL)/$(BGREEN)%s$(NORMAL) $(OKSTRING)\n" "$(TARGET)" "$(PROGRAM)"

build: prep $(filter clean cleanall,$(MAKECMDGOALS)) @$(MAKE) --no-print-directory $(OUTPUTS) @printf "Built $(BRED)%s$(NORMAL)/$(BGREEN)%s$(NORMAL) $(OKSTRING)\n" "$(TARGET)" "$(PROGRAM)".PHONY: $(PHONY)
.PRECIOUS: $(PRECIOUS)vpath src/%.h $(INC_DIRS) vpath src/%.c $(SRC_DIRS) vpath src/%.s $(SRC_DIRS)

Getting dependencies working well took me a bit

 

# For some goals it is important that dependencies are not included
# For example, if a .dep has an error in it and a 'make clean' is issued the clean will fail


# If no goal is specified on the command line we default to 'build' so we need to include dependencies if
#  MAKECMDGOALS is blank!
ifeq ($(MAKECMDGOALS),)
INCDEP = build
else
INCDEP = $(filter-out $(XDEPGOALS),$(MAKECMDGOALS))
endif


# Only include dependency files that exist
ifneq ($(INCDEP),)
$(info Including dependencies)
DEPS_EXISTING = $(foreach DIR,$(DEP_DIRS),$(wildcard $(DIR)*.dep))
ifneq ($(DEPS_EXISTING),)
include $(DEPS_EXISTING)
endif #DEPS_EXISTING
endif #INCDEP

#2Shannon Barber

Posted 01 February 2014 - 11:53 AM

I have setup several GNU-based build systems primary via cygwin.

I don't see much of a need for autoconf or automake anymore. They are legacy tools designed to support a wide range of broken POSIX systems.

I presume targeting IRIX & HP-UX are not priorities for you.

 

GNU make v4.0 corrects a number of subtle defects in the way make has worked in the past and it can handle complex projects pretty easy now.

I make sub-makefiles to handle stuff I resuse over-and-over.

 

I have a program.mk that knows how to build the current directory as a program.

I break out the toolchains into their own sub-makefiles. I target embedded stuff so this will need a bit of work for it to make sense for PC toolchains.

 

This is an excerpt from my program.mk file


PROGRAM=$(strip $(notdir $(CURDIR)))

# Find the source
ifeq ($(SRC_DIRS),)
SRC_DIRS=src $(patsubst %/.,%,$(wilcard src/*/.))
endif

ifeq ($(INC_DIRS),)
INC_DIRS=inc $(SRC_DIRS)
endif


CC_SRCS=$(filter-out $(XSRC_LIST),$(foreach SRC_DIR,$(SRC_DIRS), $(wildcard $(SRC_DIR)/*.c)))
AS_SRCS=$(filter-out $(XSRC_LIST),$(foreach SRC_DIR,$(SRC_DIRS), $(wildcard $(SRC_DIR)/*.s)))


SRCS=$(AS_SRCS) $(CC_SRCS)
CC_OBJS=$(subst src/,obj/,$(patsubst %.c,%.o,$(CC_SRCS)))
AS_OBJS=$(subst src/,obj/,$(patsubst %.s,%.o,$(AS_SRCS)))
OBJS=$(AS_OBJS) $(CC_OBJS)
OBJ_DIRS=$(sort $(dir $(OBJS)))
DEPS=$(patsubst obj/%.o,dep/%.dep,$(OBJS))
DEP_DIRS=$(subst obj/,dep/,$(OBJ_DIRS))


# Compiler/Toolchain selection
ifeq ($(VENDOR),)
$(warning Vendor is not set, choose from VENDOR={demo, microsoft, gnu}
include ../../sweng/toolchain/demo.mk
else
include ../../sweng/toolchain/$(VENDOR)-$(ARCH).mk
endif

OUTPUTS += $(PROGRAM).$(BINEXT): $(OBJS) OUTPUTS: $(OBJS)PHONY+=clean
XDEPGOALS+=clean
clean:
@rm -rf out obj lst log lnt dep
@printf "Cleaned $(BRED)%s$(NORMAL)/$(BGREEN)%s$(NORMAL) $(OKSTRING)\n" "$(TARGET)" "$(PROGRAM)"

build: prep $(filter clean cleanall,$(MAKECMDGOALS)) @$(MAKE) --no-print-directory $(OUTPUTS) @printf "Built $(BRED)%s$(NORMAL)/$(BGREEN)%s$(NORMAL) $(OKSTRING)\n" "$(TARGET)" "$(PROGRAM)".PHONY: $(PHONY)
.PRECIOUS: $(PRECIOUS)vpath src/%.h $(INC_DIRS) vpath src/%.c $(SRC_DIRS) vpath src/%.s $(SRC_DIRS)

Getting dependencies working well took me a bit

 

# For some goals it is important that dependencies are not included
# For example, if a .dep has an error in it and a 'make clean' is issued the clean will fail


# If no goal is specified on the command line we default to 'build' so we need to include dependencies if
#  MAKECMDGOALS is blank!
ifeq ($(MAKECMDGOALS),)
INCDEP = build
else
INCDEP = $(filter-out $(XDEPGOALS),$(MAKECMDGOALS))
endif


# Only include dependency files that exist
ifneq ($(INCDEP),)
$(info Including dependencies)
DEPS_EXISTING = $(foreach DIR,$(DEP_DIRS),$(wildcard $(DIR)*.dep))
ifneq ($(DEPS_EXISTING),)
include $(DEPS_EXISTING)
endif #DEPS_EXISTING
endif #INCDEP

#1Shannon Barber

Posted 01 February 2014 - 11:52 AM

I have setup several GNU-based build systems primary via cygwin.

I don't see much of a need for autoconf or automake anymore. They are legacy tools designed to support a wide range of broken POSIX systems.

I presume targeting IRIX & HP-UX are not priorities for you.

 

GNU make v4.0 corrects a number of subtle defects in the way make has worked in the past and it can handle complex projects pretty easy now.

I make sub-makefiles to handle stuff I resume over-and-over.

 

I have a program.mk that knows how to build the current directory as a program.

I break out the toolchains into their own sub-makefiles. I target embedded stuff so this will need a bit of work for it to make sense for PC toolchains.

 

This is an excerpt from my program.mk file

PROGRAM=$(strip $(notdir $(CURDIR)))

# Find the source
ifeq ($(SRC_DIRS),)
SRC_DIRS=src $(patsubst %/.,%,$(wilcard src/*/.))
endif

ifeq ($(INC_DIRS),)
INC_DIRS=inc $(SRC_DIRS)
endif


CC_SRCS=$(filter-out $(XSRC_LIST),$(foreach SRC_DIR,$(SRC_DIRS), $(wildcard $(SRC_DIR)/*.c)))
AS_SRCS=$(filter-out $(XSRC_LIST),$(foreach SRC_DIR,$(SRC_DIRS), $(wildcard $(SRC_DIR)/*.s)))


SRCS=$(AS_SRCS) $(CC_SRCS)
CC_OBJS=$(subst src/,obj/,$(patsubst %.c,%.o,$(CC_SRCS)))
AS_OBJS=$(subst src/,obj/,$(patsubst %.s,%.o,$(AS_SRCS)))
OBJS=$(AS_OBJS) $(CC_OBJS)
OBJ_DIRS=$(sort $(dir $(OBJS)))
DEPS=$(patsubst obj/%.o,dep/%.dep,$(OBJS))
DEP_DIRS=$(subst obj/,dep/,$(OBJ_DIRS))
 
# Compiler/Toolchain selection
ifeq ($(VENDOR),)
$(warning Vendor is not set, choose from VENDOR={demo, microsoft, gnu}
include ../../sweng/toolchain/demo.mk
else
include ../../sweng/toolchain/$(VENDOR)-$(ARCH).mk
endif
 

OUTPUTS += $(PROGRAM).$(BINEXT): $(OBJS) OUTPUTS: $(OBJS)

PHONY+=clean
XDEPGOALS+=clean
clean:
@rm -rf out obj lst log lnt dep
@printf "Cleaned $(BRED)%s$(NORMAL)/$(BGREEN)%s$(NORMAL) $(OKSTRING)\n" "$(TARGET)" "$(PROGRAM)"
 

build: prep $(filter clean cleanall,$(MAKECMDGOALS)) @$(MAKE) --no-print-directory $(OUTPUTS) @printf "Built $(BRED)%s$(NORMAL)/$(BGREEN)%s$(NORMAL) $(OKSTRING)\n" "$(TARGET)" "$(PROGRAM)"

.PHONY: $(PHONY)
.PRECIOUS: $(PRECIOUS)

vpath src/%.h $(INC_DIRS) vpath src/%.c $(SRC_DIRS) vpath src/%.s $(SRC_DIRS)

 

Getting dependencies working well took me a bit

 

# For some goals it is important that dependencies are not included
# For example, if a .dep has an error in it and a 'make clean' is issued the clean will fail


# If no goal is specified on the command line we default to 'build' so we need to include dependencies if
#  MAKECMDGOALS is blank!
ifeq ($(MAKECMDGOALS),)
INCDEP = build
else
INCDEP = $(filter-out $(XDEPGOALS),$(MAKECMDGOALS))
endif


# Only include dependency files that exist
ifneq ($(INCDEP),)
$(info Including dependencies)
DEPS_EXISTING = $(foreach DIR,$(DEP_DIRS),$(wildcard $(DIR)*.dep))
ifneq ($(DEPS_EXISTING),)
include $(DEPS_EXISTING)
endif #DEPS_EXISTING
endif #INCDEP

PARTNERS