| AC_INIT([open_pdks], [1.0], [github.com/RTimothyEdwards/open_pdks]) |
| |
| AC_PREFIX_DEFAULT(/usr/share) |
| |
| ## 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 Mac OS X gsed vs. sed |
| m4_ifndef([AC_PROG_SED], |
| [AC_DEFUN([AC_PROG_SED],[AC_ARG_VAR([SED]) |
| AC_CHECK_PROGS([SED],[gsed sed])])]) |
| |
| AC_PROG_SED |
| AC_SUBST(SED) |
| |
| realpath() { |
| # Cross-platform, handles ~ |
| python3 -c 'import os,sys;print(os.path.realpath(os.path.expanduser(sys.argv@<:@1@:>@)))' $1 |
| } |
| |
| # 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. |
| m4_define([M4_GET_TOOLS], [m4_normalize(m4_esyscmd(cat ./tools.txt | tr "\n" " "))]) |
| |
| # 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, [ |
| echo "Checking technology pdk..." |
| m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z-" "A-Z_"))]) |
| |
| pdkvar[]_SOURCE_PATH="" |
| pdkvar[]_LOCAL_PATH="/usr/share/[pdk]" |
| pdkvar[]_DIST_PATH="" |
| pdkvar[]_LINK_TARGETS="none" |
| pdkvar[]_AUTO="0" |
| |
| 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 |
| export pdkvar[]_SOURCE_PATH=../sources/pdk-[pdk] |
| pdkvar[]_AUTO="1" |
| elif test "$enableval" == "no" -o "$enableval" == "NO"; then |
| echo "Disabling pdk..." |
| else |
| pdkvar[]_SOURCE_PATH=$enableval |
| fi |
| ], [ |
| ] |
| ) |
| # # Require this argument |
| |
| if @<:@ "$[]pdkvar[]_SOURCE_PATH" != "" @:>@; then |
| pdkvar[]_SOURCE_PATH=`realpath $[]pdkvar[]_SOURCE_PATH` |
| pdkvar[]_BASENAME=`basename $[]pdkvar[]_SOURCE_PATH` |
| if @<:@ "$[]pdkvar[]_BASENAME" = "libraries" @:>@; then |
| pdkvar[]_SOURCE_PATH=`dirname $[]pdkvar[]_SOURCE_PATH` |
| fi |
| # Basic check that the PDK path exists, unless depending on Makefile |
| # to download it automatically. |
| if @<:@ "$[]pdkvar[]_AUTO" = "0" @:>@; then |
| 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]) |
| ]) |
| else |
| AC_MSG_NOTICE([PDK 'pdk' will be downloaded automatically during make.]) |
| 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=`realpath $[]pdkvar[]_DIST_PATH` |
| fi |
| |
| # --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 |
| AC_MSG_NOTICE([Install path for 'pdk' is $[]pdkvar[]_LOCAL_PATH]) |
| # If dist-path is specified then do not try to expand local-path |
| if test "$[]pdkvar[]_DIST_PATH" == "" ; then |
| pdkvar[]_LOCAL_PATH=`realpath $[]pdkvar[]_LOCAL_PATH` |
| fi |
| 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 setup @<:@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 |
| AC_PATH_PROG(PATCH, patch) |
| if test -z "$PATCH"; then |
| AC_MSG_ERROR([You need 'patch' to apply patches.]) |
| fi |
| |
| # Other installations (libraries or tools if applicable) |
| 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([location], $3) |
| |
| # echo target targetvar flag location |
| |
| targetvar[]_PATH="" |
| |
| AC_ARG_ENABLE( |
| flag, |
| AS_HELP_STRING( |
| [--enable-flag@<:@=path@:>@], |
| [Install target. If path is omitted, the repository will be downloaded. @<:@default=enabled@:>@] |
| ), [ |
| if test "$enableval" == "yes" -o "$enableval" == "YES"; then |
| AC_MSG_NOTICE([Package 'target' will be installed automatically during make.]) |
| export targetvar[]_PATH=location/target |
| elif test "$enableval" == "no" -o "$enableval" == "NO"; then |
| AC_MSG_NOTICE([Disabling package 'target']) |
| export targetvar[]_PATH="" |
| else |
| targetvar[]_PATH=$enableval |
| AC_MSG_NOTICE([Enabling package 'target' at $[]targetvar[]_PATH]) |
| fi |
| targetvar[]_PATH=`realpath $[]targetvar[]_PATH` |
| ],[ |
| AC_MSG_NOTICE([Package 'target' will be installed automatically during make.]) |
| targetvar[]_PATH=location/target |
| ] |
| ) |
| |
| $4 |
| |
| AC_SUBST(targetvar[]_PATH) |
| ]) |
| |
| # Optional installations (like the above, but disabled by default) |
| AC_DEFUN([M4_OPT_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([location], $3) |
| |
| # echo target targetvar flag location |
| |
| targetvar[]_PATH="" |
| |
| AC_ARG_ENABLE( |
| flag, |
| AS_HELP_STRING( |
| [--enable-flag@<:@=path@:>@], |
| [Install target. If path is omitted, the repository will be downloaded. @<:@default=disabled@:>@] |
| ), [ |
| if test "$enableval" == "yes" -o "$enableval" == "YES"; then |
| AC_MSG_NOTICE([Package 'target' will be installed automatically during make.]) |
| export targetvar[]_PATH=location/target |
| elif test "$enableval" == "no" -o "$enableval" == "NO"; then |
| AC_MSG_NOTICE([Disabling package 'target']) |
| export targetvar[]_PATH="" |
| else |
| targetvar[]_PATH=$enableval |
| AC_MSG_NOTICE([Enabling package 'target' at $[]targetvar[]_PATH]) |
| fi |
| targetvar[]_PATH=`realpath $[]targetvar[]_PATH` |
| ],[ |
| AC_MSG_NOTICE([Package 'target' will not be installed.]) |
| ] |
| ) |
| |
| $4 |
| |
| AC_SUBST(targetvar[]_PATH) |
| ]) |
| |
| M4_GEN_INSTALLATION(sky130_ml_xx_hd, alpha-sky130, ../sources) |
| M4_GEN_INSTALLATION(xschem_sky130, xschem-sky130, ../sources) |
| |
| M4_OPT_INSTALLATION(sky130_sram_macros, sram-sky130, ../sources) |
| M4_OPT_INSTALLATION(sky130_osu, osu-sky130, ../sources) |
| M4_OPT_INSTALLATION(sky130_osu_t12, osu-t12-sky130, ../sources) |
| M4_OPT_INSTALLATION(sky130_osu_t15, osu-t15-sky130, ../sources) |
| M4_OPT_INSTALLATION(sky130_osu_t18, osu-t18-sky130, ../sources) |
| |
| 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 setup @<:@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()]) |
| |
| # 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) |