aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2008-11-16 21:40:28 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2008-11-16 21:40:28 +0000
commit8ac9453f62a92bc02cb27802987337006d2646de (patch)
tree4f1479f54820ba3c991c5e1be374ef3a76d58071
parentef14c8a6f685c5ad47fae2261be5225812ea2256 (diff)
downloadswig-8ac9453f62a92bc02cb27802987337006d2646de.tar.gz
Fix -nopreprocess option to correctly generate output filenames and display filenames in warnings and errors
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10930 626c5289-ae23-0410-ae9c-e8d60b6d4f22
-rw-r--r--CHANGES.current11
-rw-r--r--Source/CParse/cparse.h4
-rw-r--r--Source/CParse/cscanner.c13
-rw-r--r--Source/CParse/parser.y2
-rw-r--r--Source/Modules/main.cxx100
5 files changed, 79 insertions, 51 deletions
diff --git a/CHANGES.current b/CHANGES.current
index c9a620568..2bfb3742e 100644
--- a/CHANGES.current
+++ b/CHANGES.current
@@ -1,9 +1,14 @@
-2008-09-26 Mikel Bancroft <mikel@franz.com>
-
Version 1.3.37 (in progress)
============================
-2008-11-01: wsfulton
+2008-11-16: wsfulton
+ Fix -nopreprocess option to:
+ - correctly report file names in warning and error messages.
+ - use the original input filename that created the preprocessed output when
+ determining the C++ wrapper file name (in the absence of -o). Previously
+ the name of the input file containing the preprocessed output was used.
+
+2008-11-11: wsfulton
[Java] Add patch #2152691 from MATSUURA Takanori which fixes compiles using the
Intel compiler
diff --git a/Source/CParse/cparse.h b/Source/CParse/cparse.h
index 0b3737463..ecaf1a541 100644
--- a/Source/CParse/cparse.h
+++ b/Source/CParse/cparse.h
@@ -34,7 +34,9 @@ extern "C" {
extern void scanner_ignore_typedef(void);
extern void scanner_last_id(int);
extern void scanner_clear_rename(void);
- extern void scanner_set_location(String_or_char *, int line);
+ extern void scanner_set_location(String_or_char *file, int line);
+ extern void scanner_set_main_input_file(String *file);
+ extern String *scanner_get_main_input_file();
extern void Swig_cparse_follow_locators(int);
extern void start_inline(char *, int);
extern String *scanner_ccode;
diff --git a/Source/CParse/cscanner.c b/Source/CParse/cscanner.c
index 871565df8..53e02f723 100644
--- a/Source/CParse/cscanner.c
+++ b/Source/CParse/cscanner.c
@@ -22,7 +22,10 @@ char cvsroot_cscanner_c[] = "$Id$";
static Scanner *scan = 0;
/* Global string containing C code. Used by the parser to grab code blocks */
-DOHString *scanner_ccode = 0;
+String *scanner_ccode = 0;
+
+/* The main file being parsed */
+static String *main_input_file = 0;
/* Error reporting/location information */
int cparse_line = 1;
@@ -467,6 +470,14 @@ void scanner_next_token(int tok) {
next_token = tok;
}
+void scanner_set_main_input_file(String *file) {
+ main_input_file = file;
+}
+
+String *scanner_get_main_input_file() {
+ return main_input_file;
+}
+
/* ----------------------------------------------------------------------------
* int yylex()
*
diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y
index e6a37d4bb..8b3639dc9 100644
--- a/Source/CParse/parser.y
+++ b/Source/CParse/parser.y
@@ -1894,6 +1894,8 @@ include_directive: includetype options string LBRACKET {
$1.filename = Copy(cparse_file);
$1.line = cparse_line;
scanner_set_location(NewString($3),1);
+ if ($2 && GetFlag($2, "maininput"))
+ scanner_set_main_input_file(NewString($3));
} interface RBRACKET {
String *mname = 0;
$$ = $6;
diff --git a/Source/Modules/main.cxx b/Source/Modules/main.cxx
index 0992d5539..07c4d18a9 100644
--- a/Source/Modules/main.cxx
+++ b/Source/Modules/main.cxx
@@ -965,11 +965,6 @@ int SWIG_main(int argc, char *argv[], Language *l) {
}
}
} else {
- // Check the suffix for a .c file. If so, we're going to
- // declare everything we see as "extern"
-
- ForceExtern = check_suffix(input_file);
-
// Run the preprocessor
if (Verbose)
printf("Preprocessing...\n");
@@ -997,7 +992,7 @@ int SWIG_main(int argc, char *argv[], Language *l) {
if (lang_config) {
Printf(fs, "\n%%include <%s>\n", lang_config);
}
- Printf(fs, "%%include \"%s\"\n", Swig_last_file());
+ Printf(fs, "%%include(maininput=1) \"%s\"\n", Swig_last_file());
for (i = 0; i < Len(libfiles); i++) {
Printf(fs, "\n%%include \"%s\"\n", Getitem(libfiles, i));
}
@@ -1006,7 +1001,7 @@ int SWIG_main(int argc, char *argv[], Language *l) {
Delete(fs);
} else {
df = Swig_open(input_file);
- cpps = NewFileFromFile(df);
+ cpps = Swig_read_file(df);
}
if (Swig_error_count()) {
SWIG_exit(EXIT_FAILURE);
@@ -1016,47 +1011,53 @@ int SWIG_main(int argc, char *argv[], Language *l) {
SWIG_exit(EXIT_SUCCESS);
}
if (depend) {
- String *outfile;
- if (!outfile_name) {
- if (CPlusPlus || lang->cplus_runtime_mode()) {
- outfile = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), cpp_extension);
+ if (!no_cpp) {
+ String *outfile;
+ if (!outfile_name) {
+ if (CPlusPlus || lang->cplus_runtime_mode()) {
+ outfile = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), cpp_extension);
+ } else {
+ outfile = NewStringf("%s_wrap.c", Swig_file_basename(input_file));
+ }
} else {
- outfile = NewStringf("%s_wrap.c", Swig_file_basename(input_file));
+ outfile = NewString(outfile_name);
}
- } else {
- outfile = NewString(outfile_name);
- }
- if (dependencies_file && Len(dependencies_file) != 0) {
- f_dependencies_file = NewFile(dependencies_file, "w", SWIG_output_files());
- if (!f_dependencies_file) {
- FileErrorDisplay(dependencies_file);
- SWIG_exit(EXIT_FAILURE);
+ if (dependencies_file && Len(dependencies_file) != 0) {
+ f_dependencies_file = NewFile(dependencies_file, "w", SWIG_output_files());
+ if (!f_dependencies_file) {
+ FileErrorDisplay(dependencies_file);
+ SWIG_exit(EXIT_FAILURE);
+ }
+ } else if (!depend_only) {
+ String *filename = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), depends_extension);
+ f_dependencies_file = NewFile(filename, "w", SWIG_output_files());
+ if (!f_dependencies_file) {
+ FileErrorDisplay(filename);
+ SWIG_exit(EXIT_FAILURE);
+ }
+ } else
+ f_dependencies_file = stdout;
+ if (dependencies_target) {
+ Printf(f_dependencies_file, "%s: ", dependencies_target);
+ } else {
+ Printf(f_dependencies_file, "%s: ", outfile);
}
- } else if (!depend_only) {
- String *filename = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), depends_extension);
- f_dependencies_file = NewFile(filename, "w", SWIG_output_files());
- if (!f_dependencies_file) {
- FileErrorDisplay(filename);
- SWIG_exit(EXIT_FAILURE);
+ List *files = Preprocessor_depend();
+ for (int i = 0; i < Len(files); i++) {
+ if ((depend != 2) || ((depend == 2) && (Strncmp(Getitem(files, i), SwigLib, Len(SwigLib)) != 0))) {
+ Printf(f_dependencies_file, "\\\n %s ", Getitem(files, i));
+ }
}
- } else
- f_dependencies_file = stdout;
- if (dependencies_target) {
- Printf(f_dependencies_file, "%s: ", dependencies_target);
+ Printf(f_dependencies_file, "\n");
+ if (f_dependencies_file != stdout)
+ Close(f_dependencies_file);
+ if (depend_only)
+ SWIG_exit(EXIT_SUCCESS);
} else {
- Printf(f_dependencies_file, "%s: ", outfile);
- }
- List *files = Preprocessor_depend();
- for (int i = 0; i < Len(files); i++) {
- if ((depend != 2) || ((depend == 2) && (Strncmp(Getitem(files, i), SwigLib, Len(SwigLib)) != 0))) {
- Printf(f_dependencies_file, "\\\n %s ", Getitem(files, i));
- }
+ Printf(stderr, "Cannot generate dependencies with -nopreprocess\n");
+ // Actually we could but it would be inefficient when just generating dependencies, as it would be done after Swig_cparse
+ SWIG_exit(EXIT_FAILURE);
}
- Printf(f_dependencies_file, "\n");
- if (f_dependencies_file != stdout)
- Close(f_dependencies_file);
- if (depend_only)
- SWIG_exit(EXIT_SUCCESS);
}
Seek(cpps, 0, SEEK_SET);
}
@@ -1138,18 +1139,20 @@ int SWIG_main(int argc, char *argv[], Language *l) {
SWIG_exit(EXIT_FAILURE);
} else {
/* Set some filename information on the object */
- Setattr(top, "infile", input_file);
+ String *infile = scanner_get_main_input_file();
+ Setattr(top, "infile", infile); // Note: if nopreprocess then infile is the original input file, otherwise input_file
+ Setattr(top, "inputfile", input_file);
if (!outfile_name) {
if (CPlusPlus || lang->cplus_runtime_mode()) {
- Setattr(top, "outfile", NewStringf("%s_wrap.%s", Swig_file_basename(input_file), cpp_extension));
+ Setattr(top, "outfile", NewStringf("%s_wrap.%s", Swig_file_basename(infile), cpp_extension));
} else {
- Setattr(top, "outfile", NewStringf("%s_wrap.c", Swig_file_basename(input_file)));
+ Setattr(top, "outfile", NewStringf("%s_wrap.c", Swig_file_basename(infile)));
}
} else {
Setattr(top, "outfile", outfile_name);
}
if (!outfile_name_h) {
- Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", Swig_file_basename(input_file), hpp_extension));
+ Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", Swig_file_basename(infile), hpp_extension));
} else {
Setattr(top, "outfile_h", outfile_name_h);
}
@@ -1157,7 +1160,12 @@ int SWIG_main(int argc, char *argv[], Language *l) {
if (Swig_contract_mode_get()) {
Swig_contracts(top);
}
+
+ // Check the suffix for a c/c++ file. If so, we're going to declare everything we see as "extern"
+ ForceExtern = check_suffix(input_file);
+
lang->top(top);
+
if (browse) {
Swig_browser(top, 0);
}