digitalmars.D - Compilation strategy
- Russel Winder (14/14) Dec 15 2012 A quick straw poll. Do people prefer to have all sources compiled in a
- Adam D. Ruppe (3/5) Dec 15 2012 I prefer the single call.
- Andrei Alexandrescu (4/7) Dec 15 2012 In phobos we use a single call for building the library. Then (at least
- David Nadlinger (7/9) Dec 15 2012 This highlights the problem with giving a single answer to the
- Peter Alexander (4/9) Dec 15 2012 Single compiler call is easier for small projects, but I worry
- Jakob Bornecrantz (9/18) Dec 15 2012 As evident by Phobos and my own project[1], for larger projects
- Peter Alexander (4/12) Dec 15 2012 Phobos is only around 200kloc. I'm worrying about the really
- RenatoUtsch (9/18) Dec 15 2012 Yes, I'm writing a build system for D (that will be pretty damn
- H. S. Teoh (22/39) Dec 15 2012 [...]
- RenatoUtsch (16/73) Dec 15 2012 Well, the idea is good. Small projects usually don't have much
- H. S. Teoh (11/31) Dec 15 2012 [...]
- RenatoUtsch (4/50) Dec 15 2012 Well, so compiling by packages seem to be the best approach. When
- Ellery Newcomer (4/12) Dec 16 2012 I always thought it would be cool if my build tool could automatically
- jerro (6/20) Dec 15 2012 I took a look at your github project, there isn't any code yet,
- RenatoUtsch (4/26) Dec 15 2012 I expect to release a first alpha version in about 15~30 days,
- Walter Bright (3/8) Dec 15 2012 The compiler does a little multithreading, but not enough to make a diff...
- Walter Bright (3/6) Dec 15 2012 Both are needed, and are suitable for different purposes. It's like aski...
- Paulo Pinto (4/8) Dec 16 2012 I prefer to compile by package, like in any module supporting language.
- deadalnix (9/15) Dec 16 2012 I currently use full compilation. I have no choice because the
A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.=20 Thanks. --=20 Russel. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.winder ekiga.n= et 41 Buckmaster Road m: +44 7770 465 077 xmpp: russel winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winder
Dec 15 2012
On Saturday, 15 December 2012 at 16:55:39 UTC, Russel Winder wrote:Do people prefer to have all sources compiled in a single compiler callI prefer the single call.
Dec 15 2012
On 12/15/12 11:55 AM, Russel Winder wrote:A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.In phobos we use a single call for building the library. Then (at least on Posix) we use multiple calls for running unittests. Andrei
Dec 15 2012
On Saturday, 15 December 2012 at 17:02:08 UTC, Andrei Alexandrescu wrote:In phobos we use a single call for building the library. Then (at least on Posix) we use multiple calls for running unittests.This highlights the problem with giving a single answer to the question: Building a large project in one call is often impractical. It only works for Phobos library builds because many templates don't even get instantiated. David
Dec 15 2012
On Saturday, 15 December 2012 at 16:55:39 UTC, Russel Winder wrote:A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.Single compiler call is easier for small projects, but I worry about compile times for larger projects...
Dec 15 2012
On Saturday, 15 December 2012 at 17:05:59 UTC, Peter Alexander wrote:On Saturday, 15 December 2012 at 16:55:39 UTC, Russel Winder wrote:As evident by Phobos and my own project[1], for larger projects multiple concurrent calls is the only way to go. Rebuilding everything does take a bit, but a bit of thought behind the layout of the project and things work much faster when working on specific areas. Cheers, Jakob. [1] http://github.com/Charged/MinersA quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.Single compiler call is easier for small projects, but I worry about compile times for larger projects...
Dec 15 2012
On Saturday, 15 December 2012 at 17:27:38 UTC, Jakob Bornecrantz wrote:On Saturday, 15 December 2012 at 17:05:59 UTC, Peter AlexanderPhobos is only around 200kloc. I'm worrying about the really large projects (multi-million lines of code).Single compiler call is easier for small projects, but I worry about compile times for larger projects...As evident by Phobos and my own project[1], for larger projects multiple concurrent calls is the only way to go. Rebuilding everything does take a bit, but a bit of thought behind the layout of the project and things work much faster when working on specific areas.
Dec 15 2012
On Saturday, 15 December 2012 at 17:05:59 UTC, Peter Alexander wrote:On Saturday, 15 December 2012 at 16:55:39 UTC, Russel Winder wrote:Yes, I'm writing a build system for D (that will be pretty damn good, I think, it has some interesting new concepts), and compiling each source separately to an object, and then linking everything will allow easily to make the build parallel, dividing the sources to compile in various threads. Or the compiler already does that if I pass all source files in one call? -- Renato UtschA quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.Single compiler call is easier for small projects, but I worry about compile times for larger projects...
Dec 15 2012
On Sat, Dec 15, 2012 at 06:31:17PM +0100, RenatoUtsch wrote:On Saturday, 15 December 2012 at 17:05:59 UTC, Peter Alexander wrote:[...] I find that the current front-end (common to dmd, gdc, ldc) tends to work better when passed multiple source files at once. It tends to be faster, presumably because it only has to parse commonly-imported files once, and also produces smaller object/executable sizes -- maybe due to fewer duplicated template instantiations? I'm not sure of the exact reasons, but this behaviour appears consistent throughout dmd and gdc, and I presume also ldc (I didn't test that). So based on this, I'd lean toward compiling multiple files at once. However, in very large project, clearly this won't work very well. If it takes half an hour to build the entire system, it makes the code - compile - test cycle very slow, which reduces programmer productivity. So perhaps one possible middle ground would be to link packages separately, but compile all the sources within a single package at once. Presumably, if the project is properly organized, recompiling a single package won't take too long, and has the perk of optimizing for size within packages. This will probably also map to SCons easily, since SCons builds per-directory. T -- They pretend to pay us, and we pretend to work. -- Russian sayingOn Saturday, 15 December 2012 at 16:55:39 UTC, Russel Winder wrote:Yes, I'm writing a build system for D (that will be pretty damn good, I think, it has some interesting new concepts), and compiling each source separately to an object, and then linking everything will allow easily to make the build parallel, dividing the sources to compile in various threads. Or the compiler already does that if I pass all source files in one call?A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.Single compiler call is easier for small projects, but I worry about compile times for larger projects...
Dec 15 2012
On Saturday, 15 December 2012 at 18:00:58 UTC, H. S. Teoh wrote:On Sat, Dec 15, 2012 at 06:31:17PM +0100, RenatoUtsch wrote:Yeah, I did read about this somewhee.On Saturday, 15 December 2012 at 17:05:59 UTC, Peter Alexander wrote:[...] I find that the current front-end (common to dmd, gdc, ldc) tends to work better when passed multiple source files at once. It tends to be faster, presumably because it only has to parse commonly-imported files once, and also produces smaller object/executable sizes -- maybe due to fewer duplicated template instantiations? I'm not sure of the exact reasons, but this behaviour appears consistent throughout dmd and gdc, and I presume also ldc (I didn't test that). So based on this, I'd lean toward compiling multiple files at once.On Saturday, 15 December 2012 at 16:55:39 UTC, Russel Winder wrote:Yes, I'm writing a build system for D (that will be pretty damn good, I think, it has some interesting new concepts), and compiling each source separately to an object, and then linking everything will allow easily to make the build parallel, dividing the sources to compile in various threads. Or the compiler already does that if I pass all source files in one call?A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.Single compiler call is easier for small projects, but I worry about compile times for larger projects...However, in very large project, clearly this won't work very well. If it takes half an hour to build the entire system, it makes the code - compile - test cycle very slow, which reduces programmer productivity. So perhaps one possible middle ground would be to link packages separately, but compile all the sources within a single package at once. Presumably, if the project is properly organized, recompiling a single package won't take too long, and has the perk of optimizing for size within packages. This will probably also map to SCons easily, since SCons builds per-directory. TWell, the idea is good. Small projects usually don't have much packages, so there will be just a few compiler calls. And compiling files concurrently will only have a meaningful efect if the project is large, and a large project will have a lot of packages. Maybe adding an option to choose between compiling all sources at once, per package, or per source. For example, in development and debug builds the compilation is per file or package, but in release builds all sources are compiled at once, or various packages at once. This way release builds will take advantage of this behavior that the frontend has, but developers won't have productivity issues. And, of couse, the behaviour will not be fixed, the devs that are using the build system will choose that.
Dec 15 2012
On Sat, Dec 15, 2012 at 07:30:52PM +0100, RenatoUtsch wrote:On Saturday, 15 December 2012 at 18:00:58 UTC, H. S. Teoh wrote:[...][...]So perhaps one possible middle ground would be to link packages separately, but compile all the sources within a single package at once. Presumably, if the project is properly organized, recompiling a single package won't take too long, and has the perk of optimizing for size within packages. This will probably also map to SCons easily, since SCons builds per-directory.Well, the idea is good. Small projects usually don't have much packages, so there will be just a few compiler calls. And compiling files concurrently will only have a meaningful efect if the project is large, and a large project will have a lot of packages.Yes, that's the idea behind it.Maybe adding an option to choose between compiling all sources at once, per package, or per source. For example, in development and debug builds the compilation is per file or package, but in release builds all sources are compiled at once, or various packages at once. This way release builds will take advantage of this behavior that the frontend has, but developers won't have productivity issues. And, of couse, the behaviour will not be fixed, the devs that are using the build system will choose that.I forgot to mention also, that passing too many source files to the compiler may sometimes cause memory consumption issues, as the compiler has to hold everything in memory. This may not be practical for very large project, where you can't fit everything into RAM. T -- Stop staring at me like that! You'll offend... no, you'll hurt your eyes!
Dec 15 2012
On Saturday, 15 December 2012 at 18:44:35 UTC, H. S. Teoh wrote:On Sat, Dec 15, 2012 at 07:30:52PM +0100, RenatoUtsch wrote:Well, so compiling by packages seem to be the best approach. When I return home I will do some tests to see what I can do. -- RenatoOn Saturday, 15 December 2012 at 18:00:58 UTC, H. S. Teoh wrote:[...][...]So perhaps one possible middle ground would be to link packages separately, but compile all the sources within a single package at once. Presumably, if the project is properly organized, recompiling a single package won't take too long, and has the perk of optimizing for size within packages. This will probably also map to SCons easily, since SCons builds per-directory.Well, the idea is good. Small projects usually don't have much packages, so there will be just a few compiler calls. And compiling files concurrently will only have a meaningful efect if the project is large, and a large project will have a lot of packages.Yes, that's the idea behind it.Maybe adding an option to choose between compiling all sources at once, per package, or per source. For example, in development and debug builds the compilation is per file or package, but in release builds all sources are compiled at once, or various packages at once. This way release builds will take advantage of this behavior that the frontend has, but developers won't have productivity issues. And, of couse, the behaviour will not be fixed, the devs that are using the build system will choose that.I forgot to mention also, that passing too many source files to the compiler may sometimes cause memory consumption issues, as the compiler has to hold everything in memory. This may not be practical for very large project, where you can't fit everything into RAM. T
Dec 15 2012
On 12/15/2012 10:30 AM, RenatoUtsch wrote:Well, the idea is good. Small projects usually don't have much packages, so there will be just a few compiler calls. And compiling files concurrently will only have a meaningful efect if the project is large, and a large project will have a lot of packages. Maybe adding an option to choose between compiling all sources at once, per package, or per source. For example, in development and debug builds the compilation is per file or package, but in release builds all sources are compiled at once, or various packages at once.I always thought it would be cool if my build tool could automatically determine the dependency graph of my d code and use it to intelligently break my project into small enough semi-independent chunks to compile.
Dec 16 2012
On Saturday, 15 December 2012 at 17:31:19 UTC, RenatoUtsch wrote:On Saturday, 15 December 2012 at 17:05:59 UTC, Peter Alexander wrote:I took a look at your github project, there isn't any code yet, but I like the concept. I was actually planing to do something similar, but since you are already doing it, I think my time would be better spent contributing to your project. Will there be some publicly available code in the near future?On Saturday, 15 December 2012 at 16:55:39 UTC, Russel Winder wrote:Yes, I'm writing a build system for D (that will be pretty damn good, I think, it has some interesting new concepts)A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.Single compiler call is easier for small projects, but I worry about compile times for larger projects...
Dec 15 2012
On Saturday, 15 December 2012 at 18:24:50 UTC, jerro wrote:On Saturday, 15 December 2012 at 17:31:19 UTC, RenatoUtsch wrote:I expect to release a first alpha version in about 15~30 days, maybe less, it depends on how much time I will have on the rest of this month.On Saturday, 15 December 2012 at 17:05:59 UTC, Peter Alexander wrote:I took a look at your github project, there isn't any code yet, but I like the concept. I was actually planing to do something similar, but since you are already doing it, I think my time would be better spent contributing to your project. Will there be some publicly available code in the near future?On Saturday, 15 December 2012 at 16:55:39 UTC, Russel Winder wrote:Yes, I'm writing a build system for D (that will be pretty damn good, I think, it has some interesting new concepts)A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.Single compiler call is easier for small projects, but I worry about compile times for larger projects...
Dec 15 2012
On 12/15/2012 9:31 AM, RenatoUtsch wrote:Yes, I'm writing a build system for D (that will be pretty damn good, I think, it has some interesting new concepts), and compiling each source separately to an object, and then linking everything will allow easily to make the build parallel, dividing the sources to compile in various threads. Or the compiler already does that if I pass all source files in one call?The compiler does a little multithreading, but not enough to make a difference. I've certainly thought about various schemes to parallelize it, though.
Dec 15 2012
On 12/15/2012 8:55 AM, Russel Winder wrote:A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call.Both are needed, and are suitable for different purposes. It's like asking if you prefer a standard or a philips screwdriver.
Dec 15 2012
Am 15.12.2012 17:55, schrieb Russel Winder:A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call. Thanks.I prefer to compile by package, like in any module supporting language. -- Paulo
Dec 16 2012
On Saturday, 15 December 2012 at 16:55:39 UTC, Russel Winder wrote:A quick straw poll. Do people prefer to have all sources compiled in a single compiler call, or (more like C++) separate compilation of each object followed by a link call. Thanks.I currently use full compilation. I have no choice because the compiler isn't emitting all symbols I need and get linking errors when doing separate compilation. Compiling my code require more than 2.5Gb of RAM now and is quite slow. To avoid multiple instantiation of the same template by the compiler, I guess the best option to me would be to compile on a by package basis.
Dec 16 2012