# OpenSTA, Static Timing Analyzer # Copyright (c) 2018, Parallax Software, Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Process this file with autoconf to produce a configure script. AC_INIT(sta, 2.0) AM_INIT_AUTOMAKE AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS(config.h) #-------------------------------------------------------------------- # Set default paths. #-------------------------------------------------------------------- AC_ARG_ENABLE(32bit, [AS_HELP_STRING([--enable-32bit],[force 32 bit compile])], [case "${enableval}" in yes) force32bit=true ;; no) force32bit=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-32bit) ;; esac], [force32bit=false]) HOST_ARCH=`uname -m` HOST_OS=`uname -s` if test x$force32bit = xtrue; then HOST_ARCH=i686 fi echo -n "checking host... " case "${HOST_OS}" in *Linux*) case "${HOST_ARCH}" in i?86) echo "Linux 32bit" INCLUDE_DIRS="/usr/include" LIB_DIRS="/usr/lib /usr/local/lib /usr/lib/i386-linux-gnu" LIB_EXTS="a so .so.1" TCL_INIT_DIRS="/usr/lib/tcl /usr/lib /usr/share/tcltk" ;; x86_64) echo "Linux 64bit" INCLUDE_DIRS="/usr/include" LIB_DIRS="/usr/lib64 /usr/lib /usr/lib/x86_64-linux-gnu" LIB_EXTS="a so" TCL_INIT_DIRS="/usr/lib64/tcl /usr/lib /usr/share/tcltk /usr/share" ;; *) echo "Linux unknown" INCLUDE_DIRS="/usr/include" LIB_DIRS="/usr/lib" LIB_EXTS="a so" TCL_INIT_DIRS="/usr/lib/tcl /usr/lib" ;; esac ;; CYGWIN*) echo "Cygwin" INCLUDE_DIRS="/usr/include" LIB_DIRS="/usr/lib" LIB_EXTS="a so" TCL_INIT_DIRS="/usr/share" ;; Darwin) echo "Darwin" use_clang=true if test x$use_clang = xtrue; then # clang/gcc-apple llvm CXX=clang++ CC=clang++ INCLUDE_DIRS="/usr/local/include /usr/include" LIB_DIRS="/usr/local/lib /usr/lib" TCL_INIT_DIRS="/usr/local/lib/tcl8.6" else # gcc CXX=g++ CC=g++ INCLUDE_DIRS="/usr/local/opt/tcl-tk/include /usr/local/opt/zlib/include /usr/include" LIB_DIRS="/usr/local/opt/tcl-tk/lib /usr/local/opt/zlib/lib /usr/local/lib" TCL_INIT_DIRS="/usr/local/opt/tcl-tk/lib/tcl8.6" fi LIB_EXTS="dylib" ;; *) echo "Unknown" INCLUDE_DIRS="/usr/include /usr/local/include" LIB_DIRS="/usr/lib /usr/local/lib" LIB_EXTS="a so" TCL_INIT_DIRS="/usr/lib/tcl /usr/share /usr/share/tcl" ;; esac #-------------------------------------------------------------------- AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug])], [case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac], [debug=false]) AC_ARG_ENABLE(gprof, [AS_HELP_STRING([--enable-gprof],[enable gprof profiling])], [case "${enableval}" in yes) gprof=true ;; no) gprof=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-gprof) ;; esac], [gprof=false]) AC_ARG_ENABLE(gcov, [AS_HELP_STRING([--enable-gcov],[enable gcov profiling])], [case "${enableval}" in yes) gcov=true ;; no) gcov=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --with-gcov) ;; esac], [gcov=false]) AC_ARG_ENABLE(asan, [AS_HELP_STRING([--enable-asan],[enable AddressSanitizer])], [case "${enableval}" in yes) asan=true ;; no) asan=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-asan) ;; esac], [asan=false]) AC_ARG_WITH(include, [AS_HELP_STRING([--with-include=dirs],[directories to search for include files])], [INCLUDE_DIRS="${withval}"], []) AC_ARG_WITH(lib, [AS_HELP_STRING([--with-lib=dirs],[directories to search for libraries])], [LIB_DIRS="${withval}"], []) AC_ARG_WITH(tcl, [AS_HELP_STRING([--with-tcl=dirs],[directories to search for Tcl init files])], [TCL_INIT_DIRS="${withval}"], []) AC_ARG_WITH(cudd, [AS_HELP_STRING([--with-cudd=path],[use Cudd BDD package, defaults to $CUDD])], [CUDD_ARG="${withval}"], [CUDD_ARG=$CUDD]) AC_ARG_WITH(visualstudio, [AS_HELP_STRING([--with-visualstudio],[use Microcruft Visual Studio C++ compiler])], [case "${withval}" in yes) visualstudio=true ;; no) visualstudio=false ;; *) AC_MSG_ERROR(bad value ${withval} for --with-visualstudio) ;; esac], [visualstudio=false]) if test x$visualstudio = xtrue; then CXX=cl CC=cl LIB_EXTS="lib" fi AC_ARG_WITH(optimize, [AS_HELP_STRING([--with-optimize],[obsolete; optimization is on by default])], [], []) #-------------------------------------------------------------------- # Locate the Tcl package #-------------------------------------------------------------------- TCL_INCLUDE="" tcl_major="8" tcl_minors="6 5 4 3 2" for tcl_minor in $tcl_minors; do AC_MSG_CHECKING(for Tcl $tcl_major.$tcl_minor header file) found_tcl_header=false for dir in $INCLUDE_DIRS ; do tcl_header=$dir/tcl.h if test -r $tcl_header; then AC_MSG_RESULT($tcl_header) TCL_INCLUDE=$dir found_tcl_header=true break fi dir2=$dir/tcl$tcl_major.$tcl_minor tcl_header=$dir2/tcl.h if test -r $tcl_header; then AC_MSG_RESULT($tcl_header) TCL_INCLUDE=$dir2 found_tcl_header=true break fi done if test -z "$TCL_INCLUDE"; then AC_MSG_RESULT(not found) fi AC_MSG_CHECKING(for Tcl $tcl_major.$tcl_minor library) TCL_LIB="" for dir in $LIB_DIRS ; do for ext in $LIB_EXTS; do # With period between tcl_major/tcl_minor. lib=tcl$tcl_major.$tcl_minor lib_path="$dir/lib$lib.$ext" if test -r $lib_path; then AC_MSG_RESULT($lib_path) TCL_LIB_DIR=$dir TCL_LIB=$lib break 2 fi # Without period between major/minor. lib=tcl$tcl_major$tcl_minor lib_path="$dir/lib$lib.$ext" if test -r $lib_path; then AC_MSG_RESULT($lib_path) TCL_LIB_DIR=$dir TCL_LIB=$lib break 2 fi # Without leading lib or period between major/minor (windoz). lib=tcl$tcl_major$tcl_minor lib_path="$dir/$lib.$ext" if test -r $lib_path; then AC_MSG_RESULT($lib_path) TCL_LIB_DIR=$dir TCL_LIB=$lib break 2 fi done done if test -z "$TCL_LIB"; then AC_MSG_RESULT(not found) fi AC_MSG_CHECKING(for Tcl $tcl_major.$tcl_minor init files) TCL_INIT_DIR="" for dir in $TCL_INIT_DIRS ; do init_dir=$dir init_path="$dir/init.tcl" if test -r $init_path; then AC_MSG_RESULT($init_path) TCL_INIT_DIR="$init_dir" break fi init_dir="$dir/tcl$tcl_major.$tcl_minor" init_path="$init_dir/init.tcl" if test -r $init_path; then AC_MSG_RESULT($init_path) TCL_INIT_DIR="$init_dir" break fi done if test -z "$TCL_INIT_DIR"; then AC_MSG_RESULT(not found) fi if test $found_tcl_header = true && test -n "$TCL_LIB" && test -n "$TCL_INIT_DIR"; then break fi done AC_SUBST(TCL_INIT_DIR, $TCL_INIT_DIR) #-------------------------------------------------------------------- # Locate the Zlib package #-------------------------------------------------------------------- AC_MSG_CHECKING(for Zlib header file) ZLIB_INCLUDE="" for dir in $INCLUDE_DIRS ; do if test -r $dir/zlib.h; then AC_MSG_RESULT($dir) ZLIB_INCLUDE=$dir AC_DEFINE(ZLIB, 1, "Zlib compressed file reader") break fi done if test -z "$ZLIB_INCLUDE"; then AC_MSG_RESULT(not found) fi AC_MSG_CHECKING(for Zlib library) ZLIB_LIB="" for dir in $LIB_DIRS ; do for ext in $LIB_EXTS; do lib_path="$dir/libz.$ext" if test -r $lib_path; then AC_MSG_RESULT($lib_path) ZLIB_DIR=$dir ZLIB_LIB="z" break 2 fi done done if test -z "$ZLIB_LIB"; then AC_MSG_RESULT(not found) fi AC_SUBST(ZLIB_INCLUDE) AC_SUBST(ZLIB_LIB) #-------------------------------------------------------------------- # Locate the Cudd package #-------------------------------------------------------------------- CUDD_INCLUDE="" CUDD_LIBS="" if test "$CUDD_ARG"; then AC_MSG_CHECKING(for Cudd header file) CUDD_INCLUDE_DIR="$CUDD_ARG/include" CUDD_HEADER="$CUDD_INCLUDE_DIR/cudd.h" if test -r "$CUDD_HEADER"; then AC_MSG_RESULT($CUDD_HEADER) CUDD_INCLUDE=$CUDD_INCLUDE_DIR AC_DEFINE(CUDD, 1, "Cudd bdd package") else AC_MSG_RESULT(not found) fi AC_MSG_CHECKING(for Cudd library) CUDD_LIB_EXT="a" CUDD_LIB="$CUDD_ARG/cudd/libcudd.$CUDD_LIB_EXT" if test -r $CUDD_LIB; then AC_MSG_RESULT($CUDD_LIB) CUDD_LIBS="$CUDD_ARG/cudd/libcudd.$CUDD_LIB_EXT $CUDD_ARG/mtr/libmtr.$CUDD_LIB_EXT $CUDD_ARG/st/libst.$CUDD_LIB_EXT $CUDD_ARG/util/libutil.$CUDD_LIB_EXT $CUDD_ARG/epd/libepd.$CUDD_LIB_EXT" else AC_MSG_RESULT(not found) fi fi AC_SUBST(CUDD_LIBS) #-------------------------------------------------------------------- # Checks for programs. AC_PROG_CXX # Disable shared libraries by default. AC_DISABLE_SHARED AC_PROG_AWK AC_PROG_YACC AM_PROG_LEX AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET # Checks for header files. AC_CHECK_HEADERS(malloc.h) AC_CHECK_HEADERS(limits.h) AC_CHECK_HEADERS(strings.h) AC_CHECK_HEADERS(stddef.h) AC_CHECK_HEADERS(inttypes.h) AC_CHECK_HEADERS(float.h) AC_CHECK_HEADERS(pthread.h, HAVE_PTHREAD=true, HAVE_PTHREAD=false) AC_CHECK_HEADERS([sys/time.h]) AC_HEADER_STDBOOL # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST # Checks for library functions. AC_FUNC_MALLOC AC_FUNC_VPRINTF AC_FUNC_STRTOD AC_TYPE_SIZE_T AC_CHECK_FUNC(strdup) AC_CHECK_FUNC(strstr) AC_CHECK_FUNC(strchr) AC_CHECK_FUNC(strrchr) AC_CHECK_FUNC(strpbrk) AC_CHECK_FUNC(strtol) AC_CHECK_FUNC(strtoul) AC_CHECK_FUNC(strcasecmp) AC_CHECK_FUNC(strncasecmp) AC_CHECK_FUNC(gettimeofday) AC_CHECK_FUNC(sqrt) AC_CHECK_FUNC(memset) AC_C_INLINE AC_FUNC_ERROR_AT_LINE #-------------------------------------------------------------------- if test $CXX = clang++; then # -Wno-deprecated-register to suppress warnings in flex files CXXFLAGS="-std=c++11 -Wno-deprecated-register -Wcast-qual -pipe" CXX_OPT="-O3" CXX_DEBUG="-g" CXX_ASAN="-fsanitize=address -O1 -fno-omit-frame-pointer" CXX_LD=$CXX LDFLAGS="-stdlib=libc++" if test x$HAVE_PTHREAD = xtrue; then LDFLAGS="$LDFLAGS -lpthread" fi if test "$TCL_LIB"; then LDFLAGS="$LDFLAGS -L$TCL_LIB_DIR -l$TCL_LIB" fi if test "$ZLIB_LIB"; then LDFLAGS="$LDFLAGS -L$ZLIB_DIR -l$ZLIB_LIB" fi elif test x$GXX = xyes; then # Use GCC_EXTRA_FLAGS for local flags. # -Wno-deprecated-register to suppress warnings in flex files CXXFLAGS="-std=c++11 -Wall -Wextra -Wpointer-arith -Wcast-qual -Wno-deprecated-register -pipe $GCC_EXTRA_FLAGS" if test x$force32bit = xtrue; then CXXFLAGS="$CXXCFLAGS -m32" fi CXX_OPT="-O3" CXX_DEBUG="-g" CXX_GPROF="-pg -g" CXX_GCOV="-fprofile-arcs -ftest-coverage" CXX_LD=$CXX LDFLAGS="" if test x$HAVE_PTHREAD = xtrue; then LDFLAGS="$LDFLAGS -lpthread" fi if test "$TCL_LIB"; then LDFLAGS="$LDFLAGS -L$TCL_LIB_DIR -l$TCL_LIB" fi if test "$ZLIB_LIB"; then LDFLAGS="$LDFLAGS -L$ZLIB_DIR -l$ZLIB_LIB" fi elif test x$visualstudio = xtrue; then # /Zc:forScope force conformance in for Loop scope # /EHa use c++ exception handling # /W3 display level 3 warnings # /WL one line diagnostics # /c compiles without linking # /GR enable run time type info (RTTI) CXX_FLAGS="/nologo /Zc:forScope /EHa /W3 /WL /c /GR" # /MDd use debug version of vc runtime library. # /RTC1 run time error check use of uninitialized variable, initialize stack # variables to non-zero value # /GS buffer security check # /Z7 symbolic debugging info # /Od disable optimization CXX_DEBUG="/MDd /RTC1 /GS /Z7 /Od" # /MD use optimized version of vc runtime library. # /Ox full optimization # /G7 ?? # /Gy enable function level linking CXX_OPT="/MD /Ox /G7 /Gy" CXX_GPROF="" CXX_GCOV="" CXX_LD="link" LDFLAGS="/nologo /SUBSYSTEM:CONSOLE /OPT:REF /IGNORE:4089 /NODEFAULTLIB:MSVCRT user32.lib advapi32.lib /OUT:sta" if test "$TCL_LIB"; then LDFLAGS="$LDFLAGS `cygpath -m $TCL_LIB_DIR/$TCL_LIB.$LIB_EXTS`" fi if test "$ZLIB_LIB"; then LDFLAGS="$LDFLAGS `cygpath -m $ZLIB_DIR/$ZLIB_LIB.$LIB_EXTS`" fi if test "$TCL_INCLUDE"; then TCL_INCLUDE=`cygpath -m $TCL_INCLUDE` fi if test "$ZLIB_INCLUDE"; then ZLIB_INCLUDE=`cygpath -m $ZLIB_INCLUDE` fi if test "$CUDD_INCLUDE"; then CUDD_INCLUDE=`cygpath -m $CUDD_INCLUDE` fi fi if test x$debug = xtrue; then CXXFLAGS+=" $CXX_DEBUG" elif test x$optimize = xtrue; then CXXFLAGS+=" $CXX_OPT" elif test x$gprof = xtrue; then if test $CXX = clang++; then echo "clang does not support gprof" exit fi CXXFLAGS+=" $CXX_GPROF" LDFLAGS+=" $CXX_GPROF" elif test x$asan = xtrue; then CXXFLAGS+=" $CXX_ASAN" elif test x$gcov = xtrue; then CXXFLAGS+=" $CXX_GCOV" LDFLAGS+=" $CXX_GCOV" else # optimize by default CXXFLAGS+=" $CXX_OPT" fi YFLAGS="-d -p \$*_" AC_SUBST(YFLAGS) SWIG=swig AC_SUBST(SWIG) SWIG_FLAGS="-tcl8 -c++" AC_SUBST(SWIG_FLAGS) # The subdirectory app has to follow all library subdirs. STA_SUBDIRS="util liberty network graph sdc sdf parasitics dcalc search tcl doc etc verilog app" STA_INCLUDE="-I.. -I../util -I../liberty -I../network -I../graph -I../sdc -I../sdf -I../parasitics -I../dcalc -I../search -I../verilog -I../app" STA_LIBS="../search/libsearch.la ../sdf/libsdf.la ../graph/libgraph.la ../dcalc/libdcalc.la ../parasitics/libparasitics.la ../sdc/libsdc.la ../liberty/libliberty.la ../network/libnetwork.la ../util/libutil.la" SWIG_DEPEND="../tcl/StaException.i ../tcl/StaTcl.i ../tcl/NetworkEdit.i ../sdf/Sdf.i ../dcalc/DelayCalc.i ../parasitics/Parasitics.i ../tcl/StaTcl.i" TCL_INIT_FILES="../tcl/Util.tcl ../dcalc/DelayCalc.tcl ../tcl/Graph.tcl ../tcl/Liberty.tcl ../tcl/Link.tcl ../tcl/Network.tcl ../tcl/NetworkEdit.tcl ../parasitics/Parasitics.tcl ../tcl/Sdc.tcl ../sdf/Sdf.tcl ../tcl/Search.tcl ../tcl/Cmds.tcl ../tcl/Variables.tcl ../tcl/Sta.tcl ../tcl/Splash.tcl" if test "$TCL_INCLUDE"; then STA_INCLUDE="$STA_INCLUDE -I$TCL_INCLUDE" fi if test "$ZLIB_INCLUDE"; then STA_INCLUDE="$STA_INCLUDE -I$ZLIB_INCLUDE" fi if test "$CUDD_INCLUDE"; then STA_INCLUDE="$STA_INCLUDE -I$CUDD_INCLUDE" fi AC_SUBST(STA_INCLUDE) AC_SUBST(STA_LIBS) AC_SUBST(TCL_INIT_FILES) AC_SUBST(SWIG_DEPEND) AM_CPPFLAGS=$STA_INCLUDE AC_SUBST(AM_CPPFLAGS) # libtool generation has to be after AR/AR_FLAGS are set. AC_PROG_LIBTOOL AC_CONFIG_FILES(Makefile) AC_CONFIG_FILES(util/Makefile) AC_CONFIG_FILES(liberty/Makefile) AC_CONFIG_FILES(network/Makefile) AC_CONFIG_FILES(verilog/Makefile) AC_CONFIG_FILES(graph/Makefile) AC_CONFIG_FILES(sdc/Makefile) AC_CONFIG_FILES(sdf/Makefile) AC_CONFIG_FILES(parasitics/Makefile) AC_CONFIG_FILES(dcalc/Makefile) AC_CONFIG_FILES(search/Makefile) AC_CONFIG_FILES(tcl/Makefile) AC_CONFIG_FILES(doc/Makefile) AC_CONFIG_FILES(etc/Makefile) AC_CONFIG_FILES(app/Makefile) # Pass $STA_SUBDIRS to Makefile.am. AC_SUBST(STA_SUBDIRS) AC_OUTPUT