Информация об изменениях

Сообщение CMake, MSVS, add_custom_command и параллельная сборка от 09.01.2026 17:33

Изменено 09.01.2026 17:34 Marty

CMake, MSVS, add_custom_command и параллельная сборка
Здравствуйте!

Есть кастомная команда (для обработки protoфайлов, но, наверное, это не важно)

add_custom_command(
      OUTPUT ${OUTPUT_PB_SOURCE} ${OUTPUT_PB_HEADER} ${OUTPUT_GRPC_SOURCE} ${OUTPUT_GRPC_HEADER}
      COMMAND ${UMBA_PROTOBUF_PROTOC}
      ARGS 
        --grpc_out "${OUTPUT_PROTO_FILE_PATH}"
        --cpp_out "${OUTPUT_PROTO_FILE_PATH}"
        "-I${PROTO_FILE_PATH}"
        ${PROTOC_OPTS}
        --plugin=protoc-gen-grpc="${GRPC_PROTOC_CPP_PLUGIN_EXECUTABLE}"
        "${PROTO_FILE}"
      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/.cmake/fix_cpp_keywords.cmd "${OUTPUT_PB_SOURCE}"    # cmd /C 
      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/.cmake/fix_cpp_keywords.cmd "${OUTPUT_PB_HEADER}"    # cmd /C 
      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/.cmake/fix_cpp_keywords.cmd "${OUTPUT_GRPC_SOURCE}"  # cmd /C 
      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/.cmake/fix_cpp_keywords.cmd "${OUTPUT_GRPC_HEADER}"  # cmd /C 
      DEPENDS "${PROTO_FILE}")


  fix_cpp_keywords.cmd
@echo off
powershell "((Get-Content -path \"%1\" -Raw) -replace 'namespace public {','namespace public_ {') | Set-Content -Path \"%1\""
powershell "((Get-Content -path \"%1\" -Raw) -replace '::public::','::public_::')                 | Set-Content -Path \"%1\""


При сборке в VSCode с использованием Ninja всем проходит нормально. Когда генерю проект для MSVS, часть файлов нормально обрабатывается командой fix_cpp_keywords.cmd, а часть — нет. Причем стабильно, одни и те же файлы сбоят — первые два обрабатываются нормально, а потом начинаются проблемы.

Set-Content : Процесс не может получить доступ к файлу бла-бла
      + CategoryInfo          : NotSpecified: (:) [Set-Content], IOException
      + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand


Есть подозрение, что это из-за параллельной сборки, но не факт.
Добавил в скрипт CMake:
if (CMAKE_GENERATOR MATCHES "Visual Studio")

message(STATUS "Disable parallel jobs using '${CMAKE_GENERATOR}' generator for target '${TARGET}'")

set_target_properties(${TARGET} PROPERTIES DISABLE_PARALLEL_BUILD TRUE)

set_target_properties(${TARGET} PROPERTIES
VS_GLOBAL_MaxCpuCount 1
VS_GLOBAL_EnableParallelBuild false
VS_GLOBAL_Parallel 0
)

# Добавляем кастомные свойства MSBuild для цели
set_target_properties(${TARGET} PROPERTIES
VS_GLOBAL_ClCompileUseMultiToolTask false
VS_GLOBAL_LinkUseMultiToolTask false
VS_GLOBAL_LibUseMultiToolTask false
)

endif()

В проект .vcxproj добавляется
  <PropertyGroup Label="Globals">
    <ProjectGuid>{2B2E3FC2-2432-377C-AC32-04D505C8DED0}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <ClCompileUseMultiToolTask>false</ClCompileUseMultiToolTask>
    <EnableParallelBuild>false</EnableParallelBuild>
    <LibUseMultiToolTask>false</LibUseMultiToolTask>
    <LinkUseMultiToolTask>false</LinkUseMultiToolTask>
    <MaxCpuCount>1</MaxCpuCount>
    <Parallel>0</Parallel>
    <WindowsTargetPlatformVersion>10.0.26100.0</WindowsTargetPlatformVersion>
    <Platform>x64</Platform>
    <VCProjectUpgraderObjectName>NoUpgrade</VCProjectUpgraderObjectName>
  </PropertyGroup>


Но ничего не изменилось, так и не собирается, ровно всё то же.

Кто-нибудь сталкивался с подобным?
CMake, MSVS, add_custom_command и параллельная сборка
Здравствуйте!

Есть кастомная команда (для обработки protoфайлов, но, наверное, это не важно)

add_custom_command(
      OUTPUT ${OUTPUT_PB_SOURCE} ${OUTPUT_PB_HEADER} ${OUTPUT_GRPC_SOURCE} ${OUTPUT_GRPC_HEADER}
      COMMAND ${UMBA_PROTOBUF_PROTOC}
      ARGS 
        --grpc_out "${OUTPUT_PROTO_FILE_PATH}"
        --cpp_out "${OUTPUT_PROTO_FILE_PATH}"
        "-I${PROTO_FILE_PATH}"
        ${PROTOC_OPTS}
        --plugin=protoc-gen-grpc="${GRPC_PROTOC_CPP_PLUGIN_EXECUTABLE}"
        "${PROTO_FILE}"
      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/.cmake/fix_cpp_keywords.cmd "${OUTPUT_PB_SOURCE}"    # cmd /C 
      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/.cmake/fix_cpp_keywords.cmd "${OUTPUT_PB_HEADER}"    # cmd /C 
      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/.cmake/fix_cpp_keywords.cmd "${OUTPUT_GRPC_SOURCE}"  # cmd /C 
      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/.cmake/fix_cpp_keywords.cmd "${OUTPUT_GRPC_HEADER}"  # cmd /C 
      DEPENDS "${PROTO_FILE}")


  fix_cpp_keywords.cmd
@echo off
powershell "((Get-Content -path \"%1\" -Raw) -replace 'namespace public {','namespace public_ {') | Set-Content -Path \"%1\""
powershell "((Get-Content -path \"%1\" -Raw) -replace '::public::','::public_::')                 | Set-Content -Path \"%1\""


При сборке в VSCode с использованием Ninja всем проходит нормально. Когда генерю проект для MSVS, часть файлов нормально обрабатывается командой fix_cpp_keywords.cmd, а часть — нет. Причем стабильно, одни и те же файлы сбоят — первые два обрабатываются нормально, а потом начинаются проблемы.

Set-Content : Процесс не может получить доступ к файлу бла-бла
      + CategoryInfo          : NotSpecified: (:) [Set-Content], IOException
      + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand


Есть подозрение, что это из-за параллельной сборки, но не факт.
Добавил в скрипт CMake:
if (CMAKE_GENERATOR MATCHES "Visual Studio")

    message(STATUS "Disable parallel jobs using '${CMAKE_GENERATOR}' generator for target '${TARGET}'")

    set_target_properties(${TARGET} PROPERTIES DISABLE_PARALLEL_BUILD TRUE)

    set_target_properties(${TARGET} PROPERTIES
        VS_GLOBAL_MaxCpuCount 1
        VS_GLOBAL_EnableParallelBuild false
        VS_GLOBAL_Parallel 0
        )

    # Добавляем кастомные свойства MSBuild для цели
    set_target_properties(${TARGET} PROPERTIES
        VS_GLOBAL_ClCompileUseMultiToolTask false
        VS_GLOBAL_LinkUseMultiToolTask false
        VS_GLOBAL_LibUseMultiToolTask false
    )

endif()

В проект .vcxproj добавляется
  <PropertyGroup Label="Globals">
    <ProjectGuid>{2B2E3FC2-2432-377C-AC32-04D505C8DED0}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <ClCompileUseMultiToolTask>false</ClCompileUseMultiToolTask>
    <EnableParallelBuild>false</EnableParallelBuild>
    <LibUseMultiToolTask>false</LibUseMultiToolTask>
    <LinkUseMultiToolTask>false</LinkUseMultiToolTask>
    <MaxCpuCount>1</MaxCpuCount>
    <Parallel>0</Parallel>
    <WindowsTargetPlatformVersion>10.0.26100.0</WindowsTargetPlatformVersion>
    <Platform>x64</Platform>
    <VCProjectUpgraderObjectName>NoUpgrade</VCProjectUpgraderObjectName>
  </PropertyGroup>


Но ничего не изменилось, так и не собирается, ровно всё то же.

Кто-нибудь сталкивался с подобным?