Name="VCCLCompilerTool"
PreprocessorDefinitions="_DEBUG"
/>
-</VisualStudioPropertySheet>
\ No newline at end of file
+ <UserMacro
+ Name="KillPythonExe"
+ Value="$(OutDir)\kill_python_d.exe"
+ />
+</VisualStudioPropertySheet>
--- /dev/null
+/*\r
+ * Helper program for killing lingering python[_d].exe processes before\r
+ * building, thus attempting to avoid build failures due to files being\r
+ * locked.\r
+ */\r
+\r
+#include <windows.h>\r
+#include <wchar.h>\r
+#include <tlhelp32.h>\r
+#include <stdio.h>\r
+\r
+#pragma comment(lib, "psapi")\r
+\r
+#ifdef _DEBUG\r
+#define PYTHON_EXE (L"python_d.exe")\r
+#define PYTHON_EXE_LEN (12)\r
+#define KILL_PYTHON_EXE (L"kill_python_d.exe")\r
+#define KILL_PYTHON_EXE_LEN (17)\r
+#else\r
+#define PYTHON_EXE (L"python.exe")\r
+#define PYTHON_EXE_LEN (10)\r
+#define KILL_PYTHON_EXE (L"kill_python.exe")\r
+#define KILL_PYTHON_EXE_LEN (15)\r
+#endif\r
+\r
+int\r
+main(int argc, char **argv)\r
+{\r
+ HANDLE hp, hsp, hsm; /* process, snapshot processes, snapshot modules */\r
+ DWORD dac, our_pid;\r
+ size_t len;\r
+ wchar_t path[MAX_PATH+1];\r
+\r
+ MODULEENTRY32W me;\r
+ PROCESSENTRY32W pe;\r
+\r
+ me.dwSize = sizeof(MODULEENTRY32W);\r
+ pe.dwSize = sizeof(PROCESSENTRY32W);\r
+\r
+ memset(path, 0, MAX_PATH+1);\r
+\r
+ our_pid = GetCurrentProcessId();\r
+\r
+ hsm = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, our_pid);\r
+ if (hsm == INVALID_HANDLE_VALUE) {\r
+ printf("CreateToolhelp32Snapshot[1] failed: %d\n", GetLastError());\r
+ return 1;\r
+ }\r
+\r
+ if (!Module32FirstW(hsm, &me)) {\r
+ printf("Module32FirstW[1] failed: %d\n", GetLastError());\r
+ CloseHandle(hsm);\r
+ return 1;\r
+ }\r
+\r
+ /*\r
+ * Enumerate over the modules for the current process in order to find\r
+ * kill_process[_d].exe, then take a note of the directory it lives in.\r
+ */\r
+ do {\r
+ if (_wcsnicmp(me.szModule, KILL_PYTHON_EXE, KILL_PYTHON_EXE_LEN))\r
+ continue;\r
+\r
+ len = wcsnlen_s(me.szExePath, MAX_PATH) - KILL_PYTHON_EXE_LEN;\r
+ wcsncpy_s(path, MAX_PATH+1, me.szExePath, len); \r
+\r
+ break;\r
+\r
+ } while (Module32NextW(hsm, &me));\r
+\r
+ CloseHandle(hsm);\r
+\r
+ if (path == NULL) {\r
+ printf("failed to discern directory of running process\n");\r
+ return 1;\r
+ }\r
+\r
+ /*\r
+ * Take a snapshot of system processes. Enumerate over the snapshot,\r
+ * looking for python processes. When we find one, verify it lives\r
+ * in the same directory we live in. If it does, kill it. If we're\r
+ * unable to kill it, treat this as a fatal error and return 1.\r
+ * \r
+ * The rationale behind this is that we're called at the start of the \r
+ * build process on the basis that we'll take care of killing any\r
+ * running instances, such that the build won't encounter permission\r
+ * denied errors during linking. If we can't kill one of the processes,\r
+ * we can't provide this assurance, and the build shouldn't start.\r
+ */\r
+\r
+ hsp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);\r
+ if (hsp == INVALID_HANDLE_VALUE) {\r
+ printf("CreateToolhelp32Snapshot[2] failed: %d\n", GetLastError());\r
+ return 1;\r
+ }\r
+\r
+ if (!Process32FirstW(hsp, &pe)) {\r
+ printf("Process32FirstW failed: %d\n", GetLastError());\r
+ CloseHandle(hsp);\r
+ return 1;\r
+ }\r
+\r
+ dac = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE;\r
+ do {\r
+\r
+ /*\r
+ * XXX TODO: if we really wanted to be fancy, we could check the \r
+ * modules for all processes (not just the python[_d].exe ones)\r
+ * and see if any of our DLLs are loaded (i.e. python30[_d].dll),\r
+ * as that would also inhibit our ability to rebuild the solution.\r
+ * Not worth loosing sleep over though; for now, a simple check \r
+ * for just the python executable should be sufficient.\r
+ */\r
+\r
+ if (_wcsnicmp(pe.szExeFile, PYTHON_EXE, PYTHON_EXE_LEN))\r
+ /* This isn't a python process. */\r
+ continue;\r
+\r
+ /* It's a python process, so figure out which directory it's in... */\r
+ hsm = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe.th32ProcessID);\r
+ if (hsm == INVALID_HANDLE_VALUE)\r
+ /* \r
+ * If our module snapshot fails (which will happen if we don't own\r
+ * the process), just ignore it and continue. (It seems different\r
+ * versions of Windows return different values for GetLastError()\r
+ * in this situation; it's easier to just ignore it and move on vs.\r
+ * stopping the build for what could be a false positive.)\r
+ */\r
+ continue;\r
+\r
+ if (!Module32FirstW(hsm, &me)) {\r
+ printf("Module32FirstW[2] failed: %d\n", GetLastError());\r
+ CloseHandle(hsp);\r
+ CloseHandle(hsm);\r
+ return 1;\r
+ }\r
+\r
+ do {\r
+ if (_wcsnicmp(me.szModule, PYTHON_EXE, PYTHON_EXE_LEN))\r
+ /* Wrong module, we're looking for python[_d].exe... */\r
+ continue;\r
+\r
+ if (_wcsnicmp(path, me.szExePath, len))\r
+ /* Process doesn't live in our directory. */\r
+ break;\r
+\r
+ /* Python process residing in the right directory, kill it! */\r
+ hp = OpenProcess(dac, FALSE, pe.th32ProcessID);\r
+ if (!hp) {\r
+ printf("OpenProcess failed: %d\n", GetLastError());\r
+ CloseHandle(hsp);\r
+ CloseHandle(hsm);\r
+ return 1;\r
+ }\r
+\r
+ if (!TerminateProcess(hp, 1)) {\r
+ printf("TerminateProcess failed: %d\n", GetLastError());\r
+ CloseHandle(hsp);\r
+ CloseHandle(hsm);\r
+ CloseHandle(hp);\r
+ return 1;\r
+ }\r
+\r
+ CloseHandle(hp);\r
+ break;\r
+\r
+ } while (Module32NextW(hsm, &me));\r
+\r
+ CloseHandle(hsm);\r
+\r
+ } while (Process32NextW(hsp, &pe));\r
+\r
+ CloseHandle(hsp);\r
+\r
+ return 0;\r
+}\r
+\r
+/* vi: set ts=8 sw=4 sts=4 expandtab */\r
--- /dev/null
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+ ProjectType="Visual C++"\r
+ Version="9.00"\r
+ Name="kill_python"\r
+ ProjectGUID="{6DE10744-E396-40A5-B4E2-1B69AA7C8D31}"\r
+ RootNamespace="kill_python"\r
+ Keyword="Win32Proj"\r
+ TargetFrameworkVersion="196613"\r
+ >\r
+ <Platforms>\r
+ <Platform\r
+ Name="Win32"\r
+ />\r
+ <Platform\r
+ Name="x64"\r
+ />\r
+ </Platforms>\r
+ <ToolFiles>\r
+ </ToolFiles>\r
+ <Configurations>\r
+ <Configuration\r
+ Name="Debug|Win32"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets=".\pyproject.vsprops;.\debug.vsprops"\r
+ CharacterSet="0"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+ SubSystem="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ Description="Killing existing Python processes..."\r
+ CommandLine=""$(KillPythonExe)""\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Debug|x64"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets=".\pyproject.vsprops;.\debug.vsprops;.\x64.vsprops"\r
+ CharacterSet="0"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ TargetEnvironment="3"\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+ SubSystem="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ Description="Killing existing Python processes..."\r
+ CommandLine=""$(KillPythonExe)""\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Release|Win32"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets=".\pyproject.vsprops;.\release.vsprops"\r
+ CharacterSet="0"\r
+ WholeProgramOptimization="1"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ SubSystem="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ Description="Killing existing Python processes..."\r
+ CommandLine=""$(KillPythonExe)""\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Release|x64"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets=".\pyproject.vsprops;.\release.vsprops;.\x64.vsprops"\r
+ CharacterSet="0"\r
+ WholeProgramOptimization="1"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ TargetEnvironment="3"\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ SubSystem="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ Description="Killing existing Python processes..."\r
+ CommandLine=""$(KillPythonExe)""\r
+ />\r
+ </Configuration>\r
+ </Configurations>\r
+ <References>\r
+ </References>\r
+ <Files>\r
+ <Filter\r
+ Name="Source Files"\r
+ >\r
+ <File\r
+ RelativePath=".\kill_python.c"\r
+ >\r
+ </File>\r
+ </Filter>\r
+ </Files>\r
+ <Globals>\r
+ </Globals>\r
+</VisualStudioProject>\r
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythoncore", "pythoncore.vcproj", "{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}"
ProjectSection(ProjectDependencies) = postProject
{F0E0541E-F17D-430B-97C4-93ADF0DD284E} = {F0E0541E-F17D-430B-97C4-93ADF0DD284E}
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
{C73F0EC1-358B-4177-940F-0846AC8B04CD} = {C73F0EC1-358B-4177-940F-0846AC8B04CD}
EndProjectSection
EndProject
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "w9xpopen", "w9xpopen.vcproj", "{E9E0A1F6-0009-4E8C-B8F8-1B8F5D49A058}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_buildinfo", "make_buildinfo.vcproj", "{C73F0EC1-358B-4177-940F-0846AC8B04CD}"
EndProject
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_bsddb", "_bsddb.vcproj", "{B4D38F3F-68FB-42EC-A45D-E00657BB3627}"
ProjectSection(ProjectDependencies) = postProject
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
{62172C7D-B39E-409A-B352-370FF5098C19} = {62172C7D-B39E-409A-B352-370FF5098C19}
{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}
EndProjectSection
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_bsddb44", "_bsddb44.vcproj", "{62172C7D-B39E-409A-B352-370FF5098C19}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite3", "sqlite3.vcproj", "{A1A295E5-463C-437F-81CA-1F32367685DA}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31} = {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kill_python", "kill_python.vcproj", "{6DE10744-E396-40A5-B4E2-1B69AA7C8D31}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
{A1A295E5-463C-437F-81CA-1F32367685DA}.Release|Win32.Build.0 = Release|Win32
{A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.ActiveCfg = Release|x64
{A1A295E5-463C-437F-81CA-1F32367685DA}.Release|x64.Build.0 = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Debug|Win32.Build.0 = Debug|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Debug|x64.ActiveCfg = Debug|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Debug|x64.Build.0 = Debug|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGInstrument|Win32.ActiveCfg = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGInstrument|Win32.Build.0 = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGInstrument|x64.ActiveCfg = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGInstrument|x64.Build.0 = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGUpdate|Win32.ActiveCfg = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGUpdate|Win32.Build.0 = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGUpdate|x64.ActiveCfg = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.PGUpdate|x64.Build.0 = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|Win32.ActiveCfg = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|Win32.Build.0 = Release|Win32
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|x64.ActiveCfg = Release|x64
+ {6DE10744-E396-40A5-B4E2-1B69AA7C8D31}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
/>
<Tool
Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine=""$(SolutionDir)make_buildinfo.exe" $(ConfigurationName)"
+ Description="Generate build information and kill existing Python processes..."
+ CommandLine=""$(SolutionDir)make_buildinfo.exe" Release
"$(KillPythonExe)""
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="$(SolutionDir)make_buildinfo.exe $(ConfigurationName)"
+ Description="Generate build information and kill existing Python processes..."
+ CommandLine=""$(SolutionDir)make_buildinfo.exe" Release
"$(KillPythonExe)""
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine=""$(SolutionDir)make_buildinfo.exe" $(ConfigurationName)"
+ Description="Generate build information and kill existing Python processes..."
+ CommandLine=""$(SolutionDir)make_buildinfo.exe" Debug
"$(KillPythonExe)""
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="$(SolutionDir)make_buildinfo.exe $(ConfigurationName)"
+ Description="Generate build information and kill existing Python processes..."
+ CommandLine=""$(SolutionDir)make_buildinfo.exe" Debug
"$(KillPythonExe)""
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="$(SolutionDir)make_buildinfo.exe Release"
+ Description="Generate build information and kill existing Python processes..."
+ CommandLine=""$(SolutionDir)make_buildinfo.exe" Release
"$(KillPythonExe)""
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="$(SolutionDir)make_buildinfo.exe $(ConfigurationName)"
+ Description="Generate build information and kill existing Python processes..."
+ CommandLine=""$(SolutionDir)make_buildinfo.exe" Release
"$(KillPythonExe)""
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="$(SolutionDir)make_buildinfo.exe Release"
+ Description="Generate build information and kill existing Python processes..."
+ CommandLine=""$(SolutionDir)make_buildinfo.exe" Release
"$(KillPythonExe)""
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCPreLinkEventTool"
- Description="generate buildinfo"
- CommandLine="$(SolutionDir)make_buildinfo.exe $(ConfigurationName)"
+ Description="Generate build information and kill existing Python processes..."
+ CommandLine=""$(SolutionDir)make_buildinfo.exe" Release
"$(KillPythonExe)""
/>
<Tool
Name="VCLinkerTool"
Name="VCCLCompilerTool"
PreprocessorDefinitions="NDEBUG"
/>
+ <UserMacro
+ Name="KillPythonExe"
+ Value="$(OutDir)\kill_python.exe"
+ />
</VisualStudioPropertySheet>
+++ /dev/null
-all: kill_python.exe
- ./kill_python.exe
-
-kill_python.exe: kill_python.c
- gcc -o kill_python.exe kill_python.c -lpsapi
-
@rem Used by the buildbot "compile" step.
cmd /c Tools\buildbot\external-amd64.bat
call "%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
-REM cmd /q/c Tools\buildbot\kill_python.bat
cmd /c Tools\buildbot\clean-amd64.bat
vcbuild PCbuild\pcbuild.sln "Debug|x64"
@rem Used by the buildbot "compile" step.
cmd /c Tools\buildbot\external.bat
call "%VS90COMNTOOLS%vsvars32.bat"
-cmd /q/c Tools\buildbot\kill_python.bat
cmd /c Tools\buildbot\clean.bat
vcbuild /useenv PCbuild\pcbuild.sln "Debug|Win32"
)
@rem build Python
-cmd /q/c Tools\buildbot\kill_python.bat
vcbuild /useenv PCbuild\pcbuild.sln "Release|Win32"
@rem build the documentation
+++ /dev/null
-cd Tools\buildbot
-nmake /C /S /f kill_python.mak
-kill_python.exe
+++ /dev/null
-/* This program looks for processes which have build\PCbuild\python.exe
- in their path and terminates them. */
-#include <windows.h>
-#include <psapi.h>
-#include <stdio.h>
-
-int main()
-{
- DWORD pids[1024], cbNeeded;
- int i, num_processes;
- if (!EnumProcesses(pids, sizeof(pids), &cbNeeded)) {
- printf("EnumProcesses failed\n");
- return 1;
- }
- num_processes = cbNeeded/sizeof(pids[0]);
- for (i = 0; i < num_processes; i++) {
- HANDLE hProcess;
- char path[MAX_PATH];
- HMODULE mods[1024];
- int k, num_mods;
- hProcess = OpenProcess(PROCESS_QUERY_INFORMATION
- | PROCESS_VM_READ
- | PROCESS_TERMINATE ,
- FALSE, pids[i]);
- if (!hProcess)
- /* process not accessible */
- continue;
- if (!EnumProcessModules(hProcess, mods, sizeof(mods), &cbNeeded)) {
- /* For unknown reasons, this sometimes returns ERROR_PARTIAL_COPY;
- this apparently means we are not supposed to read the process. */
- if (GetLastError() == ERROR_PARTIAL_COPY) {
- CloseHandle(hProcess);
- continue;
- }
- printf("EnumProcessModules failed: %d\n", GetLastError());
- return 1;
- }
- if (!GetModuleFileNameEx(hProcess, NULL, path, sizeof(path))) {
- printf("GetProcessImageFileName failed\n");
- return 1;
- }
-
- _strlwr(path);
- /* printf("%s\n", path); */
-
- /* Check if we are running a buildbot version of Python.
-
- On Windows, this will always be a debug build from the
- PCbuild directory. build\\PCbuild\\python_d.exe
-
- On Cygwin, the pathname is similar to other Unixes.
- Use \\build\\python.exe to ensure we don't match
- PCbuild\\python.exe which could be a normal instance
- of Python running on vanilla Windows.
- */
- if ((strstr(path, "pcbuild\\python_d.exe") != NULL) ||
- (strstr(path, "\\build\\python.exe") != NULL)) {
- printf("Terminating %s (pid %d)\n", path, pids[i]);
- if (!TerminateProcess(hProcess, 1)) {
- printf("Termination failed: %d\n", GetLastError());
- return 1;
- }
- return 0;
- }
-
- CloseHandle(hProcess);
- }
-}
+++ /dev/null
-kill_python.exe: kill_python.c
- cl -nologo -o kill_python.exe kill_python.c psapi.lib