All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Simek <michal.simek@petalogix.com>
To: Garrett Cooper <yanegomi@gmail.com>
Cc: ltp-list@lists.sourceforge.net, Mike Frysinger <vapier@gentoo.org>
Subject: Re: [LTP] [PATCH 3/4] Make system enhancements, Draft 3
Date: Mon, 20 Jul 2009 07:25:23 +0200	[thread overview]
Message-ID: <4A63FFC3.80304@petalogix.com> (raw)
In-Reply-To: <364299f40907181419y73621db2w1242b7a1fa7650c@mail.gmail.com>

Garrett Cooper wrote:
> Version 3 of the epic saga: [PATCH 3/4] Make system enhancements.
>
> ========
> HISTORY
> ========
>
> Draft 1:
> 1. Write up a document on how to use the new Make system
> (README.mk-devel), so others may assist in the work that we're
> spearheading at Cisco and contributing back to LTP, and we can begin
> dropping the adhoc Makefiles.
> 2. Add master_rules.mk which contains canned rules for environment
> setup, leaf directories, and trunk directories to reduce Make logic
> noise in the existing LTP Makefile's. This is a more condensed and
> straightforward version of the original master_rules.mk file
> contributed and never integrated into LTP in the past.
> 3. Add master_include.mk, a file which stands as the defacto include
> Makefile for all . This was created out of the comment provided by
> Mike Frysinger w.r.t. a master include file.
>
> Draft 2:
> 1. Addresses issues brought up by Mike Frysinger in draft 1 review.
> 2. Fixes several bugs found through continued testing.
> 3. Adds lib.mk, testcases.mk to create more structure in Makefiles,
> and prevent ad-hoc structure with libraries and testcases/ directory
> binaries to reduce code duplication.
>
> Draft 3:
> Address all outstanding comments by Mike Frysinger in draft 2 review.
>
> Signed-off-by: Garrett Cooper <yanegomi@gmail.com>
>
> Index: README.mk-devel
> ===================================================================
> RCS file: README.mk-devel
> diff -N README.mk-devel
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ README.mk-devel	18 Jul 2009 21:15:04 -0000
> @@ -0,0 +1,178 @@
> +==============================
> +Introduction
> +==============================
> +
> +The following document briefly describes the steps and methodologies used for
> +the new and improved Makefile system.
> +
> +==============================
> +The Problem
> +==============================
> +
> +The problem with the old Makefile system is that it was very difficult to
> +maintain and it lacked any sense of formal structure, thus developing for LTP
> +and including new targets was very more difficult than it should have been
> +(maintenance). Furthermore, cross-compilation was impossible due to the fact
> +that the Makefiles didn't support a prefixing system, and the appropriate
> +implicit / static rules hadn't been configured to compile into multiple object
> +directories (easy of use / functionality).
I cross compile LTP all the time and Mike do the same for BlackFin.
cross-compilation was possible.
CROSS_COMPILE=mb-linux-
make

>  Finally, there wasn't a means to
> +setup dependencies between components, such that if a component required
> +libltp.a in order to compile, it would go off and compile libltp.a first
> +(easy of use).
> +
> +These items needed to be fixed to reduce maintenance nightmares for the
> +development community contributing to LTP.
> +
> +==============================
> +Design
> +==============================
> +
> +The system was designed such that including a single GNU Makefile compatible
> +set in each new directory component is all that's essentially required to
> +build the system. Here's an example of how one would accomplish that:
> +
> +.../foo/Makefile:
> +#
> +# Copyright disclaimer goes here -- please use GPLv2.
> +#
> +
> +srcdir			?= ../
> +
> +include $(srcdir)/include/mk/master_include.mk
> +
> +$(eval $(generic_dir_target))
> +
> +.../foo/bar/Makefile:
> +#
> +# Copyright disclaimer goes here -- please use GPLv2.
> +#
> +
> +srcdir			?= ../
> +
> +include $(srcdir)/include/mk/master_include.mk
> +
> +$(eval $(generic_leaf_target))
> +
> +==============================
> +Make Rules and Make Variables
> +==============================
> +
> +When using make rules, avoid writing adhoc rules like:
> +
> +[prog]: [dependencies]
> +	cc -I../../include $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(LDLIBS) \
> +	    -o [prog] [dependencies]
> +
> +etc. This makes cross-compilation and determinism difficult, if not impossible.
> +Besides, implicit rules are your friends and as long as you use `MAKEOPTS=;' in
> +the top-level caller (or do $(subst r,$(MAKEOPTS)) to remove -r), the compile
> +will complete successfully, assuming all other prerequisites have been
> +fulfilled (libraries, headers, etc).
> +
> +$(AR)			: The library archiver.
> +
> +$(CC)			: The system C compiler.
> +
> +$(CXX)			: The system C++ compiler.
> +
> +$(CPP)			: The system C preprocessor.
> +
> +$(CFLAGS)		: C compiler flags.
> +
> +$(CPPFLAGS)		: Preprocessor flags, e.g. -I arguments.
> +
> +$(CXXFLAGS)		: C++ compiler flags, e.g. -I arguments.
> +
> +$(DEBUG_CFLAGS)		: Debug flags to pass to $(CC), -g, etc.
> +
> +$(DEBUG_CXXFLAGS)	: Debug flags to pass to $(CXX).
> +
> +$(LD)			: The system linker (typically $(CC), but not
> +			  necessarily).
> +
> +$(LDFLAGS)		: What to pass in to the linker, including -L arguments
> +			  and other ld arguments, apart from -l library
> +			  includes (see $(LDLIBS)).
> +
> +			  This should be done in the $(CC) args passing style
> +			  when LD := $(CC), e.g. `-Wl,-foo', as opposed to
> +			  `-foo'.
> +
> +$(LDLIBS)		: Libraries to pass to the linker (e.g. -lltp, etc).
> +
> +$(OPT_CFLAGS)		: Optimization flags to pass into the C compiler, -O2,
> +			  etc. If you specify -O2 or higher, make sure that you
> +			  also specify -fno-strict-aliasing, because of gcc
> +			  fstrict-aliasing optimization bugs in the tree
> +			  optimizer! Search for `fstrict-aliasing optimization
> +			  bug'.
> +
> +			  Examples:
> +			  1. tree-optimization/17510
> +			  2. tree-optimization/39100
> +
> +			  Various bugs have occurred in the past due to buggy
> +			  logic in the tree-optimization portion of the gcc
> +			  compiler, from 3.3.x to 4.4, so far.
> +
> +$(OPT_CXXFLAGS)		: Optimization flags to pass to the C++ compiler.
> +
> +$(RANLIB)		: What to run after archiving a library.
> +
> +$(WCFLAGS)		: Warning flags to pass to $(CC), e.g. -Werror,
> +			  -Wall, etc.
> +
> +$(WCXXFLAGS)		: Same as $(WCFLAGS), but for $(CXX).
> +
> +==============================
> +Make System Variables
> +==============================
> +
> +A series of variables are used within the make system that direct what actions
> +need to be taken. Rather than me listing the variables here, please instead
> +refer to the comments contained in `.../include/mk/master_rules.mk'.
> +
> +==============================
> +Guidelines and Recommendations
> +==============================
> +
> +Of course, the GNU Make manual is key to understanding the Make system, but
> +here are the following sections and chapters I suggest reviewing:
> +
> +- implicit rules:
> http://www.gnu.org/software/make/manual/make.html#Implicit-Rules
> +- variables and expansion:
> http://www.gnu.org/software/make/manual/make.html#Using-Variables
> +- origin use: http://www.gnu.org/software/make/manual/make.html#Origin-Function
> +- vpath use: http://www.gnu.org/software/make/manual/make.html#Directory-Search
> +
> +==============================
> +Before Committing
> +==============================
> +
> +One should rebuild from scratch before committing. Here's an example of how to
> +do that:
> +#!/bin/sh
> +
> +TOOLS_PATH=/path/to/tools
> +
> +# Replace [options] with any make specific options and variables, for each
> +# step, example: -j 4, DESTDIR=/path/for/install, etc.
> +make maintainer-clean [options]
> +make \
> +  ACLOCAL=$TOOLS_PATH/bin/aclocal \
> +  AUTOCONF=$TOOLS_PATH/bin/autoconf \
> +  AUTOHEADER=$TOOLS_PATH/bin/autoheader \
> +  AUTOMAKE=$TOOLS_PATH/bin/automake \
> +  autotools
> +./configure [options]
> +make all [options]
> +make install [options]
> +
> +==============================
> +Other Errata
> +==============================
> +
> +- This system (in its current form) supports cross-compilation out of a single
> +directory. Object directory support will be completed soon to properly enable
> +cross-compilation. This is required to avoid sporadic Make-related errors.
> +
> +# vim:
> Index: include/mk/master_rules.mk
> ===================================================================
> RCS file: include/mk/master_rules.mk
> diff -N include/mk/master_rules.mk
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ include/mk/master_rules.mk	18 Jul 2009 21:15:04 -0000
> @@ -0,0 +1,311 @@
> +#
> +#    Master rules Makefile.
> +#
> +#    Copyright (C) 2009, Cisco Systems Inc.
> +#
> +#    This program is free software; you can redistribute it and/or modify
> +#    it under the terms of the GNU General Public License as published by
> +#    the Free Software Foundation; either version 2 of the License, or
> +#    (at your option) any later version.
> +#
> +#    This program is distributed in the hope that it will be useful,
> +#    but WITHOUT ANY WARRANTY; without even the implied warranty of
> +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +#    GNU General Public License for more details.
> +#
> +#    You should have received a copy of the GNU General Public License along
> +#    with this program; if not, write to the Free Software Foundation, Inc.,
> +#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +#
> +# Garrett Cooper, July 2009
> +#
> +
> +# Get the absolute path for the source directory.
> +ifeq ($(origin top_srcdir),undefined)
> +$(error top_srcdir is not defined)
> +endif
> +
> +# Where's the root source directory?
> +top_srcdir			:= $(abspath $(top_srcdir))
> +
> +# Where's the root object directory?
> +top_builddir			?= $(top_srcdir)		# Just in case
> +								# it's not
> +								# specified...
> +
> +top_builddir			:= $(abspath $(top_builddir))	# We need the
> +								# absolute
> +								# path...
> +# Where's the source located at?
> +srcdir				?= .
> +# Where's the root object directory?
> +builddir			?= $(srcdir)
> +# Where are we going to install the files? Most of this junk ends up in
> +# testcases/bin, so let's dump it there :)...
> +INSTALL_DIR			?= testcases/bin
> +
> +abs_builddir			:= $(abspath $(builddir))
> +abs_srcdir			:= $(abspath $(srcdir))
> +
> +# We can piece together where we're located in the source and object trees with
> +# just these two vars and $(CURDIR).
> +export top_srcdir top_builddir
> +
> +define generate_vpath_rule
> +vpath %.$(1)	$(if $(2),$(2),$(srcdir))
> +endef
> +
> +define generate_install_rule
> +$$(warning "gir: $(1) => $(2)")
> +
> +$(1):
> +	install -m $$(INSTALL_MODE) "$(2)/$$(@F)" "$$@"
> +endef
> +
> +# Default source search path. Modify as necessary, but I would call that
> +# poor software design if you need more than one search directory, and
> +# would suggest creating a general purpose static library to that end.
> +$(eval $(call generate_vpath_rule,c))
> +
> +#
> +# get_make_dirs
> +#
> +# Sets the make directories in $(SUBDIRS), and then subsequently filters out
> +# the subdirectories based on $(FILTER_OUT_DIRS).
> +#
> +define get_make_dirs
> +
> +SUBDIRS				?= $$(patsubst %/Makefile,%,$$(wildcard */Makefile))
> +
> +ifneq ($$(strip $$(SUBDIRS)),)		# We have directories to parse.
> +ifneq ($$(strip $$(FILTER_OUT_DIRS)),)	# We have directories to filter-out.
> +SUBDIRS				:= $$(filter-out $$(FILTER_OUT_DIRS),$$(SUBDIRS))
> +endif
> +endif
> +
> +endef
> +
> +define generic_target_env_setup
> +
> +ifeq ($$(origin MAKE_TARGETS),undefined)
> +MAKE_TARGETS			:= $$(notdir $$(patsubst %.c,%,$$(wildcard $$(srcdir)/*.c)))
> +endif
> +
> +# Don't append $(MAKE_TARGETS) unless it is non-NUL length.
> +ifneq ($$(strip $$(MAKE_TARGETS)),)
> +
> +CLEAN_TARGETS			+= $$(MAKE_TARGETS)
> +INSTALL_TARGETS			+= $$(MAKE_TARGETS)
> +
> +endif
> +
> +CLEAN_TARGETS			+= $$(wildcard *.o)
> +
> +# The large majority of the files that we install are going to be apps and
> +# scripts, so let's chmod them like that.
> +INSTALL_MODE			?= 00775
> +
> +ifneq ($(filter-out %install,$(MAKECMDGOALS)),)	# Not an install
> target -- skip.
> +ifeq ($$(origin INSTALL_DIR),undefined)	# Not set by the user -- most like a
> +					# programming error now in this .mk
> +					# file.
> +$$(error INSTALL_DIR is not set (undefined))
> +else
> +ifeq ($$(strip $$(INSTALL_DIR)),)	# Set to a NUL-length string (dev
> +					# error in a leaf Makefile, or
> +					# someone's toying with the
> +					# environment).
> +$$(error INSTALL_DIR is not set to a non-NUL string)
> + 					# else $(INSTALL_DIR) is set to a
> + 					# non-NUL string.
> +
> +endif					# END: INSTALL_DIR NUL-length string.
> +endif					# END: undefined
> +endif					# END: Not install
> +
> +# An absolute path; don't append $(DESTDIR)/$(prefix) to the var.
> +ifeq ($$(patsubst /%,,$$(INSTALL_DIR)),)
> +INSTALL_PATH			:= $$(INSTALL_DIR)
> +# Otherwise, let's assume that it's not relative to $(prefix)
> +else
> +INSTALL_PATH			:= $$(DESTDIR)/$$(prefix)/$$(INSTALL_DIR)
> +endif
> +
> +INSTALL_FILES			:= $$(addprefix $$(INSTALL_PATH)/,$$(notdir
> $$(INSTALL_TARGETS)))
> +
> +CLEAN_TARGETS			+= $$(INSTALL_FILES)
> +
> +$$(INSTALL_PATH):
> +	mkdir -p $$@
> +
> +$$(INSTALL_FILES): %: pre-install $$(abs_builddir)/$$(@F) $$(INSTALL_DEPS)
> +	install -m $$(INSTALL_MODE) $$(abs_builddir)/$$(@F) $$@
> +
> +endef
> +
> +#
> +# generic_leaf_target
> +#
> +# Generate a set of basic targets (all, clean, install) for a leaf directory
> +# (no subdirectories).
> +#
> +# In order to properly emulate pre- and post- behavior, a pre-install and
> +# _install target are generated as well. The flow for install is as follows:
> +#
> +# pre-install -> $(INSTALL_FILES) -> install
> +#
> +# Helpful variables are:
> +#
> +# $(MAKE_DEPS)			: What to execute before all.
> +# $(MAKE_TARGETS)		: What to execute as direct dependencies of
> +# 				  all.
> +# 				  1. Defaults to the basename of the targets
> +# 				     produced by the %.c -> % implicit pattern
> +# 				     rules, e.g. the MAKE_TARGET in a directory
> +# 				     like the following:
> +#
> +#				  $$ ls /bar
> +# 				  foo.c
> +#
> +#				     Would be `foo'. Similarly, the following
> +#				     dir structure:
> +#
> +#				  $$ ls /bar
> +# 				  foo.c zanzibar.c
> +#
> +#				     Would be `foo zanzibar'.
> +#
> +#				  2. If you define MAKE_TARGETS as an empty
> +#				     string, this will override the defaults.
> +#				     I did this to avoid providing too much
> +#				     rope to hang one's self in the event of
> +#				     unwanted behavior.
> +#
> +# $(CLEAN_TARGETS)		: What targets should be cleaned (must be
> +#				  real files). This will automatically append
> +#				  adds the .o suffix to all files referenced
> +#				  by $(MAKE_TARGETS)) to CLEAN_TARGETS, if
> +#				  MAKE_TARGETS wasn't defined (see
> +#				  $(MAKE_TARGETS)).
> +# $(PREINSTALL_DEPS)		: What to run as direct dependencies of
> +# 				  pre-install.
> +# $(INSTALL_DEPS)		: What to run as direct dependencies of
> +# 				  the _install target. These must be real
> +# 				  files.
> +# $(POSTINSTALL_DEPS)		: What to install direct dependencies of
> +# 				  the install target.
> +# $(INSTALL_MODE)		: What mode should we using when calling
> +# 				  install(1)?
> +#
> +# If you choose to cherrypick the logic contained here, by changing around the
> +# dependencies for $(INSTALL_DEPS) and $(POSTINSTALL_DEPS), then you must also
> +# emulate the $(INSTALL_DEPS): pre-install and install: $(POSTINSTALL_DEPS)
> +# dependencies, if you _use_ them.
> +#
> +# Also, if you wish to change the installation directory, from the set default
> +# (testcases/bin) you must do something like either one of the following items:
> +#
> +# Method A:
> +#
> +# INSTALL_DIR			:= /path/to/installdir/from/$(DESTDIR)/$(prefix)
> +#
> +# e.g. if I wanted to install my binaries in testcases/bin, I would do:
> +#
> +# INSTALL_DIR			:= testcases/bin
> +#
> +# in my calling Makefile.
> +#
> +# Or Method B:
> +#
> +# INSTALL_DIR			:= /path/to/installdir/from/$(DESTDIR)
> +#
> +# e.g. if I wanted to install my binaries in $(libdir) (which may not exist
> +# outside of $(prefix) right now, but could in the future), I could do the
> +# following:
> +#
> +# INSTALL_DIR			:= $(libdir)
> +#
> +define generic_leaf_target
> +
> +$$(eval $$(generic_target_env_setup))
> +
> +.PHONY: all clean _install install pre-install
> +
> +all: | $$(MAKE_DEPS) $$(MAKE_TARGETS)
> +
> +clean: $$(CLEAN_DEPS)
> +	-$(RM) -f $$(CLEAN_TARGETS)
> +
> +pre-install: | $$(INSTALL_PATH) $$(PREINSTALL_DEPS)
> +
> +install: | $$(INSTALL_FILES) $$(POSTINSTALL_DEPS)
> +
> +endef
> +
> +#
> +# generic_trunk_target
> +#
> +# Generate a set of recursive targets to apply over a trunk directory (has
> +# directories) -- optionally with a set of trunk-based files.
> +#
> +# All variables in this canned define are essentially the same as
> +# generic_leaf_target, with the exception that the install flow for local
> +# targets is:
> +#
> +# pre-install -> $(INSTALL_FILES) -> trunk-install
> +#
> +# All recursive targets are traverse SUBDIRS as defined by the user, or if
> +# undefined, defaults to any subdirectories where Makefile's are contained
> +# within.
> +#
> +# generic_trunk_target specific variables are:
> +#
> +# RECURSIVE_TARGETS		: a list of targets to apply over an entire
> +# 				  directory tree. This defaults to
> +# 				  `all clean install'.
> +#
> +# See generic_leaf_target, generic_target_env_setup, and get_make_dirs for
> +# more details and design notes.
> +#
> +define generic_trunk_target
> +
> +#
> +# Doesn't need forced secondary expansion because $(CURDIR) isn't going to
> +# change (or at least it bloody well shouldn't ;)...).
> +#
> +# Don't do this in generic_target_env_setup, because we only need to do this
> +# by default for generic_dir_target.
> +#
> +$(eval $(get_make_dirs))
> +
> +RECURSIVE_TARGETS		?= all clean install
> +
> +.PHONY: $$(RECURSIVE_TARGETS) $$(addprefix
> trunk-,$$(RECURSIVE_TARGETS)) pre-install
> +
> +$$(eval $$(generic_target_env_setup))
> +
> +trunk-all: | $$(MAKE_DEPS) $$(MAKE_TARGETS)
> +
> +trunk-clean: $$(CLEAN_DEPS)
> +	-$(RM) -f $$(CLEAN_TARGETS)
> +
> +pre-install: | $$(INSTALL_PATH) $$(PREINSTALL_DEPS)
> +
> +trunk-install: | $$(INSTALL_FILES) $$(POSTINSTALL_DEPS)
> +
> +# Avoid creating duplicate .PHONY references to all, clean, and install. IIRC,
> +# I've seen some indeterministic behavior when one does this in the past with
> +# GNU Make...
> +.PHONY: $$(filter-out $$(RECURSIVE_TARGETS),all clean install)
> +all: trunk-all
> +
> +clean: trunk-clean
> +
> +install: trunk-install
> +
> +$$(RECURSIVE_TARGETS): %:
> +	@set -e; for dir in $$(SUBDIRS); do \
> +	    $(MAKE) -C $$$$dir $$@; \
> +	done
> +
> +endef
> Index: include/mk/master_include.mk
> ===================================================================
> RCS file: include/mk/master_include.mk
> diff -N include/mk/master_include.mk
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ include/mk/master_include.mk	18 Jul 2009 21:15:04 -0000
> @@ -0,0 +1,25 @@
> +#
> +#    Master include Makefile.
> +#
> +#    Copyright (C) 2009, Cisco Systems Inc.
> +#
> +#    This program is free software; you can redistribute it and/or modify
> +#    it under the terms of the GNU General Public License as published by
> +#    the Free Software Foundation; either version 2 of the License, or
> +#    (at your option) any later version.
> +#
> +#    This program is distributed in the hope that it will be useful,
> +#    but WITHOUT ANY WARRANTY; without even the implied warranty of
> +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +#    GNU General Public License for more details.
> +#
> +#    You should have received a copy of the GNU General Public License along
> +#    with this program; if not, write to the Free Software Foundation, Inc.,
> +#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +#
> +# Garrett Cooper, July 2009
> +#
> +
> +# Only include config.mk for non-clean based targets.
> +-include $(top_srcdir)/include/mk/config.mk
> +include $(top_srcdir)/include/mk/master_rules.mk
> Index: include/mk/lib.mk
> ===================================================================
> RCS file: include/mk/lib.mk
> diff -N include/mk/lib.mk
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ include/mk/lib.mk	18 Jul 2009 21:15:04 -0000
> @@ -0,0 +1,71 @@
> +#
> +#    library include Makefile.
> +#
> +#    Copyright (C) 2009, Cisco Systems Inc.
> +#
> +#    This program is free software; you can redistribute it and/or modify
> +#    it under the terms of the GNU General Public License as published by
> +#    the Free Software Foundation; either version 2 of the License, or
> +#    (at your option) any later version.
> +#
> +#    This program is distributed in the hope that it will be useful,
> +#    but WITHOUT ANY WARRANTY; without even the implied warranty of
> +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +#    GNU General Public License for more details.
> +#
> +#    You should have received a copy of the GNU General Public License along
> +#    with this program; if not, write to the Free Software Foundation, Inc.,
> +#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +#
> +# Garrett Cooper, July 2009
> +#
> +
> +include $(top_srcdir)/include/mk/master_include.mk
> +
> +# Change the default goal when nothing is specified to install because we want
> +# to ensure that the libraries get installed ASAP so they can be properly
> +# linked in with all required apps.
> +CPPFLAGS			+= -I$(includedir)
> +
> +# An extension of generic_leaf_target, strictly for libraries.
> +define lib_target
> +
> +.PHONY: install_headers
> +
> +ifeq ($$(origin LIB),undefined)
> +$$(error You must define LIB when including this Makefile)
> +endif
> +
> +install_headers: $$(addprefix $(includedir)/,$$(notdir $$(HEADER_FILES)))
> +
> +INSTALL_DEPS			:= install_headers
> +
> +INSTALL_DIR			:= $(libdir)
> +
> +INSTALL_MODE			?= 00664
> +
> +LIB				:= $$(addprefix $$(builddir)/,$$(LIB))
> +
> +MAKE_TARGETS			:= $$(LIB)
> +
> +ifeq ($$(origin LIBSRCS),undefined)
> +LIBSRCS				?= $$(wildcard $(srcdir)/*.c)
> +endif
> +
> +LIBSRCS				:= $$(notdir $$(LIBSRCS))
> +
> +LIBOBJS				:= $$(addprefix $$(builddir)/,$$(patsubst %.c,%.o,$$(LIBSRCS)))
>   
long line.

Michal


> +
> +$$(warning $$(LIBSRCS))
> +
> +$$(LIB): $$(LIBOBJS)
> +	set -e; if [ -z "$$(strip $$^)" ] ; then \
> +	    echo "Cowardly refusing to create empty archive."; \
> +	    exit 1; \
> +	fi
> +	$$(AR) -rc $$@ $$^
> +	$$(RANLIB) $$@
> +
> +$$(eval $$(generic_leaf_target))
> +
> +endef
> Index: include/mk/testcases.mk
> ===================================================================
> RCS file: include/mk/testcases.mk
> diff -N include/mk/testcases.mk
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ include/mk/testcases.mk	18 Jul 2009 21:15:04 -0000
> @@ -0,0 +1,25 @@
> +#
> +#    testcases include Makefile.
> +#
> +#    Copyright (C) 2009, Cisco Systems Inc.
> +#
> +#    This program is free software; you can redistribute it and/or modify
> +#    it under the terms of the GNU General Public License as published by
> +#    the Free Software Foundation; either version 2 of the License, or
> +#    (at your option) any later version.
> +#
> +#    This program is distributed in the hope that it will be useful,
> +#    but WITHOUT ANY WARRANTY; without even the implied warranty of
> +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +#    GNU General Public License for more details.
> +#
> +#    You should have received a copy of the GNU General Public License along
> +#    with this program; if not, write to the Free Software Foundation, Inc.,
> +#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +#
> +# Garrett Cooper, July 2009
> +#
> +
> +include $(top_srcdir)/include/mk/master_include.mk
> +
> +LDLIBS			+= -lltp
>
> ------------------------------------------------------------------------------
> Enter the BlackBerry Developer Challenge  
> This is your chance to win up to $100,000 in prizes! For a limited time, 
> vendors submitting new applications to BlackBerry App World(TM) will have
> the opportunity to enter the BlackBerry Developer Challenge. See full prize  
> details at: http://p.sf.net/sfu/Challenge
> _______________________________________________
> Ltp-list mailing list
> Ltp-list@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ltp-list
>   


-- 
Michal Simek, Ing. (M.Eng)
PetaLogix - Linux Solutions for a Reconfigurable World
w: www.petalogix.com p: +61-7-30090663,+42-0-721842854 f: +61-7-30090663


------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

  reply	other threads:[~2009-07-20  5:25 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-18 21:19 [LTP] [PATCH 3/4] Make system enhancements, Draft 3 Garrett Cooper
2009-07-20  5:25 ` Michal Simek [this message]
2009-07-20  7:32   ` Garrett Cooper
2009-07-21 13:01     ` Michal Simek
2009-07-21 13:57       ` Garrett Cooper
2009-07-21 14:01         ` Michal Simek
2009-07-30 18:28           ` Subrata Modak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A63FFC3.80304@petalogix.com \
    --to=michal.simek@petalogix.com \
    --cc=ltp-list@lists.sourceforge.net \
    --cc=vapier@gentoo.org \
    --cc=yanegomi@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.