File.........: 6 - Toolchain types.txt Copyright....: (C) 2010 Yann E. MORIN License......: Creative Commons Attribution Share Alike (CC-by-sa), v2.5 Toolchain types / ________________/ There are four kinds of toolchains you could encounter. First off, you must understand the following: when it comes to compilers there are up to four machines involved: 1) the machine configuring the toolchain components: the config machine 2) the machine building the toolchain components: the build machine 3) the machine running the toolchain: the host machine 4) the machine the toolchain is generating code for: the target machine We can most of the time assume that the config machine and the build machine are the same. Most of the time, this will be true. The only time it isn't is if you're using distributed compilation (such as distcc). Let's forget this for the sake of simplicity. So we're left with three machines: - build - host - target Any toolchain will involve those three machines. You can be as pretty sure of this as "2 and 2 are 4". Here is how they come into play: 1) build == host == target This is a plain native toolchain, targeting the exact same machine as the one it is built on, and running again on this exact same machine. You have to build such a toolchain when you want to use an updated component, such as a newer gcc for example. crosstool-NG calls it "native". 2) build == host != target This is a classic cross-toolchain, which is expected to be run on the same machine it is compiled on, and generate code to run on a second machine, the target. crosstool-NG calls it "cross". 3) build != host == target Such a toolchain is also a native toolchain, as it targets the same machine as it runs on. But it is build on another machine. You want such a toolchain when porting to a new architecture, or if the build machine is much faster than the host machine. crosstool-NG calls it "cross-native". 4) build != host != target This one is called a canadian-toolchain (*), and is tricky. The three machines in play are different. You might want such a toolchain if you have a fast build machine, but the users will use it on another machine, and will produce code to run on a third machine. crosstool-NG calls it "canadian". crosstool-NG can build all these kinds of toolchains (or is aiming at it, anyway!) (*) The term Canadian Cross came about because at the time that these issues were all being hashed out, Canada had three national political parties. http://en.wikipedia.org/wiki/Cross_compiler