Make the addition of the local directory optional (include path).

In the past we automatically added the local directory to
the beginning of the include search path. This was found to
conflict with what other tools do so this functionality is
now only available when the -grelative-include option is
given to iverilog.
This commit is contained in:
Cary R 2009-02-04 17:27:25 -08:00 committed by Stephen Williams
parent 87541ce335
commit 0ea0bffd9a
5 changed files with 50 additions and 21 deletions

View File

@ -1,4 +1,4 @@
.TH iverilog 1 "April 22nd, 2008" "" "Version 0.9.devel"
.TH iverilog 1 "February 4th, 2009" "" "Version 0.9.devel"
.SH NAME
iverilog - Icarus Verilog compiler
@ -81,6 +81,13 @@ include directory after all other explicit include directories. This
standard include directory is a convenient place to install standard
header files that a Verilog program may include.
.TP 8
.B -grelative-include\fI|\fP-gno-relative-include
Enable or disable (default) adding the local files directory to
the beginning of the include file search path. This allows files
to be included relative to the current file not the more common
files are only found in the working directory or in the specified
include file search path.
.TP 8
.B -gxtypes\fI|\fP-gno-xtypes
Enable (default) or disable support for extended types. Enabling
extended types allows for new types that are supported by Icarus

View File

@ -120,6 +120,10 @@ const char*gen_system_verilog = "no-system-verilog";
/* Boolean: true means use a default include dir, false means don't */
int gen_std_include = 1;
/* Boolean: true means add the local file directory to the start
of the include list. */
int gen_relative_include = 0;
char warning_flags[16] = "";
unsigned integer_width = 32;
@ -594,6 +598,12 @@ int process_generation(const char*name)
else if (strcmp(name,"no-std-include") == 0)
gen_std_include = 0;
else if (strcmp(name,"relative-include") == 0)
gen_relative_include = 1;
else if (strcmp(name,"no-relative-include") == 0)
gen_relative_include = 0;
else if (strcmp(name,"io-range-error") == 0)
gen_io_range_error = "io-range-error";
@ -613,7 +623,7 @@ int process_generation(const char*name)
else if (strcmp(name,"no-verilog-ams") == 0)
gen_verilog_ams = "no-verilog-ams";
else if (strcmp(name,"system-verilog") == 0)
else if (strcmp(name,"system-verilog") == 0)
gen_system_verilog = "system-verilog";
else {
@ -627,10 +637,11 @@ int process_generation(const char*name)
" specify | no-specify\n"
" verilog-ams | no-verilog-ams\n"
" std-include | no-std-include\n"
" relative-include | no-relative-include\n"
" xtypes | no-xtypes\n"
" icarus-misc | no-icarus-misc\n"
" io-range-error | no-io-range-error\n"
" strict-ca-eval | no-strict-ca-eval\n"
" strict-ca-eval | no-strict-ca-eval\n"
" system-verilog\n");
return 1;
}
@ -941,7 +952,13 @@ int main(int argc, char **argv)
specifically disabled, then write that directory as the
very last include directory to use... always. */
if (gen_std_include) {
fprintf(defines_file, "I:%s%cinclude", base, sep);
fprintf(defines_file, "I:%s%cinclude\n", base, sep);
}
if (gen_relative_include) {
fprintf(defines_file, "relative include:true\n");
} else {
fprintf(defines_file, "relative include:false\n");
}
fclose(source_file);

View File

@ -1,7 +1,7 @@
#ifndef __globals_H
#define __globals_H
/*
* Copyright (c) 1999-2008 Stephen Williams (steve@icarus.com)
* Copyright (c) 1999-2009 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
@ -34,6 +34,8 @@ extern void dump_precompiled_defines(FILE*out);
extern char**include_dir;
extern unsigned include_cnt;
extern int relative_include;
/* This flag is true if #line directives are to be generated. */
extern int line_direct_flag;

View File

@ -1422,8 +1422,7 @@ static void output_init()
static void include_filename()
{
if(standby)
{
if(standby) {
emit_pathline(istack);
fprintf
(
@ -1443,14 +1442,11 @@ static void include_filename()
static void do_include()
{
/* standby is defined by include_filename() */
if (standby->path[0] == '/')
{
if (standby->path[0] == '/') {
if ((standby->file = fopen(standby->path, "r")))
goto code_that_switches_buffers;
}
else
{
unsigned idx, start = 0;
} else {
unsigned idx, start = 1;
char path[4096];
char *cp;
@ -1458,20 +1454,18 @@ static void do_include()
strcpy(path, istack->path);
cp = strrchr(path, '/');
if (cp == 0)
start = 1; /* A base file so already in [1] */
else
{
/* I may need the relative path for a planned warning even when
* we are not in relative mode, so for now keep it around. */
if (cp != 0) {
*cp = '\0';
include_dir[0] = strdup(path);
if (relative_include) start = 0;
}
for (idx = start ; idx < include_cnt ; idx += 1)
{
for (idx = start ; idx < include_cnt ; idx += 1) {
sprintf(path, "%s/%s", include_dir[idx], standby->path);
if ((standby->file = fopen(path, "r")))
{
if ((standby->file = fopen(path, "r"))) {
/* Free the original path before we overwrite it. */
free(standby->path);
standby->path = strdup(path);

View File

@ -83,6 +83,8 @@ void add_source_file(const char*name)
char**include_dir = 0;
unsigned include_cnt = 0;
int relative_include = 0;
int line_direct_flag = 0;
unsigned error_count = 0;
@ -151,6 +153,13 @@ static int flist_read_flags(const char*path)
dep_path = strdup(arg);
}
} else if (strcmp(cp,"relative include") == 0) {
if (strcmp(arg, "true") == 0) {
relative_include = 1;
} else {
relative_include = 0;
}
} else {
fprintf(stderr, "%s: Invalid keyword %s\n", path, cp);
}