@@ -57,3 +57,111 @@ index e977207378..e3756a5e1d 100644
5757
5858 add_custom_command(
5959 TARGET ${TARGET_NAME}
60+ diff --git a/paddle/fluid/operators/generator/CMakeLists.txt b/paddle/fluid/operators/generator/CMakeLists.txt
61+ index 7c0fdca05d..2451403e4c 100644
62+ --- a/paddle/fluid/operators/generator/CMakeLists.txt
63+ +++ b/paddle/fluid/operators/generator/CMakeLists.txt
64+ @@ -87,12 +87,19 @@ set(generated_static_argument_mapping_path
65+ set(generated_sparse_argument_mapping_path
66+ ${CMAKE_SOURCE_DIR}/paddle/fluid/operators/ops_signature/generated_sparse_sig.cc
67+ )
68+ - execute_process(
69+ - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/paddle/fluid/operators/generator
70+ - COMMAND ${CMAKE_COMMAND} -E make_directory ${parsed_op_dir} RESULTS_VARIABLE
71+ - _result)
72+ - if(${_result})
73+ - message(FATAL_ERROR "Failed to create folder for parsed op yamls, exiting.")
74+ + ## NOTE(Windows): 原先使用 execute_process + `${CMAKE_COMMAND} -E make_directory` 在部分 Windows 环境下
75+ + ## 由于多 COMMAND 聚合的行为(以及 GitHub Actions pwsh runner 的实现差异)导致子目录未能及时创建,进而
76+ + ## parse_op.py 在打开输出文件时报 FileNotFoundError。这里在配置阶段直接使用 `file(MAKE_DIRECTORY ...)`
77+ + ## 递归创建所需目录,保证跨平台一致性,避免后续 Python 脚本写文件失败。
78+ + file(MAKE_DIRECTORY
79+ + ${parsed_op_dir}
80+ + ${parsed_op_dir}/inconsistent
81+ + ${parsed_op_dir}/legacy)
82+ +
83+ + if(NOT EXISTS ${parsed_op_dir} OR
84+ + NOT EXISTS ${parsed_op_dir}/inconsistent OR
85+ + NOT EXISTS ${parsed_op_dir}/legacy)
86+ + message(FATAL_ERROR "Failed to create required parsed op yaml directories.")
87+ endif()
88+
89+ message(
90+ @@ -104,42 +111,42 @@ message(
91+ - ${fused_op_yaml_file}
92+ - ${static_op_yaml_file}")
93+
94+ - execute_process(
95+ - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/paddle/fluid/operators/generator
96+ - COMMAND ${CMAKE_COMMAND} -E make_directory ${parsed_op_dir}
97+ - COMMAND ${CMAKE_COMMAND} -E make_directory ${parsed_op_dir}/inconsistent
98+ - COMMAND ${CMAKE_COMMAND} -E make_directory ${parsed_op_dir}/legacy
99+ - COMMAND ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${op_yaml_file}
100+ - --output_path ${parsed_op_dir}/ops.parsed.yaml
101+ - COMMAND ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${legacy_op_yaml_file}
102+ - --output_path ${parsed_op_dir}/inconsistent/dygraph_ops.parsed.yaml
103+ - COMMAND ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${bw_op_yaml_file}
104+ - --output_path ${parsed_op_dir}/backward.parsed.yaml --backward
105+ - COMMAND
106+ - ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${legacy_bw_op_yaml_file}
107+ - --output_path ${parsed_op_dir}/inconsistent/dygraph_backward.parsed.yaml
108+ - --backward
109+ - COMMAND ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${static_op_yaml_file}
110+ - --output_path ${parsed_op_dir}/legacy/static_ops.parsed.yaml
111+ - COMMAND ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${fused_op_yaml_file}
112+ - --output_path ${parsed_op_dir}/fused_ops.parsed.yaml
113+ - COMMAND ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${sparse_op_yaml_file}
114+ - --output_path ${parsed_op_dir}/sparse_ops.parsed.yaml
115+ - COMMAND
116+ - ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${sparse_bw_op_yaml_file}
117+ - --output_path ${parsed_op_dir}/sparse_backward.parsed.yaml --backward
118+ - COMMAND
119+ - ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${static_bw_op_yaml_file}
120+ - --output_path ${parsed_op_dir}/legacy/static_backward.parsed.yaml --backward
121+ - COMMAND
122+ - ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${fused_bw_op_yaml_file}
123+ - --output_path ${parsed_op_dir}/fused_backward.parsed.yaml --backward
124+ - RESULTS_VARIABLE _results)
125+ - foreach(_result in ${_results})
126+ - if(${_result})
127+ - message(FATAL_ERROR "op yaml parsing failed, exiting.")
128+ + ## 逐条调用 Python,避免单一 execute_process 聚合时 Windows 下前置目录未必可见的问题
129+ + set(_parse_fail FALSE)
130+ + macro(_RUN_PARSE _yaml _out _is_bwd)
131+ + if(_is_bwd)
132+ + execute_process(
133+ + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/paddle/fluid/operators/generator
134+ + COMMAND ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${_yaml}
135+ + --output_path ${_out} --backward
136+ + RESULT_VARIABLE _ret)
137+ + else()
138+ + execute_process(
139+ + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/paddle/fluid/operators/generator
140+ + COMMAND ${PYTHON_EXECUTABLE} parse_op.py --op_yaml_path ${_yaml}
141+ + --output_path ${_out}
142+ + RESULT_VARIABLE _ret)
143+ endif()
144+ - endforeach()
145+ + if(NOT _ret EQUAL 0)
146+ + message(WARNING "parse_op failed for ${_yaml} -> ${_out}, code=${_ret}")
147+ + set(_parse_fail TRUE)
148+ + endif()
149+ + endmacro()
150+ +
151+ + _RUN_PARSE(${op_yaml_file} ${parsed_op_dir}/ops.parsed.yaml FALSE)
152+ + _RUN_PARSE(${legacy_op_yaml_file} ${parsed_op_dir}/inconsistent/dygraph_ops.parsed.yaml FALSE)
153+ + _RUN_PARSE(${bw_op_yaml_file} ${parsed_op_dir}/backward.parsed.yaml TRUE)
154+ + _RUN_PARSE(${legacy_bw_op_yaml_file} ${parsed_op_dir}/inconsistent/dygraph_backward.parsed.yaml TRUE)
155+ + _RUN_PARSE(${static_op_yaml_file} ${parsed_op_dir}/legacy/static_ops.parsed.yaml FALSE)
156+ + _RUN_PARSE(${fused_op_yaml_file} ${parsed_op_dir}/fused_ops.parsed.yaml FALSE)
157+ + _RUN_PARSE(${sparse_op_yaml_file} ${parsed_op_dir}/sparse_ops.parsed.yaml FALSE)
158+ + _RUN_PARSE(${sparse_bw_op_yaml_file} ${parsed_op_dir}/sparse_backward.parsed.yaml TRUE)
159+ + _RUN_PARSE(${static_bw_op_yaml_file} ${parsed_op_dir}/legacy/static_backward.parsed.yaml TRUE)
160+ + _RUN_PARSE(${fused_bw_op_yaml_file} ${parsed_op_dir}/fused_backward.parsed.yaml TRUE)
161+ +
162+ + if(_parse_fail)
163+ + message(FATAL_ERROR "op yaml parsing failed, exiting.")
164+ + endif()
165+
166+ # validation of op yamls
167+ message("validate op yaml:
0 commit comments