1

To define PATH locally in a project from property sheet, I need to add it in LocalDebuggerEnvironment.

This approach works well when there is only 1 property sheet that define PATH.

If I have more than one property sheet, while I want to use PATH from every property sheet,
Visual Studio will consider only PATH of the last property sheet that I have included.

Example

If I create property sheet B1.props :-

<PropertyGroup Label="UserMacros"><LocalDebuggerEnvironment>
PATH=SOMEPATH1;%PATH%     
</LocalDebuggerEnvironment></PropertyGroup>

, property sheet B2.props :-

<PropertyGroup Label="UserMacros"><LocalDebuggerEnvironment>
PATH=SOMEPATH2;%PATH%       <!-- different only this line -->
</LocalDebuggerEnvironment></PropertyGroup> 

, property sheet C.props (=include B1.props & B2.props):-

<ImportGroup Label="PropertySheets">
    <Import Project="B1.props" />
    <Import Project="B2.props" />
  </ImportGroup>

, and set a Visual Studio project to use C.props

, I will get the result : PATH=SOMEPATH2;%PATH%.

Question

How to make Visual Studio use the summation of path e.g. PATH=SOMEPATH2;SOMEPATH1;%PATH%
... while maintain the nice property sheet modularity?

cppBeginner
  • 1,009
  • 5
  • 20

1 Answers1

3

One way or another you'll need to inherit property values in each imported property sheet. You see if you write <A>someValue</A> then whatever A was it will now be set to someValue. You need <A>someValue;$(A)</A> to make the evaluated value consist of the 'old' one concatenated with the new one.

In this case you cannot simply concatenate the variables though becasue of the PATH= expression. Suppose you'd use

<LocalDebuggerEnvironment>PATH=SOMEPATH;$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
<LocalDebuggerEnvironment>PATH=SOMEPATH2;$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>

then you'd end up with

PATH=SOMEPATH2;PATH=SOMEPATH

So you need a workaround. One way is using a separate value for paths which you want to add:

B1:

<PropertyGroup Label="UserMacros">
  <PathValue>SOMEPATH;$(PathValue)</PathValue>
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

B2:

<PropertyGroup Label="UserMacros">
  <PathValue>SOMEPATH2;$(PathValue)</PathValue>
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

C:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=$(PathValue);%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

Disadvantage is that you need 2 variables and have to repeat the LocalDebuggerEnvironment part in each file otherwise you cannot use them standalone. However for the rest it's pretty usable and clear. And if you do not want to use B1 and B2 by themselves, you don't need the LocalDebuggerEnvironment in them at all. Then if you want just the value from B1, you'd add C and B1 to your project.

The only alternative I see currently would mean you'd have to do some parsing of the value to get the inheriting working without repating the PATH= part. But that won't be exactly pretty and can probably break in some cases. All in all I'd advice against it, just too complicated. Here's one variation; using Property Functions, take the current value of LocalDebuggerEnvironment, remove the PATH= part, remove the %PATH% part, then remove some consecutive semicolons (not strictly needed I guess). As you can see C doesn't need anything since the Bs already take care of inheriting the value and as such can be used standalone:

B1:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=SOMEPATH;$(LocalDebuggerEnvironment.Replace('PATH=', '').Replace('%PATH%', '').Replace(';;', ';'));%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

B2:

<PropertyGroup Label="UserMacros">
  <LocalDebuggerEnvironment>PATH=SOMEPATH2;$(LocalDebuggerEnvironment.Replace('PATH=', '').Replace('%PATH%', '').Replace(';;', ';'));%PATH%</LocalDebuggerEnvironment>
</PropertyGroup>

C:

<PropertyGroup Label="UserMacros" />
stijn
  • 31,563
  • 13
  • 95
  • 145
  • Whoa, so professional as always. I won't have much time to check, so I will give bounty now. Thank a lot, and don't forget to create some blog. XD – cppBeginner Mar 16 '20 at 12:42
  • Sorry I'm not into blogging. But questions/answers on Stackoverflow sort of work as well :) Anyway after you can test it let me know if this doesn't work for some reason. – stijn Mar 16 '20 at 13:11