Subject:
Makefile.rules
From:
Gary James ####@####.####
Date:
28 Nov 2000 05:41:24 -0000
Message-Id: <3A234741.1000403@twcny.rr.com>
Hi Greg,
I'm trying to get comfortable with how I might structure the build
environment for a project using Microwindows. What's been bothering me
up to now is how to seperate the Microwindows library parts from my
applications parts in the build scripts. It seems like the three files
"config", "Arch.rules" and "Makefile.rules" have a lot of critical
definitions that I want my makefile to pick up on. But the one file
"Makefile.rules" also has some pieces that I don't want in my makefile.
These are mostly the phony targets used to build and install
Microwindows. I'd like my makefile to have a "clean" and an "install"
target that don't conflict with your targets.
I think we could split "Makefile.rules" into two files say
"Makefile.rules" and "Makefile.defs". Keep all the Microwindows build
specific stuff in the ".rules" file and keep the definitions needed by
all Microwindows based applications in the ".defs" file.
The Microwindows makefile includes "Makefile.rules" which inturn
includes "Makefile.defs" which includes "Arch.rules". Other third party
application makefiles can define their own phony target rules and just
include "Makefile.defs" which includes "Arch.rules".
By splitting the files up in the way I've proposed, there should be no
impact to any projects that are using the current "Makefile.rules".
I've attached two files that seem to do the trick. I've created these
two files from the "Makefile.rules" originally found in version 0.89pre6.
Gary James
Sr Software Engineer
Critical Link LLC
www.criticallink.com
##############################################################################
# Microwindows rules Makefile
# Copyright (c) 2000 Martin Jolicoeur, Greg Haerr
#
# This makefile should be placed at the top of a project hierarchy
#
# NOTE: The TOP environment variable should be set to that top directory
##############################################################################
include $(TOP)/Makefile.defs
INSTALL_DIR = install -c -m 755 -o root -g root -d
INSTALL_HDR = install -c -m 644 -o root -g bin
INSTALL_LIB = install -c -m 444 -o root -g bin
# If you dont want to see every executed command ...
ifeq ($(VERBOSE), N)
.SILENT:
endif
.PHONY: default subdirs clean cleandepend xconfig
#
# This is the default target
# It looks for sub-directories with makefiles in it and tries to execute them
#
ifeq ($(SHAREDLIBS), Y)
default: subdirs $(OBJS) $(CXXOBJS) $(TOP)/lib/$(LIBNAME) $(TOP)/lib/$(LIBNAMESO)
else
default: subdirs $(OBJS) $(CXXOBJS) $(ASMOBJS) $(TOP)/lib/$(LIBNAME)
endif
dirs = $(shell for file in `\ls`; \
do if [ -d $$file -a $$file != "demos" ]; then \
if [ -f $$file/Makefile ]; then echo $$file; fi; fi; done)
demos = $(shell for file in `\ls`; \
do if [ -d $$file -a $$file = "demos" ]; then \
if [ -f $$file/Makefile ]; then echo $$file; fi; fi; done)
#
# Subdirectories target
#
subdirs:
ifeq ($(ARCH), DJGPP)
$(shell set CURDIR=$(pwd);)
$(shell \
if [ ! -d $(TOP)/bin ]; \
then mkdir $(TOP)/bin; fi;)
$(shell \
if [ ! -d $(TOP)/lib ]; \
then mkdir $(TOP)/lib; fi;)
endif
$(foreach dir, $(dirs), $(MAKE) -C $(dir);)
#
# If a library name is specified,
# a library of that name will be created with objects in that directory
#
ifneq ($(LIBNAME), )
$(TOP)/lib/$(LIBNAME): $(OBJS) $(CXXOBJS)
@echo "Creating library $@ ..."
$(AR) $(ARFLAGS) $(TOP)/lib/$(LIBNAME) $(OBJS) $(CXXOBJS) $(ASMOBJS)
endif
#
# If a shared object library name is specified, link this object
#
ifeq ($(SHAREDLIBS), Y)
$(TOP)/lib/$(LIBNAMESO): $(TOP)/lib/$(LIBNAME)
@echo "Creating shared library $@ ..."
$(LD) -shared -o $@ --whole-archive $^
endif
xconfig:
./xconfigure
# don't clean lib dir
cleanapps: cleandepend
@echo "Cleaning directory $(CURDIR) ..."
$(RM) core *~ *.bak *.o TAGS
$(RM) bin/*
$(foreach dir, $(dirs), $(MAKE) -C $(dir) cleanapps;)
$(foreach dir, $(demos), $(MAKE) -C $(dir) cleanapps;)
clean: cleandepend
@echo "Cleaning directory $(CURDIR) ..."
$(RM) core *~ *.bak *.o TAGS
$(RM) $(TOP)/lib/*.a $(TOP)/lib/*.so
$(shell cd $(TOP)/bin; \
for file in `\ls`; do if [ ! -d $$file ]; \
then $(RM) $$file; fi; done; cd $(TOP))
$(foreach dir, $(dirs), $(MAKE) -C $(dir) clean;)
$(foreach dir, $(demos), $(MAKE) -C $(dir) clean;)
cleandepend:
@echo "Cleaning dependencies in directory $(CURDIR) ..."
$(RM) .depend
$(foreach dir, $(dirs), $(MAKE) -C $(dir) cleandepend;)
$(foreach dir, $(demos), $(MAKE) -C $(dir) cleandepend;)
install: default
$(INSTALL_DIR) $(HDRINSTALLDIR)
echo "Copying hdrs to $(HDRINSTALLDIR)"
$(INSTALL_HDR) include/*.h $(HDRINSTALLDIR)
echo "Copying libs to $(LIBINSTALLDIR)"
$(INSTALL_DIR) $(LIBINSTALLDIR)
$(INSTALL_LIB) lib/*.a $(LIBINSTALLDIR)
ifeq ($(SHAREDLIBS), Y)
$(INSTALL_LIB) lib/*.so $(LIBINSTALLDIR)
endif
echo "Installation completed successfully."
tags:
-rm -f TAGS
etags --language=c++ --append \
`find . \( -name '*.h' -o -name '*.cc' \) -print`
etags --language=c --append `find . -name \*.[hc] -print`
etags --language=asm --append `find . -name \*.[Ss] -print`
#
# Included dependency files
#
ifneq ($(MAKECMDGOALS), clean)
ifneq ($(MAKECMDGOALS), cleandepend)
ifneq ($(MAKECMDGOALS), realclean)
ifneq ($(MAKECMDGOALS), xconfig)
ifneq ($(OBJS),)
-include .depend
endif
endif
endif
endif
endif
##############################################################################
# Microwindows rules Makefile
# Copyright (c) 2000 Martin Jolicoeur, Greg Haerr
#
# This makefile should be placed at the top of a project hierarchy
#
# NOTE: The TOP environment variable should be set to that top directory
##############################################################################
ifeq ($(ARCH), DJGPP)
SHELL = bash
else
SHELL = /bin/sh
endif
# install directories for headers and libraries
INSTALL_PREFIX = /usr
HDRINSTALLDIR = $(INSTALL_PREFIX)/include/microwin
LIBINSTALLDIR = $(INSTALL_PREFIX)/lib
INCLUDEDIRS += -I. -I$(TOP)/include
#
# General configuration setup (see config file)
#
DEFINES += -DMWPIXEL_FORMAT=$(SCREEN_PIXTYPE)
ifeq ($(VTSWITCH), Y)
DEFINES += -DVTSWITCH=1
endif
ifeq ($(X11), Y)
CFLAGS += -DX11=1
LDFLAGS += -L/usr/X11R6/lib -lX11
endif
ifeq ($(VGALIB), Y)
LDFLAGS += -lvga
endif
ifeq ($(ARCH),FREEBSD-X86)
LDFLAGS += -lvgl
endif
ifeq ($(HAVE_FILEIO), Y)
DEFINES += -DHAVE_FILEIO
ifeq ($(HAVE_JPEG_SUPPORT), Y)
DEFINES += -DHAVE_JPEG_SUPPORT=1
INCLUDEDIRS += -I$(INCJPEG)
endif
ifeq ($(HAVE_T1LIB_SUPPORT), Y)
DEFINES += -DHAVE_T1LIB_SUPPORT=1
INCLUDEDIRS += -I$(INCT1LIB)
endif
ifeq ($(HAVE_FREETYPE_SUPPORT), Y)
DEFINES += -DHAVE_FREETYPE_SUPPORT=1
INCLUDEDIRS += -I$(INCFTLIB)
endif
ifeq ($(HAVE_HZK_SUPPORT), Y)
DEFINES += -DHAVE_HZK_SUPPORT=1
DEFINES += -DHZK_FONT_DIR="\"$(HZK_FONT_DIR)"\"
endif
ifeq ($(HAVE_BIG5_SUPPORT), Y)
DEFINES += -DHAVE_BIG5_SUPPORT=1
endif
ifeq ($(HAVE_GB2312_SUPPORT), Y)
DEFINES += -DHAVE_GB2312_SUPPORT=1
endif
ifeq ($(HAVE_BMP_SUPPORT), Y)
DEFINES += -DHAVE_BMP_SUPPORT=1
endif
ifeq ($(HAVE_GIF_SUPPORT), Y)
DEFINES += -DHAVE_GIF_SUPPORT=1
endif
ifeq ($(HAVE_XPM_SUPPORT), Y)
DEFINES += -DHAVE_XPM_SUPPORT=1
endif
endif
ifeq ($(NOFONTSORCLIPPING), Y)
CFLAGS += -DNOFONTSORCLIPPING=1
endif
ifeq ($(HAVE_SHAREDMEM_SUPPORT), Y)
DEFINES += -DHAVE_SHAREDMEM_SUPPORT=1
endif
ifeq ($(SHAREDLIBS), Y)
CFLAGS += -fpic
endif
ifeq ($(OPTIMIZE), Y)
OPTFLAGS += -O3
endif
ifeq ($(DEBUG), Y)
OPTFLAGS += -ggdb
endif
CFLAGS += $(INCLUDEDIRS)
HOSTCFLAGS := $(CFLAGS)
CPPFLAGS += $(DEFINES)
LDFLAGS += -L$(TOP)/lib
ARFLAGS = rs
# Tools (may be overridden by Arch.rules)
HOSTCC = gcc
# Include the rules for arch's
# if the user has a specific arch local to their home load it
ifeq ($(HOME)/microwin/Arch.rules,$(wildcard $(HOME)/microwin/Arch.rules))
include $(HOME)/microwin/Arch.rules
else
include $(TOP)/Arch.rules
endif
# Tools ...
CC = $(TOOLSPREFIX)$(COMPILER)
CXX = $(TOOLSPREFIX)$(CXX_COMPILER)
AR = $(TOOLSPREFIX)ar
LD = $(TOOLSPREFIX)ld
NM = $(TOOLSPREFIX)nm
STRIP = $(TOOLSPREFIX)strip
OBJCOPY = $(TOOLSPREFIX)objcopy
CP = cp
MV = mv
################## Libraries Section ##################
MWINLIBS = $(TOP)/lib/libmwin.a $(TOP)/lib/libmwinlib.a\
$(TOP)/lib/libmwengine.a $(TOP)/lib/libmwdrivers.a\
$(TOP)/lib/libmwfonts.a $(TOP)/lib/libmwimages.a
CCMWINLIBS = -lmwin -lmwinlib -lmwin -lmwengine -lmwdrivers -lmwfonts -lmwimages -lm
ifeq ($(NWIDGET), Y)
NANOXCLIENTLIBS += $(TOP)/lib/libnwidget.a
#ifeq ($(LINK_APP_INTO_SERVER), Y)
#NANOXSERVERLIBS += $(TOP)/lib/libnwidget.a
#endif
endif
ifeq ($(LINK_APP_INTO_SERVER), Y)
NANOXCLIENTLIBS += $(TOP)/lib/libnano-X.a $(TOP)/lib/libmwengine.a\
$(TOP)/lib/libmwdrivers.a $(TOP)/lib/libmwfonts.a
CCNANOXCLIENTLIBS += -lnano-X -lmwengine -lmwdrivers -lmwfonts
else
NANOXCLIENTLIBS += $(TOP)/lib/libnano-X.a
CCNANOXCLIENTLIBS += -lnano-X
endif
NANOXSERVERLIBS += $(TOP)/lib/libmwengine.a $(TOP)/lib/libmwdrivers.a\
$(TOP)/lib/libmwfonts.a
CCNANOXSERVERLIBS += -lmwengine -lmwdrivers -lmwfonts
ifeq ($(HAVE_FILEIO), Y)
ifeq ($(HAVE_JPEG_SUPPORT), Y)
MWINLIBS += $(LIBJPEG)
CCMWINLIBS += $(LIBJPEG)
NANOXLIBS += $(LIBJPEG)
NANOXSERVERLIBS += $(LIBJPEG)
ifeq ($(SHAREDLIBS), Y)
CCNANOXSERVERLIBS += $(LIBJPEG)
endif
ifeq ($(LINK_APP_INTO_SERVER), Y)
NANOXCLIENTLIBS += $(LIBJPEG)
endif
endif
endif
ifeq ($(HAVE_T1LIB_SUPPORT), Y)
MWINLIBS += $(LIBT1LIB)
CCMWINLIBS += $(LIBT1LIB)
NANOXLIBS += $(LIBT1LIB)
NANOXSERVERLIBS += $(LIBT1LIB)
ifeq ($(SHAREDLIBS), Y)
CCNANOXSERVERLIBS += $(LIBT1LIB)
endif
ifeq ($(LINK_APP_INTO_SERVER), Y)
NANOXCLIENTLIBS += $(LIBT1LIB)
endif
LDFLAGS += -lm
endif
ifeq ($(HAVE_FREETYPE_SUPPORT), Y)
MWINLIBS += $(LIBFTLIB)
CCMWINLIBS += $(LIBFTLIB)
NANOXLIBS += $(LIBFTLIB)
NANOXSERVERLIBS += $(LIBFTLIB)
ifeq ($(SHAREDLIBS), Y)
CCNANOXSERVERLIBS += $(LIBFTLIB)
endif
ifeq ($(LINK_APP_INTO_SERVER), Y)
NANOXCLIENTLIBS += $(LIBFTLIB)
endif
LDFLAGS += -lm
endif
ifeq ($(ARCH), ELKS)
CCMWINLIBS = $(MWINLIBS)
CCNANOXLIBS = $(NANOXLIBS)
endif
ifeq ($(ARCH), DJGPP)
CCMWINLIBS = $(MWINLIBS) -lgrx20
CCNANOXLIBS = $(NANOXLIBS)
NANOXCLIENTLIBS += -lgrx20
endif
################## End of Libraries Section ##################
# Add any exportable variable here
export TOP ARCH CONFIG
#
# Dependencies target for C files
#
.depend: $(OBJS:.o=.c) $(CXXOBJS:.o=.cc)
@echo "Updating dependencies in $(CURDIR) ..."
$(SHELL) -ec '$(HOSTCC) -MM $(CPPFLAGS) $(CFLAGS) $(OBJS:.o=.c) \
| sed '\''s/\($*\)\.o[ :]*/\1.o \$@ : $$(TOP)\/config /g'\'' > $@; \
[ -s $@ ] || rm -f $@'
#
# Compilation target for C files
#
%.o:%.c
@echo "Compiling $< ..."
$(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $<
#
# Compilation target for C++ files
#
%.o:%.cc
@echo "C++ compiling $< ..."
$(CXX) -c $(CFLAGS) $(CXXFLAGS) -o $@ $<
#
# Compilation target for bmp file conversion
#
%.c:%.bmp $(TOP)/mwin/bmp/convbmp.c
echo "Generating $@ from bitmap file ..."
$(TOP)/bin/convbmp $< > $@