@@ -1613,6 +1613,7 @@ function ADD_SOURCES(dir, file_list, target, obj_dir, duplicate_sources)
16131613 var i ;
16141614 var tv ;
16151615 var src , obj , sym , flags ;
1616+ var parallel_build = typeof PHP_PARALLEL_BUILD != "undefined" && PHP_PARALLEL_BUILD == "yes" ;
16161617
16171618 if ( target == null ) {
16181619 target = "php" ;
@@ -1712,7 +1713,7 @@ function ADD_SOURCES(dir, file_list, target, obj_dir, duplicate_sources)
17121713 srcs_by_dir [ build_dir ] . push ( i ) ;
17131714 }
17141715
1715- if ( ! duplicate_sources ) {
1716+ if ( ! duplicate_sources && ! parallel_build ) {
17161717 /* Create makefile build targets and dependencies. */
17171718 MFO . WriteLine ( objs_line + ": " + srcs_line ) ;
17181719 }
@@ -1730,7 +1731,7 @@ function ADD_SOURCES(dir, file_list, target, obj_dir, duplicate_sources)
17301731 var mangle_dir = k . replace ( new RegExp ( "[\\\\/.-]" , "g" ) , "_" ) ;
17311732 var bd_flags_name = "CFLAGS_BD_" + mangle_dir . toUpperCase ( ) ;
17321733
1733- if ( VS_TOOLSET ) {
1734+ if ( VS_TOOLSET && ! parallel_build ) {
17341735 ADD_FLAG ( bd_flags_name , "/Fd" + sub_build + d ) ;
17351736 }
17361737
@@ -1797,7 +1798,36 @@ function ADD_SOURCES(dir, file_list, target, obj_dir, duplicate_sources)
17971798 }
17981799
17991800 if ( ! duplicate_sources ) {
1800- if ( PHP_MP_DISABLED ) {
1801+ if ( parallel_build ) {
1802+ for ( var j in srcs_by_dir [ k ] ) {
1803+ src = file_list [ srcs_by_dir [ k ] [ j ] ] ;
1804+
1805+ var _tmp = src . split ( "\\" ) ;
1806+ var filename = _tmp . pop ( ) ;
1807+ obj = sub_build + d + filename . replace ( re , ".obj" ) ;
1808+
1809+ /* A parallel make needs one recipe owner per output. Generated files are
1810+ * an explicit prerequisite instead of relying on nmake's serial order. */
1811+ MFO . WriteLine ( obj + ": generated_files " + dir + "\\" + src ) ;
1812+
1813+ var pdb_flag = "" ;
1814+ if ( VS_TOOLSET ) {
1815+ /* Concurrent cl.exe processes must not share a PDB/IDB file. */
1816+ pdb_flag = " /Fd" + sub_build + d + filename . replace ( re , ".pdb" ) ;
1817+ }
1818+
1819+ MFO . WriteLine ( "\t" + CMD_MOD1 + "$(CC) $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ")" + pdb_flag + " /c " + dir + "\\" + src + " /Fo" + obj ) ;
1820+
1821+ if ( "clang" == PHP_ANALYZER ) {
1822+ MFO . WriteLine ( "\t" + CMD_MOD1 + "\"$(CLANG_CL)\" " + analyzer_base_args + " $(" + flags + "_ANALYZER) $(CFLAGS_ANALYZER) $(" + bd_flags_name + "_ANALYZER) " + dir + "\\" + src ) ;
1823+ } else if ( "cppcheck" == PHP_ANALYZER ) {
1824+ MFO . WriteLine ( "\t\"" + CMD_MOD1 + "$(CPPCHECK)\" " + analyzer_base_args + " $(" + flags + "_ANALYZER) $(CFLAGS_ANALYZER) $(" + bd_flags_name + "_ANALYZER) " + analyzer_base_flags + " " + dir + "\\" + src ) ;
1825+ } else if ( PHP_ANALYZER == "pvs" ) {
1826+ MFO . WriteLine ( "\t" + CMD_MOD1 + "\"$(PVS_STUDIO)\" --cl-params $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ")" + pdb_flag + " /c " + dir + "\\" + src + " --source-file " + dir + "\\" + src
1827+ + " --cfg PVS-Studio.conf --errors-off \"V122 V117 V111\" " ) ;
1828+ }
1829+ }
1830+ } else if ( PHP_MP_DISABLED ) {
18011831 for ( var j in srcs_by_dir [ k ] ) {
18021832 src = file_list [ srcs_by_dir [ k ] [ j ] ] ;
18031833
0 commit comments