summaryrefslogtreecommitdiffstats
path: root/win/nmakehlp.c
diff options
context:
space:
mode:
Diffstat (limited to 'win/nmakehlp.c')
-rw-r--r--win/nmakehlp.c116
1 files changed, 49 insertions, 67 deletions
diff --git a/win/nmakehlp.c b/win/nmakehlp.c
index ff0bfd9..03841a4 100644
--- a/win/nmakehlp.c
+++ b/win/nmakehlp.c
@@ -9,27 +9,25 @@
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* ----------------------------------------------------------------------------
- * RCS: @(#) $Id: nmakehlp.c,v 1.1.6.1 2004/10/27 00:36:34 davygrvy Exp $
+ * RCS: @(#) $Id: nmakehlp.c,v 1.1.6.2 2006/06/14 23:52:01 patthoyts Exp $
* ----------------------------------------------------------------------------
*/
+
+#define _CRT_SECURE_NO_DEPRECATE
#include <windows.h>
#pragma comment (lib, "user32.lib")
#pragma comment (lib, "kernel32.lib")
-#include <stdio.h>
/* protos */
int CheckForCompilerFeature (const char *option);
int CheckForLinkerFeature (const char *option);
int IsIn (const char *string, const char *substring);
-int GrepForDefine (const char *file, const char *string);
DWORD WINAPI ReadFromPipe (LPVOID args);
/* globals */
-#define CHUNK 25
-#define STATICBUFFERSIZE 1000
typedef struct {
HANDLE pipe;
- char buffer[STATICBUFFERSIZE];
+ char buffer[1000];
} pipeinfo;
pipeinfo Out = {INVALID_HANDLE_VALUE, '\0'};
@@ -45,10 +43,16 @@ main (int argc, char *argv[])
DWORD dwWritten;
int chars;
- /* make sure children (cl.exe and link.exe) are kept quiet. */
+ /*
+ * Make sure children (cl.exe and link.exe) are kept quiet.
+ */
+
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
- /* Make sure the compiler and linker aren't effected by the outside world. */
+ /*
+ * Make sure the compiler and linker aren't affected by the outside world.
+ */
+
SetEnvironmentVariable("CL", "");
SetEnvironmentVariable("LINK", "");
@@ -85,15 +89,6 @@ main (int argc, char *argv[])
} else {
return IsIn(argv[2], argv[3]);
}
- case 'g':
- if (argc == 2) {
- chars = wsprintf(msg, "usage: %s -g <file> <string>\n"
- "grep for a #define\n"
- "exitcodes: integer of the found string (no decimals)\n", argv[0]);
- WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, chars, &dwWritten, NULL);
- return 2;
- }
- return GrepForDefine(argv[2], argv[3]);
}
}
chars = wsprintf(msg, "usage: %s -c|-l|-f ...\n"
@@ -110,11 +105,11 @@ CheckForCompilerFeature (const char *option)
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
- DWORD threadID;
+ DWORD threadID, n;
char msg[300];
BOOL ok;
HANDLE hProcess, h, pipeThreads[2];
- char cmdline[100];
+ char cmdline[256];
hProcess = GetCurrentProcess();
@@ -142,7 +137,12 @@ CheckForCompilerFeature (const char *option)
0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
/* base command line */
- strcpy(cmdline, "cl.exe -nologo -c -TC -Zs -X ");
+ n = GetEnvironmentVariable("CC", cmdline, 255);
+ cmdline[n] = 0;
+ if (n == 0)
+ strcpy(cmdline, "cl.exe");
+ strncat(cmdline, " -nologo -c -TC -Zs -X ", 255);
+
/* append our option for testing */
strcat(cmdline, option);
/* filename to compile, which exists, but is nothing and empty. */
@@ -186,13 +186,37 @@ CheckForCompilerFeature (const char *option)
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
+ /* clean up temporary files before returning */
+ DeleteFile("temp.idb");
+ DeleteFile("temp.pdb");
+
/* wait for our pipe to get done reading, should it be a little slow. */
WaitForMultipleObjects(2, pipeThreads, TRUE, 500);
CloseHandle(pipeThreads[0]);
CloseHandle(pipeThreads[1]);
- /* look for the commandline warning code in both streams. */
- return !(strstr(Out.buffer, "D4002") != NULL || strstr(Err.buffer, "D4002") != NULL);
+#ifdef _DEBUG
+ {
+ DWORD err = 0;
+ strcat(cmdline, "\n");
+ WriteFile(GetStdHandle(STD_ERROR_HANDLE), cmdline,
+ strlen(cmdline), &err, NULL);
+ WriteFile(GetStdHandle(STD_ERROR_HANDLE), Out.buffer,
+ strlen(Out.buffer), &err,NULL);
+ WriteFile(GetStdHandle(STD_ERROR_HANDLE), Err.buffer,
+ strlen(Err.buffer), &err,NULL);
+ }
+#endif
+
+ /*
+ * Look for the commandline warning code in both streams.
+ * - in MSVC 6 & 7 we get D4002, in MSVC 8 we get D9002.
+ */
+
+ return !(strstr(Out.buffer, "D4002") != NULL
+ || strstr(Err.buffer, "D4002") != NULL
+ || strstr(Out.buffer, "D9002") != NULL
+ || strstr(Err.buffer, "D9002") != NULL);
}
int
@@ -236,6 +260,8 @@ CheckForLinkerFeature (const char *option)
strcpy(cmdline, "link.exe -nologo ");
/* append our option for testing */
strcat(cmdline, option);
+ /* filename to compile, which exists, but is nothing and empty. */
+// strcat(cmdline, " nul");
ok = CreateProcess(
NULL, /* Module name. */
@@ -293,11 +319,7 @@ ReadFromPipe (LPVOID args)
BOOL ok;
again:
- if (lastBuf - pi->buffer + CHUNK > STATICBUFFERSIZE) {
- CloseHandle(pi->pipe);
- return -1;
- }
- ok = ReadFile(pi->pipe, lastBuf, CHUNK, &dwRead, 0L);
+ ok = ReadFile(pi->pipe, lastBuf, 25, &dwRead, 0L);
if (!ok || dwRead == 0) {
CloseHandle(pi->pipe);
return 0;
@@ -313,43 +335,3 @@ IsIn (const char *string, const char *substring)
{
return (strstr(string, substring) != NULL);
}
-
-/*
- * Find a specified #define by name.
- *
- * If the line is '#define TCL_VERSION "8.5"', it returns
- * 85 as the result.
- */
-
-int
-GrepForDefine (const char *file, const char *string)
-{
- FILE *f;
- char s1[51], s2[51], s3[51];
- int r = 0;
- double d1;
-
- f = fopen(file, "rt");
- if (f == NULL) {
- return 0;
- }
-
- do {
- r = fscanf(f, "%50s", s1);
- if (r == 1 && !strcmp(s1, "#define")) {
- /* get next two words */
- r = fscanf(f, "%50s %50s", s2, s3);
- if (r != 2) continue;
- /* is the first word what we're looking for? */
- if (!strcmp(s2, string)) {
- fclose(f);
- /* add 1 past first double quote char. "8.5" */
- d1 = atof(s3 + 1); /* 8.5 */
- return ((int) (d1 * 10) & 0xFF); /* 85 */
- }
- }
- } while (!feof(f));
-
- fclose(f);
- return 0;
-}