]> rtime.felk.cvut.cz Git - omk.git/blob - doc/omk-manual.texinfo
Small fix in documentation
[omk.git] / doc / omk-manual.texinfo
1 \input texinfo   @c -*-texinfo-*-
2 @c %**start of header
3 @setfilename omk-manual
4 @documentencoding UTF-8
5 @settitle OMK: Ocera Make System
6 @c %**end of header
7
8 @copying
9 Manual for Ocera Make System (OMK) version $Id$
10
11 Copyright @copyright{} 2007, 2008 Michal Sojka, Pavel Pisa
12 @end copying
13
14 @titlepage
15 @title Ocera Make System Manual
16 @page
17 @vskip 0pt plus 1filll
18 @insertcopying
19 @end titlepage
20
21 @contents
22
23 @ifnottex
24 @node Top, Overview of OMK, (dir), (dir)
25 @top Ocera Make System
26
27 @insertcopying
28 @end ifnottex
29
30
31 @menu
32 * Overview of OMK::             
33 * OMK User's Manual::           
34 * Original README::             
35 * OMK Development::             
36 * Variable Index::              
37 @end menu
38
39 @node Overview of OMK, OMK User's Manual, Top, Top
40 @chapter OMK Overview
41 @cindex overview
42
43 OMK is an advanced make system written entirely in GNU make. Compiling
44 software using OMK requires only GNU Make and standard UNIX
45 utilities (@command{sh}, @command{sed}, @command{cmp}, ...)
46 installed. OMK aims to be developer friendly; to use OMK, you do not
47 need to understand (sometimes) cryptic syntax of Makefiles.
48
49 You can use OMK on all platforms where you can run GNU Make including
50 Cygwin and MinGW. MS DOS was not tested.
51
52 @c @section Features
53
54 @c @itemize
55 @c @item
56 @c Easy to use for beginners.
57 @c @item
58 @c Automatic handling of dependencies.
59 @c @item
60 @c Supported host platforms: all Un*x operating system including Linux,
61 @c Cygwin, MS DOS and maybe others.
62 @c @end itemize
63
64 @menu
65 * Why to Use OMK?::             
66 * Quick Start::                 
67 * History::                     
68 @end menu
69
70 @node Why to Use OMK?, Quick Start, Overview of OMK, Overview of OMK
71 @section Why to Use OMK?
72
73 Here we list some of OMK features, which we think are important for
74 choosing of a make system.
75
76
77 @itemize
78 @item
79   Makefile in source directories are usually very @b{simple}.
80 @item
81   There is only @b{one} @file{Makefile.rules} for most of components of
82   a bigger project.
83 @item
84   OMK greatly simplifies compilation of projects, where source files are
85   spread between @b{multiple directories}.
86 @item
87   OMK handles properly @b{dependencies} of source files and libraries,
88   so it is not necessary to recompile the whole project if only several
89   files changed.
90 @item
91   OMK allows to freely @b{move} cross-dependant components @b{in
92   directory structure} without the need to update users of moved
93   component. I hate something like
94   @option{-I../../sched/rtlshwq/include} in makefiles for example. If a
95   component is renamed or version is added to the name, many Makefiles
96   in the project would require an update.
97 @item
98   The above feature is very helpful in @b{combining components}
99   (libraries) from different projects/developers to a single project by
100   simply creating symbolic links to external components.
101 @item
102   Compilation of an OMK based projects don't require to install any
103   files before successful finish of build.
104 @item
105   OMK allows to call @command{make} for a particular subdirectory in the
106   source tree.
107 @item
108   Under OMK all products of compilation are stored @b{out of source
109   directories}. This simplifies work with version control systems and
110   helps when simultaneous compilation for multiple targets/platforms is
111   needed.
112 @end itemize
113
114
115
116
117 @node Quick Start, History, Why to Use OMK?, Overview of OMK
118 @section Quick Start
119
120 If you get some sources, which are distributed with OMK, usually the
121 following commands are sufficient to compile the whole project.
122
123 @example
124 @verbatim
125 make default-config
126 make
127 @end verbatim
128 @end example
129
130 @noindent To use OMK in your own project, follow these steps:
131
132 @enumerate
133 @item
134   The newest version of OMK can be found at @uref{http://rtime.felk.cvut.cz/omk/}.
135 @item
136   Take appropriate @file{Makefile.rules} (see @ref{Properties of
137   Specific Makefile.rules}), put it together with leaf @file{Makefile}
138   to the root directory of your project.
139 @item
140   Create @file{Makefile.omk} files in all directories you want to
141   compile something. Please refer to @ref{OMK User's Manual} to learn
142   what to write in @file{Makefile.omk} files.
143 @item
144   Run @command{make omkize} in the root directory.
145 @end enumerate
146
147 @noindent Your project is now ready to compile.
148
149
150 @node History,  , Quick Start, Overview of OMK
151 @section History
152
153 OMK was originally written by Pavel Píša as a solution to have one
154 common make system for OCERA project, where we needed to compile
155 user-space programs, Linux kernel modules and RT Linux modules in one
156 package. Although this system was not accepted for the whole OCERA
157 project. Several individual developers (mostly from Czech Technical
158 University) liked it and started to use it.
159
160 As a number of projects using OMK grew it was necessary to modularize
161 the make system to support more ``targets''. Michal Sojka took care
162 about the process of modularization.
163
164 @node OMK User's Manual, Original README, Overview of OMK, Top
165 @chapter OMK User's Manual
166
167 @menu
168 * Basic Concepts::              
169 * Invoking OMK::                
170 * Compiling Programs::          
171 * Libraries::                   
172 * Multiple Directories::        
173 * Dependency Tracking::         
174 * Configuration and Conditional Compilation::  
175 * Advanced OMK Features::       
176 * Properties of Specific Makefile.rules::  
177 * Running OMK under Windows OS::  
178 * Interfacing OMK to popular IDEs::  
179 * Troubleshooting::             
180 @end menu
181
182 @node Basic Concepts, Invoking OMK, OMK User's Manual, OMK User's Manual
183 @section Basic Concepts
184
185 The main concept of OMK is very simple. In the root directory of the
186 projects resides a file called @file{Makefile.rules}. This file contains
187 all compilation rules needed for compilation of a particular
188 project. There are different @file{Makefile.rules} for different
189 platforms (Unix, RTEMS, system-less, ...). In every subdirectory a
190 @file{Makefile.omk} is stored. This file determines what should be done
191 in the respective directory (e.g. compile a program from several source
192 files). Its syntax is very simple -- see the following sections.
193
194 Since make searches by default for a @file{Makefile} and not for
195 @file{Makefile.rules} or @file{Makefile.omk}, there must@footnote{When
196 USE_LEAF_MAKEFILES is set to @samp{n}, this @file{Makefile} can be
197 omitted in subdirectories. @xref{USE_LEAF_MAKEFILES}.} be a small
198 generic @file{Makefile} in every directory, whose task is only to find
199 @file{Makefile.rules} in the actual or any parent directory and include
200 it. This search is performed only once at the beginning of compilation.
201
202 @c TODO: Pavel's note about qmake.
203
204 @anchor{passes}
205 The compilation process itself is comprised of several @emph{passes}. Every
206 pass traverses the whole directory structure@footnote{In future, we are
207 planning some optimization that allows OMK to traverse the directories
208 only once and thus decrease compilation time.} and does a particular
209 task in every directory of the project. Typically, these passes are:
210 @table @dfn
211 @anchor{include-pass}
212 @item include-pass
213     This pass takes all include files marked for ``export'' and copies
214     (or links) them to the @file{include} directory under
215     @file{_compiled} directory. @xref{Header Files}.
216
217     Also, during this pass, automatically generated header file are
218     generated according to the current
219     configuration. @xref{Configuration and Conditional Compilation}.
220 @item library-pass
221     During this pass, all include files are in place, so all libraries
222     can be compiled.
223 @item binary-pass
224     Finally, programs can be compiled and linked against libraries
225     created in the previous pass.
226 @end table
227
228 The results of compilation are stored under the @file{_compiled}
229 directory. This directory is structured as a classical Unix file-system
230 (it contains directories like @file{bin}, @file{lib} and @file{include})
231 and can be directly copied to the target device or to some directory on
232 a host computer (e.g. @file{/usr/local}).
233
234 Besides @file{_compiled} directory, there in a @file{_build}
235 directory. Under this directory are stored some temporary files and
236 intermediate compilation products (object files, dependency files etc.).
237
238 In the next section, we provide an overview of methods, how to invoke
239 OMK from command line. Section @ref{Interfacing OMK to popular IDEs}
240 covers running of OMK from popular IDEs.
241
242 Sections @ref{Compiling Programs} through @ref{Configuration and
243 Conditional Compilation} deals with the content of
244 @file{Makefile.omk}. Its syntax in usual cases compatible to GNU
245 Automake's @file{Makefile.am} syntax. Also, the scheme for naming
246 variables was inspired by Automake so most OMK variables have the name
247 like @samp{@var{target}_@var{TYPE}}.
248
249 @node Invoking OMK, Compiling Programs, Basic Concepts, OMK User's Manual
250 @section Invoking OMK
251
252 Before using OMK for the first time, you have to call:
253 @example
254 @command{make default-config}
255 @end example
256 @noindent See @ref{Configuration and Conditional Compilation} for
257 details. If you forget to do this, OMK will notice you.
258
259 To compile the whole project or only some subtree of the project, call
260 @example
261 @command{make}
262 @end example
263 @noindent in the appropriate directory.
264
265 To clean files in @file{_build} directory but not in @file{_compiled}
266 one, use:
267 @example
268 @command{make clean}
269 @end example
270
271 To clean the compilation completely, you can either remove
272 @file{_compiled} and @file{_build} directories manually, or call
273 @example
274 @command{make distclean}
275 @end example
276 @noindent which does the same. This command removes these directories
277 even if you call it from a subdirectory.
278
279 To debug compilation problems, you can use @code{V} variable (see
280 @ref{V}):
281 @example
282 @command{make V=1}
283 @end example
284
285 You can also set values of some other variables on command line for
286 temporary change something. The example below compiles the code
287 temporarily with debugging information:
288 @example
289 @command{make CFLAGS="-g -O0 -Wall"}
290 @end example
291
292 If your project uses an alternative make-system (e.g. Automake or custom
293 makefiles), it might be useful for you to use the command:
294 @example
295 @command{make omkize}
296 @end example
297 @noindent This will find all @file{Makefile.omk} files in all subdirectories
298 and copies generic @file{Makefile} from the root directory to that
299 subdirectories. This way you can easily switch your project to use OMK.
300
301
302
303 @anchor{V}
304 @defvar V
305 If this variable equals to @samp{1}, the whole command lines for all
306 executed commands are displayed. When not set or zero, only short
307 messages are printed. Value of @samp{2} displays the whole command lines
308 as with @samp{1} and in addition directory navigation messages are
309 printed.
310 @end defvar
311
312 @node Compiling Programs, Libraries, Invoking OMK, OMK User's Manual
313 @section Compiling Programs
314
315 To tell OMK to compile a program, you need to set some variables in
316 @file{Makefile.omk} (usually) in the directory where program sources are
317 located.
318
319 In the example bellow a program @command{test} will be compiled from
320 source @file{test.c}.
321
322 @example
323 @verbatiminclude ../tests/programs/Makefile.omk
324 @end example
325
326 @noindent The variables are:
327
328 @anchor{bin_PROGRAMS}
329 @defvar bin_PROGRAMS
330   Contains a list of names (whitespace separated) of programs to be
331   compiled in this directory.
332 @end defvar
333
334 @defvar test_PROGRAMS
335   Almost the same as @ref{bin_PROGRAMS}, but resulting binaries are
336   stored in @file{bin-tests} directory instead of @file{bin}. This
337   variable is intended for various test programs not to be mixed with
338   the final product.
339 @end defvar
340
341 @defvar utils_PROGRAMS
342   Almost the same as @ref{bin_PROGRAMS}, but resulting binaries are
343   stored in @file{bin-utils} directory instead of @file{bin}. This
344   variable is intended for various development utilities not to be mixed
345   with the final product.
346 @end defvar
347
348 @defvar xxx_SOURCES
349   For every program name @var{xxx} in @code{bin_PROGRAMS},
350   @code{test_PROGRAMS} or @code{utils_PROGRAMS}, this variable contains
351   a list of sources that are needed to compile the program. OMK uses an
352   extension of the filename to determine the compiler to compile this
353   source.
354 @end defvar
355
356 @defvar xxx_LIBS
357   This variable contains a list of libraries the program @var{xxx} will
358   be linked with.
359
360   @example
361   test_LIBS = m curses
362   @end example
363 @end defvar
364
365 @defvar LOADLIBES
366   This variable contains a list of libraries all programs in this
367   directory needs to be linked to.
368 @end defvar
369
370 @defvar INCLUDES
371   Directives passed to the C or C++ compiler with additional directories
372   to be searched for header files. In most cases you need to specify an
373   absolute path. To specify a directory relative to the source
374   directory, you can use the @code{$(SOURCES_DIR)} variable, which
375   refers to the directory, where @file{Makefile.omk} is located. This
376   variable applies to all compilations invoked in the current directory.
377
378   @example
379   INCLUDES = -I$(SOURCES_DIR)/my_include_dir
380   @end example
381 @end defvar
382
383 @defvar DEFS
384   Directives passed to the C or C++ compiler with preprocessor macro
385   definitions. This variable applies to all compilations invoked in the
386   current directory.
387
388   @example
389   DEFS = -DDEBUG=1
390   @end example
391 @end defvar
392
393
394 @c FIXME: INCLUDES variable should not be set by rtlinux rules.
395
396 @node Libraries, Multiple Directories, Compiling Programs, OMK User's Manual
397 @section Libraries
398
399
400 With OMK, you can easily create statically or dynamically linked
401 libraries. The way of creating libraries is very similar to how programs
402 are created. @xref{Compiling Programs}.
403
404 In @file{Makefile.omk}, you specify several variables, which defines how
405 the libraries should be compiled. In the example below the library
406 @samp{mylib} (full filename will be @file{libmylib.a}) is created from
407 two sources @file{funca.c} and @file{funcb.c}. Interface of this library
408 is defined in @file{myfunc.h}. Therefore, we export this header for use
409 by other programs.
410
411 @example
412 @verbatiminclude ../tests/libraries/Makefile.omk
413 @end example
414
415 @noindent Variables for use with libraries are:
416
417 @defvar lib_LIBRARIES
418   Specifies a list of statically linked libraries to be compiled. OMK
419   automatically prepends @code{lib} prefix library names.
420 @end defvar
421
422 @defvar shared_LIBRARIES
423   Specifies a list of dynamically linked libraries to be compiled. 
424 @end defvar
425
426 @defvar xxx_SOURCES
427   For every library name @var{xxx} in @code{lib_LIBRARIES} or
428   @code{shared_LIBRARIES}, this variable contains a list of sources that
429   are needed to compile the library. OMK uses an extension of the
430   filename to determine the compiler to compile this source.
431 @end defvar
432
433 @menu
434 * Header Files::                
435 @end menu
436
437 @node Header Files,  , Libraries, Libraries
438 @subsection Header Files
439
440 C and C++ libraries are not very useful without header files. OMK
441 provides several variables that specify activities on header files.
442
443 During compilation, header files are copied (or linked) from source
444 directories to the @file{_compiled} tree
445 (see @ref{include-pass}). Libraries and programs are then compiled against
446 these copies.
447
448 @anchor{include_HEADERS}
449 @defvar include_HEADERS
450   Specifies the list of header files to be exported for use by other
451   libraries/programs. The files are exported directly to the
452   @file{include} directory even if the file is located in a subdirectory
453   (like @file{sci_regs.h} in the example below)
454
455   @example
456   include_HEADERS = regs.h periph/sci_regs.h
457   @end example
458 @end defvar
459
460 @defvar nobase_include_HEADERS
461   Similar to @ref{include_HEADERS}, but the directory prefix is always
462   kept. To include the file exported by this variable, use
463   @code{#include <@var{prefix}/@var{header.h}>}.
464 @end defvar
465
466 @defvar renamed_include_HEADERS
467   Exports the header files under different name. The form of the items
468   in this whitespace separated list is: @var{real name}@code{->}@var{new
469   name}.
470
471 @example 
472   renamed_include_HEADERS = orte_config_omk_win32.h->orte_config.h
473 @end example
474 @end defvar
475
476 @defvar LN_HEADERS
477   If this variable equals to @samp{y}, symbolic links to headers in
478   source directories are used in @file{_compiled} tree instead of
479   copies.
480
481   Normally, the header files are copied into @file{_compiled} directory
482   to be prepared for transfer into target location afterwards. Copying
483   ensures that resulting libraries are in correspondence with the header
484   files even if the header is changed by a developer but the library is
485   not recompiled.
486
487 @c   Another reason for having single include directory for the whole
488 @c   project is tat every component knows where to find header files of
489 @c   other components. 
490
491   On the other side, the copying could make problems during
492   development. Most @acronym{IDE}s, allows you to jump directly to the
493   place, where an error is reported by the compiler. If the error is in
494   a header file, IDE opens you the copy of the header file. If you
495   correct the error there, after the next compilation, your header file
496   will be overwritten by the old version from your source tree.
497   
498   This option is not typically used in @file{Makefile.omk}, but in the
499   top level configuration file @file{config.omk} or on command line.
500 @end defvar
501
502 @node Multiple Directories, Dependency Tracking, Libraries, OMK User's Manual
503 @section Multiple Directories
504
505 OMK is probably most useful in projects consisting of multiple
506 directories. For such projects, it is not easy to write from scratch
507 classic Makefiles that provides all the needed features.
508
509 You can instruct OMK to descend to a (sub)directory by setting the
510 @code{SUBDIRS} variable in @file{Makefile.omk}.
511
512 @anchor{SUBDIRS}
513 @defvar SUBDIRS
514   This variable contains a list of directories, in which compilation
515   must be also invoked. Usually, names of subdirectories are used, but
516   you can use any path specification here.
517
518   Compilation is invoked in these directories before it is invoked in
519   the current directory.
520
521   See also @ref{AUTOMATIC_SUBDIRS}.
522 @end defvar
523 @c TODO: Write tests for this.
524
525 @anchor{ALL_OMK_SUBDIRS}
526 @defvar ALL_OMK_SUBDIRS
527   This variable is set by OMK and can be used as the value of
528   @code{SUBDIRS} variable. It contains a list of all direct
529   subdirectories, which contain @file{Makefile.omk}. This is especially
530   useful if you are combining several projects or components
531   together. In the root directory of your project, you just create
532   symbolic links the components from other projects and all the linked
533   directories automatically appears as the value of this variable.
534
535   @example
536   SUBDIRS = $(ALL_OMK_SUBDIRS)
537   @end example
538 @end defvar
539
540 @anchor{AUTOMATIC_SUBDIRS}
541 @defvar AUTOMATIC_SUBDIRS
542   If this variable is set to @samp{y} and @code{SUBDIRS} is not assigned
543   in @file{Makefile.omk}, then @code{SUBDIRS} is assigned a default
544   value @code{$(ALL_OMK_SUBDIRS)}.
545 @end defvar
546
547 @node Dependency Tracking, Configuration and Conditional Compilation, Multiple Directories, OMK User's Manual
548 @section Dependency Tracking
549
550 OMK automatically handles tracking of dependencies of files in compiled
551 projects. It uses gcc's @option{-M@var{x}} options to do this for object
552 files. This way, whenever you change some header file, OMK recompiles
553 only those files, where the changed header was really included.
554
555 Dependencies are also maintained for libraries and binaries. To find the
556 dependencies, OMK parses linker map files, so a change to some library
557 causes recompilation of all programs using that library.
558
559 @node Configuration and Conditional Compilation, Advanced OMK Features, Dependency Tracking, OMK User's Manual
560 @section Configuration and Conditional Compilation
561
562 In many projects, it is necessary to configure the compilation process. By
563 this configuring we mean, setting some parameters that influence the
564 output of compilation process. In GNU projects, @command{configure}
565 script is usually responsible for configuration. User provides some
566 parameters to @command{configure}, which is run before compilation, and
567 this script does all steps needed to configure the sources and
568 make-system in the desired way.
569
570 OMK has its own configuration mechanism, which is described in this
571 section. For future releases, we plan that this mechanism can make use
572 of GNU Autoconf, but currently there is no directly integrated support
573 for it.
574
575 There exist three different configuration files
576 @file{config.omk-default}, @file{config.target} and
577 @file{config.omk}. All of these have to be stored in the same directory
578 as @file{Makefile.rules}. During compilation, these files are included
579 in @file{Makefile.rules} in this order which means that variables
580 assigned in the former files are overridden by those from later
581 ones. All settings specified here apply to the whole compilation
582 tree. Each file is intended for a different kind of configuration
583 values:
584 @table @file
585 @item config.omk-default
586   Stores default configuration of compiled components. This file is
587   automatically generated (see below) and should not be edited by users.
588 @item config.target
589   Stores default configuration for a project or target hardware. This
590   file is intended to be stored in a version control system and should
591   be modified only by the maintainer of the project. 
592
593   For cross compiled projects, this file typically contains settings of
594   variables like @var{CC} and @var{CFLAGS}.
595 @item config.omk
596   This is a file for end users, where any default settings set in the
597   above files can be overridden. This file should not be stored in
598   version control system. The project should compile without having this
599   file.
600 @end table
601
602 Besides variables defined in @file{config.target}, @file{Makefile.omk}
603 in any subdirectory can specify some configuration parameters. When
604 @command{make default-config} is run, all these parameters are found and
605 together with their default values are stored as makefile variables in
606 @file{config.omk-default}. This file is included during compilation, so
607 if you don't specify other values, these defaults are used. If you are
608 not satisfied with these defaults, you can override the values of
609 parameters either locally for your build in @file{config.omk} or
610 globally for all people working with the project in
611 @file{config.target}.
612
613 @menu
614 * Specifying Configuration Parameters::  
615 * Using Configuration Parameters::  
616 * Common Variables::            
617 @end menu
618
619 @node Specifying Configuration Parameters, Using Configuration Parameters, Configuration and Conditional Compilation, Configuration and Conditional Compilation
620 @subsection Specifying Configuration Parameters
621
622 To specify names and default values of configuration parameters use the
623 @code{default_CONFIG} variable in @file{Makefile.omk}.
624
625 @defvar default_CONFIG
626   This variable contains a list of configuration parameters and their
627   default values. The format of every item in this list is
628   @var{CONFIG_xxxx}=@var{value}. You can name the parameter as you want,
629   but it is good practice to start the name with @samp{CONFIG_} prefix.
630    
631   OMK can automatically generate header files, with C preprocessor macro
632   definitions according to the OMK's configuration parameters. The
633   actual content of generated header files depends on the form of the
634   @var{value}. The possible forms are:
635   
636 @table @code 
637 @item @samp{y}, @samp{n} or @samp{x}
638   This defines boolean parameters. If the value of the parameter is
639   @samp{y}, the @samp{#define CONFIG_@var{xxx} 1} is generated, if it is
640   @samp{n}, no @code{#define} is generated. 
641
642   @samp{x} is a special value called @emph{recessive 'n'}. The meaning
643   is that this parameter influences the component in the current
644   directory (i.e. the corresponding @code{#define} will be included in
645   @code{LOCAL_CONFIG_H}; see @ref{LOCAL_CONFIG_H}) but the default value
646   is not specified here. If the default value is not specified anywhere,
647   the behavior is the same as if @samp{n} is specified.
648 @item @samp{number}
649   Numeric parameters. The define looks like @samp{#define CONFIG_@var{xxx} @var{number}}
650 @item @samp{text}
651   Text without quotes. The define looks like @samp{#define CONFIG_@var{xxx} @var{text}}
652 @item @samp{"text"}
653   Text with quotes. The define looks like @samp{#define CONFIG_@var{xxx} "@var{text}"}
654 @end table
655 @end defvar
656
657 @noindent Example of using @code{default_CONFIG}. @file{Makefile.omk} reads like:
658 @example
659 @verbatiminclude ../tests/config/default/Makefile.omk
660 @end example
661 @noindent and @file{subdir/Makefile.omk} like:
662 @example
663 @verbatiminclude ../tests/config/default/subdir/Makefile.omk
664 @end example
665
666 @noindent After running @command{make default-config}, the content of
667 @file{config.omk-default} will be:
668 @example
669 @verbatiminclude ../tests/config/default/config.omk-correct
670 @end example
671
672 @node Using Configuration Parameters, Common Variables, Specifying Configuration Parameters, Configuration and Conditional Compilation
673 @subsection Using Configuration Parameters
674
675 Configuration parameters can be used in two ways:
676 @enumerate
677 @item
678   as variables in @file{Makefile.omk} and
679 @item
680   as C/C++ preprocessor macros in OMK generated header files.
681 @end enumerate
682
683 @noindent For the first use, your @file{Makefile.omk} may contain something like:
684 @example
685 SUBDIRS = arch/$(CONFIG_ARCH)
686
687 ifeq ($(CONFIG_DEBUG),y)
688 DEFS += -DUSE_SIMULATOR
689 endif
690 @end example
691
692 @noindent For the second use, there are several variables that control
693 the generation of header files with configuration values. These
694 variables are described here:
695
696 @anchor{LOCAL_CONFIG_H}
697 @defvar LOCAL_CONFIG_H
698   The value of this variable is the name of a header file, which will
699   contain all configuration parameters declared in the current directory
700   by @code{default_CONFIG}. This header file is accessible only by files
701   in the current directory and it should be included like @code{#include
702   "@var{myconfig.h}"}.
703
704   In @file{Makefile.omk}, the use of this variable can look like this:
705
706 @example
707 LOCAL_CONFIG_H = myconfig.h
708 @end example
709 @end defvar
710
711 @defvar config_include_HEADERS
712   This variable is similar to @code{LOCAL_CONFIG_H}. One difference is
713   that the generated header file is accessible to all sub-projects in
714   all directories, not only to the files in the same directory (the
715   header is stored in @file{_compiled} tree). The second difference is
716   that you have to specify, which configuration parameters you want to
717   appear in the header file.
718 @end defvar
719
720 @defvar xxx_DEFINES
721   This variable determines the configuration parameters that should be
722   stored in a header file specified by
723   @code{config_include_HEADERS}. The @var{xxx} in the name of this
724   variable needs to be the same as the base name (without extension) of
725   the header file.
726 @end defvar
727
728 @noindent Example of using @code{config_include_HEADERS}:
729 @example
730 default_CONFIG = CONFIG_LINCAN=y CONFIG_LINCANRTL=n CONFIG_LINCANVME=n
731 config_include_HEADERS = global.h
732 global_DEFINES = CONFIG_OC_LINCAN CONFIG_OC_LINCANRTL 
733 @end example
734
735 @noindent Here, we include only two out of the three configuration 
736 parameters defined in the current @file{Makefile.omk}. It is also
737 possible to include configuration parameters defined in a different
738 directory.
739
740 @node Common Variables,  , Using Configuration Parameters, Configuration and Conditional Compilation
741 @subsection Common Variables
742
743 It is common practice to use @file{config.target} or @file{config.omk}
744 to store project-wide settings. Here is the list of variables, which are
745 commonly set here (but they can also be set elsewhere, e.g. in
746 @file{Makefile.omk}).
747
748 You can easily ``reconfigure'' your project by changing the
749 @file{config.omk} file. It is useful to have several configurations
750 stored in different files and let @file{config.omk} be a symbolic link
751 to the desired configuration.
752
753 @vtable @code
754 @item CC
755   The name of C compiler.
756 @item CFLAGS
757   Command line options for C compiler.
758 @item CXX
759   The name of C++ compiler.
760 @item CPPFLAGS
761   Additional parameters (besides @code{CFLAGS}) to by passed to C++
762   compiler.
763 @end vtable
764
765 @node Advanced OMK Features, Properties of Specific Makefile.rules, Configuration and Conditional Compilation, OMK User's Manual
766 @section Advanced OMK Features
767
768 In this section we list several OMK features, which are more complicated
769 or rarely used so they were omitted in previous sections.
770
771 @menu
772 * Organization of the Source Tree::  
773 * Additional Variables::        
774 * Adding Hooks to Passes::      
775 @end menu
776
777 @node   Organization of the Source Tree, Additional Variables, Advanced OMK Features, Advanced OMK Features
778 @subsection Organization of the Source Tree
779
780 @itemize
781 @item
782   The @file{_compiled} directory can be shared between multiple projects
783   (by using symbolic links).
784
785 @item
786   If you work on a bigger project, you usually don't need to rebuild the
787   whole project and call @command{make} only in a
788   subdirectory. Sometimes, it might be useful to rebuild the whole
789   project. You can either change working directory to the root of your
790   project and call @command{make} there or, as a shortcut, you can use
791   @code{W} variable (see @ref{W}) to compile everything directly from a
792   subdirectory.
793 @example
794 @code{make W=1}
795 @end example
796
797 @item
798   Searching for @file{Makefile.rules} works such way, that if you get
799   into sources directory over symbolic links, OMK is able to unwind your
800   steps back. This implies you can make links to component directories
801   on read-only media, copy @file{Makefile.rules}, @file{Makefile} and
802   top-level @file{Makefile.omk}, adjust @file{Makefile.omk} to contain
803   only required components and then call @command{make} in the top
804   directory or even in read-only directories after changing working
805   directory from your tree to the readonly media.
806 @end itemize
807
808
809 @anchor{W}
810 @defvar W
811 If this variable equals to @samp{1}, the @b{whole} project is
812 (re)compiled, even if @command{make} is called from a subdirectory.
813 @end defvar
814
815 @node Additional Variables, Adding Hooks to Passes, Organization of the Source Tree, Advanced OMK Features
816 @subsection Additional Variables
817
818 @anchor{USE_LEAF_MAKEFILES}
819 @defvar USE_LEAF_MAKEFILES
820 If this variable equals to @samp{n} (default is unset), then OMK uses
821 the leaf @file{Makefile} only when it is invoked by simple
822 @command{make} command. Later, during recursive directory descent leaf
823 @file{Makefile} is not used and @file{Makefile.rules} is included
824 directly.
825
826 This feature is useful if you are integrating some non-OMK project into
827 your project. You only add @file{Makefile.omk} files to the non-OMK
828 project and don't need to modify project's original Makefiles.
829
830 This variable can be set either globally in a @file{config.*} file or
831 locally in some @file{Makefile.omk}. In the latter case, it influences
832 only subdirectories of the directory containing @file{Makefile.omk}.
833 @end defvar
834
835 @anchor{SOURCES_DIR}
836 @defvar{SOURCES_DIR}
837 This variable is set internally by OMK and its value is the absolute
838 path to the directory with compiled sources. It can be used if you need
839 to refer to sources files in some custom constructs in
840 @file{Makefile.omk}.
841 @example
842 @verbatim
843 include_HEADERS = $(notdir $(wildcard $(SOURCES_DIR)/*.h))
844 @end verbatim
845 @end example
846 @end defvar
847
848 @defvar{srcdir}
849 The same as @ref{SOURCES_DIR}. Provided for Automake compatibility.
850 @end defvar
851
852 @defvar{MAKERULES_DIR}
853 This variable is set internally by OMK and its value is the absolute
854 path to the directory containing @file{Makefile.rules} currently used
855 during compilation.
856 @end defvar
857
858 @defvar{OMK_RULES_TYPE}
859 Identification the type of @file{Makefile.rules} used for
860 compilation. Values are like @samp{linux}, @samp{rtems}, @samp{sysless},
861 ... This variable is automatically generated during creation of
862 @file{Makefile.rules} and can be used in configuration files (see
863 @ref{Configuration and Conditional Compilation}) or in
864 @file{Makefile.omk} to tweak compilation for specific targets.
865 @end defvar
866
867 @node Adding Hooks to Passes,  , Additional Variables, Advanced OMK Features
868 @subsection Adding Hooks to Passes
869
870 Sometimes it is necessary to run some special commands as a part of
871 compilation. Typical example might be a tool which generates source
872 files on the fly. OMK supports calling additional commands during
873 compilation by so called @emph{pass hooks}. A pass hook is an ordinary
874 make target which is invoked as part of compilation during a particular
875 pass (see @ref{passes}). Pass hooks can be defined by assigning their
876 names to @code{xxx_HOOKS} variable.
877
878 @defvar{xxx_HOOKS}
879 Specifies one or more hooks (make targets) which are invoked during pass
880 @var{xxx}. The working directory of commands or this target is under the
881 @file{_build} tree.
882
883 In the example bellow header file @file{generated_header.h} is created
884 during @samp{include-pass} by @file{convert_data} program. The program
885 takes @file{data_file.txt} in the source directory as the input and
886 creates the header file in the in the correct directory under the
887 @file{_build} tree.
888
889 @example
890 include-pass_HOOKS = generated_header.h
891
892 generated_header.h: $(SOURCES_DIR)/data_file.txt
893             convert_data < $^ > $@@
894 @end example
895 @end defvar
896
897 @node Properties of Specific Makefile.rules, Running OMK under Windows OS, Advanced OMK Features, OMK User's Manual
898 @section Properties of Specific Makefile.rules
899
900 In previous sections, general properties of @file{Makefile.rules} were
901 documented. This section contains documentation to features found only
902 in some particular @file{Makefile.rules}.
903
904 @menu
905 * Linux::                       
906 * System-Less::                 
907 * RTEMS::                       
908 @end menu
909
910 @node Linux, System-Less, Properties of Specific Makefile.rules, Properties of Specific Makefile.rules
911 @subsection Linux
912
913 This @file{Makefile.rules} is used not only for Linux as the name
914 suggests, but also for other Unices and even for Windows.
915
916 @defvar BUILD_OS
917   The name of the operating system (OS) where make was invoked.
918 @end defvar
919
920 @defvar TARGET_OS
921   Should specify the name of OS where the resulting binary should be
922   used. If not specified manually, it equals to BUILD_OS. 
923 @end defvar
924
925 @defvar QT_SUBDIRS
926   Lists subdirectories with QT project (.pro) file. OMK will generate
927   there @file{Makefile} by calling @command{qmake} with correct
928   parameters to interface QT application to the rest of the compilation
929   tree.  Then @command{make} is called there to compile QT
930   application. Variable @samp{QTDIR} must be set to the directory with
931   QT installation (e.g. /usr/share/qt4 on Debian).
932 @end defvar
933
934
935 @node System-Less, RTEMS, Linux, Properties of Specific Makefile.rules
936 @subsection System-Less
937
938 This @file{Makefile.rules} is designed for compilation of code for
939 (small) micro-controllers without operating systems. See
940 @uref{http://rtime.felk.cvut.cz/hw/index.php/System-Less_Framework} for
941 more information about our framework, which uses this rules.
942
943 @node RTEMS,  , System-Less, Properties of Specific Makefile.rules
944 @subsection RTEMS
945
946 TODO
947  
948  
949 @node Running OMK under Windows OS, Interfacing OMK to popular IDEs, Properties of Specific Makefile.rules, OMK User's Manual
950 @section Running OMK under Windows OS
951
952 It is possible to use OMK under Windows OS with MinGW (see
953 @uref{http://www.mingw.org/}). Unfortunately, the compilation speed is
954 much lower than on UNIX systems.
955
956 TODO: Is it necessary to install anything special?
957
958 @node Interfacing OMK to popular IDEs, Troubleshooting, Running OMK under Windows OS, OMK User's Manual
959 @section Interfacing OMK to popular IDEs
960
961 @menu
962 * KDevelop::                    
963 * Eclipse/CDT::                 
964 * Emacs/Vim/etc.::              
965 @end menu
966
967 @node KDevelop, Eclipse/CDT, Interfacing OMK to popular IDEs, Interfacing OMK to popular IDEs
968 @subsection KDevelop
969
970 KDevelop has support for custom build systems. To use KDevelop to
971 develop projects using OMK follow these steps. These steps are valid for
972 version 3.5.0 of KDevelop, but for previous versions it doesn't differ
973 much.
974
975 @enumerate
976 @item
977   Import project to KDevelop (from menu choose @emph{Project---Import
978   existing project}). Select the type of project to @emph{Generic C
979   Application (Custom Buildsystem)}.
980 @example
981   @image{kdevelop1}
982 @end example
983
984 @item
985   Then answer to following dialogs as you want.
986 @example
987   @image{kdevelop2}
988 @end example
989 @example
990   @image{kdevelop3} @image{kdevelop4}
991 @end example
992
993 @item
994   If you are working only on some small part of the bigger project, you
995   usually don't want to recompile the whole project every time. In
996   @emph{Project---Project Options}, you can specify the subdirectory where to
997   run @command{make}.
998 @example
999   @image{kdevelop5}
1000 @end example
1001
1002 @item
1003   If you want to switch between several configurations easily (see also
1004   @ref{Configuration and Conditional Compilation}), in the same dialog
1005   you can add @option{-e} to make options. This makes environment variables
1006   have higher precedence than those in @file{config.omk-default}. Then,
1007   you can define several environments with different
1008   @code{CONFIG_@var{xxx}} variables and their values.
1009 @example
1010   @image{kdevelop6}
1011 @end example
1012
1013 @item
1014   You can easily switch the configurations from @emph{Build---Make
1015   Environment}.
1016 @example
1017   @image{kdevelop7}
1018 @end example
1019 @end enumerate
1020
1021 @node Eclipse/CDT, Emacs/Vim/etc., KDevelop, Interfacing OMK to popular IDEs
1022 @subsection Eclipse/CDT
1023 TODO
1024 @node Emacs/Vim/etc.,  , Eclipse/CDT, Interfacing OMK to popular IDEs
1025 @subsection Emacs, VIM, etc.
1026
1027 Since OMK compilation is started by executing @command{make} command,
1028 many common editors can work easily with OMK.
1029
1030 Under Emacs, you can use @command{compile} or @command{recompile}
1031 commands as you are used to do.
1032
1033 @node Troubleshooting,  , Interfacing OMK to popular IDEs, OMK User's Manual
1034 @section Troubleshooting
1035
1036 @itemize
1037 @item
1038   If you rename some file or directory and then you can't compile your
1039   project, call @command{make clean} in the directory with errors. The
1040   reason for this behavior is that OMK remembers dependencies of every
1041   file. After renaming something, the original name is still stored in
1042   dependencies, but make doesn't know how to create this non-existent
1043   source.
1044
1045 @item
1046   Sometimes, you may want to compile one file the same way as OMK does
1047   it, but run the compilation manually from command line. For example,
1048   you want to debug some preprocessor macros and you only want to
1049   produce preprocessed source instead of an object file.
1050
1051   To compile something manually, you can run OMK by @command{make
1052   V=2}. This will print all commands executed together with directory
1053   navigation messages. Find the command you want to execute manually in
1054   the output. To run it, you need to change the working directory to the
1055   correct one in the @file{_build} tree. The correct directory can be
1056   found in make output on the line @samp{Entering directory} preceding
1057   the desired command.
1058
1059 @item
1060   Currently, C++ sources are supposed to have @file{.cc} or @file{.cxx}
1061   extensions. The @file{.cpp} extension is not supported (yet).
1062 @end itemize
1063
1064 @node Original README, OMK Development, OMK User's Manual, Top
1065 @chapter Original README
1066
1067 Since this manual still doesn't cover all aspects of OMK, we include
1068 here a @file{README.rules} file, which was written for the first version
1069 of OMK.
1070
1071 @b{Important notice:} This make system uses features found in recent
1072 versions of GNU Make program. If you encounter problems with package
1073 building, check, that you use correct version of Make program.  The
1074 Make older than version 3.80, could not be used.  Even Make version
1075 3.80 has annoying bug which causes building fail with misleading
1076 message "virtual memory exhausted".  Please, upgrade at least to
1077 version 3.81 of GNU Make.
1078
1079 There is list of features which we want to solve with our make system:
1080 @itemize
1081 @item
1082 Central @file{Makefile.rules} for most of components of a bigger project.
1083
1084 FIXME (our CAN framework includes more libraries common with our other
1085 projects, we need to separate some utility libraries etc.)
1086 @item
1087 The rules in more spread Makefiles are way to the hell (update for
1088 different kernel, RT-Linux etc would be nightmare in other case).
1089 @item
1090 Make system should allow to freely move cross-dependant components in
1091 directory structure without need to update users of moved component (I
1092 hate something like @option{-I../../sched/rtlshwq/include} in CAN makefiles for
1093 example. If a component is renamed or version is added to then name,
1094 all Makefiles in CAN will require update).
1095 @item
1096 Make system should be able to compile mutually cross-dependant
1097 libraries and should ensure, that change in one component sources or
1098 headers would result in relink or rebuild in components linked against
1099 that library or including modified header file.
1100 @item
1101 Make system has to enable compilation out of OCERA full source tree
1102 (we would lost many users of particular components in other case).
1103 @item
1104 Compile should be able to do all above work without need to install
1105 any files before successful finish of build.
1106 @item
1107 Because we use some libraries for RT-Linux build and user-space build,
1108 we need to solve how to compile from same sources to both targets.
1109 @item
1110 The build system should allow to call make for particular source
1111 subdirectory. Time of recursive make through all subdirectories is
1112 unacceptable.
1113 @item
1114 Make system should enable to build out of sources tree (else clean or
1115 working with CVS sandbox gets fussy and simultaneous multiple targets
1116 gets problematic).
1117 @item
1118 It would be good, if there is a possibility to call make from
1119 read-only media sources.
1120 @item
1121 Make system should store results of build in some separate directory
1122 structure to simple install and testing.
1123 @item
1124 Makefiles in sources directories should be simple.
1125 @end itemize
1126
1127 There is probably only one alternative fully supporting above requirements
1128 and it is GNU Autoheader...Automake...Autoconf... system.
1129 But it is complicated and requires big amount of support files.
1130 It would be acceptable if it could be easily used for OCERA framework.
1131 But there are important show stoppers for that system:
1132 @itemize
1133 @item
1134 It would require deep revision of all OCERA CVS contents and agreement
1135 on this would be problematic
1136 @item
1137 This system is not well prepared for dual compilation for Linux and
1138 RT-Linux sub-targets. It would mean many changes in default autoconf
1139 setup to support this. Probably simplest way would be to rebuild GCC
1140 tool chain for something like i586-elf-rtlinux.  This would require
1141 even more space for OCERA development.
1142 @end itemize
1143
1144 The problem calls for some solution, which would have minimal impact
1145 on other components and would be elegant and would be maintainable
1146 and small, because our main goal is components development and not
1147 make systems development.
1148
1149 There is result of our trial. It is OMK make system.
1150 The @file{Makefile} and @file{Makefile.omk} files should be in all source
1151 directories. Common @file{Makefile.rules} file is required in the toplevel
1152 sources directory. Alternatively this file could be moved
1153 to link tree pointing into readonly media or can be anywhere
1154 else if @code{MAKERULES_DIR} and @code{SOURCES_DIR} are specified.
1155
1156 @c !!! tohle tam nejak zmizelo, mozna by to chtelo zkontrolovat, ze to
1157 @c     sedi s aktualnim stavem
1158
1159
1160 Syntax of Makefile.omk files is for usual cases compatible
1161 to Automake's Makefile.am descriptions. There are specific targets
1162 for RT-Linux and Linux kernel related stuff
1163
1164 Makefile.omk user defined variables
1165 @vtable @code
1166 @item SUBDIRS
1167 list of subdirectories intended for make from actual directory
1168 @item lib_LIBRARIES
1169 list of the user-space libraries
1170 @item shared_LIBRARIES
1171 list of the user-space shared libraries
1172 @item kernel_LIBRARIES
1173 list of the kernel-space libraries
1174 @item rtlinux_LIBRARIES
1175 list of the RT-Linux kernel-space libraries
1176 @item include_HEADERS  
1177 list of the user-space header files
1178 @item nobase_include_HEADERS 
1179 headers copied even with directory part
1180 @item kernel_HEADERS   
1181 list of the kernel-space  header files
1182 @item rtlinux_HEADERS  
1183 list of the RT-Linux kernel-space  header files
1184 @item bin_PROGRAMS     
1185 list of the require binary programs
1186 @item utils_PROGRAMS   
1187 list of the development utility programs
1188 @item kernel_MODULES   
1189 list of the kernel side modules/applications
1190 @item rtlinux_MODULES  
1191 list of RT-Linux the kernel side modules/applications
1192 @item xxx_SOURCES      
1193 list of specific target sources
1194 @item INCLUDES         
1195 additional include directories and defines for user-space
1196 @item kernel_INCLUDES  
1197 additional include directories and defines for kernel-space
1198 @item rtlinux_INCLUDES 
1199 additional include directories and defines for RT-Linux
1200 @item default_CONFIG   
1201 list of default config assignments CONFIG_XXX=y/n ...
1202 @end vtable
1203
1204 The Makefile is same for all sources directories and is only 14 lines
1205 long.  It is there only for convenience reasons to enable call "make"
1206 from local directory. It contains code which locates
1207 @file{Makefile.rules} in actual or any parent directory. With standard
1208 BASH environment it works such way, that if you get into sources
1209 directory over symbolic links, it is able to unwind yours steps back
1210 => you can make links to readonly media component directories, copy
1211 @file{Makefile.rules}, Makefile and toplevel Makefile.omk, adjust
1212 Makefile.omk to contain only required components and then call make in
1213 top or even directories after crossing from your tree to readonly
1214 media.
1215
1216 The system compiles all files out of source directories.  The actual
1217 version of system is adapted even for OCERA tree mode if
1218 @code{OCERA_DIR} variable is defined in @file{Makefile.rules}
1219
1220 There are next predefined directory name components, which can be
1221 adapted if required
1222
1223 @table @code
1224 @item BUILD_DIR_NAME = _build
1225         prefix of directory, where temporary build files are stored
1226 @item COMPILED_DIR_NAME = _compiled
1227         prefix of directory, where final compilation results are stored
1228 @item GROUP_DIR_NAME = yyy
1229         this is used for separation of build sub-trees in OCERA environment
1230         where more @file{Makefile.rules} is spread in the tree
1231 @end table
1232
1233 Next directories are used:
1234
1235 @table @code
1236 @item KERN_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern
1237         directory to store intermediate files for kernel-space targets
1238 @item USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user
1239         directory to store intermediate files for user-space targets
1240
1241 @item USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
1242         directory to store exported include files which should be installed later
1243         on user-space include path
1244 @item USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
1245         same for user-pace libraries
1246 @item USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
1247         utilities for testing, which would not probably be installed
1248 @item USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
1249         binaries, which should go into directory on standard system PATH
1250         (/usr/local/bin, /usr/bin or $(prefix)/bin)
1251
1252 @item KERN_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include-kern
1253         directory to store exported include files which should be installed later
1254         on kernel-space include path
1255 @item KERN_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib-kern
1256         same for kernel-pace libraries
1257 @item KERN_MODULES_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/modules
1258         builded modules for Linux kernel or RT-Linux system
1259 @end table
1260
1261 There is more recursive passes through directories to enable
1262 mutual dependant libraries and binaries to compile.
1263 Next passes are defined
1264
1265 @table @samp
1266 @item default-config
1267 generates @file{config.omk-default} or xxx-default (FIXME) configuration file
1268 @item check-dir 
1269 checks and creates required build directories
1270 @item include-pass   
1271 copies header files to @code{USER_INCLUDE_DIR} and @code{KERN_INCLUDE_DIR}
1272 @item library-pass
1273 builds objects in USER_BUILD_DIR/@var{relative path} and creates libraries
1274 in USER_LIB_DIR
1275 @item binary-pass and utils-pass
1276 links respective binaries in USER_@{BIN,UTILS@}_DIR directory. If some
1277 object file is missing it compiles it in USER_BUILD_DIR/@var{relative path}
1278 @item kernel-lib-pass
1279 builds libraries for kernel space targets
1280 @item kernel-pass 
1281 builds kernel modules
1282 @end table
1283
1284 The amount of passes is relatively high and consumes some time.  But
1285 only other way to support all required features is to assemble one big
1286 toplevel Makefile, which would contain all components and targets
1287 cross-dependencies.
1288
1289 Drawbacks of designed make system
1290 @itemize
1291 @item
1292 the system is not as fast as we would like
1293 @item
1294 it lacks Autoconf and configure extensive support for many systems
1295 from UNIX to DOS and WINDOWS
1296 @item
1297 it does not contain support for checking existence of target
1298 libraries and functionalities as GNU Autoconf
1299 @item
1300 it is heavily dependant on GNU MAKE program. But it would not be big
1301 problem, because even many commercial applications distribute GNU MAKE
1302 with them to be able to work in non-friendly systems
1303 @item
1304 the key drawback is dependence on recent MAKE version 3.80 and better
1305 and even version 3.80 of MAKE has important bug, which has been
1306 corrected in newer sources (FIXME)
1307 @end itemize
1308
1309 The last point is critical. I have not noticed it first, because
1310 I use Slackware-9.2 and it contains latest released version 
1311 of MAKE (version 3.80).
1312 The problem appears when I have tried to build bigger libraries.
1313 There is bug in version 3.80, which results in misleading
1314 error "Virtual memory exhausted". It is known bug with ID 1517
1315
1316 @smallexample
1317 * long prerequisite inside eval(call()) => vm exhausted, Paul D. Smith
1318 @end smallexample
1319
1320
1321 I have optimized some rules to not push memory to the edge,
1322 but there could be still issues with 3.80 version.
1323
1324 I have downloaded latest MAKE CVS sources. The compilation required
1325 separate lookup and download for .po files and full Autoheader... cycle.
1326 I have put together package similar to release. Only ./configure --prefix=...
1327 and make is required. CVS sources contains version 3.81beta1.
1328 You can download prepared sources archive from
1329   @uref{http://paulandlesley.org/make/make-3.81beta1.tar.bz2}
1330 Or you can get our local copy from
1331   @uref{http://cmp.felk.cvut.cz/~pisa/can/make-3.81beta1.tar.gz}
1332
1333 The archive contains even "make" binary build by me, which should work
1334 on other Linux distributions as well.  Older version of MAKE (3.79.x
1335 released about year 2000) found on Mandrake and RedHat are not
1336 sufficient and do not support eval feature.  I do not expect, that
1337 Debian would be more up-to-date or contain fixes to MAKE vm exhausted
1338 bug.
1339
1340 The local CTU archive with our CAN components prepared for inclusion
1341 into OCERA SF CVS could be found in my "can" directory
1342
1343   @uref{http://cmp.felk.cvut.cz/~pisa/can/ocera-can-031212.tar.gz}
1344
1345 The code should build for user-space with new make on most of Linux distros
1346 when make is updated.
1347
1348 If you want to test compile for RT-Linux targets, line
1349
1350 @example
1351 #RTL_DIR := /home/cvs/ocera/ocera-build/kernel/rtlinux
1352 @end example
1353
1354 in @file{Makefile.rules} has to be activated and updated
1355 to point RT-Linux directory containing "rtl.mk".
1356 There is only one library ("ulutrtl") and test utility compiled for RT-Linux
1357 (@file{can/utils/ulut/ul_rtlchk.c}).
1358
1359 The next line, if enabled, controls compilation in OCERA project tree
1360
1361 @example
1362 #OCERA_DIR := $(shell ( cd -L $(MAKERULES_DIR)/../../.. ; pwd -L ) )
1363 @end example
1364
1365 The LinCAN driver has been updated to compile out of source directories.
1366
1367 Please, check, if you could compile CAN package and help us with integration
1368 into OCERA SF CVS. Send your comments and objections. 
1369
1370 The OMK system has been adapted to support actual OCERA configuration process.
1371 I am not happy with ocera.mk mix of defines and poor two or three rules,
1372 but OMK is able to overcome that.
1373
1374 The OMK system has integrated rules (default-config) to build default
1375 configuration file. The file is named @file{config.omk-default} for
1376 the stand-alone compilation.  The name corresponds to OCERA config +
1377 "-default" if OCERA_DIR is defined.  This file contains statements
1378 from all @code{default_CONFIG} lines in all @file{Makefile.omk}.  The
1379 file should be used for building of own @file{config.omk} file, or as
1380 list for all options if Kconfig is used.
1381
1382 @c @chapter OMK Reference
1383
1384 @node OMK Development, Variable Index, Original README, Top
1385 @chapter OMK Development
1386
1387 This section is far from complete. Its purpose is to document internals
1388 of @file{Makefile.rules} as well as other things needed only by people
1389 who hack OMK itself.
1390
1391 @section Passes
1392
1393 A pass is created by instantiation of @code{omk_pass_template} with
1394 @var{pass-name} as one of arguments. This defines several targets which
1395 are described here:
1396
1397 @table @code
1398 @item @var{pass-name}
1399 Target used to invoke the individual pass either from command line or
1400 from inside of @file{Makefile.rules}.
1401
1402 @item @var{pass-name}-submakes
1403 Invoked recursively from @var{pass-name}. The reason for this is the
1404 fact that 
1405
1406 @item @var{pass-name}-this-dir
1407 This target calls make recursively once again with @var{pass-name}-local
1408 target, which does the real-work. Make's working directory is set to the
1409 corresponding directory in @file{_build} tree and the -local
1410
1411 @item @var{pass-name}-@var{dirname}-subdir
1412 This target is responsible for recursive invocation of @command{make} in
1413 subdirectories specified in @code{@ref{SUBDIRS}} variable.
1414 @end table
1415
1416 @node Variable Index,  , OMK Development, Top
1417 @unnumbered Variable Index
1418
1419 @printindex vr
1420
1421 @c @node Concept Index,  , Variable Index, Top
1422 @c @unnumbered Concept Index
1423 @c @printindex cp
1424
1425 @bye