Can I pass a preprocessor definition to the resource compiler through the command line?
Asked Answered
D

4

7

I'm currently trying to switch between a few different default icons in a Visual C++ .rc file using #ifdef tags.

The builds switching the #define value are being created through the command line using MSBuild.

The difficulty I have been running into is that using Visual Studio 2010, in order to pass a preprocessor definition to the resource compiler you must define it in the project settings (Config PropertiesResourcesGeneral).

This makes it difficult to use an #ifdef tag, because using this method it will always be defined in the resource compiler.

I would love to define it to a value, so that I might use a preprocessor #if SOMEVALUE == 4 might work, but I cannot seem to find a way to pass a Preprocessor definition + value to MSBuild via the command line.

Is there a way to pass a preprocessor definition directly through to the resource compiler or a way to define a value for a preprocessor definition via the command line for MSBuild?

Dowery answered 22/8, 2011 at 15:12 Comment(0)
R
7

Yes, this can be done.

Try using environment variables to pass values into your build process.

In your project properties add ;$(CMDLINE_DEFINES) to the end of your resource preprocessor definitions. (Be sure to pick the right configuration.)

Then when you use MSBuild from the command line type (or add to a batch file)...

cd C:\Projects\SomeProject
set CMDLINE_DEFINES=SOMETEST=42
MSBuild SomeProject.vcproj

A batch file may look like:

@echo off
SET CMDLINE_DEFINES=%1
MSBUILD SomeProject.vcproj

Using this batch file, whatever you pass on the command line will be passed on to the build process as your preprocessor macro(s).

Roccoroch answered 22/8, 2011 at 18:34 Comment(0)
B
3

See the answer to this, with the additional step of setting up ResourceCompile options, i.e., edit your project file in a text editor to include elements like this:

<ItemDefinitionGroup>
    <ClCompile>
        <AdditionalOptions>/DERROR_LOG_LEVEL=5 %(AdditionalOptions)</AdditionalOptions>
    </ClCompile>
    <ResourceCompile>
        <AdditionalOptions>/DERROR_LOG_LEVEL=5 %(AdditionalOptions)</AdditionalOptions>
    </ResourceCompile>
</ItemDefinitionGroup>
Bligh answered 15/2, 2013 at 14:40 Comment(0)
B
1

The difficulty I have been running into is that using Visual Studio 2010, in order to pass a preprocessor definition to the resource compiler you must define it in the project settings (Config Properties -> Resources -> General).

You got the hard part. Just enter the define as TESTAPPLE=15 and it will effectively #define TESTAPPLE 15 for the entire project.

But answered 22/8, 2011 at 17:36 Comment(2)
Unfortunately #define values that are passed to project compiler don't get passed down to the Resource compiler. I.e., /D "TESTAPPLE=15" in when compiling the project sets TESTAPPLE to a value of 15. In the Resource Compiler, however, TESTAPPLE is just defined, but doesn't have a value of 15.Dowery
huh, guess I haven't played with the resource compiler enough. cmake.org/pipermail/cmake/2011-January/042093.html implies that it works /d "CMAKE_INTDIR=\"Release\"", but not an authoritive source.But
B
0

For reference, the following steps work with me:

  1. Pass the variable = underlying value in msbuild command line using /p, e.g.

    msbuild my_solution.sln /p:ENVSOMEVALUE="4"
    
  2. In the project file my_proj.vcxproj, define the variable as a preprocessor definition for the resource compiler, and assign it to the variable passed from msbuild, e.g. add the following section inside <Project></Project>:

      <ItemDefinitionGroup>
        <ResourceCompile>
          <PreprocessorDefinitions>
            SOMEVALUE=$(ENVSOMEVALUE);
            %(PreprocessorDefinitions)</PreprocessorDefinitions>
        </ResourceCompile>
      </ItemDefinitionGroup>
    
  3. in the .rc file, use the code the way you like:

    #if SOMEVALUE == 4
    

    You might need to set a default value for the definition if not passed from msbuild (e.g., building from the Visual Studio IDE), in this case you might use the condition manually in the project file, e.g.,

      <ItemDefinitionGroup  Condition="'$(ENVSOMEVALUE)'!=''">
        <ResourceCompile>
          <PreprocessorDefinitions>
            SOMEVALUE=$(ENVSOMEVALUE);
            %(PreprocessorDefinitions)</PreprocessorDefinitions>
        </ResourceCompile>
      </ItemDefinitionGroup>
      <ItemDefinitionGroup  Condition="'$(ENVSOMEVALUE)'==''">
        <ResourceCompile>
          <PreprocessorDefinitions>
            SOMEVALUE=1; <!-- Default Value -->
            %(PreprocessorDefinitions)</PreprocessorDefinitions>
        </ResourceCompile>
      </ItemDefinitionGroup>
    
Bister answered 11/11, 2022 at 11:31 Comment(1)
Have you tried assigning the variable directly - msbuild my_solution.sln /p:SOMEVALUE=4?Sorb

© 2022 - 2024 — McMap. All rights reserved.