docs/overview.txt
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Mar 29 00:15:32 2010 +0200 (2010-03-29)
changeset 1864 758d5137fe87
parent 1842 2535545dd450
child 1937 384b7f8fc780
permissions -rw-r--r--
scripts/populate: optimise search loop

Curently, populate will iterate over all ELF (shared objects|executables)
to look for missing NEEDED DSOs, adding to the list at every iterations
of the search loop.

Instead of looking again at previously handled ELF files, recursively
resolve every ELf files.

Also, in case there are a whole lot of files (more than the shell can
accept as arguments list, or creating a command line longer than the
shell can cope with), use a temporary file with the list of files
to search for missing dependencies.
yann@1
     1
File.........: overview.txt
yann@197
     2
Content......: Overview of how crosstool-NG works.
yann@92
     3
Copyrigth....: (C) 2007 Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
yann@192
     4
License......: Creative Commons Attribution Share Alike (CC-by-sa), v2.5
yann@92
     5
yann@628
     6
____________________
yann@628
     7
                   /
yann@628
     8
Table Of Content  /
yann@628
     9
_________________/
yann@628
    10
yann@628
    11
yann@628
    12
Introduction
yann@628
    13
History
yann@1581
    14
Referring to crosstool-NG
yann@628
    15
Installing crosstool-NG
yann@628
    16
  Install method
yann@628
    17
  The hacker's way
yann@1048
    18
  Preparing for packaging
yann@837
    19
  Shell completion
yann@628
    20
  Contributed code
yann@628
    21
Configuring crosstool-NG
yann@628
    22
  Interesting config options
yann@628
    23
  Re-building an existing toolchain
yann@1842
    24
  Using as a backend for a build-system
yann@628
    25
Running crosstool-NG
yann@628
    26
  Stopping and restarting a build
yann@628
    27
  Testing all toolchains at once
yann@628
    28
  Overriding the number of // jobs
yann@1491
    29
  Note on // jobs
yann@1493
    30
  Tools wrapper
yann@628
    31
Using the toolchain
yann@1554
    32
  The 'populate' script
yann@628
    33
Toolchain types
yann@1551
    34
  Seemingly-native toolchains
yann@1575
    35
Contributing
yann@1575
    36
  Sending a bug report
yann@1575
    37
  Sending patches
yann@628
    38
Internals
yann@628
    39
  Makefile front-end
yann@628
    40
  Kconfig parser
yann@628
    41
  Architecture-specific
yann@628
    42
  Adding a new version of a component
yann@628
    43
  Build scripts
yann@628
    44
yann@1580
    45
yann@1
    46
________________
yann@1
    47
               /
yann@1
    48
Introduction  /
yann@1
    49
_____________/
yann@1
    50
yann@1
    51
crosstool-NG aims at building toolchains. Toolchains are an essential component
yann@1
    52
in a software development project. It will compile, assemble and link the code
rpjday@436
    53
that is being developed. Some pieces of the toolchain will eventually end up
yann@1
    54
in the resulting binary/ies: static libraries are but an example.
yann@1
    55
yann@1
    56
So, a toolchain is a very sensitive piece of software, as any bug in one of the
yann@1
    57
components, or a poorly configured component, can lead to execution problems,
yann@1
    58
ranging from poor performance, to applications ending unexpectedly, to
yann@1
    59
mis-behaving software (which more than often is hard to detect), to hardware
rpjday@436
    60
damage, or even to human risks (which is more than regrettable).
yann@1
    61
yann@1
    62
Toolchains are made of different piece of software, each being quite complex
yann@1
    63
and requiring specially crafted options to build and work seamlessly. This
yann@1
    64
is usually not that easy, even in the not-so-trivial case of native toolchains.
yann@1
    65
The work reaches a higher degree of complexity when it comes to cross-
yann@40
    66
compilation, where it can become quite a nightmare...
yann@1
    67
yann@40
    68
Some cross-toolchains exist on the internet, and can be used for general
yann@1
    69
development, but they have a number of limitations:
yann@1
    70
  - they can be general purpose, in that they are configured for the majority:
yann@1
    71
    no optimisation for your specific target,
yann@1
    72
  - they can be prepared for a specific target and thus are not easy to use,
yann@1
    73
    nor optimised for, or even supporting your target,
rpjday@436
    74
  - they often are using aging components (compiler, C library, etc...) not
yann@1
    75
    supporting special features of your shiny new processor;
yann@1
    76
On the other side, these toolchain offer some advantages:
yann@1
    77
  - they are ready to use and quite easy to install and setup,
yann@1
    78
  - they are proven if used by a wide community.
yann@1
    79
yann@1
    80
But once you want to get all the juice out of your specific hardware, you will
yann@197
    81
want to build your own toolchain. This is where crosstool-NG comes into play.
yann@1
    82
rpjday@436
    83
There are also a number of tools that build toolchains for specific needs,
rpjday@436
    84
which are not really scalable. Examples are:
rpjday@436
    85
  - buildroot (buildroot.uclibc.org) whose main purpose is to build root file
yann@1
    86
    systems, hence the name. But once you have your toolchain with buildroot,
yann@1
    87
    part of it is installed in the root-to-be, so if you want to build a whole
yann@1
    88
    new root, you either have to save the existing one as a template and
yann@1
    89
    restore it later, or restart again from scratch. This is not convenient,
yann@1
    90
  - ptxdist (www.pengutronix.de/software/ptxdist), whose purpose is very
yann@1
    91
    similar to buildroot,
yann@702
    92
  - other projects (openembedded.org for example), which are again used to
yann@1
    93
    build root file systems.
yann@1
    94
rpjday@436
    95
crosstool-NG is really targeted at building toolchains, and only toolchains.
yann@1
    96
It is then up to you to use it the way you want.
yann@1
    97
yann@1580
    98
yann@1
    99
___________
yann@1
   100
          /
yann@1
   101
History  /
yann@1
   102
________/
yann@1
   103
rpjday@436
   104
crosstool was first 'conceived' by Dan Kegel, who offered it to the community
yann@1
   105
as a set of scripts, a repository of patches, and some pre-configured, general
yann@1
   106
purpose setup files to be used to configure crosstool. This is available at
yann@203
   107
http://www.kegel.com/crosstool, and the subversion repository is hosted on
yann@203
   108
google at http://code.google.com/p/crosstool/.
yann@1
   109
yann@1
   110
I once managed to add support for uClibc-based toolchains, but it did not make
yann@437
   111
into mainline, mostly because I didn't have time to port the patch forward to
yann@1
   112
the new versions, due in part to the big effort it was taking.
yann@1
   113
yann@1
   114
So I decided to clean up crosstool in the state it was, re-order the things
yann@437
   115
in place, add appropriate support for what I needed, that is uClibc support
yann@437
   116
and a menu-driven configuration, named the new implementation crosstool-NG,
yann@437
   117
(standing for crosstool Next Generation, as many other comunity projects do,
yann@437
   118
and as a wink at the TV series "Star Trek: The Next Generation" ;-) ) and
yann@437
   119
made it available to the community, in case it was of interest to any one.
yann@1
   120
yann@1580
   121
yann@1581
   122
_____________________________
yann@1581
   123
                            /
yann@1581
   124
Referring to crosstool-NG  /
yann@1581
   125
__________________________/
yann@1581
   126
yann@1581
   127
yann@1581
   128
The long name of the project is crosstool-NG:
yann@1581
   129
  * no leading uppercase (except as first word in a sentence)
yann@1581
   130
  * crosstool and NG separated with a hyphen (dash)
yann@1581
   131
  * NG in uppercase
yann@1581
   132
yann@1581
   133
Crosstool-NG can also be referred to by its short name CT-NG:
yann@1581
   134
  * all in uppercase
yann@1581
   135
  * CT and NG separated with a hyphen (dash)
yann@1581
   136
yann@1581
   137
The long name is preferred over the short name, except in mail subjects, where
yann@1581
   138
the short name is a better fit.
yann@1581
   139
yann@1581
   140
When referring to a specific version of crosstool-NG, append the version number
yann@1581
   141
either as:
yann@1581
   142
  * crosstool-NG X.Y.Z
yann@1581
   143
    - the long name, a space, and the version string
yann@1581
   144
  * crosstool-ng-X.Y.Z
yann@1581
   145
    - the long name in lowercase, a hyphen (dash), and the version string
yann@1581
   146
    - this is used to name the release tarballs
yann@1581
   147
  * crosstool-ng-X.Y.Z+hg_id
yann@1581
   148
    - the long name in lowercase, a hyphen, the version string, and the Hg id
yann@1581
   149
      (as returned by: ct-ng version)
yann@1581
   150
    - this is used to differentiate between releases and snapshots
yann@1581
   151
yann@1581
   152
The frontend to crosstool-NG is the command ct-ng:
yann@1581
   153
  * all in lowercase
yann@1581
   154
  * ct and ng separated by a hyphen (dash)
yann@1581
   155
yann@1581
   156
yann@294
   157
___________________________
yann@294
   158
                          /
yann@294
   159
Installing crosstool-NG  /
yann@294
   160
________________________/
yann@294
   161
yann@294
   162
There are two ways you can use crosstool-NG:
yann@294
   163
 - build and install it, then get rid of the sources like you'd do for most
yann@294
   164
   programs,
yann@294
   165
 - or only build it and run from the source directory.
yann@294
   166
yann@294
   167
The former should be used if you got crosstool-NG from a packaged tarball, see
rpjday@436
   168
"Install method", below, while the latter is most useful for developpers that
yann@1576
   169
use a clone of the repository, and want to submit patches, see "The Hacker's
yann@294
   170
way", below.
yann@294
   171
yann@294
   172
Install method |
yann@294
   173
---------------+
yann@294
   174
yann@294
   175
If you go for the install, then you just follow the classical, but yet easy
yann@294
   176
./configure way:
yann@294
   177
  ./configure --prefix=/some/place
yann@294
   178
  make
yann@294
   179
  make install
yann@294
   180
  export PATH="${PATH}:/some/place/bin"
yann@294
   181
yann@294
   182
You can then get rid of crosstool-NG source. Next create a directory to serve
yann@294
   183
as a working place, cd in there and run:
yann@294
   184
  ct-ng help
yann@294
   185
yann@294
   186
See below for complete usage.
yann@294
   187
yann@294
   188
The Hacker's way |
yann@294
   189
-----------------+
yann@294
   190
yann@294
   191
If you go the hacker's way, then the usage is a bit different, although very
yann@294
   192
simple:
yann@294
   193
  ./configure --local
yann@294
   194
  make
yann@294
   195
yann@294
   196
Now, *do not* remove crosstool-NG sources. They are needed to run crosstool-NG!
yann@294
   197
Stay in the directory holding the sources, and run:
yann@294
   198
  ./ct-ng help
yann@294
   199
yann@294
   200
See below for complete usage.
yann@294
   201
yann@1554
   202
Now, provided you used a clone of the repository, you can send me your changes.
yann@1575
   203
See the section titled CONTRIBUTING, below, for how to submit changees.
yann@294
   204
yann@1048
   205
Preparing for packaging |
yann@1048
   206
------------------------+
yann@1048
   207
yann@1048
   208
If you plan on packaging crosstool-NG, you surely don't want to install it
yann@1048
   209
in your root file system. The install procedure of crosstool-NG honors the
yann@1048
   210
DESTDIR variable:
yann@1048
   211
yann@1048
   212
  ./configure --prefix=/usr
yann@1048
   213
  make
rpjday@1291
   214
  make DESTDIR=/packaging/place install
yann@1048
   215
yann@837
   216
Shell completion |
yann@837
   217
-----------------+
yann@837
   218
yann@837
   219
crosstool-NG comes with a shell script fragment that defines bash-compatible
yann@837
   220
completion. That shell fragment is currently not installed automatically, but
yann@837
   221
this is planned.
yann@837
   222
yann@837
   223
To install the shell script fragment, you have two options:
yann@837
   224
 - install system-wide, most probably by copying ct-ng.comp into
yann@837
   225
   /etc/bash_completion.d/
yann@837
   226
 - install for a single user, by copying ct-ng.comp into ${HOME}/ and
yann@837
   227
   sourcing this file from your ${HOME}/.bashrc
yann@837
   228
yann@456
   229
Contributed code |
yann@456
   230
-----------------+
yann@456
   231
yann@456
   232
Some people contibuted code that couldn't get merged for various reasons. This
yann@1574
   233
code is available as lzma-compressed patches, in the contrib/ sub-directory.
yann@1574
   234
These patches are to be applied to the source of crosstool-NG, prior to
yann@1574
   235
installing, using something like the following:
yann@1574
   236
  lzcat contrib/foobar.patch.lzma |patch -p1
yann@620
   237
yann@620
   238
There is no guarantee that a particuliar contribution applies to the current
yann@620
   239
version of crosstool-ng, or that it will work at all. Use contributions at
yann@620
   240
your own risk.
yann@620
   241
yann@1580
   242
yann@168
   243
____________________________
yann@168
   244
                           /
yann@168
   245
Configuring crosstool-NG  /
yann@168
   246
_________________________/
yann@168
   247
yann@620
   248
crosstool-NG is configured with a configurator presenting a menu-stuctured set
yann@620
   249
of options. These options let you specify the way you want your toolchain
yann@620
   250
built, where you want it installed, what architecture and specific processor it
yann@277
   251
will support, the version of the components you want to use, etc... The
yann@277
   252
value for those options are then stored in a configuration file.
yann@277
   253
yann@476
   254
The configurator works the same way you configure your Linux kernel. It is
yann@277
   255
assumed you now how to handle this.
yann@168
   256
yann@168
   257
To enter the menu, type:
yann@192
   258
  ct-ng menuconfig
yann@168
   259
yann@203
   260
Almost every config item has a help entry. Read them carefully.
yann@168
   261
yann@168
   262
String and number options can refer to environment variables. In such a case,
yann@192
   263
you must use the shell syntax: ${VAR}. You shall neither single- nor double-
yann@294
   264
quote the string/number options.
yann@168
   265
yann@192
   266
There are three environment variables that are computed by crosstool-NG, and
yann@168
   267
that you can use:
yann@168
   268
yann@168
   269
CT_TARGET:
yann@335
   270
  It represents the target tuple you are building for. You can use it for
yann@168
   271
  example in the installation/prefix directory, such as:
yann@168
   272
    /opt/x-tools/${CT_TARGET}
yann@168
   273
yann@168
   274
CT_TOP_DIR:
yann@182
   275
  The top directory where crosstool-NG is running. You shouldn't need it in
yann@182
   276
  most cases. There is one case where you may need it: if you have local
yann@182
   277
  patches and you store them in your running directory, you can refer to them
yann@168
   278
  by using CT_TOP_DIR, such as:
yann@168
   279
    ${CT_TOP_DIR}/patches.myproject
yann@168
   280
yann@168
   281
CT_VERSION:
yann@192
   282
  The version of crosstool-NG you are using. Not much use for you, but it's
yann@168
   283
  there if you need it.
yann@168
   284
yann@168
   285
Interesting config options |
yann@476
   286
---------------------------+
yann@168
   287
yann@168
   288
CT_LOCAL_TARBALLS_DIR:
yann@277
   289
  If you already have some tarballs in a direcotry, enter it here. That will
yann@197
   290
  speed up the retrieving phase, where crosstool-NG would otherwise download
yann@168
   291
  those tarballs.
yann@168
   292
yann@168
   293
CT_PREFIX_DIR:
yann@168
   294
  This is where the toolchain will be installed in (and for now, where it
yann@437
   295
  will run from). Common use is to add the target tuple in the directory
yann@277
   296
  path, such as (see above):
yann@277
   297
    /opt/x-tools/${CT_TARGET}
yann@168
   298
yann@168
   299
CT_TARGET_VENDOR:
yann@168
   300
  An identifier for your toolchain, will take place in the vendor part of the
yann@335
   301
  target tuple. It shall *not* contain spaces or dashes. Usually, keep it
yann@168
   302
  to a one-word string, or use underscores to separate words if you need.
yann@168
   303
  Avoid dots, commas, and special characters.
yann@168
   304
yann@168
   305
CT_TARGET_ALIAS:
yann@168
   306
  An alias for the toolchian. It will be used as a prefix to the toolchain
yann@168
   307
  tools. For example, you will have ${CT_TARGET_ALIAS}-gcc
yann@168
   308
yann@246
   309
Also, if you think you don't see enough versions, you can try to enable one of
yann@246
   310
those:
yann@246
   311
yann@246
   312
CT_OBSOLETE:
yann@246
   313
  Show obsolete versions or tools. Most of the time, you don't want to base
yann@246
   314
  your toolchain on too old a version (of gcc, for example). But at times, it
yann@246
   315
  can come handy to use such an old version for regression tests. Those old
yann@1300
   316
  versions are hidden behind CT_OBSOLETE. Those versions (or features) are so
yann@1300
   317
  marked because maintaining support for those in crosstool-NG would be too
yann@1300
   318
  costly, time-wise, and time is dear.
yann@246
   319
yann@246
   320
CT_EXPERIMENTAL:
yann@246
   321
  Show experimental versions or tools. Again, you might not want to base your
yann@246
   322
  toolchain on too recent tools (eg. gcc) for production. But if you need a
yann@246
   323
  feature present only in a recent version, or a new tool, you can find them
yann@1300
   324
  hidden behind CT_EXPERIMENTAL. Those versions (or features) did not (yet)
yann@1300
   325
  receive thorough testing in crosstool-NG, and/or are not mature enough to
yann@1300
   326
  be blindly trusted.
yann@246
   327
yann@276
   328
Re-building an existing toolchain |
yann@276
   329
----------------------------------+
yann@276
   330
yann@276
   331
If you have an existing toolchain, you can re-use the options used to build it
yann@276
   332
to create a new toolchain. That needs a very little bit of effort on your side
yann@894
   333
but is quite easy. The options to build a toolchain are saved with the
yann@894
   334
toolchain, and you can retrieve this configuration by running:
yann@1803
   335
  ${CT_TARGET}-ct-ng.config
yann@276
   336
yann@1803
   337
An alternate method is to extract the configuration from a build.log file.
yann@1803
   338
This will be necessary if your toolchain was build with crosstool-NG prior
yann@1803
   339
to 1.4.0, but can be used with build.log files from any version:
yann@1803
   340
  ct-ng extractconfig <build.log >.config
yann@1803
   341
yann@1803
   342
Or, if your build.log file is compressed (most probably!):
yann@1803
   343
  bzcat build.log.bz2 |ct-ng extractconfig >.config
yann@1803
   344
yann@1803
   345
The above commands will dump the configuration to stdout, so to rebuild a
yann@1803
   346
toolchain with this configuration, just redirect the output to the
yann@1803
   347
.config file:
yann@1803
   348
  ${CT_TARGET}-ct-ng.config >.config
yann@1098
   349
  ct-ng oldconfig
yann@276
   350
yann@894
   351
Then, you can review and change the configuration by running:
yann@894
   352
  ct-ng menuconfig
yann@276
   353
yann@1842
   354
Using as a backend for a build-system |
yann@1842
   355
--------------------------------------+
yann@1842
   356
yann@1842
   357
Crosstool-NG can be used as a backend for an automated build-system. In this
yann@1842
   358
case, some components that are expected to run on the target (eg. the native
yann@1842
   359
gdb, ltrace, DUMA...) are not available in the menuconfig, and they are not
yann@1842
   360
build either, as it is considered the responsibility of the build-system to
yann@1842
   361
build its own versions of those tools.
yann@1842
   362
yann@1842
   363
If you want to use crosstool-NG as a backend to generate your toolchains for
yann@1842
   364
your build-system, you have to set and export this environment variable:
yann@1842
   365
  CT_IS_A_BACKEND=y
yann@1842
   366
yann@1842
   367
(case is not sensitive, you can say Y).
yann@1842
   368
yann@1580
   369
yann@168
   370
________________________
yann@168
   371
                       /
yann@168
   372
Running crosstool-NG  /
yann@168
   373
_____________________/
yann@1
   374
yann@168
   375
To build the toolchain, simply type:
yann@203
   376
  ct-ng build
yann@135
   377
yann@135
   378
This will use the above configuration to retrieve, extract and patch the
yann@135
   379
components, build, install and eventually test your newly built toolchain.
yann@1
   380
yann@1
   381
You are then free to add the toolchain /bin directory in your PATH to use
yann@1
   382
it at will.
yann@1
   383
yann@135
   384
In any case, you can get some terse help. Just type:
yann@192
   385
  ct-ng help
yann@203
   386
or:
yann@203
   387
  man 1 ct-ng
yann@135
   388
rpjday@436
   389
Stopping and restarting a build |
yann@476
   390
--------------------------------+
yann@135
   391
yann@135
   392
If you want to stop the build after a step you are debugging, you can pass the
yann@135
   393
variable STOP to make:
fr@1643
   394
  ct-ng build STOP=some_step
yann@135
   395
yann@135
   396
Conversely, if you want to restart a build at a specific step you are
yann@135
   397
debugging, you can pass the RESTART variable to make:
fr@1643
   398
  ct-ng build RESTART=some_step
yann@135
   399
yann@136
   400
Alternatively, you can call make with the name of a step to just do that step:
yann@192
   401
  ct-ng libc_headers
yann@136
   402
is equivalent to:
fr@1643
   403
  ct-ng build RESTART=libc_headers STOP=libc_headers
yann@136
   404
yann@304
   405
The shortcuts +step_name and step_name+ allow to respectively stop or restart
yann@136
   406
at that step. Thus:
fr@1643
   407
  ct-ng +libc_headers              and:    ct-ng libc_headers+
yann@136
   408
are equivalent to:
fr@1643
   409
  ct-ng build STOP=libc_headers    and:    ct-ng build RESTART=libc_headers
yann@136
   410
yann@181
   411
To obtain the list of acceptable steps, please call:
yann@544
   412
  ct-ng list-steps
yann@181
   413
yann@168
   414
Note that in order to restart a build, you'll have to say 'Y' to the config
yann@168
   415
option CT_DEBUG_CT_SAVE_STEPS, and that the previous build effectively went
yann@168
   416
that far.
yann@92
   417
yann@1025
   418
Building all toolchains at once |
yann@1025
   419
--------------------------------+
yann@92
   420
yann@1025
   421
You can build all samples; simply call:
yann@1025
   422
  ct-ng build-all
yann@40
   423
yann@335
   424
Overriding the number of // jobs |
yann@476
   425
---------------------------------+
yann@335
   426
yann@335
   427
If you want to override the number of jobs to run in // (the -j option to
yann@335
   428
make), you can either re-enter the menuconfig, or simply add it on the command
yann@335
   429
line, as such:
yann@335
   430
  ct-ng build.4
yann@335
   431
yann@335
   432
which tells crosstool-NG to override the number of // jobs to 4.
yann@335
   433
yann@335
   434
You can see the actions that support overriding the number of // jobs in
yann@335
   435
the help menu. Those are the ones with [.#] after them (eg. build[.#] or
yann@1025
   436
build-all[.#], and so on...).
yann@1025
   437
yann@1025
   438
Note on // jobs |
yann@1025
   439
----------------+
yann@1025
   440
yann@1025
   441
The crosstool-NG script 'ct-ng' is a Makefile-script. It does *not* execute
yann@1025
   442
in parallel (there is not much to gain). When speaking of // jobs, we are
yann@1025
   443
refering to the number of // jobs when making the *components*. That is, we
yann@1025
   444
speak of the number of // jobs used to build gcc, glibc, and so on...
yann@1025
   445
yann@1493
   446
Tools wrapper |
yann@1493
   447
--------------+
yann@1493
   448
yann@1493
   449
Starting with gcc-4.3 come two new dependencies: GMP and MPFR. With gcc-4.4,
yann@1493
   450
come three new ones: GMP, PPL and CLooG/ppl. These are libraries that enable
yann@1493
   451
advanced features to gcc. Additionally, some of the libraries can be used by
yann@1493
   452
binutils and gdb. Unfortunately, not all systems on which crosstool-NG runs
yann@1493
   453
have all of those libraries. And for those that do, the versions of those
yann@1493
   454
libraries may be older than the version required by gcc.
yann@1493
   455
yann@1493
   456
This is why crosstool-NG builds its own set of libraries as part of the
yann@1493
   457
toolchain.
yann@1493
   458
yann@1493
   459
The libraries are built as shared libraries, because building them as static
yann@1493
   460
libraries has some short-comings. This poses no problem at build time, as
yann@1513
   461
crosstool-NG correctly points gcc (and binutils and gdb) to the correct
yann@1493
   462
place where our own version of the libraries are installed. But it poses
yann@1493
   463
a problem when gcc et al. are run: the place where the libraries are is most
yann@1493
   464
probably not known to the host dynamic linker. Still worse, if the host system
yann@1493
   465
has its own versions, then ld.so would load the wrong library!
yann@1493
   466
yann@1493
   467
So we have to force the dynamic linker to load the correct version. We do this
yann@1493
   468
by using the LD_LIBRARY_PATH variable, that informs the dynamic linker where
yann@1493
   469
to look for shared libraries prior to searching its standard places. But we
yann@1493
   470
can't impose that burden on all the system (because it'd be a nightmare to
yann@1513
   471
configure, and because two toolchains on the same system may use different
yann@1493
   472
versions of the libraries); so we have to do it on a per-toolchain basis.
yann@1493
   473
yann@1493
   474
So we rename all binaries of the toolchain (by adding a dot '.' as their first
yann@1493
   475
character), and add a small program, the so-called "tools wrapper", that
yann@1493
   476
correctly sets LD_LIBRARY_PATH prior to running the real tool.
yann@1493
   477
yann@1493
   478
First, the wrapper was written as a POSIX-compliant shell script. That shell
yann@1493
   479
script is very simple, if not trivial, and works great. The only drawback is
yann@1493
   480
that it does not work on host systems that lack a shell, for example the
yann@1493
   481
MingW32 environment. To solve the issue, the wrapper has been re-written in C,
yann@1493
   482
and compiled at build time. This C wrapper is much more complex than the shell
yann@1493
   483
script, and although it sems to be working, it's been only lightly tested.
yann@1493
   484
Some of the expected short-comings with this C wrapper are;
yann@1493
   485
 - multi-byte file names may not be handled correctly
yann@1493
   486
 - it's really big for what it does
yann@1493
   487
yann@1493
   488
So, the default wrapper installed with your toolchain is the shell script.
yann@1493
   489
If you know that your system is missing a shell, then you shall use the C
yann@1493
   490
wrapper (and report back whether it works, or does not work, for you).
yann@1493
   491
yann@335
   492
yann@227
   493
_______________________
yann@227
   494
                      /
yann@227
   495
Using the toolchain  /
yann@227
   496
____________________/
yann@227
   497
yann@227
   498
Using the toolchain is as simple as adding the toolchain's bin directory in
yann@227
   499
your PATH, such as:
yann@227
   500
  export PATH="${PATH}:/your/toolchain/path/bin"
yann@227
   501
yann@335
   502
and then using the target tuple to tell the build systems to use your
yann@227
   503
toolchain:
yann@335
   504
  ./configure --target=your-target-tuple
yann@294
   505
or
yann@335
   506
  make CC=your-target-tuple-gcc
yann@294
   507
or
yann@335
   508
  make CROSS_COMPILE=your-target-tuple-
yann@294
   509
and so on...
yann@227
   510
yann@476
   511
It is strongly advised not to use the toolchain sys-root directory as an
yann@620
   512
install directory for your programs/packages. If you do so, you will not be
yann@476
   513
able to use your toolchain for another project. It is even strongly advised
yann@476
   514
that your toolchain is chmod-ed to read-only once successfully build, so that
yann@620
   515
you don't go polluting your toolchain with your programs/packages' files.
yann@476
   516
yann@476
   517
Thus, when you build a program/package, install it in a separate directory,
yann@476
   518
eg. /your/root. This directory is the /image/ of what would be in the root file
yann@620
   519
system of your target, and will contain all that your programs/packages have
yann@476
   520
installed.
yann@476
   521
Yann@1405
   522
The 'populate' script |
Yann@1405
   523
----------------------+
Yann@1405
   524
yann@227
   525
When your root directory is ready, it is still missing some important bits: the
yann@227
   526
toolchain's libraries. To populate your root directory with those libs, just
yann@227
   527
run:
yann@335
   528
  your-target-tuple-populate -s /your/root -d /your/root-populated
yann@227
   529
yann@227
   530
This will copy /your/root into /your/root-populated, and put the needed and only
yann@227
   531
the needed libraries there. Thus you don't polute /your/root with any cruft that
yann@227
   532
would no longer be needed should you have to remove stuff. /your/root always
yann@227
   533
contains only those things you install in it.
yann@227
   534
yann@227
   535
You can then use /your/root-populated to build up your file system image, a
yann@227
   536
tarball, or to NFS-mount it from your target, or whatever you need.
yann@227
   537
Yann@1405
   538
The populate script accepts the following options:
yann@294
   539
Yann@1405
   540
 -s src_dir
Yann@1405
   541
    Use 'src_dir' as the un-populated root directory.
yann@294
   542
Yann@1405
   543
 -d dst_dir
Yann@1405
   544
    Put the populated root directory in 'dst_dir'.
Yann@1405
   545
Yann@1405
   546
 -l lib1 [...]
Yann@1405
   547
    Always add specified libraries.
Yann@1405
   548
Yann@1405
   549
 -L file
Yann@1405
   550
    Always add libraries listed in 'file'.
yann@294
   551
yann@294
   552
 -f
Yann@1405
   553
    Remove 'dst_dir' if it previously existed; continue even if any library
Yann@1405
   554
    specified with -l or -L is missing.
yann@294
   555
yann@294
   556
 -v
yann@294
   557
    Be verbose, and tell what's going on (you can see exactly where libs are
yann@294
   558
    coming from).
yann@294
   559
yann@294
   560
 -h
Yann@1405
   561
    Print the help.
Yann@1405
   562
Yann@1405
   563
See 'your-target-tuple-populate -h' for more information on the options.
yann@294
   564
Yann@1406
   565
Here is how populate works:
Yann@1406
   566
Yann@1406
   567
  1) performs some sanity checks:
Yann@1406
   568
     - src_dir and dst_dir are specified
Yann@1406
   569
     - src_dir exists
Yann@1406
   570
     - unless forced, dst_dir does not exist
Yann@1406
   571
     - src_dir != dst_dir
Yann@1406
   572
Yann@1406
   573
  2) copy src_dir to dst_dir
Yann@1406
   574
Yann@1406
   575
  3) add forced libraries to dst_dir
Yann@1406
   576
     - build the list from -l and -L options
Yann@1406
   577
     - get forced libraries from the sysroot (see below for heuristics)
Yann@1406
   578
       - abort on the first missing library, unless -f is specified
Yann@1406
   579
Yann@1406
   580
  4) add all missing libraries to dst_dir
Yann@1406
   581
     - scan dst_dir for every ELF files that are 'executable' or
Yann@1406
   582
       'shared object'
Yann@1406
   583
     - list the "NEEDED Shared library" fields
Yann@1406
   584
       - check if the library is already in dst_dir/lib or dst_dir/usr/lib
Yann@1406
   585
       - if not, get the library from the sysroot
Yann@1406
   586
         - if it's in sysroot/lib, copy it to dst_dir/lib
Yann@1406
   587
         - if it's in sysroot/usr/lib, copy it to dst_dir/usr/lib
Yann@1406
   588
         - in both cases, use the SONAME of the library to create the file
Yann@1406
   589
           in dst_dir
Yann@1406
   590
         - if it was not found in the sysroot, this is an error.
Yann@1406
   591
yann@1580
   592
yann@40
   593
___________________
yann@40
   594
                  /
yann@40
   595
Toolchain types  /
yann@40
   596
________________/
yann@40
   597
yann@40
   598
There are four kinds of toolchains you could encounter.
yann@40
   599
yann@40
   600
First off, you must understand the following: when it comes to compilers there
yann@40
   601
are up to four machines involved:
yann@40
   602
  1) the machine configuring the toolchain components: the config machine
yann@40
   603
  2) the machine building the toolchain components:    the build machine
yann@40
   604
  3) the machine running the toolchain:                the host machine
yann@203
   605
  4) the machine the toolchain is generating code for: the target machine
yann@40
   606
yann@40
   607
We can most of the time assume that the config machine and the build machine
yann@40
   608
are the same. Most of the time, this will be true. The only time it isn't
yann@40
   609
is if you're using distributed compilation (such as distcc). Let's forget
yann@40
   610
this for the sake of simplicity.
yann@40
   611
yann@40
   612
So we're left with three machines:
yann@40
   613
 - build
yann@40
   614
 - host
yann@40
   615
 - target
yann@40
   616
yann@40
   617
Any toolchain will involve those three machines. You can be as pretty sure of
yann@40
   618
this as "2 and 2 are 4". Here is how they come into play:
yann@40
   619
yann@40
   620
1) build == host == target
yann@40
   621
    This is a plain native toolchain, targetting the exact same machine as the
yann@40
   622
    one it is built on, and running again on this exact same machine. You have
yann@40
   623
    to build such a toolchain when you want to use an updated component, such
yann@40
   624
    as a newer gcc for example.
yann@197
   625
    crosstool-NG calls it "native".
yann@40
   626
yann@40
   627
2) build == host != target
yann@40
   628
    This is a classic cross-toolchain, which is expected to be run on the same
yann@40
   629
    machine it is compiled on, and generate code to run on a second machine,
yann@40
   630
    the target.
yann@197
   631
    crosstool-NG calls it "cross".
yann@40
   632
yann@40
   633
3) build != host == target
yann@40
   634
    Such a toolchain is also a native toolchain, as it targets the same machine
yann@40
   635
    as it runs on. But it is build on another machine. You want such a
yann@40
   636
    toolchain when porting to a new architecture, or if the build machine is
yann@40
   637
    much faster than the host machine.
yann@197
   638
    crosstool-NG calls it "cross-native".
yann@40
   639
yann@40
   640
4) build != host != target
yann@92
   641
    This one is called a canadian-toolchain (*), and is tricky. The three
yann@40
   642
    machines in play are different. You might want such a toolchain if you
yann@40
   643
    have a fast build machine, but the users will use it on another machine,
yann@40
   644
    and will produce code to run on a third machine.
yann@197
   645
    crosstool-NG calls it "canadian".
yann@40
   646
yann@197
   647
crosstool-NG can build all these kinds of toolchains (or is aiming at it,
yann@197
   648
anyway!)
yann@40
   649
yann@40
   650
(*) The term Canadian Cross came about because at the time that these issues
yann@40
   651
    were all being hashed out, Canada had three national political parties.
yann@40
   652
    http://en.wikipedia.org/wiki/Cross_compiler
yann@40
   653
yann@1551
   654
yann@1575
   655
________________
yann@1575
   656
               /
yann@1575
   657
Contributing  /
yann@1575
   658
_____________/
yann@1575
   659
yann@1575
   660
Sending a bug report |
yann@1575
   661
---------------------+
yann@1575
   662
yann@1575
   663
If you need to send a bug report, please send a mail with subject
yann@1575
   664
prefixed with "[CT_NG]" with to following destinations:
yann@1575
   665
    TO: yann.morin.1998 (at) anciens.enib.fr
yann@1575
   666
    CC: crossgcc (at) sourceware.org
yann@1575
   667
yann@1575
   668
Sending patches |
yann@1575
   669
----------------+
yann@1575
   670
yann@1575
   671
If you want to enhance crosstool-NG, there's a to-do list in the TODO file.
yann@1575
   672
yann@1575
   673
Patches should come with the appropriate SoB line. A SoB line is typically
yann@1575
   674
something like:
yann@1575
   675
   Signed-off-by: John DOE <john.doe@somewhere.net>
yann@1575
   676
yann@1575
   677
The SoB line is clearly described in Documentation/SubmittingPatches , section
yann@1575
   678
12, of your favourite Linux kernel source tree.
yann@1575
   679
yann@1575
   680
Then you'll need to correctly configure Mercurial. There are two extensions
yann@1575
   681
that you may find usefull:
yann@1575
   682
  - mq        : http://mercurial.selenic.com/wiki/MqExtension
yann@1575
   683
  - patchbomb : http://mercurial.selenic.com/wiki/PatchbombExtension
yann@1575
   684
yann@1575
   685
Commit messages should look like (without leading pipes):
yann@1575
   686
 |component: short, one-line description
yann@1575
   687
 |
yann@1575
   688
 |optional longer description
yann@1575
   689
 |on multiple lines if needed
yann@1575
   690
yann@1575
   691
Here is an example commit message (see revision a53a5e1d61db):
yann@1575
   692
 |comp-libs/cloog: fix building
yann@1575
   693
 |
yann@1575
   694
 |For CLooG/PPL 0.15.3, the directory name was simply cloog-ppl.
yann@1575
   695
 |For any later versions, the directory name does have the version, such as
yann@1575
   696
 |cloog-ppl-0.15.4.
yann@1575
   697
yann@1575
   698
Here's a typical hacking session:
yann@1575
   699
  hg clone http://ymorin.is-a-geek.org/hg/crosstool-ng crosstool-ng
yann@1575
   700
  cd crosstool-ng
yann@1575
   701
  hg qinit
yann@1575
   702
  hg qnew -D -U -e my_first_patch
yann@1575
   703
  *edit patch description*
yann@1575
   704
  *hack* *hack* *check* *fails* *hack* *hack* *check* *works*
yann@1575
   705
  hg qref -D -e
yann@1575
   706
  *edit patch description, serving as commit message*
yann@1575
   707
  hg qnew -D -U -e my_second_patch
yann@1575
   708
  *edit patch description*
yann@1575
   709
  *hack* *hack* *check* *fails* *hack* *hack* *check* *works*
yann@1575
   710
  hg qref -D -e
yann@1575
   711
  *edit patch description, serving as commit message*
yann@1575
   712
  hg email --outgoing --intro   \
yann@1575
   713
           --from '"Your Full NAME" <your.email (at) your.domain>'   \
yann@1575
   714
           --to '"Yann E. MORIN" <yann.morin.1998 (at) anciens.enib.fr>'    \
yann@1575
   715
           --cc 'crossgcc (at) sourceware.org'
yann@1575
   716
  *edit introductory message*
yann@1575
   717
  *wait for feedback*
yann@1575
   718
  *re-send if no answer for a few days*
yann@1575
   719
yann@1575
   720
Note: replace '(at)' above with a plain '@'.
yann@1575
   721
yann@1575
   722
yann@1
   723
_____________
yann@1
   724
            /
yann@1
   725
Internals  /
yann@1
   726
__________/
yann@1
   727
yann@92
   728
Internally, crosstool-NG is script-based. To ease usage, the frontend is
yann@92
   729
Makefile-based.
yann@92
   730
yann@92
   731
Makefile front-end |
yann@476
   732
-------------------+
yann@92
   733
yann@203
   734
The entry point to crosstool-NG is the Makefile script "ct-ng". Calling this
yann@203
   735
script with an action will act exactly as if the Makefile was in the current
yann@203
   736
working directory and make was called with the action as rule. Thus:
yann@203
   737
  ct-ng menuconfig
yann@294
   738
yann@203
   739
is equivalent to having the Makefile in CWD, and calling:
yann@203
   740
  make menuconfig
yann@203
   741
yann@203
   742
Having ct-ng as it is avoids copying the Makefile everywhere, and acts as a
yann@203
   743
traditional command.
yann@203
   744
yann@203
   745
ct-ng loads sub- Makefiles from the library directory $(CT_LIB_DIR), as set up
yann@203
   746
at configuration time with ./configure.
yann@203
   747
yann@437
   748
ct-ng also searches for config files, sub-tools, samples, scripts and patches in
yann@203
   749
that library directory.
yann@92
   750
yann@294
   751
Because of a stupid make behavior/bug I was unable to track down, implicit make
yann@294
   752
rules are disabled: installing with --local would triger those rules, and mconf
yann@294
   753
was unbuildable.
yann@294
   754
yann@182
   755
Kconfig parser |
yann@476
   756
---------------+
yann@92
   757
yann@965
   758
The kconfig language is a hacked version, vampirised from the Linux kernel
yann@965
   759
(http://www.kernel.org/), and (heavily) adapted to my needs.
yann@92
   760
yann@1040
   761
The list of the most notable changes (at least the ones I remember) follows:
yann@1040
   762
- the CONFIG_ prefix has been replaced with CT_
yann@1040
   763
- a leading | in prompts is skipped, and subsequent leading spaces are not
yann@1843
   764
  trimmed; otherwise leading spaces are silently trimmed
yann@1843
   765
- removed the warning about undefined environment variable
yann@1040
   766
yann@203
   767
The kconfig parsers (conf and mconf) are not installed pre-built, but as
yann@203
   768
source files. Thus you can have the directory where crosstool-NG is installed,
yann@203
   769
exported (via NFS or whatever) and have clients with different architectures
yann@203
   770
use the same crosstool-NG installation, and most notably, the same set of
yann@203
   771
patches.
yann@203
   772
yann@381
   773
Architecture-specific |
yann@476
   774
----------------------+
yann@381
   775
yann@628
   776
Note: this chapter is not really well written, and might thus be a little bit
yann@628
   777
complex to understand. To get a better grasp of what an architecture is, the
yann@628
   778
reader is kindly encouraged to look at the "arch/" sub-directory, and to the
yann@628
   779
existing architectures to see how things are laid out.
yann@628
   780
yann@381
   781
An architecture is defined by:
yann@381
   782
yann@381
   783
 - a human-readable name, in lower case letters, with numbers as appropriate.
yann@628
   784
   The underscore is allowed; space and special characters are not.
yann@628
   785
     Eg.: arm, x86_64
yann@903
   786
 - a file in "config/arch/", named after the architecture's name, and suffixed
yann@903
   787
   with ".in".
yann@903
   788
     Eg.: config/arch/arm.in
yann@903
   789
 - a file in "scripts/build/arch/", named after the architecture's name, and
yann@903
   790
   suffixed with ".sh".
yann@903
   791
     Eg.: scripts/build/arch/arm.sh
yann@628
   792
yann@903
   793
The architecture's ".in" file API:
yann@628
   794
 > the config option "ARCH_%arch%" (where %arch% is to be replaced with the
yann@628
   795
   actual architecture name).
yann@628
   796
   That config option must have *neither* a type, *nor* a prompt! Also, it can
yann@628
   797
   *not* depend on any other config option (EXPERIMENTAL is managed as above).
yann@628
   798
     Eg.:
yann@628
   799
       config ARCH_arm
yann@630
   800
   + mandatory:
yann@702
   801
       defines a (terse) help entry for this architecture:
yann@630
   802
       Eg.:
yann@630
   803
         config ARCH_arm
yann@630
   804
           help
yann@630
   805
             The ARM architecture.
yann@628
   806
   + optional:
yann@628
   807
       selects adequate associated config options.
yann@1038
   808
       Note: 64-bit architectures *shall* select ARCH_64
yann@628
   809
       Eg.:
yann@628
   810
         config ARCH_arm
yann@628
   811
           select ARCH_SUPPORTS_BOTH_ENDIAN
yann@628
   812
           select ARCH_DEFAULT_LE
yann@630
   813
           help
yann@630
   814
             The ARM architecture.
yann@1038
   815
       Eg.:
yann@1038
   816
         config ARCH_x86_64
yann@1038
   817
            select ARCH_64
yann@1038
   818
            help
yann@1038
   819
              The x86_64 architecture.
yann@628
   820
yann@628
   821
 > other target-specific options, at your discretion. Note however that to
yann@628
   822
   avoid name-clashing, such options shall be prefixed with "ARCH_%arch%",
yann@628
   823
   where %arch% is again replaced by the actual architecture name.
yann@628
   824
   (Note: due to historical reasons, and lack of time to clean up the code,
yann@628
   825
    I may have left some config options that do not completely conform to
yann@628
   826
    this, as the architecture name was written all upper case. However, the
yann@628
   827
    prefix is unique among architectures, and does not cause harm).
yann@381
   828
yann@903
   829
The architecture's ".sh" file API:
yann@965
   830
 > the function "CT_DoArchTupleValues"
yann@381
   831
   + parameters: none
yann@381
   832
   + environment:
yann@901
   833
     - all variables from the ".config" file,
yann@901
   834
     - the two variables "target_endian_eb" and "target_endian_el" which are
yann@901
   835
       the endianness suffixes
yann@381
   836
   + return value: 0 upon success, !0 upon failure
yann@381
   837
   + provides:
yann@391
   838
     - mandatory
yann@383
   839
     - the environment variable CT_TARGET_ARCH
yann@389
   840
     - contains:
yann@389
   841
       the architecture part of the target tuple.
yann@389
   842
       Eg.: "armeb" for big endian ARM
yann@389
   843
            "i386" for an i386
yann@389
   844
   + provides:
yann@391
   845
     - optional
yann@389
   846
     - the environment variable CT_TARGET_SYS
yann@456
   847
     - contains:
yann@383
   848
       the sytem part of the target tuple.
yann@383
   849
       Eg.: "gnu" for glibc on most architectures
yann@383
   850
            "gnueabi" for glibc on an ARM EABI
yann@383
   851
     - defaults to:
yann@383
   852
       - for glibc-based toolchain: "gnu"
yann@383
   853
       - for uClibc-based toolchain: "uclibc"
yann@383
   854
   + provides:
yann@383
   855
     - optional
yann@767
   856
     - the environment variables to configure the cross-gcc (defaults)
yann@767
   857
       - CT_ARCH_WITH_ARCH    : the gcc ./configure switch to select architecture level         ( "--with-arch=${CT_ARCH_ARCH}"   )
yann@767
   858
       - CT_ARCH_WITH_ABI     : the gcc ./configure switch to select ABI level                  ( "--with-abi=${CT_ARCH_ABI}"     )
yann@767
   859
       - CT_ARCH_WITH_CPU     : the gcc ./configure switch to select CPU instruction set        ( "--with-cpu=${CT_ARCH_CPU}"     )
yann@767
   860
       - CT_ARCH_WITH_TUNE    : the gcc ./configure switch to select scheduling                 ( "--with-tune=${CT_ARCH_TUNE}"   )
yann@767
   861
       - CT_ARCH_WITH_FPU     : the gcc ./configure switch to select FPU type                   ( "--with-fpu=${CT_ARCH_FPU}"     )
yann@767
   862
       - CT_ARCH_WITH_FLOAT   : the gcc ./configure switch to select floating point arithmetics ( "--with-float=soft" or /empty/  )
yann@391
   863
   + provides:
yann@391
   864
     - optional
yann@767
   865
     - the environment variables to pass to the cross-gcc to build target binaries (defaults)
yann@391
   866
       - CT_ARCH_ARCH_CFLAG   : the gcc switch to select architecture level                     ( "-march=${CT_ARCH_ARCH}"            )
yann@456
   867
       - CT_ARCH_ABI_CFLAG    : the gcc switch to select ABI level                              ( "-mabi=${CT_ARCH_ABI}"              )
yann@391
   868
       - CT_ARCH_CPU_CFLAG    : the gcc switch to select CPU instruction set                    ( "-mcpu=${CT_ARCH_CPU}"              )
yann@391
   869
       - CT_ARCH_TUNE_CFLAG   : the gcc switch to select scheduling                             ( "-mtune=${CT_ARCH_TUNE}"            )
yann@391
   870
       - CT_ARCH_FPU_CFLAG    : the gcc switch to select FPU type                               ( "-mfpu=${CT_ARCH_FPU}"              )
yann@391
   871
       - CT_ARCH_FLOAT_CFLAG  : the gcc switch to choose floating point arithmetics             ( "-msoft-float" or /empty/           )
yann@391
   872
       - CT_ARCH_ENDIAN_CFLAG : the gcc switch to choose big or little endian                   ( "-mbig-endian" or "-mlittle-endian" )
yann@391
   873
     - default to:
yann@391
   874
       see above.
yann@767
   875
   + provides:
yann@767
   876
     - optional
yann@767
   877
     - the environement variables to configure the core and final compiler, specific to this architecture:
yann@767
   878
       - CT_ARCH_CC_CORE_EXTRA_CONFIG   : additional, architecture specific core gcc ./configure flags
yann@767
   879
       - CT_ARCH_CC_EXTRA_CONFIG        : additional, architecture specific final gcc ./configure flags
yann@767
   880
     - default to:
yann@767
   881
       - all empty
yann@767
   882
   + provides:
yann@767
   883
     - optional
yann@767
   884
     - the architecture-specific CFLAGS and LDFLAGS:
yann@767
   885
       - CT_ARCH_TARGET_CLFAGS
yann@767
   886
       - CT_ARCH_TARGET_LDFLAGS
yann@767
   887
     - default to:
yann@767
   888
       - all empty
yann@628
   889
yann@903
   890
You can have a look at "config/arch/arm.in" and "scripts/build/arch/arm.sh" for
yann@903
   891
a quite complete example of what an actual architecture description looks like.
yann@901
   892
yann@890
   893
Kernel specific |
yann@890
   894
----------------+
yann@890
   895
yann@890
   896
A kernel is defined by:
yann@890
   897
yann@890
   898
 - a human-readable name, in lower case letters, with numbers as appropriate.
yann@890
   899
   The underscore is allowed; space and special characters are not (although
yann@890
   900
   they are internally replaced with underscores.
yann@890
   901
     Eg.: linux, bare-metal
yann@890
   902
 - a file in "config/kernel/", named after the kernel name, and suffixed with
yann@890
   903
   ".in".
yann@890
   904
     Eg.: config/kernel/linux.in, config/kernel/bare-metal.in
yann@901
   905
 - a file in "scripts/build/kernel/", named after the kernel name, and suffixed
yann@901
   906
   with ".sh".
yann@901
   907
     Eg.: scripts/build/kernel/linux.sh, scripts/build/kernel/bare-metal.sh
yann@890
   908
yann@890
   909
The kernel's ".in" file must contain:
yann@890
   910
 > an optional lines containing exactly "# EXPERIMENTAL", starting on the
yann@890
   911
   first column, and without any following space or other character.
yann@890
   912
   If this line is present, then this kernel is considered EXPERIMENTAL,
yann@890
   913
   and correct dependency on EXPERIMENTAL will be set.
yann@901
   914
yann@890
   915
 > the config option "KERNEL_%kernel_name%" (where %kernel_name% is to be
yann@890
   916
   replaced with the actual kernel name, with all special characters and
yann@890
   917
   spaces replaced by underscores).
yann@890
   918
   That config option must have *neither* a type, *nor* a prompt! Also, it can
yann@890
   919
   *not* depends on EXPERIMENTAL.
yann@890
   920
     Eg.: KERNEL_linux, KERNEL_bare_metal
yann@890
   921
   + mandatory:
yann@890
   922
       defines a (terse) help entry for this kernel.
yann@890
   923
       Eg.:
yann@890
   924
         config KERNEL_bare_metal
yann@890
   925
           help
yann@890
   926
             Build a compiler for use without any kernel.
yann@890
   927
   + optional:
yann@890
   928
       selects adequate associated config options.
yann@890
   929
       Eg.:
yann@890
   930
         config KERNEL_bare_metal
yann@890
   931
           select BARE_METAL
yann@890
   932
           help
yann@890
   933
             Build a compiler for use without any kernel.
yann@890
   934
yann@890
   935
 > other kernel specific options, at your discretion. Note however that, to
yann@890
   936
   avoid name-clashing, such options should be prefixed with
yann@890
   937
   "KERNEL_%kernel_name%", where %kernel_name% is again tp be replaced with
yann@890
   938
   the actual kernel name.
yann@890
   939
   (Note: due to historical reasons, and lack of time to clean up the code,
yann@890
   940
    I may have left some config options that do not completely conform to
yann@890
   941
    this, as the kernel name was written all upper case. However, the prefix
yann@890
   942
    is unique among kernels, and does not cause harm).
yann@890
   943
yann@901
   944
The kernel's ".sh" file API:
yann@901
   945
 > is a bash script fragment
yann@901
   946
yann@965
   947
 > defines the function CT_DoKernelTupleValues
yann@965
   948
   + see the architecture's CT_DoArchTupleValues, except for:
yann@965
   949
   + set the environment variable CT_TARGET_KERNEL, the kernel part of the
yann@965
   950
     target tuple
yann@965
   951
   + return value: ignored
yann@965
   952
yann@901
   953
 > defines the function "do_kernel_get":
yann@901
   954
   + parameters: none
yann@901
   955
   + environment:
yann@901
   956
      - all variables from the ".config" file.
yann@901
   957
   + return value: 0 for success, !0 for failure.
yann@901
   958
   + behavior: download the kernel's sources, and store the tarball into
yann@901
   959
     "${CT_TARBALLS_DIR}". To this end, a functions is available, that
yann@901
   960
     abstracts downloading tarballs:
yann@901
   961
     - CT_DoGet <tarball_base_name> <URL1 [URL...]>
yann@901
   962
       Eg.: CT_DoGet linux-2.6.26.5 ftp://ftp.kernel.org/pub/linux/kernel/v2.6
yann@901
   963
     Note: retrieving sources from svn, cvs, git and the likes is not supported
yann@901
   964
     by CT_DoGet. You'll have to do this by hand, as it is done for eglibc in
yann@901
   965
     "scripts/build/libc/eglibc.sh"
yann@901
   966
yann@901
   967
 > defines the function "do_kernel_extract":
yann@901
   968
   + parameters: none
yann@901
   969
   + environment:
yann@901
   970
      - all variables from the ".config" file,
yann@901
   971
   + return value: 0 for success, !0 for failure.
yann@901
   972
   + behavior: extract the kernel's tarball into "${CT_SRC_DIR}", and apply
yann@901
   973
     required patches. To this end, a function is available, that abstracts
yann@901
   974
     extracting tarballs:
yann@901
   975
     - CT_ExtractAndPatch <tarball_base_name>
yann@901
   976
       Eg.: CT_ExtractAndPatch linux-2.6.26.5
yann@901
   977
yann@901
   978
 > defines the function "do_kernel_headers":
yann@901
   979
   + parameters: none
yann@901
   980
   + environment:
yann@901
   981
      - all variables from the ".config" file,
yann@901
   982
   + return value: 0 for success, !0 for failure.
yann@901
   983
   + behavior: install the kernel headers (if any) in "${CT_SYSROOT_DIR}/usr/include"
yann@901
   984
yann@901
   985
 > defines any kernel-specific helper functions
yann@901
   986
   These functions, if any, must be prefixed with "do_kernel_%CT_KERNEL%_",
yann@901
   987
   where '%CT_KERNEL%' is to be replaced with the actual kernel name, to avoid
yann@901
   988
   any name-clashing.
yann@901
   989
yann@901
   990
You can have a look at "config/kernel/linux.in" and "scripts/build/kernel/linux.sh"
yann@903
   991
as an example of what a complex kernel description looks like.
yann@901
   992
yann@620
   993
Adding a new version of a component |
yann@476
   994
------------------------------------+
yann@476
   995
yann@476
   996
When a new component, such as the Linux kernel, gcc or any other is released,
yann@476
   997
adding the new version to crosstool-NG is quite easy. There is a script that
yann@476
   998
will do all that for you:
yann@1095
   999
  scripts/addToolVersion.sh
yann@476
  1000
yann@476
  1001
Run it with no option to get some help.
yann@381
  1002
yann@203
  1003
Build scripts |
yann@476
  1004
--------------+
yann@203
  1005
yann@203
  1006
To Be Written later...