diff -r 000000000000 -r 42188c7ea2d9 Orb/Doxygen/tmake/doc/tmake.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Orb/Doxygen/tmake/doc/tmake.html Thu Jan 21 17:29:01 2010 +0000 @@ -0,0 +1,727 @@ + + +User's Guide - tmake + +

User's Guide - tmake

+ + +
+

Introduction

+ +tmake is an easy-to-use tool from Troll Tech to create and maintain +makefiles for software projects. It can be a painful task to manage +makefiles manually, especially if you develop for more than one platform +or use more than one compiler. tmake automates and streamlines this +process and lets you spend your valuable time on writing code, not +makefiles. + +

+Our main motivation for developing tmake was that we spent far too much +time maintaining makefiles for Qt, +our cross-platform GUI toolkit. Qt supports around 15 flavors of Unix, +Microsoft Windows, and around 15 different C++ compilers. We looked at +GNU autoconf, but it was Unix-specific and not flexible enough in our +opinion. Our makefile system also had to deal with Qt meta object compiler +(moc) issues. The moc program extracts meta information from C++ files and +generates a C++ file with data tables etc. It takes extra work to add +makefile rules for the moc and wanted to automate this task. + +

+tmake is written in Perl and requires that you have installed perl version +5 or newer. Basic use of tmake requires no perl knowledge, but if you know +perl you can extend tmake and write your own makefile templates. + +

+Windows users: The tmake distribution for Win32 includes tmake.exe +(built by the perl2exe utility) and you do not need to download and +install perl unless you want to modify the tmake source code or run other +perl scripts. You can download perl for Win32 (Windows NT and 95) from www.activestate.com + +

+tmake is free software and you may use, copy, modify and distribute tmake +and its documentation for any purpose and without any fee. See the +LICENSE file for details. + +

+Feedback is highly appreciated. Contact the author, Haavard Nord (hanord@troll.no), if you have ideas, +patches etc. for tmake. + +


+

Installation

+ +
    +
  1. Make sure you have perl version 5 or later installed (optional +for Windows users). +
  2. Unpack the tmake tar.gz archive for Unix or the tmake .zip file for Windows. +
  3. Set the TMAKEPATH environment variable to the directories +containing the template files (see below). +
  4. Add the tmake/bin directory to your PATH. +
+ +Here are some examples:

+Unix Bourne shell:

+    TMAKEPATH=/local/tmake/lib/linux-g++
+    PATH=$PATH:/local/tmake/bin
+    export TMAKEPATH PATH
+
+ +Unix C shell:
+    setenv TMAKEPATH /local/tmake/lib/linux-g++
+    setenv PATH $PATH:/local/tmake/bin
+
+ +Microsoft Windows:
+    set TMAKEPATH=c:\tmake\lib\win32-msvc
+    set PATH=%PATH%;c:\tmake\bin
+
+ +

+The template directory name has the form platform-compiler +and contains a platform configuration file (tmake.conf) and tmake template +files. + +

+Supported platforms: AIX, Data General, FreeBSD, HPUX, SGI Irix, Linux, +NetBSD, OpenBSD, OSF1/DEC, SCO, Solaris, SunOS, Ultrix, Unixware and +Win32. + +

+You can find your platform-compiler combination in the tmake/lib. + +

+Unix users: tmake requires that perl is in /usr/bin. If your +version of perl is elsewehere, either change the first line of tmake or +make a small shell script which invokes tmake with the correct perl. + + +


+

Getting Started

+ +Let's assume you have a small Qt application consisting of one C++ header +file and two source files. + +First you need to create a tmake project file, e.g. hello.pro:
+  HEADERS   =  hello.h
+  SOURCES   =  hello.cpp main.cpp
+  TARGET    =  hello
+
+ +Then run tmake to create a Makefile:
+  tmake hello.pro -o Makefile
+
+And finally:
+  make
+
+This builds the hello program. Remember to set the TMAKEPATH +environment variable before you run tmake. +

+See Makefile for Linux/g++.
+See Makefile for Win32/msvc +(Microsoft Visual C++).
+ + +


+

Makefile Templates

+ +The tmake distribution includes three makefile templates and one +configuration file for each platform/compiler combination. The +TMAKEPATH environment variable tells tmake where to find +these files: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
 app.t Creates a makefile for building applications.
 lib.t Creates a makefile for building libraries.
 subdirs.t Creates a makefile for building targets in subdirectories.
 tmake.conf This configuration file contains compiler options and lists + tools and libraries. +
+ + +

+The hello.pro project file above does not have a TEMPLATE or +a CONFIG variable. The default template is app (the .t +extension is optional) and the default configuration is qt warn_on +release. + +This project file produces exactly the same result as the hello.pro +above:

+  TEMPLATE =  app
+  CONFIG   =  qt warn_on release
+  HEADERS  =  hello.h
+  SOURCES  =  hello.cpp main.cpp
+  TARGET   =  hello
+
+ + + +

Makefile Configuration

+ +

+The CONFIG variable is recognized by both the app.t and lib.t +templates and specifies what compiler options to use and which extra +libraries to link in. + +These options control the compilation flags: +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
 release Compile with optimization enabled, ignored if + "debug" is specified.
 debug Compile with debug options enabled.
 warn_on The compiler should emit more warnings than normally, ignored if + "warn_off" is specified.
 warn_off The compiler should emit no warnings or as few as possible.
+ +

+These options defines the application/library type: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 qt The target is a Qt application/library and requires Qt header + files/library.
 opengl The target requires the OpenGL (or Mesa) headers/libraries.
 x11 The target is a X11 application or library.
 windows The target is a Win32 window application (app.t only).
 console The target is a Win32 console application (app.t only).
 dll The target is a shared object/DLL.
 staticlib The target is a static library (lib.t only).
+ +

+As an example, if the hello application uses both Qt and OpenGL and you +want to compile it for debugging, your CONFIG line should +read:

+  CONFIG = qt opengl debug
+
+ +

+The most common tmake options and project variables are described here. +See the tmake reference manual for +details.

+ + + +

The Application Template

+ +The application template, app.t, lets you compile and link executable +programs or shared objects (DLLs). + +This template recognizes several variabless. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 HEADERS Header files.
 SOURCES Source files.
 TARGET Name of executable (adds .exe if on Windows).
 DESTDIR Where to put the target.
 DEFINES Tell compiler to define C preprocessor macros (-D option).
 INCLUDEPATH Sets the include file search path for the compiler (-I + option). +
 DEPENDPATH Sets the dependency search path for tmake.
 DEF_FILE Win32 only: Link with a .def file.
 RC_FILE Win32 only: Use a .rc file (compile to temporary .res). +
 RES_FILE Win32 only: Link with a .res file. +
+ +

+ + +

The Library Template

+ +The library template, lib.t, lets you compile and create static or shared +libraries. + +

+The lib.t template supports the same project variables as app.t, but also +VERSION. VERSION is the version number of the +target library, e.g. 1.40. The version is important for shared libraries. + + + +

The Subdirs Template

+ +The subdirs template, subdirs.t, lets you invoke make in subdirectories. + +

The SUBDIRS variable contains the name of all subdirectories to +be processed. + + +

Special Templates for Microsoft Visual C++

+ +If you have Microsoft Visual C++ 5.0, you can use two special templates to +generate a MSVC++ IDE project (.dsp file). After you have generated +e.g. hello.dsp, choose "File"->"Open Workspace" and select the hello.dsp +file. Visual C++ will then create a workspace (.dsw file) for you.

+ + + + + + + + + + + + + +
 vcapp.t Creates an application project file (Microsoft Visual C++ 5.0 + only).
 vclib.t Creates a library project file (Microsoft Visual C++ 5.0 + only).
+ +

+Run tmake to create a hello.dsp file (use -t to override the default +template):

+  tmake -t vcapp -o hello.dsp hello.pro
+
+ + +
+

Project File Syntax

+ +The tmake project file has a very simple syntax. You may set +project variables, append to project variables, remove from +project variable and substitute project variables. + +To set a project variable:
+    HEADERS = gui.h xml.h url.h
+
+ +If you cannot fit everything on one line, use '\' to split it up:
+    HEADERS = gui.h \
+	      xml.h \
+	      url.h
+
+ +

+Project variables contains lists of items (such as header files, +compiler options etc.) and use whitespace to separate the items. +This means that tmake cannot deal with items containing whitespace. +The INCLUDEPATH variable is an exception. If INCLUDEPATH contains +one or more semicolons (;), tmake uses the semicolon to separate +the include directories, hence you can have include directories +containing whitespace (this is quite common on Windows). + +

+Here is an example:

+    INCLUDEPATH = C:\Program Files\DBLib\Include;C:\qt\include
+
+ +

+tmake supports project variable expension. Use $$ to expand +any project variable:

+    ALLFILES = $$HEADERS $$SOURCES
+
+ +

+Most often you assign some value to a project variable, but you can +also add to, remove from or replace parts of a project variable.

+    A   = abc
+    X   = xyz
+    A  += def			# A = abc def
+    X  *= xyz			# X = xyz
+    B   = $$A			# B = abc def
+    B  -= abc			# B = def
+    X  /= s/y/Y/		# X = xYz
+
+The *= operation adds the value if the variable does not already contain it. +The /= operation performs regular expression substitution. + +

+You can also set variables from the command line when running the tmake +program. For instance, if you want to generate a makefile with debug +information:

+    tmake "CONFIG+=debug" hello.pro
+
+ +

+Use the unix: or win32: (conditional) qualifier if you want a +platform-specific variable:

+    SOURCES	   =   common.cpp   # common for all platforms
+    unix:SOURCES   +=  unix.cpp	    # additional sources for Unix
+    win32:SOURCES  +=  win32.cpp    # additional sources for Windows
+    unix:LIBS	   +=  -lm	    # on Unix we need the math lib
+
+If none of the platforms match, tmake looks for the variable in CONFIG +variable:
+    debug:SOURCES  +=  dbgstuff.cpp # additional source for debugging
+
+ +Finally, you can set platform and compiler-dependent variables:
+    linux-g++:TMAKE_CFLAGS = -fno-rtti
+
+ +

+You may define your own project variables to be used by custom templates. A +project variable is stored in %project, which is an associative +Perl array. Access it like this: $project{"var"} or via the +function Project("var"). For example, after reading +"hello.pro", $project{"SOURCES"} contains "hello.cpp +main.cpp".

+ + +


+

Running tmake

+ +Usage:
+  tmake [options] project files or project settings
+
+Options:
+  -e expr    Evaluate the Perl expression.  Ignores the template file.
+  -nodepend  Don't generate dependency information.
+  -o file    Write output to file instead of stdout.
+  -t file    Specify a template file.
+  -unix      Force tmake into Unix mode.
+  -v         Verbose/debugging on.
+  -win32     Force tmake into Win32 mode.
+
+ +The -t option overrides any TEMPLATE variable in the project file. +

+The default project file extension is ".pro". The default template file +extension is ".t". If you do not specify these extension tmake will +automatically add them for you. + +

+Example of basic use:

+    tmake hello -o Makefile
+
+ +

+Example of how to create a makefile with debugging information:

+    tmake "CONFIG+=debug" hello -o Makefile
+
+ +

+Exmaple of how to specify a TMAKEPATH:

+    tmake "TMAKEPATH=/local/tmake/lib/hpux-g++" hello.pro -o Makefile
+
+ +Example of how to evaluate a perl expression (print names of headers +and source files):
+    tmake hello -e 'Expand("HEADERS","SOURCES")'
+
+ +
+

The progen Utility

+ +The progen utility creates project files for you. It can be used like +this:
+  progen -n hello -o hello.pro
+
+If no .cpp or .h files are specified on the command line, progen +searches for .cpp and .h (except moc_*.cpp) in the current directory +and below. +

+Usage:

+  progen [options] [C/C++ header files and source files]
+
+Options:
+  -lower   Lower-case letters in filenames (useful on Windows).
+  -n name  Specify a project name (TARGET).
+  -o file  Write output to file instead of stdout.
+  -t file  Specify a template file.
+
+ + +
+

Advanced Topics

+ +In most cases you will be happy with using tmake as described above, but +sometimes you need to add special compiler options or even add new +makefile rules. This chapter describes how to customize your makefiles. + +

Conditional Project Settings

+ +If you need a special compiler option etc., you can add platform-dependent +settings in your project file:
  
+  solaris-cc:TMAKE_CC     = /opt/bin/CC_5.0
+  solaris-cc:TMAKE_CFLAGS = -pts
+  unix:TMAKE_LIBS         = -lXext
+  win32:INCLUDEPATH       = c:\myinclude
+  win32-borland:DEFINES   = NO_BOOL
+
+ +You can prefix a project variable with unix: or win32: to make it specific for +either Unix or Windows. You can also prefix a variable with +platform-compiler + +

Your Own Templates

+ +If you know Perl programming, there is virtually no limitation to what you +can do with tmake. First you need to know how tmake works. + +

Template Processing

+ +When you run tmake, it first reads the tmake.conf file. +This configuration file has the same syntax as the project file. + +tmake then reads the project file and sets the project variables it +finds, e.g. HEADERS, SOURCES etc. + +All variables and values are stored in a global associative Perl hash +array called project. For example, +$project{"SOURCES"} contains "hello.cpp main.cpp" +after processing hello.pro. + +When both the tmake.conf and the project files have been +read, tmake starts reading the template file line by line and +executes any Perl code it finds in the template. + + + +

+Example:

+    #! This is a comment which will be removed.
+    This text will appear in the output.
+    #$ $text = "The header file(s) are: " . $project{"HEADERS"};
+    # This text also appears in the output.
+    #${
+       $a = 12;
+       $b = 13;
+       $text = $a * $b;
+    #$}
+    That's all.
+
+Output:
+    This text will appear in the output.
+    The header file(s) are: hello.h
+    # This text also appears in the output.
+    156
+    That's all.
+
+ + +

Using tmake With Lex and Yacc

+ +The standard tmake templates knows how to process C and C++ files, but +sometimes you need to process additional files and link them into your +project. A typical example is to process lex and yacc files when you're +building a parser. + +

+Parser template:

+  #!
+  #! parser.t: This is a custom template for building a parser
+  #!
+  #$ IncludeTemplate("app.t");
+
+  ####### Lex/yacc programs and options
+
+  LEX	    =	flex
+  YACC    =	#$ $text = ($is_unix ? "yacc -d" : "byacc -d");
+
+  ####### Lex/yacc files
+
+  LEXIN   =	#$ Expand("LEXINPUT");
+  LEXOUT  =	lex.yy.c
+  YACCIN  =	#$ Expand("YACCINPUT");
+  YACCOUT =	y.tab.c
+  YACCHDR =	y.tab.h
+  PARSER  =	#$ Expand("PARSER");
+
+  ####### Process lex/yacc files
+
+  $(LEXOUT): $(LEXIN)
+          $(LEX) $(LEXIN)
+
+  $(PARSER): $(YACCIN) $(LEXOUT)
+          $(YACC) $(YACCIN)
+          #$ $text = ($is_unix ? "-rm -f " : "-del ") . '$(PARSER)';
+          #$ $text = ($is_unix ? "-mv " : "-ren ") . '$(YACCOUT) $(PARSER)'; 
+
+ +The parser template adds some extra rules to the application template +in order to build the lex and yacc portions of the project. This +template is portable across Unix and Windows since it generates different +commands depending on the $is_unix variable. + +

+To learn more about the Expand() function and other Perl functions which +tmake provides, consult the reference manual. + +

+Example project file:

+  TEMPLATE  = parser.t
+  CONFIG    = console release
+  LEXINPUT  = lexer.l
+  YACCINPUT = grammar.y
+  PARSER    = parser.cpp
+  SOURCES   = $$PARSER    \
+              node.cpp    \
+              asmgen.cpp
+  TARGET    = parser
+
+ +Here we use macro expansion $$PARSER to avoid writing parser.cpp +two places. + + +

Counting the Number of Code Lines

+ +tmake is generic since it is based on Perl. You can create your own +templates for other purposes than producing makefiles. Here is an example +template that counts the number of code lines in our project. + +

+Template wc.t:

+  #! Template that count number of C++ lines.
+  The number of C++ code lines for #$ $text=$project_name;
+  #${
+    $files = $project{"HEADERS"} . " " . $project{"SOURCES"};
+    $text = `wc -l $files`;
+  #$}
+
+Run it:
+  tmake -t wc hello
+
+Output:
+  The number of C++ code lines for hello.pro
+       25    hello.h
+       98    hello.cpp
+       38    main.cpp
+      161    total
+
+This will only work if the wc program is installed on your system. + + +