I agree that <property> doesn't work well with <macro> and some other use cases.
I'm +1 on <local> if we can keep it separated from <property>, so the behavior of <property> doesn't change. I think it may be a good idea to even throw an exception if some name is used with both local and property. I wouldn't mind even a <var> that is local + modifiable. I don't like the second example where local seems to be used to declare filepath that is later defined as a property. Another approach is to use namespaces for properties - IMO that's a cleaner solution, but has the disadvantage that overloads <property> behavior. ( a local:foo property name will imply a local lifecycle, a att:foo could be used for a modifiable property, etc ). I know this isn't very popular :-) Costin peter reilly wrote: > On Wednesday 22 October 2003 15:04, Stefan Bodewig wrote: >> On 22 Oct 2003, Stefan Bodewig <[EMAIL PROTECTED]> wrote: >> > I haven't made up my mind on the feature itself >> >> OK, re-reading the description first, I don't like the >> >> ,---- >> >> | The value part of <local> is optional, and the local >> | property may be set by a subsequent <property>, <property> >> | will only set it if the value is not set. >> >> `---- >> >> part. This means that whenever I find a <property> task I'll have to >> search all possible scopes for a <local> element and can't rely on it >> being global. >> >> What is the benefit of making <property> adhere to the scoping set up >> by <local>? > > The point is that all tasks including <property> see the local > properties as normal properties. > > It means that the macro attributes are now seen as normal > properties by the tasks that are contained within the sequential > nested element. > > The <local> makes a property of the same kind as the macro attribute. > > A common use case for this is when converting an antcall to a macro: > I had a target that was used as an antcall target, it used a property > "suite.pattern" to contain a regex what was used a number of times > in the target and as an ant call was done to invoke the target, this > was not seen outside the target. On conversion to a macrodef, the > property "suite.pattern" is now a global property and the macrodef > may fail unexpectly. > > With local the macro now looks like this: > <!-- > macro to generate test suites registing > @param gen.dir the dir to place the register_suites.h and .cpp > files @param unit.dir the dir that the unit_*.cpp files are located > --> > <macrodef name="gen-register-suites"> > <attribute name="gen.dir"/> > <attribute name="unit.dir"/> > <sequential> > <local name="suite.pattern" value="^ *SUITE\(.*,\s*(.*)\s*\)"/> > <mkdir dir="${gen.dir}"/> > ... > </sequential> > </macrodef> > > Another common use case is use of a local to pass information from one > task to another without messing up global properties or similar properties > used in other targets (say in a complicated build with a number of imports > and lots of targets). > > <local name="filepath"/> > <pathconvert property="filepath" targetos="unix" > refid="files.path"/> > <echo>the files in "files.path" are ${filepath}</echo> > > However I can see the problem of looking at a script and not knowing if > the property is local or global. > > The last patch allowed [sub]ant[call] to inherit the local properties. > > I propose to change the local so that this inheriatance is removed and > also that macro instances do not inherit the local properites - i.e. > the local properties are staticlly scoped in the build script. > > So currently the following is the case: > <property name="p" value="global"/> > > <macrodef name="inner"> > <sequential> > <echo>p is ${p}</echo> > </sequential> > </macrodef> > > <macrodef name="outer"> > <attribute name="p"/> > <sequential> > <inner/> > </sequential> > </macrodef> > > <outer p="from macro"/> > > Will generate "p is from macro" which is probally not expected as > inner was not explicilty passed the property by outer and inner > may be in another file or in an antlib.xml. > > Peter > >> >> I don't have any strong objections against the rest or the >> implementation. >> >> So +0.5 (which can be turned into a +0.9 by explaining why <property> >> should care about scopes 8-). >> >> Stefan >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]