buildframework/helium/sf/java/imaker/src/com/nokia/helium/imaker/ant/types/Configuration.java
author wbernard
Fri, 13 Aug 2010 14:59:05 +0300
changeset 628 7c4a911dc066
parent 587 85df38eb4012
permissions -rw-r--r--
helium_11.0.0-e00f171ca185
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     1
/*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     2
* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     3
* All rights reserved.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     4
* This component and the accompanying materials are made available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     6
* which accompanies this distribution, and is available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     8
*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     9
* Initial Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    11
*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    12
* Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    13
*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    14
* Description: 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    15
*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    16
*/
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    17
 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    18
package com.nokia.helium.imaker.ant.types;
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    19
import java.io.File;
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    20
import java.util.ArrayList;
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    21
import java.util.HashSet;
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    22
import java.util.List;
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    23
import java.util.Set;
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    24
import java.util.Vector;
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    25
import java.util.regex.Pattern;
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    26
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    27
import org.apache.tools.ant.BuildException;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    28
import org.apache.tools.ant.DirectoryScanner;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    29
import org.apache.tools.ant.Project;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    30
import org.apache.tools.ant.types.DataType;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    31
import org.apache.tools.ant.types.PatternSet;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    32
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    33
import com.nokia.helium.imaker.IMaker;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    34
import com.nokia.helium.imaker.IMakerException;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    35
import com.nokia.helium.imaker.ant.Command;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    36
import com.nokia.helium.imaker.ant.IMakerCommandSet;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    37
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    38
/**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    39
 * The imakerconfiguration enables the build manager to configure his iMaker
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    40
 * builds based on introspection.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    41
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    42
 * The makefileset element will configure the filtering of the "imaker help-config"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    43
 * command. Then for each of the configuration found the targetset elements will be used
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    44
 * to filter the output from the "imaker -f <i>configuration.mk</i> help-target-*-list"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    45
 * command. Finally a set of command will be generated.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    46
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    47
 * Each command will then be configure using the set of variables defined by the variableset
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    48
 * elements. Only the WORKDIR variable is under the task control to ensure call safety during the
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    49
 * parallelization. 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    50
 * 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    51
 * The usage of the variablegroup will allow you to duplicate the common set of commands 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    52
 * and apply additional variables.    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    53
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    54
 * Example: 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    55
 * <pre>
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    56
 *     &lt;imakerconfiguration regionalVariation="true"&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    57
 *         &lt;makefileset&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    58
 *             &lt;include name="*&#42;/product/*ui.mk"/&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    59
 *         &lt;/makefileset&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    60
 *         &lt;targetset&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    61
 *             &lt;include name="^core$" /&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    62
 *             &lt;include name="langpack_\d+" /&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    63
 *             &lt;include name="^custvariant_.*$" /&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    64
 *             &lt;include name="^udaerase$" /&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    65
 *         &lt;/targetset&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    66
 *         &lt;variableset&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    67
 *             &lt;variable name="USE_FOTI" value="0"/&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    68
 *             &lt;variable name="USE_FOTA" value="1"/&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    69
 *         &lt;/variableset&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    70
 *         &lt;variablegroup&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    71
 *             &lt;variable name="TYPE" value="rnd"/&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    72
 *         &lt;/variablegroup&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    73
 *         &lt;variablegroup&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    74
 *             &lt;variable name="TYPE" value="subcon"/&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    75
 *         &lt;/variablegroup&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    76
 *     &lt;/imakerconfiguration&gt;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    77
 * </pre>
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    78
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    79
 * This configuration might produce the following calls :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    80
 * <pre>
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    81
 * imaker -f /epoc32/rom/config/platform/product/image_conf_product_ui.mk TYPE=rnd USE_FOTI=0 USE_FOTA=1 core
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    82
 * imaker -f /epoc32/rom/config/platform/product/image_conf_product_ui.mk TYPE=subcon USE_FOTI=0 USE_FOTA=1 core
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    83
 * imaker -f /epoc32/rom/config/platform/product/image_conf_product_ui.mk TYPE=rnd USE_FOTI=0 USE_FOTA=1 langpack_01
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    84
 * imaker -f /epoc32/rom/config/platform/product/image_conf_product_ui.mk TYPE=subcon USE_FOTI=0 USE_FOTA=1 langpack_01
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    85
 * </pre>
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    86
 * 
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    87
 * Remember to update helium/sf/java/imaker/imaker.rst if you change this
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    88
 *
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    89
 * @ant.type name="imakerconfiguration" category="imaker"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    90
 */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    91
public class Configuration extends DataType implements IMakerCommandSet {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    92
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    93
    private Vector<PatternSet> makefiles = new Vector<PatternSet>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    94
    private Vector<MakefileSelector> selectors = new Vector<MakefileSelector>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    95
    private Vector<PatternSet> targets = new Vector<PatternSet>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    96
    private Vector<VariableSet> variables = new Vector<VariableSet>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    97
    private Vector<VariableGroup> variablegroups = new Vector<VariableGroup>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    98
    private boolean regionalVariation;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    99
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   100
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   101
     * Create a makefileset element.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   102
     * Makefileset elements are based on regular Ant PatternSet.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   103
     * @return a PatternSet object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   104
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   105
    public PatternSet createMakefileSet() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   106
        PatternSet makefile =  new PatternSet();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   107
        makefiles.add(makefile);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   108
        return makefile;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   109
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   110
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   111
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   112
     * Get the list of makefileset element.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   113
     * @return a vector of PatternSet objects.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   114
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   115
    public Vector<PatternSet> getMakefileSet() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   116
        return makefiles;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   117
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   118
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   119
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   120
     * Add a Makefile selector configuration (e.g: products)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   121
     * @param filter
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   122
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   123
    public void add(MakefileSelector filter) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   124
        selectors.add(filter);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   125
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   126
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   127
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   128
     * Create a targetset element.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   129
     * Targetset elements are based on regular Ant PatternSet.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   130
     * @return a PatternSet object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   131
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   132
    public PatternSet createTargetSet() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   133
        PatternSet target =  new PatternSet();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   134
        targets.add(target);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   135
        return target;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   136
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   137
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   138
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   139
     * Get the list of targetset.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   140
     * @return a vector of PatternSet objects.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   141
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   142
    public Vector<PatternSet> getTargetSet() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   143
        return targets;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   144
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   145
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   146
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   147
     * Create a VariableSet element.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   148
     * @return a VariableSet object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   149
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   150
    public VariableSet createVariableSet() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   151
        VariableSet var =  new VariableSet();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   152
        variables.add(var);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   153
        return var;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   154
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   155
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   156
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   157
     * Create a VariableSet element.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   158
     * @return a VariableSet object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   159
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   160
    public VariableGroup createVariableGroup() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   161
        VariableGroup var =  new VariableGroup();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   162
        variablegroups.add(var);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   163
        return var;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   164
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   165
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   166
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   167
     * Get the list of variableset.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   168
     * @return a vector of VariableSet objects.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   169
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   170
    public Vector<VariableSet> getVariableSet() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   171
        return variables;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   172
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   173
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   174
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   175
     * Enables the sorting of images per region. 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   176
     * @deprecated The usage of this feature is now ignored.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   177
     * @param value the state of the regional variation
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   178
     * @ant.not-required Default is false - The usage of this feature is now ignored.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   179
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   180
    @Deprecated
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   181
    public void setRegionalVariation(boolean value) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   182
        log(this.getDataTypeName() + ": the usage of the regionalVariation attribute is now ignored.", Project.MSG_WARN);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   183
        regionalVariation = value;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   184
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   185
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   186
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   187
     * Get the status of the regional variation enabling.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   188
     * @deprecated The usage of this feature is now ignored.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   189
     * @return returns true is the regional variation should be enabled.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   190
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   191
    public boolean getRegionalVariation() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   192
        return regionalVariation;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   193
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   194
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   195
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   196
     * Check if name is matching any of the pattern under patterns list.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   197
     * @param name the string to match
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   198
     * @param patterns a list of PatternSet
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   199
     * @return Returns true if name matches at least one pattern.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   200
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   201
    protected boolean isIncluded(String name, Vector<PatternSet> patterns) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   202
        for (PatternSet patternSet : patterns) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   203
            if (patternSet.isReference()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   204
                patternSet = (PatternSet) patternSet.getRefid().getReferencedObject();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   205
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   206
            String[] includes = patternSet.getIncludePatterns(getProject());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   207
            if (includes != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   208
                for (String pattern : includes) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   209
                    if (Pattern.matches(pattern, name)) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   210
                        return true;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   211
                    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   212
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   213
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   214
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   215
        return false;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   216
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   217
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   218
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   219
     * Check if name is matching any of the pattern under patterns list.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   220
     * @param name the string to match
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   221
     * @param patterns a list of PatternSet
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   222
     * @return Returns true if name matches at least one pattern.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   223
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   224
    protected boolean isExcluded(String name, Vector<PatternSet> patterns) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   225
        for (PatternSet patternSet : patterns) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   226
            if (patternSet.isReference()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   227
                patternSet = (PatternSet) patternSet.getRefid().getReferencedObject();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   228
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   229
            String[] excludes = patternSet.getExcludePatterns(getProject());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   230
            if (excludes != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   231
                for (String pattern : excludes) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   232
                    if (Pattern.matches(pattern, name)) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   233
                        return true;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   234
                    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   235
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   236
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   237
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   238
        return false;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   239
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   240
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   241
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   242
     * Get a configured matcher.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   243
     * @return a configured makefile matcher.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   244
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   245
    protected Matcher getMakefileMatcher(IMaker imaker) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   246
        Matcher matcher = new Matcher();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   247
        List<String> includes = new ArrayList<String>(); 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   248
        List<String> excludes = new ArrayList<String>(); 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   249
        for (PatternSet patternSet : makefiles) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   250
            if (patternSet.isReference()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   251
                patternSet = (PatternSet) patternSet.getRefid().getReferencedObject();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   252
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   253
            String[] patterns = patternSet.getIncludePatterns(getProject());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   254
            if (patterns != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   255
                for (String pattern : patterns) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   256
                    includes.add(pattern);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   257
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   258
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   259
            patterns = patternSet.getExcludePatterns(getProject());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   260
            if (patterns != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   261
                for (String pattern : patterns) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   262
                    excludes.add(pattern);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   263
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   264
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   265
        }    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   266
        matcher.setIncludes(includes.toArray(new String[includes.size()]));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   267
        matcher.setExcludes(excludes.toArray(new String[excludes.size()]));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   268
        matcher.setBasedir(imaker.getEpocroot());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   269
        return matcher;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   270
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   271
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   272
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   273
     * {@inheritDoc}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   274
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   275
    @Override
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   276
    public List<List<Command>> getCommands(IMaker imaker) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   277
        List<List<Command>> cmdSet = new ArrayList<List<Command>>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   278
        List<Command> cmds = new ArrayList<Command>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   279
        // Let's add one fake group.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   280
        if (variablegroups.size() == 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   281
            variablegroups.add(new VariableGroup());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   282
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   283
        try {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   284
            for (String configuration : getConfigurations(imaker.getConfigurations(), imaker)) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   285
                log("Including configuration: " + configuration);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   286
                for (String target : imaker.getTargets(configuration)) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   287
                    if (isIncluded(target, targets) && !isExcluded(target, targets)) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   288
                        log("Including target: " + target);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   289
                        for (VariableGroup group : variablegroups) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   290
                            if (group.isReference()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   291
                                group = (VariableGroup)group.getRefid().getReferencedObject();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   292
                            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   293
                            Command cmd = new Command();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   294
                            cmd.setCommand("imaker");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   295
                            cmd.addArgument("-f");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   296
                            cmd.addArgument(configuration);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   297
                            // Adding variables
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   298
                            for (VariableSet vs : variables) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   299
                                cmd.addVariables(vs.toMap());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   300
                            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   301
                            // Adding variables from groups
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   302
                            cmd.addVariables(group.toMap());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   303
                            cmd.setTarget(target);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   304
                            cmds.add(cmd);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   305
                        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   306
                    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   307
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   308
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   309
        } catch (IMakerException e) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   310
            throw new BuildException(e.getMessage());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   311
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   312
        // adding all the commands.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   313
        if (cmds.size() > 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   314
            cmdSet.add(cmds);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   315
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   316
        return cmdSet;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   317
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   318
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   319
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   320
     * Select which iMaker configuration should be built.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   321
     * @param configurations
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   322
     * @return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   323
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   324
    protected Set<String> getConfigurations(List<String> configurations, IMaker imaker) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   325
        Set<String> result = new HashSet<String>();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   326
        if (makefiles.size() > 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   327
            Matcher matcher = getMakefileMatcher(imaker);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   328
            for (String configuration : configurations) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   329
                if (matcher.match(configuration)) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   330
                    result.add(configuration);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   331
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   332
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   333
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   334
        for (MakefileSelector selector : selectors) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   335
            result.addAll(selector.selectMakefile(configurations));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   336
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   337
        return result;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   338
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   339
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   340
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   341
     * Matcher object to filter discovered configurations.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   342
     * iMaker configuration.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   343
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   344
    public class Matcher extends DirectoryScanner {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   345
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   346
        /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   347
         * Check is a particular configuration can
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   348
         * is selected.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   349
         * @param path the string to match.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   350
         * @return return true is the path is selected.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   351
         */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   352
        public boolean match(String path) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   353
            String vpath = path.replace('/', File.separatorChar).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   354
                replace('\\', File.separatorChar);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   355
            return isIncluded(vpath) && !isExcluded(vpath);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   356
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   357
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   358
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   359
}