scons icon indicating copy to clipboard operation
scons copied to clipboard

MSVS: Generated solution file with both MSVSSolution and MSVSProject auto_build_solution may be erroneous

Open jcbrill opened this issue 1 year ago • 2 comments

When passing the results of MSVSProject calls that auto build the solution files (i.e., auto_build_solution=1), the auto-generated solution files are included in the MSVSSolution generated solution file as Projects due to the contents of the returned values from MSVSProject.

I don't believe that solution files are valid Project files but I don't know for sure.

Test configuration:

  • Layout

    806 B Test-Folder
    806 B └─ SConstruct
    
    1 file
    
  • SConstruct File

    env=Environment(
        tools=['msvs'],
        MSVS_VERSION='14.3',
        HOST_ARCH='amd64',
    )
    
    p1 = env.MSVSProject(
        target = 'Test1.vcxproj',
        srcs = ['test1.cpp', 'test2.cpp'],
        incs = [r'sdk_dir\\sdk.h'],
        localincs = ['test.h'],
        resources = ['test.rc'],
        misc = ['readme.txt'],
        buildtarget = 'Test1.exe',
        variant = 'Release',
        auto_build_solution=1,
    )
    
    p2 = env.MSVSProject(
        target = 'Test2.vcxproj',
        srcs = ['test1.cpp', 'test2.cpp'],
        incs = [r'sdk_dir\\sdk.h'],
        localincs = ['test.h'],
        resources = ['test.rc'],
        misc = ['readme.txt'],
        buildtarget = 'Test2.exe',
        variant = 'Release',
        auto_build_solution=1,
    )
    
    env.MSVSSolution(
        target = 'Test.sln',
        projects = [p1, p2],
        variant = 'Release',
    )
    

Test results:

  • Output Layout

    18370 B Test-I2-P1S1A-M
      806 B ├─ SConstruct
     1710 B ├─ Test.sln
      820 B ├─ Test1.sln
     5393 B ├─ Test1.vcxproj
     1714 B ├─ Test1.vcxproj.filters
      820 B ├─ Test2.sln
     5393 B ├─ Test2.vcxproj
     1714 B └─ Test2.vcxproj.filters
    
    8 files
    
  • Build\Test.sln Fragment:

    # Visual Studio 17
    Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test1.vcxproj", "Test1.vcxproj", "{7A34FCB5-D229-56C1-949C-B631EEF1A199}"
    EndProject
    Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test1.sln", "Test1.sln", "{514B41F4-D961-5536-A064-0E1F7BB8C6CB}"
    EndProject
    Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test2.vcxproj", "Test2.vcxproj", "{CD7B5EA4-C079-57F3-BA37-C83ED1D7466D}"
    EndProject
    Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test2.sln", "Test2.sln", "{3542A23A-C6C3-5619-9C25-5FFC91F61566}"
    EndProject
    Global
    

Possibly invalid project definitions:

  • Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test1.sln", "Test1.sln", "{514B41F4-D961-5536-A064-0E1F7BB8C6CB}"
  • Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test2.sln", "Test2.sln", "{3542A23A-C6C3-5619-9C25-5FFC91F61566}"

All solution files likely should be filtered from the projects list when generating the solution file.

Required information:

  • Link to SCons Users thread discussing your issue.
    n/a
  • Version of SCons
    4.8.1 Master (SHA-1: fc36781173e80c99774284c653557c6cb9675c88)
  • Version of Python
    3.11.4
  • Which python distribution if applicable (python.org, cygwin, anaconda, macports, brew,etc)
    WinPython
  • How you installed SCons
    filesystem git repository master branch
  • What Platform are you on? (Linux/Windows and which version)
    Win 10
  • How to reproduce your issue? Please include a small self contained reproducer. Likely a SConstruct should do for most issues.
    See above and below
  • How you invoke scons (The command line you're using "scons --flags some_arguments")
    python PathToSconsRoot/scripts/scons.py from test folder root

jcbrill avatar Oct 12 '24 22:10 jcbrill

PR #4610 assumes that solution files are invalid as Project definitions and filters the solution files from the projects list prior to generating solution files.

Tests results:

  • Output Layout:

    17750 B Test-I2-P1S1A-B
      806 B ├─ SConstruct
     1106 B ├─ Test.sln
      812 B ├─ Test1.sln
     5393 B ├─ Test1.vcxproj
     1714 B ├─ Test1.vcxproj.filters
      812 B ├─ Test2.sln
     5393 B ├─ Test2.vcxproj
     1714 B └─ Test2.vcxproj.filters
    
    8 files
    
  • Build\Test.sln Fragment:

    # Visual Studio 17
    Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test1", "Test1.vcxproj", "{7A34FCB5-D229-56C1-949C-B631EEF1A199}"
    EndProject
    Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test2", "Test2.vcxproj", "{CD7B5EA4-C079-57F3-BA37-C83ED1D7466D}"
    EndProject
    Global
    

If this is not the correct behavior, these changes to 4610 will need to be backed out.

jcbrill avatar Oct 12 '24 22:10 jcbrill

Test: one MSVSProject auto_build_project (Test1.vcxproj and Test1.sln) and one MSVSSolution (Test.sln: Project Test1.vcxproj, Project Test1.sln).

When opening Test.sln, the VS IDE complains the Test1.sln Project is either not supported or needs to be modified and offers a one-way upgrade.

When attempting a one-way upgrade, a warning pops up indicating that the file Test1.vcxproj already exists on disk. Do you want to ovewrite the project and its imported property sheets? Yes or No.

Yes:

  • Popup: the solution already contains an item named Test1.sln
  • Migration log with errors
  • The solution appears to "work" after loaded.

No:

  • Popup: The project Test1.sln cannot be added to the solution because a project with the same project filename already exists in the solution.
  • Migration log with on warning
  • The solution appears to "work" after loaded.

There does not appear to be any benefit, nor new information, by including the auto-generated MSVSProject solution file in the MSVSSolution generated file.

#4610 automatically filters nodes with a sln extension. While this might not be correct in the general case, it should be for the SCons implementation.

Any thoughts?

jcbrill avatar Oct 14 '24 10:10 jcbrill