blob: 03866fcdffd489c8700ad425ae003d57183c5542 [file] [log] [blame]
AC_INIT([open_pdks], [1.0], [github.com/RTimothyEdwards/open_pdks])
# detect PDKs based on directories that include Makefile.in files
m4_define([M4_GET_TECHS], [m4_normalize(m4_esyscmd(cd .. && find * -mindepth 1 -maxdepth 1 -name "Makefile.in" -exec dirname {} \; | tr "\n" " "))])
# define tools
# define tools to install setup files for. This does not imply that the tools are
# available on the system; just that open_pdks will install the setup files for them.
## DO NOT INCLUDE XSCHEM IN THE TOOL LIST. XSCHEM CAN BE INSTALLED IN THE CONFIG SCRIPT
m4_define([M4_GET_TOOLS], [m4_normalize(m4_esyscmd(cat ./tools.txt | tr "\n" " "))])
mkdir -p ../pdks
# check for the source and install paths for each PDK.
AC_DEFUN([M4_GEN_WITH_PDK_ARGS], [
# --enable-pdk-[pdk]=/path/to/pdk
m4_foreach_w(pdk, $1, [
m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z" "A-Z"))])
pdkvar[]_SOURCE_PATH=""
pdkvar[]_LOCAL_PATH=""
pdkvar[]_DIST_PATH=""
pdkvar[]_LINK_TARGETS="none"
pdk_get() {
AC_CHECK_FILE(../pdk/[pdk]_info, [
AC_CHECK_FILE(../pdks/pdk,[
echo "Using pre-existing pdk download..."
], [
REPO=$(cat "../pdk/pdk_info" | sed -n "1p")
POST_CLONE_COMMANDS=$(cat "../pdk/pdk_info" | sed "1d")
mkdir -p ../pdks
git clone "$REPO" ../pdks/pdk;
(cd ../pdks/pdk && sh -c "$POST_CLONE_COMMANDS")
])
export pdkvar[]_SOURCE_PATH=../pdks/pdk
], [
AC_MSG_ERROR([PDK pdk cannot be automatically downloaded and requires a path.])
])
}
pdk_find() {
FOUND=0
for path in /opt/pdks/pdk /usr/share/pdks/pdk /usr/local/share/pdks/pdk; do
if @<:@ -d $path @:>@ ; then
echo "Found pdk in $path, using this installation..."
export pdkvar[]_SOURCE_PATH=$path
FOUND=1
fi
done
if @<:@ "$FOUND" = "$1" @:>@; then
echo "Could not found pdk in standard search paths, manually downloading to ../pdks/pdk ..."
pdk_find
fi
}
AC_ARG_ENABLE(pdk-[pdk],
[AS_HELP_STRING([--enable-pdk-[pdk]=@<:@/path/to/pdk/@:>@ --disable-pdk-[pdk]], "location of the source files for the pdk (pdks with a [pdk]_url file can automatically download them if the path is omitted)")],
[
if test "$enableval" == "yes" -o "$enableval" == "YES"; then
pdk_find
elif test "$enableval" == "no" -o "$enableval" == "NO"; then
echo "Disabling pdk..."
else
export pdkvar[]_SOURCE_PATH=$enableval
fi
], [
pdk_find
]
)
# # Require this argument
# AC_MSG_NOTICE([Checking whether source path is specified for 'pdk'])
# if test "x$[]pdkvar[]_SOURCE_PATH" == "x" ; then
# AC_MSG_ERROR([Option --with-pdk-source=<path> not specified!])
# fi
if @<:@ "$[]pdkvar[]_SOURCE_PATH" != "" @:>@; then
pdkvar[]_SOURCE_PATH=`readlink -f $[]pdkvar[]_SOURCE_PATH`
# basic check that the PDK exists there (the path must exist in any case)
AC_MSG_NOTICE([Checking specified path for 'pdk' at $pdkvar[]_SOURCE_PATH])
AC_CHECK_FILE($pdkvar[]_SOURCE_PATH,[
AC_MSG_NOTICE(['pdk' source path found at $pdkvar[]_SOURCE_PATH])
], [
AC_MSG_ERROR([Specified path for 'pdk' at $pdkvar[]_SOURCE_PATH not found])
])
# --with-pdk-local-path=PDK_LOCAL_PATH
AC_ARG_WITH(pdk-local-path,
[AS_HELP_STRING([--with-pdk-local-path=/path/to/install/pdk], "run-time location of the PDK")],
[pdkvar[]_LOCAL_PATH=$withval]
)
# Require this argument
AC_MSG_NOTICE([Checking whether local path is specified for 'pdk'])
if test "x$[]pdkvar[]_LOCAL_PATH" == "x" ; then
AC_MSG_ERROR([Option --with-pdk-local-path=<path> not specified!])
pdkvar[]_LOCAL_PATH=""
else
pdkvar[]_LOCAL_PATH=`readlink -f $[]pdkvar[]_LOCAL_PATH`
fi
# --with-pdk-dist-path=PDK_DIST_PATH
AC_ARG_WITH(pdk-dist-path,
[AS_HELP_STRING([--with-pdk-dist-path=/path/to/install/pdk], "staging location to install the PDK for distribution (optional)")],
[pdkvar[]_DIST_PATH=$withval]
)
# "Require" this argument
AC_MSG_NOTICE([Checking whether distribution path is specified for 'pdk'])
if test "x$[]pdkvar[]_DIST_PATH" == "x" ; then
AC_MSG_NOTICE([Option --with-pdk-dist-path=<path> not specified. Local install only.])
pdkvar[]_DIST_PATH=""
else
pdkvar[]_DIST_PATH=`readlink -f $[]pdkvar[]_DIST_PATH`
fi
# --with-pdk-link-targets=PDK_LINK_TARGETS
AC_ARG_WITH(pdk-link-targets,
[AS_HELP_STRING([--with-pdk-link-targets=none|source], "make symbolic links to existing files @<:@default=none@:>@")],
[[]pdkvar[]_LINK_TARGETS=$with_[]pdk[]_link_targets]
)
AC_SUBST([]pdkvar[]_LINK_TARGETS)
AC_MSG_NOTICE([Link targets set to $pdkvar[]_LINK_TARGETS])
fi
AC_SUBST(pdkvar[]_SOURCE_PATH)
AC_SUBST(pdkvar[]_LOCAL_PATH)
AC_SUBST(pdkvar[]_DIST_PATH)
AC_SUBST(pdkvar[]_LINK_TARGETS)
])
])
AC_MSG_NOTICE([Found technology directories: M4_GET_TECHS()])
M4_GEN_WITH_PDK_ARGS(M4_GET_TECHS())
# Set variables for tool setups
AC_DEFUN([M4_GEN_WITH_TOOLS], [
m4_foreach_w(tool, $1, [
m4_define([toolvar], [m4_normalize(m4_esyscmd(echo tool | tr "a-z" "A-Z"))])
toolvar[]_DISABLED=0
AC_ARG_ENABLE(tool,
AS_HELP_STRING(
--enable-tool
Enable or disable tool @<:@default=enabled@:>@
), [
if test "$enableval" == "no" -o "$enableval" == "NO"; then
toolvar[]_DISABLED=1
fi
]
)
AC_SUBST(toolvar[]_DISABLED)
])
])
AC_MSG_NOTICE([Found tools: M4_GET_TOOLS()])
M4_GEN_WITH_TOOLS(M4_GET_TOOLS())
# Magic
AC_PATH_PROG(MAGIC, magic)
if test -z "$MAGIC"; then
AC_MSG_ERROR([You need 'magic' to generate the needed various cell views.])
fi
# Other installations (libraries or tools if applicable)
mkdir -p ../libs
mkdir -p ../tools
AC_DEFUN([M4_GEN_INSTALLATION], [
m4_define([target], $1)
m4_define([targetvar], [m4_normalize(m4_esyscmd(echo target | tr "a-z" "A-Z"))])
m4_define([flag], $2)
m4_define([url], $3)
m4_define([location], $4)
# echo target targetvar flag url location
targetvar[]_PATH=""
targetvar[]_GET() {
AC_CHECK_FILE(
location/target,
[
echo "Using pre-existing target download..."
], [
mkdir -p location/target
sh ./download.sh url location/target.tar.gz
(echo "Extracting target..." && cd location && tar -xf target.tar.gz --strip-components 1 -C location/target)
]
)
export targetvar[]_PATH=location/target
}
AC_ARG_ENABLE(
flag,
AS_HELP_STRING(
[--enable-flag@<:@=path@:>@],
[Install target. If path is omitted, it'll be downloaded. @<:@default=disabled@:>@]
), [
if test "$enableval" == "yes" -o "$enableval" == "YES"; then
targetvar[]_GET
XSCHEM_INST=1
elif test "$enableval" == "no" -o "$enableval" == "NO"; then
echo "Disabling target..."
XSCHEM_DISABLED=1
else
targetvar[]_PATH=$enableval
fi
targetvar[]_PATH=`readlink -f $[]targetvar[]_PATH`
],
[]
)
$5
AC_SUBST(targetvar[]_PATH)
])
M4_GEN_INSTALLATION(osu, osu-lib, 'https://vlsiarch.ecen.okstate.edu/flows/MOSIS_SCMOS/osu_stdcells_v2.4/osu_stdcells_lib.v2.4.tar.gz', ../libs)
M4_GEN_INSTALLATION(sky130_ml_xx_hd, alpha-lib, 'https://github.com/PaulSchulz/sky130_pschulz_xx_hd/archive/master.tar.gz', ../libs)
XSCHEM_DISABLED=0
XSCHEM_INST=0
M4_GEN_INSTALLATION(xschem, xschem, 'https://github.com/StefanSchippers/xschem/archive/master.tar.gz', ../tools, [
if @<:@ "$XSCHEM_INST" = 1 @:>@; then
AC_CHECK_FILE(../tools/xschem-install,[
echo "Using pre-existing xschem installation..."
], [
echo "---"
echo "Note: attempting to build xschem. Xschem requires all of Magic's dependencies and further, flex, bison and libxpm."
echo "Your build WILL fail if any of these are missing. You can choose to remove --enable-xschem or add a known installation path."
sleep 2
mkdir -p ../tools/xschem-install
XSCHEM_ABSOLUTE=`readlink -f ../tools/xschem-install`
(cd ../tools/xschem && ./configure --prefix=$XSCHEM_ABSOLUTE && make && make install)
XSCHEM_PATH=$XSCHEM_ABSOLUTE
])
fi
])
AC_DEFUN([M4_GEN_WITH_TOOLS], [
m4_foreach_w(tool, $1, [
m4_define([toolvar], [m4_normalize(m4_esyscmd(echo tool | tr "a-z" "A-Z"))])
toolvar[]_DISABLED=0
AC_ARG_ENABLE(tool,
AS_HELP_STRING(
--enable-tool --disable-tool,
Enable or disable tool @<:@default=enabled@:>@
),
[
if test "$enableval" == "no" -o "$enableval" == "NO"; then
toolvar[]_DISABLED=1
fi
],
)
AC_SUBST(toolvar[]_DISABLED)
])
])
AC_MSG_NOTICE([Tools enabled for PDK setup installation: M4_GET_TOOLS()])
M4_GEN_WITH_TOOLS(M4_GET_TOOLS())
# Checking if (some) prerequisites are satisfied
## REQUIRES: https://www.gnu.org/software/autoconf-archive/ax_python_module.html#ax_python_module
AM_PATH_PYTHON([3.4])
AX_PYTHON_MODULE([distutils],[])
# Check for "--with-ef-style"
EF_STYLE=0
AC_ARG_WITH(
[ef-style],
AS_HELP_STRING(
[--with-ef-style],
[Use efabless style file system structure @<:@default=no@:>@]
), [
pdks_ef_style=$withval
if test "$withval" == "yes" -o "$withval" == "YES"; then
EF_STYLE=1
fi
],
)
AC_SUBST(EF_STYLE)
MAKEFILES=$(find .. -name "Makefile.in" | sed 's/\(.*\)\.in/\1/g')
AC_CONFIG_FILES($MAKEFILES)
AC_OUTPUT
AC_MSG_RESULT(Build configured successfully)