[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Generate Custom Compiler / Build Rules?
From: |
Xochitl Lunde |
Subject: |
Re: Generate Custom Compiler / Build Rules? |
Date: |
Tue, 15 Sep 2009 14:24:08 -0500 |
address@hidden wrote on 09/14/2009
11:51:26 PM:
> You can, even only as an intermediate step on the way to a unified
> makefile, put code common to several makefile in a fragment:
> <http://www.gnu.org/software/automake/manual/html_node/Include.html>
>
Xochitl: Ok, I am going to try it.
> Well, you can still use GNU make on all of them. Your choice whether
> you want to make it a prerequisite for your users or not.
>
Xochitl: Ah, there are only 8 in-house users of our Makefiles. We
distribute RPMS or complete binaries to customers. That said, I would
still like to make good choices when writing Makefiles.
> But without seeing the things the rules have in common, or differ in, we
> cannot easily suggest a simplification.
Xochitl: Oh, I did not expect anyone to have the time. I worked out some
of the rules yesterday. I can't figure out how to make a rule that says,
"after all objects for 'program_a' are built, make this intermediate
target before the EXEEXT without overriding the EXEEXT, which you saw that
I did before. Meaning, I can't figure out how to make a target that is
based on a group of things like "all object files". For the moment,
everything is now shortened quite a bit. I changed the EXEEXT to build
the .elf file and now I let make create that by itself. Then afterward I
can type 'make safemodetest-flash' or 'make safemodetest-gdb' to complete
my setup. This is exactly the command sequence I had before, just now the
rules are pattern-matched. My experimental Makefile.am is now 330 lines
shorter.
I would like to get to the point where for all programs it creates both
the *.elf file and the *.bin file when I type make, instead of having to
do it in 2 steps. Right now if I type 'make' it will build all the *.elf
files because that is defined as the EXEEXT, but then I have to run
additional rules to get it to make the *.bin file.
Also you were of course right that the myprog_INCLUDES does not work. I
was defining myprog_INCLUDES and then adding $(myprog_INCLUDES) in
myprog_CXXFLAGS, and that was why it worked for me.
# -----------------------------------------------------------------------
# Note: Because libcppunit uses exceptions, all of these applications
# need to have exceptions enabled.
# -----------------------------------------------------------------------
AM_CPPFLAGS = -fexceptions -g
TESTS = safemodetest systemutilitytest
##stringutilitytest datetimeutilitytest timespantest
##datetimetest fileutilitytest
bin_PROGRAMS = $(TESTS)
vpath %.c .
vpath %.cpp .
vpath %.c $(ac_netos_dir)/src/bsp/common
vpath %.s $(ac_netos_dir)/src/bsp/common
vpath %.cpp $(top_srcdir)/tests
vpath %.cpp $(top_srcdir)/tests/all
# --------------------------------------
# Unit test of safemode.h / safemode.cpp
# --------------------------------------
dist_safemodetest_SOURCES = \
$(top_srcdir)/../common/tests/base/safemodetest.h \
$(top_srcdir)/../common/tests/base/safemodetest.cpp \
$(top_srcdir)/../$(ac_power_alert_platform_path)/tests/main.cpp
# From Makefile.appbuild.ns9215, additional code needs to be compiled.
nodist_safemodetest_SOURCES= $(ac_netos_dir)/src/bsp/common/appconf_api.c
safemodetest_INCLUDES = -include
$(top_srcdir)/../common/tests/base/safemodetest.h
safemodetest_CXXFLAGS = -DTESTCLASS=SafeModeTest $(safemodetest_INCLUDES)
safemodetest_LDFLAGS = -Wl,-T,${ac_netos_linkcmd}
-Wl,--cref,-Map,safemodetest$(MAP_EXT)
safemodetest_LDADD = $(NETOS_CUST_OBJS) $(STARTFILE) $(LDADD) $(APP_LIBS)
# ------------------------------------------------
# Unit test of systemutility.h / systemutility.cpp
# ------------------------------------------------
dist_systemutilitytest_SOURCES = \
$(top_srcdir)/../common/tests/base/systemutilitytest.h \
$(top_srcdir)/../common/tests/base/systemutilitytest.cpp \
$(top_srcdir)/../$(ac_power_alert_platform_path)/tests/main.cpp
# From Makefile.appbuild.ns9215, additional code needs to be compiled.
nodist_systemutilitytest_SOURCES=
$(ac_netos_dir)/src/bsp/common/appconf_api.c
systemutilitytest_INCLUDES = -include
$(top_srcdir)/../common/tests/base/systemutilitytest.h
systemutilitytest_CXXFLAGS = -DTESTCLASS=SystemUtilityTest
$(systemutilitytest_INCLUDES)
systemutilitytest_LDFLAGS = -Wl,-T,${ac_netos_linkcmd}
-Wl,--cref,-Map,safemodetest$(MAP_EXT)
systemutilitytest_LDADD = $(NETOS_CUST_OBJS) $(STARTFILE) $(LDADD)
$(APP_LIBS)
# -----------------------------
# Include paths for all images.
# -----------------------------
INCLUDES = \
-I.. \
-I$(top_srcdir)/src \
-I$(top_srcdir)/../common/src \
-I$(top_srcdir)/../common/tests \
-I$(top_srcdir)/../../externals/cppunit/arm9/include \
$(ac_netos_includes)
# -------------------------------------------
# LDFLAGS and PowerAlert libs for all images.
# -------------------------------------------
AM_LIBTOOLFLAGS = --preserve-dup-deps
AM_LDFLAGS = \
-L$(top_srcdir)/src/startup \
-L$(top_builddir)/src/services \
-L$(top_builddir)/src/base \
-L$(top_srcdir)/../../externals/cppunit/$(ac_external_arch_path)/lib \
-L$(ac_netos_libdir) \
-L$(ac_netos_bspdir) \
-L$(ac_netos_dir)/lib \
-L$(ac_netos_dir)/gnusrc \
-L$(ac_netos_dir)/lib/32b/gnu
LDADD = \
-lstartup \
-lservices \
-lbase
# -----------------------------------------------
# LDADD doesn't cut it for the netsilicon build.
# Instead we need to give the full library paths.
# -----------------------------------------------
APP_LIBS = \
-lftpsvr \
-ltcpip \
-lflash \
-lc \
-ltx \
-lbsp \
-lfilesys \
-lcrypto \
-lsntp \
-laddp \
-ldnsclnt \
-lposix \
-ltcpip \
-lbsp \
-lfilesys \
-ltx \
-lcppunit \
-lc
LIBS = -lgcc -lm -lstdc++ -ltx
# -----------------------------------------------------------
# Additional objects are required for linking an application.
# -----------------------------------------------------------
NETOS_CUST_OBJS=$(ac_netos_bspdir)/reset.o \
$(ac_netos_libdir)/memcpy.o
# -------------------------------------------------------------
# The startfile is crt0.o. This defines our application start.
# Only crt0.o is needed if your application is C.
# For c++ define the other 4 files. You might otherwise see the
# error: undefined symbol __dso_handle
# -------------------------------------------------------------
STARTFILE=$(ac_netos_dir)/lib/32b/gnu/crt0.o \
$(ac_netos_dir)/lib/32b/gnu/crti.o \
$(ac_netos_dir)/lib/32b/gnu/crtbegin.o \
$(ac_netos_dir)/lib/32b/gnu/crtend.o \
$(ac_netos_dir)/lib/32b/gnu/crtn.o
# ---------------------------------------------------
# Define custom build rules for the executable files.
# These are the definitions for the debug image.
# More rules are needed to initialize the debugger.
# ---------------------------------------------------
%$(SYM_EXT) : %$(EXEEXT)
$(NM) -n $< > $@
# ------------------------------------------------------------------
# Define rules to make the *.bin images. This build rule is defined
# in Makefile.appbuild.ns9215 as the target $(IMAGE_WITH_HEADER).
# ------------------------------------------------------------------
%$(BIN_EXT) : %$(EXEEXT)
f=`echo "$<" | sed 's/$(EXEEXT)//'`; \
make $$f$(SYM_EXT); \
cp $< $$f-monimage$(EXEEXT);
$(OBJCOPY) -Obinary $< $$f$(ac_uncompress_ext)
$(ac_netos_imgcompress) $$f$(ac_uncompress_ext)
$$f$(ac_compress_ext)
$(ac_netos_boothdr) $(ac_netos_imgheader_cfg)
$$f$(ac_compress_ext) $@ $(PLATFORM) $(ac_netos_l2b_endian)
$(RM) $$f$(ac_compress_ext)
../../$(ac_netos_binpack) $(PLATFORM)
$(ac_netos_ldscripts)/rom.bin $@
mv rom.bin $@
mv rom.bin.md5 address@hidden
# ------------------------------------------------------------
# Add the rules to create the GDB debugger files. The debugger
# needs to have the information from each image, and it
# expects that image to be named 'image.elf'. Only one image
# can be ready to debug at any given time.
# ------------------------------------------------------------
debugfile=$(shell pwd)/image.elf
currentfile="`cygpath -a -w $(debugfile)`"
gdbinit:
echo $(currentfile) > .currentfile
cp $(ac_netos_dir)/debugger_files/gdb$(PLATFORM).jlink ./.gdbinit
echo source $(ac_netos_dir)/debugger_files/.gdbinit.threadx >>
.gdbinit
echo source $(ac_netos_dir)/debugger_files/.gdbinit.ns9215 >>
.gdbinit
echo "addresses-ns9215" >> .gdbinit
echo "command-info" >> .gdbinit
rm .currentfile
%$(GDB) : %$(EXEEXT)
$(RM) ./image$(EXEEXT); \
$(RM) ./.gdbinit; \
cp $< image$(EXEEXT); \
make gdbinit; \
echo "Please find the debug image at" $(debugfile)
# ----------------------------------------------
# Create rules to make the images from the file.
# This includes creating rom.bin and image.elf
# from the desired executable targets.
# ----------------------------------------------
releasefile=$(shell pwd)/rom$(BIN_EXT)
%$(FLASH): %$(BIN_EXT) %$(GDB)
f=`echo "$<" | sed 's/$(BIN_EXT)//'`; \
$(RM) ./rom.bin; \
$(RM) ./rom.bin.md5; \
mv $$f$(BIN_EXT) rom$(BIN_EXT); \
mv $$f$(BIN_EXT).md5 rom$(BIN_EXT).md5; \
echo "Please find the flash image at" $(releasefile)
# -------------------------
# Additional general rules.
# -------------------------
clean:
$(RM) ./*.o ./*.d
$(RM) ./*.elf ./*.bin ./*.sym ./*.map ./*.*compressed ./.gdbinit
./*.bin.md5