From 5a502d451d646f51d7db1953c7dcde47cf945444 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Wed, 25 Nov 2009 17:20:28 -0500 Subject: [PATCH] Fix running configure outside of kit, and update README, bug193 --- Makefile.in | 23 ++++---- nodist/install_test | 136 ++++++++++++++++++++++++++++++++++++++++++++ readme.pod | 44 ++++++++++---- src/Makefile_obj.in | 22 +++++-- 4 files changed, 199 insertions(+), 26 deletions(-) create mode 100755 nodist/install_test diff --git a/Makefile.in b/Makefile.in index 1446e3642..13479de9d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -243,26 +243,27 @@ VL_INST_BIN_FILES = verilator verilator_bin verilator_bin_dbg \ # so they can be found by the user, and under $VERILATOR_ROOT. installbin: $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(bindir) - ( cd bin ; $(INSTALL_PROGRAM) verilator $(DESTDIR)$(bindir)/verilator ) - ( cd bin ; $(INSTALL_PROGRAM) verilator_profcfunc $(DESTDIR)$(bindir)/verilator_profcfunc ) + ( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator $(DESTDIR)$(bindir)/verilator ) + ( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator_profcfunc $(DESTDIR)$(bindir)/verilator_profcfunc ) ( $(INSTALL_PROGRAM) verilator_bin $(DESTDIR)$(bindir)/verilator_bin ) ( $(INSTALL_PROGRAM) verilator_bin_dbg $(DESTDIR)$(bindir)/verilator_bin_dbg ) $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(pkgdatadir)/bin - ( cd bin ; $(INSTALL_PROGRAM) verilator_includer $(DESTDIR)$(pkgdatadir)/bin/verilator_includer ) + ( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator_includer $(DESTDIR)$(pkgdatadir)/bin/verilator_includer ) -installman: +installman: $(VL_INST_MAN_FILES) $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(mandir)/man1 for p in $(VL_INST_MAN_FILES) ; do \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(mandir)/man1/$$p; \ done installdata: - $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(pkgdatadir)/examples - cp -r include $(DESTDIR)$(pkgdatadir) - cp -r test_c $(DESTDIR)$(pkgdatadir)/examples - cp -r test_sc $(DESTDIR)$(pkgdatadir)/examples - cp -r test_sp $(DESTDIR)$(pkgdatadir)/examples - cp -r test_v $(DESTDIR)$(pkgdatadir)/examples + $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(pkgdatadir)/include $(DESTDIR)$(pkgdatadir)/examples + cp -r include/* $(DESTDIR)$(pkgdatadir)/include + cp -r ${srcdir}/include/* $(DESTDIR)$(pkgdatadir)/include + cp -r ${srcdir}/test_c $(DESTDIR)$(pkgdatadir)/examples + cp -r ${srcdir}/test_sc $(DESTDIR)$(pkgdatadir)/examples + cp -r ${srcdir}/test_sp $(DESTDIR)$(pkgdatadir)/examples + cp -r ${srcdir}/test_v $(DESTDIR)$(pkgdatadir)/examples VL_INST_DATA_FILES = verilator.1 install: all_nomsg installbin installman installdata install-msg @@ -373,7 +374,7 @@ dist-file-list: ###################################################################### # Distributions -DISTCONFIG = src/config_build.h.in +DISTCONFIG = ${srcdir}/src/config_build.h.in DISTTITLE := $(shell sed -e '/DTVERSION/!d' -e 's/[^0-9]*\([0-9.a-z]*\).*/verilator-\1/' -e 's/v/V/' -e q $(DISTCONFIG)) DISTNAME := $(shell sed -e '/DTVERSION/!d' -e 's/[^0-9]*\([0-9.a-z]*\).*/verilator-\1/' -e q $(DISTCONFIG)) diff --git a/nodist/install_test b/nodist/install_test new file mode 100755 index 000000000..2c4e5e638 --- /dev/null +++ b/nodist/install_test @@ -0,0 +1,136 @@ +#!/usr/bin/perl -w +# See copyright, etc in below POD section. +###################################################################### + +use Getopt::Long; +use Cwd; +use IO::File; +use Pod::Usage; +use strict; +use vars qw ($Debug); + +#====================================================================== +# main + +autoflush STDOUT 1; +autoflush STDERR 1; +Getopt::Long::config ("no_auto_abbrev"); +if (! GetOptions ( + "debug" => sub { $Debug = 1; }, + "<>" => sub { die "%Error: Unknown parameter: $_[0]\n"; }, + )) { + die "%Error: Bad usage, try 'install_test --help'\n"; +} + +test(); + +####################################################################### + +sub test { + -r "nodist/install_test" or die "%Error: Run from the top of the verilator kit,"; + + cleanenv(); + $ENV{VERILATOR_NO_OPT_BUILD} = 1; # Don't build optimized executables; just slows this down + run("make distclean") if -r "Makefile"; + + # Try building from a scratch area + my $srcdir = getcwd(); + my $blddir = $srcdir."/test_regress/obj_dir/install_test_bld"; + my $prefix = $srcdir."/test_regress/obj_dir/install_test_prefix"; + my $testdir = $srcdir."/test_regress/obj_dir/install_test_test"; + if (1) { + run("/bin/rm -rf $blddir"); + run("/bin/mkdir -p $blddir"); + run("cd $blddir && $srcdir/configure --prefix $prefix"); + run("cd $blddir && make -j"); + } + + # Install it under the prefix + if (1) { + run("/bin/rm -rf $prefix"); + run("/bin/mkdir -p $prefix"); + run("cd $blddir && make install"); + } + + # Run a test using just the path + if (1) { + run("/bin/rm -rf $testdir"); + run("/bin/mkdir -p $testdir"); + my $bin1 = $prefix."/bin"; + my $bin2 = $prefix."/share/bin"; + IO::File->new(">$testdir/foo.v")->print('module t; initial begin $display("HELLO WORLD"); end endmodule'."\n"); + run("cd $testdir && PATH=$bin1:$bin2:\$PATH verilator --cc --exe foo.v"); + run("cd $testdir/obj_dir && PATH=$bin1:$bin2:\$PATH make -f Vfoo.mk"); + #Need .c file for this to work + #run("cd $testdir && PATH=$bin1:$bin2:\$PATH obj_dir/Vfoo"); + } +} + +sub cleanenv { + foreach my $var (keys %ENV) { + if ($var eq "VERILATOR_ROOT") { + print "unset $var # Was '$ENV{$var}'\n"; + delete $ENV{$var} + } + } +} + +####################################################################### + +sub run { + # Run a system command, check errors + my $command = shift; + print "\t$command\n"; + system "$command"; + my $status = $?; + ($status == 0) or die "%Error: Command Failed $command, $status, stopped"; +} + +####################################################################### +__END__ + +=pod + +=head1 NAME + +install_test - Build and install Verilator several ways + +=head1 SYNOPSIS + + install_test + +=head1 DESCRIPTION + +install_test performs several make-and-install iterations to verify the +kit. It isn't part of the normal "make test" due to the number of builds +required. + +=head1 ARGUMENTS + +=over 4 + +=item --help + +Displays this message and program version and exits. + +=back + +=head1 DISTRIBUTION + +Copyright 2009-2009 by Wilson Snyder. This package is free software; you +can redistribute it and/or modify it under the terms of either the GNU +Lesser General Public License Version 3 or the Perl Artistic License +Version 2.0. + +=head1 AUTHORS + +Wilson Snyder + +=head1 SEE ALSO + +=cut + +###################################################################### +### Local Variables: +### compile-command: "cd .. ; nodist/install_test " +### End: diff --git a/readme.pod b/readme.pod index e08be3f11..bcd195486 100644 --- a/readme.pod +++ b/readme.pod @@ -95,13 +95,34 @@ C to the Verilator directory containing this README. =item -Type C<./configure> to configure Verilator for your system. +You now have to decide how you're going to eventually install the kit. -If you are configuring Verilator to be part of a RPM or other distribution -package system, you may want to use the --enable-defenv configure flag. -This will take the current value of VERILATOR_ROOT, SYSTEMC, SYSTEMC_ARCH, -SYSTEMPERL, and SYSTEMPERL_INCLUDE and build them as defaults into the -executable. +Our personal favorite is to always run Verilator from the kit directory. +This allows the easiest experimentation and upgrading. It's also how most +EDA tools operate; you just point to the tarball. + + export VERILATOR_ROOT=`pwd` # if your shell is bash + setenv VERILATOR_ROOT `pwd` # if your shell is csh + ./configure + +The next option is to install it globally, using the normal system paths: + + unset VERILATOR_ROOT # if your shell is bash + unsetenv VERILATOR_ROOT # if your shell is csh + ./configure + +Alternatively you can configure a prefix that install will populate, as +most GNU tools support: + + unset VERILATOR_ROOT # if your shell is bash + unsetenv VERILATOR_ROOT # if your shell is csh + ./configure --prefix /opt/verilator-VERSION + +Finally, if you are configuring Verilator to be part of a RPM or other +distribution package system, you may want to tune the various install +directories and use the --enable-defenv configure flag. This will take the +current value of VERILATOR_ROOT, SYSTEMC, SYSTEMC_ARCH, SYSTEMPERL, and +SYSTEMPERL_INCLUDE and build them as defaults into the executable. =item @@ -119,11 +140,12 @@ unsigned long uint32_t;}. =item -There is no installation at present; this package runs from the -distribution directory. Programs should set the environment variable -VERILATOR_ROOT to point to this distribution, then execute -$VERILATOR_ROOT/bin/verilator, which will find the path to all needed -files. +If you used the VERILATOR_ROOT sheme you're done. Programs should set the +environment variable VERILATOR_ROOT to point to this distribution, then +execute $VERILATOR_ROOT/bin/verilator, which will find the path to all +needed files. + +If you used the prefix scheme, now do a C. Verilator assumes you did a make in the SystemC kit directory. If not, you will need to populate C<$SYSTEMC/include> and C<$SYSTEMC/lib-linux> diff --git a/src/Makefile_obj.in b/src/Makefile_obj.in index 111fc6c96..8961290f8 100644 --- a/src/Makefile_obj.in +++ b/src/Makefile_obj.in @@ -21,8 +21,22 @@ #### Start of system configuration section. #### -srcdir = .. -incdir = ../../include +# Unfortunately configure uses relative paths, and this makefile is called +# from a level lower, so we need to move up if it's relative, not if absolute. +config_srcdir = @srcdir@ +ifeq ($(config_srcdir),.) + srcdir = .. +else # Run an experiment + ifeq ($(shell -e $(config_srcdir)/../Makefile_obj.in),) + srcdir = $(config_srcdir) + else + srcdir = $(config_srcdir)/.. + endif +endif + +incdir = $(srcdir)/../include +# Bldsrc may differ from srcdir if configure wan't run from the kit top +bldsrc = .. # Programs CC = @CC@ @@ -49,7 +63,7 @@ LDFLAGS += @LDFLAGS@ #### End of system configuration section. #### -VPATH += . $(srcdir) +VPATH += . $(bldsrc) $(srcdir) TGT = ../../verilator_bin ################# @@ -71,7 +85,7 @@ endif LIBS = -lm -lfl CPPFLAGSNOWALL += -MMD -CPPFLAGSNOWALL += -I. -I$(srcdir) -I$(incdir) +CPPFLAGSNOWALL += -I. -I$(bldsrc) -I$(srcdir) -I$(incdir) CPPFLAGSNOWALL += -DYYDEBUG # Required to get nice error messages #CPPFLAGSNOWALL += -DVL_LEAK_CHECKS # If running valgrind or other hunting tool CPPFLAGSNOWALL += $(COPT)