diff --git a/Documentation/.latex2html-init b/Documentation/.latex2html-init new file mode 100644 index 00000000..cc4b5dc6 --- /dev/null +++ b/Documentation/.latex2html-init @@ -0,0 +1,47 @@ + +# Workaround for a bug in latex2html which does not seem to +# manage the \tableofcontents command correctly +&ignore_commands( <<_IGNORED_CMDS_); +tableofcontents +_IGNORED_CMDS_ + +$ASCII_MODE = 1; + +$BODYTEXT = "BGCOLOR=\"\#FFFFFF\" text=\"\#000000\" link=\"\#0000FF\" vlink=\"\#4444FF\" alink=\"\#3388FF\""; + +$SHOW_SECTION_NUMBERS = 1; + +$MAX_SPLIT_DEPTH = 4; + +$INFO = " +

+Copyright (C) 2000, 2001 Free Software Foundation, Inc. +

+Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. +

+Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. +

+Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions. +"; + + +sub top_navigation_panel { + ($NEXT_TITLE ? " Next: $NEXT_TITLE \n" : undef) . + ($UP_TITLE ? "Up: $UP_TITLE \n" : undef) . + ($PREVIOUS_TITLE ? " Previous: $PREVIOUS_TITLE \n" : undef) . + "

\n" +} + +sub bot_navigation_panel { + "


". + ($NEXT_TITLE ? " Next: $NEXT_TITLE \n" : undef) . + ($UP_TITLE ? "Up: $UP_TITLE \n" : undef) . + ($PREVIOUS_TITLE ? " Previous: $PREVIOUS_TITLE \n" : undef) +} diff --git a/Documentation/GNUmakefile.in b/Documentation/GNUmakefile.in index 8ae3c43f..c886cc35 100644 --- a/Documentation/GNUmakefile.in +++ b/Documentation/GNUmakefile.in @@ -36,9 +36,10 @@ GNUSTEP_TEXI2HTML = texi2html GNUSTEP_TEXI2HTML_FLAGS = -split_chapter -expandinfo GNUSTEP_DVIPS = dvips GNUSTEP_DVIPS_FLAGS = +TAR = @TAR@ # The documents to be generated -DOCUMENT_NAME = make gnustep-howto machines faq +DOCUMENT_NAME = make gnustep-howto machines faq internals # The text documents to be generated DOCUMENT_TEXT_NAME = INSTALL README NEWS GNUstep-HOWTO @@ -65,6 +66,9 @@ gnustep-howto_TEXI_FILES = \ gnustep-howto.texi \ version.texi +internals_LATEX_FILES = \ +internals.tex + INSTALL_TEXI_FILES = version.texi INSTALL_TEXT_MAIN = install.texi INSTALL_DOC_INSTALL_DIR = Developer/Makefiles/ReleaseNotes/$(VERSION) diff --git a/Documentation/internals.tex b/Documentation/internals.tex new file mode 100644 index 00000000..4e1920ab --- /dev/null +++ b/Documentation/internals.tex @@ -0,0 +1,192 @@ +\documentclass[a4paper]{article} +% +% Comment the following line out if you don't have the geometry +% package on your system. +% +\usepackage[includemp=no]{geometry} +% +% +% +\begin{document} +\title{GNUstep Makefile Package Internals} +\author{Nicola Pero n.pero@mi.flashnet.it} +\date{last days of June 2001} +\maketitle +\tableofcontents + +\section{Introduction} +This short document attempts to explain simply how the gnustep +makefile package works internally. Since the mechanism involves +recursive invocations of make on the same makefiles (each time with +different targets and variables), it might be very confusing at the +beginning. In this document we concentrate on understanding the main +flow of processing, ignoring most of the little details. This should +hopefully allow you to start reading and understanding the +gnustep-make source code, and then you can learn about the little +details by yourself. + +\section{From `make' to the internal-all rule} + +Imagine for example that in your \texttt{ GNUmakefile} you include both +\texttt{tool.make} and \texttt{library.make}, as in the following example: +\begin{verbatim} +include $(GNUSTEP_MAKEFILES)/common.make + +TOOL_NAME = decrypt +decrypt_OBJC_FILES = decrypt.m + +LIBRARY_NAME = libDvd +libDvd_OBJC_FILES = decss.m + +include $(GNUSTEP_MAKEFILES)/tool.make +include $(GNUSTEP_MAKEFILES)/library.make +\end{verbatim} % $ fool emacs's buggy tex mode +Then you type `make' on the command line. We want to understand what +happens. + +Make will process your \texttt{GNUmakefile}, which includes +\texttt{tool.make}, and that will include \texttt{rules.make}. In +\texttt{rules.make} make finds the first rule (the one which is +executed), which is +\begin{verbatim} +all:: before-all internal-all after-all +\end{verbatim} +This means that make will build by default that target \texttt{ all}, +and that building that target requires building the +\texttt{before-all}, \texttt{internal-all} and \texttt{after-all} +targets. We ignore the \texttt{before-all} and \texttt{after-all} +targets for now, and only concentrate on the core target, which is +\texttt{internal-all}. + +\section{From the internal-all rule to the \%.variables rule} +Make needs to build this target \texttt{internal-all}. In +\texttt{rules.make} this target appears as +\begin{verbatim} +internal-all:: +\end{verbatim} +because of the double colons (that is, because it is +\texttt{internal-all::} rather than \texttt{internal-all:}) this +target can have multiple totally separated rules. Each rule must be a +double colon rule, and is processed separately from the other rules +(even if they refer to the same target). + +The real rules for \texttt{internal-all} are included by the specific +makefiles; in our example, \texttt{tool.make} includes +\begin{verbatim} +internal-all:: $(TOOL_NAME:=.all.tool.variables) +\end{verbatim} %$ +now - in our case - because \texttt{TOOL\_NAME} is \texttt{decrypt}, then +this rule actually means +\begin{verbatim} +internal-all:: decrypt.all.tool.variables +\end{verbatim} +This means that to build \texttt{internal-all}, make has to build (at +least) the \texttt{decrypt.all.tool.variables} target. +\texttt{library.make} includes the completely analogous rule +\begin{verbatim} +internal-all:: $(LIBRARY_NAME:=.all.library.variables) +\end{verbatim} %$ +which in our case means +\begin{verbatim} +internal-all:: libDvd.all.library.variables +\end{verbatim} +This rule is completely separated from the other one; to build +\texttt{internal-all}, make has to build the two different targets: +\begin{verbatim} +decrypt.all.tool.variables +libDvd.all.library.variables +\end{verbatim} + +The rule for building these targets is in the \texttt{rules.make} file, +it is the \texttt{\%.variables} rule: +\begin{verbatim} +%.variables: + @(target=$(basename $(basename $*)); \ + operation=$(subst .,,$(suffix $(basename $*))); \ + type=$(subst -,_,$(subst .,,$(suffix $*))); \ + $(MAKE) -f $(MAKEFILE_NAME) --no-print-directory --no-keep-going \ + TARGET_TYPE=$${type} \ + OPERATION=$${operation} TARGET=$${target} \ + PROCESS_SECOND_TIME=yes $${target}.build \ + OBJCFLAGS="$(OBJCFLAGS)" CFLAGS="$(CFLAGS)" \ + OPTFLAG="$(OPTFLAG)" ) +\end{verbatim} +This rule matches all targets ending in \texttt{.variables}. The rule +parses the \texttt{.variables} string - for example when the rule +is applied to +\begin{verbatim} +decrypt.all.tool.variables +\end{verbatim} +then (remember that \texttt{\$*} is the stem of the rule, +\texttt{decrypt.all.tool} in this case) it extracts +\begin{verbatim} +target=decrypt +operation=all +type=tool +\end{verbatim} +and then it runs a make subprocess with the \texttt{OPERATION} and +\texttt{TYPE} variables set, and a target built from the \texttt{target} +by appending \texttt{.build}. + +\section{The second make invocation} +In our case, the \texttt{\%.variables} rules is executed twice, so it +runs two separate make processes: +\begin{verbatim} +make OPERATION=all TYPE=tool decrypt.build PROCESS_SECOND_TIME=yes ... +make OPERATION=all TYPE=library libDvd.build PROCESS_SECOND_TIME=yes ... +\end{verbatim} +where we have omitted the less interesting variables (as signified by the +\texttt{...}). + +What this means is that for each target/type/operation, a separate +make process is run. For example, if you have two tools, +\texttt{decrypt} and \texttt{crypt}, and you want to both compile and install +them, it will run four make subprocesses: +\begin{verbatim} +make OPERATION=all TYPE=tool decrypt.build PROCESS_SECOND_TIME=yes ... +make OPERATION=all TYPE=tool crypt.build PROCESS_SECOND_TIME=yes ... +make OPERATION=install TYPE=tool decrypt.build PROCESS_SECOND_TIME=yes ... +make OPERATION=install TYPE=tool crypt.build PROCESS_SECOND_TIME=yes ... +\end{verbatim} +This is the `second make invocation'. The make package knows that it +is being invoked for the second time, because of the +\texttt{PROCESS\_SECOND\_TIME} flag. + +\section{The \%.build rule} +Let's examine what happens in the make subprocess - for example in the +\texttt{decrypt.build} make subprocess. Make looks for a rule to +build \texttt{decrypt.build}. The rule is found in +\texttt{rules.make}; it is the \texttt{\%.build} rule. This rule is +too long to quote it here; but basically it runs yet another make +subprocess (which is the one which finally does the work). This last +make subprocess is run more or less as follows: +\begin{verbatim} +make INTERNAL_tool_NAME=decrypt \ + internal-tool-all \ + OBJC_FILES="{the list of OBJC_FILES specified using decrypt_OBJC_FILES + in the makefile}" ... +\end{verbatim} +where \texttt{...} stands for a lot of other variables, including all +variables needed to perform the final stage: \texttt{OBJC\_FILES}, +\texttt{C\_FILES}, \texttt{JAVA\_FILES}, +\texttt{ADDITIONAL\_INCLUDE\_DIRS} etc. Note that each make +subprocess will get passed different, specific, variables. If +gnustep-make wants to modify these variables in some way, it does it +at this stage, before passing them to the submake process. For +example, some library flags are filtered through the +\texttt{WHICH\_LIB\_SCRIPT}. + +\section{The third make subprocess} +This last make subprocess is the one which really builds the target. +Because of the \texttt{INTERNAL\_tool\_NAME} variable being a +non-empty string (while it was empty in all previous invocations), +\texttt{tool.make} will include the actual rules to build the tool; in +particular, the \texttt{internal-tool-all} rule, which is then +executed and builds the tool. All variables such as +\texttt{OBJC\_FILES} or the library flags are now available directly in +the makefiles, they have already been prepared and preprocessed, so +that the rules in \texttt{tool.make} can just plainly use these +variables naively to perform their job (compiling, installing, or +whatever). + +\end{document}