[ 
https://jira.codehaus.org/browse/MOJO-1704?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Daniel Franzen closed MOJO-1704.
--------------------------------

    Resolution: Incomplete

I failed to submit the issue to the correct component :(

> C/C++ plugin suite
> ------------------
>
>                 Key: MOJO-1704
>                 URL: https://jira.codehaus.org/browse/MOJO-1704
>             Project: Mojo
>          Issue Type: New Feature
>            Reporter: Daniel Franzen
>         Attachments: cpp-plugins.zip
>
>
> This is a suite of three plugins currently used for C/C++ projects at 
> Ericsson, as previously described in [email protected].
> Rationale
> If I were you I'd be asking "Isn't there already a plugin for that? Why 
> another one?". I hope that question is answered in detail below, but the long 
> and the short of it is we felt that the need for better performance, less 
> verbose configuration and built-in support for multiple targets - both common 
> and exotic ones - motivated an attempt at rolling our own.
>  
> - Speed
> What triggered the development of these plugins earlier this year were the 
> problems we were having with existing plugins for native code. Perhaps the 
> fault was with us not understanding how to use them properly, but it 
> eventually got to a point where people started writing alternative 
> Boost.Build scripts for building and unit testing. Maven was also generally 
> perceived as slow and unable to compete with "real C/C++ tools". Thus the 
> plugins were developed to answer the question: Can we match the speed of 
> Boost.Build, yet bring all the goodness of Maven to C/C++ projects? While 
> build benchmarking is a tricky business, from my experience with the projects 
> where we have deployed the plugins, I would say the answer is yes. How the 
> project is structured plays a role, though: sometimes Boost.Build is faster, 
> sometimes the Maven plugins are faster.
>  
> How it works
> - Three plugins
> Currently the suite consists of cpp-compiler-maven-plugin (the workhorse), 
> cpp-tester-maven-plugin (runs any executables produced by the compiler) and 
> car-maven-plugin (zips the output into a ".car" artifact). 
> cpp-compiler-maven-plugin defines a custom lifecycle for packaging type 
> "car", invoking itself and the other plugins in phases compile, test-compile, 
> test and package.
>  
> - Multi-target
> Which targets to build for is controlled by putting e.g. 
> <targetEnvironments>linux_32,linux_64,win_32</targetEnvironments> in the 
> plugin configuration. Compilation and linking flags can then be specified per 
> target and/or for all targets.
>  
> - Bundles
> We'd like to support any combination of host to target environments, and any 
> oddities of the target environment shouldn't bleed through to the POM. To 
> this end we introduced "bundles", which are essentially plugins to the 
> plugin. When the plugin needs to build for a given target it asks the bundles 
> on its classpath: Given the current host environment, can you build for this 
> target? If one and only one bundle answers yes it will get the job. This 
> allows for clean configuration of multiple exotic, proprietary, in-house 
> targets with custom toolchains along with standard Linux x86/Windows targets. 
> Included in the donation is only our Linux 32/64 bundle using GCC.
>  
> - Multi-threading
> The plugin spawns as many compiler threads as there are logical cores, each 
> thread polling a common pool of objects to build. The pool is populated by 
> the main thread, which determines what needs to be built and what's up to 
> date. That is, compilation starts as soon as the first object has been put up 
> for building. To reduce overhead the compiler is fed batches of files, but to 
> avoid single threads overshooting the others dynamic batch sizes are used. 
> Essentially each thread only picks up as many objects to build as it's 
> confident to complete before the other threads have finished off the rest of 
> the pool.
>  
> - Incremental builds
> The plugin uses a mechanism determined by the responsible bundle (our Linux 
> bundle uses the GCC pre-processor) to decide whether an object is up to date 
> or not. Any up-to-date include dependency information left over from previous 
> builds is reused to minize the incremental build time.
>  
> - Dependency extraction
> The .car artifacts are zips of static libraries and/or headers for each 
> supported target. As dependencies are needed during the project lifecycle 
> they are extracted from the local repository into the target directory, but 
> only the parts needed are extracted (e.g. you don't need to extract targets 
> you yourself are not building for). Any existing extracted dependencies are 
> checked before extraction - if the correct non-SNAPSHOT version of a 
> dependency has already been extracted it will be reused. SNAPSHOT 
> dependencies are replaced if a newer version exists in the local repository.
>  
> - Linking
> Linking executables and test executables is done for separate and/or all 
> targets by specifying which code files contain the main function(s). A syntax 
> example of this would be:
> <executables><all>myExec=src/main/cpp/MyExec.cc;myOtherExec=src/main/cpp/MyOtherExec.cc,src/main/cpp/Other*cc</all><linux_64>[]=src/linux/main/cpp/entry-points/*.cc</linux_64></executables>.
>  This would create a myExec and a myOtherExec for every target. In addition, 
> for linux_64 a separate executable will be linked for each file matching the 
> pattern. This is very useful when doing one-executable-per-test style unit 
> tests.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to