Ran last commit from the wrong directory and didn't catch most of the
modified files.
diff --git a/.gitignore b/.gitignore
index 0cb02a5..3c2b7bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,17 +11,13 @@
*_migrate.log
# autotools artifacts
-scripts/*
-!scripts/configure
-!scripts/configure.ac
-!scripts/tools.txt
-!scripts/rl
**/Makefile
**/Makefile.am
# exceptions for travisCI
!.travisCI/Makefile
-# staged PDKs
-sky130/sky130A
-sky130/sky130A/*
+# local install cache
+/pdks
+/libs
+/tools
\ No newline at end of file
diff --git a/Makefile.in b/Makefile.in
index 1a1c2c7..b0fcdc0 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -35,13 +35,39 @@
# The following definitions are tied to the contents
# of this repository and should not be changed.
-TECHS = sky130
+TECHS =
+
+SKY130_SOURCE_PATH = @SKY130_SOURCE_PATH@
+ifneq ($(SKY130_SOURCE_PATH),)
+ TECHS += sky130
+endif
+
+DONE_MESSAGE = "Done."
+ifeq ($(TECHS),)
+ DONE_MESSAGE = "No techs configured."
+endif
+
+TECHS_ALL = $(addprefix tech_,$(TECHS))
+TECHS_INSTALL = $(addprefix install-,$(TECHS))
+TECHS_CLEAN = $(addprefix clean-,$(TECHS))
+TECHS_VERYCLEAN = $(addprefix veryclean-,$(TECHS))
#---------------------------------------------------
-all: ${TECHS}
- for tech in ${TECHS}; do \
- ${MAKE} tech_$$tech; done
+all: $(TECHS_ALL)
+ @echo $(DONE_MESSAGE)
+
+install: $(TECHS_INSTALL)
+ @echo $(DONE_MESSAGE)
+
+clean: $(TECHS_CLEAN)
+ @echo $(DONE_MESSAGE)
+
+veryclean: $(TECHS_VERYCLEAN)
+ @echo $(DONE_MESSAGE)
+
+distclean: $(TECHS_VERYCLEAN)
+ @echo $(DONE_MESSAGE)
#---------------------------------------------------
@@ -59,20 +85,4 @@
veryclean-sky130:
(cd sky130 && ${MAKE} veryclean)
-#---------------------------------------------------
-
-install: ${TECHS}
- for tech in ${TECHS}; do \
- ${MAKE} install-$${tech}; done
-
-clean: ${TECHS}
- for tech in ${TECHS}; do \
- ${MAKE} clean-$${tech}; done
-
-veryclean: ${TECHS}
- for tech in ${TECHS}; do \
- ${MAKE} veryclean-$${tech}; done
-
-distclean: ${TECHS}
- for tech in ${TECHS}; do \
- ${MAKE} veryclean-$${tech}; done
+#---------------------------------------------------
\ No newline at end of file
diff --git a/scripts/.gitignore b/scripts/.gitignore
new file mode 100644
index 0000000..b1083e1
--- /dev/null
+++ b/scripts/.gitignore
@@ -0,0 +1,7 @@
+*
+!.gitignore
+!configure
+!configure.ac
+!tools.txt
+!print_tools_make.pl
+!dl
\ No newline at end of file
diff --git a/scripts/configure b/scripts/configure
index 5841a66..ba4f0c8 100755
--- a/scripts/configure
+++ b/scripts/configure
@@ -587,7 +587,6 @@
ac_subst_vars='LTLIBOBJS
LIBOBJS
EF_STYLE
-MAGIC
pkgpyexecdir
pyexecdir
pkgpythondir
@@ -597,15 +596,19 @@
PYTHON_PREFIX
PYTHON_VERSION
PYTHON
+XSCHEM_PATH
+SKY130_ML_XX_HD_PATH
+OSU_PATH
+MAGIC
QFLOW_DISABLED
OPENLANE_DISABLED
NETGEN_DISABLED
MAGIC_DISABLED
KLAYOUT_DISABLED
-SKY130_LINK_TARGETS
SKY130_DIST_PATH
SKY130_LOCAL_PATH
SKY130_SOURCE_PATH
+SKY130_LINK_TARGETS
target_alias
host_alias
build_alias
@@ -647,7 +650,7 @@
ac_subst_files=''
ac_user_opts='
enable_option_checking
-with_sky130_source
+enable_sky130_pdk
with_sky130_local_path
with_sky130_dist_path
with_sky130_link_targets
@@ -656,6 +659,9 @@
enable_netgen
enable_openlane
enable_qflow
+enable_osu_lib
+enable_alpha_lib
+enable_xschem
with_ef_style
'
ac_precious_vars='build_alias
@@ -1271,6 +1277,37 @@
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-sky130-pdk=[/path/to/sky130/] --disable-sky130-pdk
+ "location of the source files for the sky130 (pdks
+ with a pdk_url file can automatically download them
+ if the path is omitted)"
+ --enable-klayout
+ Enable or disable klayout [default=enabled]
+
+
+ --enable-magic
+ Enable or disable magic [default=enabled]
+
+
+ --enable-netgen
+ Enable or disable netgen [default=enabled]
+
+
+ --enable-openlane
+ Enable or disable openlane [default=enabled]
+
+
+ --enable-qflow
+ Enable or disable qflow [default=enabled]
+
+
+ --enable-osu-lib[=path] Install osu. If path is omitted, it'll be
+ downloaded. [default=disabled]
+ --enable-alpha-lib[=path]
+ Install sky130_ml_xx_hd. If path is omitted, it'll be
+ downloaded. [default=disabled]
+ --enable-xschem[=path] Install xschem. If path is omitted, it'll be
+ downloaded. [default=disabled]
--enable-klayout --disable-klayout
Enable or disable klayout [default=enabled]
--enable-magic --disable-magic
@@ -1285,12 +1322,10 @@
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-sky130-source=/path/to/sky130/source
- "location of the source files for sky130"
- --with-sky130-local-path=/path/to/install/pdks
- "run-time location of the PDKs"
- --with-sky130-dist-path=/path/to/install/pdks
- "staging location to install the PDKs for
+ --with-sky130-local-path=/path/to/install/sky130
+ "run-time location of the PDK"
+ --with-sky130-dist-path=/path/to/install/sky130
+ "staging location to install the PDK for
distribution (optional)"
--with-sky130-link-targets=none|source
"make symbolic links to existing files
@@ -1736,10 +1771,14 @@
# detect PDKs based on directories that include Makefile.in files
+# 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
+mkdir -p ../pdks
+
# check for the source and install paths for each PDK.
@@ -1747,31 +1786,102 @@
$as_echo "$as_me: Found technology directories: sky130" >&6;}
- # --with-pdk-source=PDK_SOURCE_PATH
+
+ # --enable-pdk-[pdk]=/path/to/pdk
- SKY130_SOURCE_PATH_=""
-# Check whether --with-sky130-source was given.
-if test "${with_sky130_source+set}" = set; then :
- withval=$with_sky130_source; SKY130_SOURCE_PATH_=$withval
+ SKY130_SOURCE_PATH=""
+ SKY130_LOCAL_PATH=""
+ SKY130_DIST_PATH=""
+ SKY130_LINK_TARGETS="none"
+
+ pdk_get() {
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../sky130/pdk_url" >&5
+$as_echo_n "checking for ../sky130/pdk_url... " >&6; }
+if ${ac_cv_file____sky130_pdk_url+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ test "$cross_compiling" = yes &&
+ as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
+if test -r "../sky130/pdk_url"; then
+ ac_cv_file____sky130_pdk_url=yes
+else
+ ac_cv_file____sky130_pdk_url=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____sky130_pdk_url" >&5
+$as_echo "$ac_cv_file____sky130_pdk_url" >&6; }
+if test "x$ac_cv_file____sky130_pdk_url" = xyes; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../pdks/sky130" >&5
+$as_echo_n "checking for ../pdks/sky130... " >&6; }
+if ${ac_cv_file____pdks_sky130+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ test "$cross_compiling" = yes &&
+ as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
+if test -r "../pdks/sky130"; then
+ ac_cv_file____pdks_sky130=yes
+else
+ ac_cv_file____pdks_sky130=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____pdks_sky130" >&5
+$as_echo "$ac_cv_file____pdks_sky130" >&6; }
+if test "x$ac_cv_file____pdks_sky130" = xyes; then :
+
+ echo "Using pre-existing sky130 download..."
+
+else
+
+ mkdir -p ../pdks/sky130
+ sh dl $(cat "../sky130/pdk_get") ../pdks/sky130.tar.gz;
+ (echo "Extracting sky130" && cd ../pdks && tar -xf sky130.tar.gz --strip-components 1 -C ../pdks/sky130)
fi
+ export SKY130_SOURCE_PATH=../pdks/sky130
- # Require this argument
- { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether source path is specified for 'sky130'" >&5
-$as_echo "$as_me: Checking whether source path is specified for 'sky130'" >&6;}
- if test "x$SKY130_SOURCE_PATH_" == "x" ; then
- as_fn_error $? "Option --with-sky130-source=<path> not specified!" "$LINENO" 5
- fi
+else
- SKY130_SOURCE_PATH=`readlink -f $SKY130_SOURCE_PATH_`
+ as_fn_error $? "PDK sky130 cannot be automatically downloaded and requires a path." "$LINENO" 5
- # basic check that the PDK exists there (the path must exist in any case)
- { $as_echo "$as_me:${as_lineno-$LINENO}: Checking specified path for 'sky130' at $SKY130_SOURCE_PATH" >&5
+fi
+
+ }
+
+ # Check whether --enable-sky130-sky130 was given.
+if test "${enable_sky130_pdk+set}" = set; then :
+ enableval=$enable_sky130_pdk;
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ pdk_get
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ echo "Disabling sky130..."
+ else
+ export SKY130_SOURCE_PATH=$enableval
+ fi
+
+else
+
+ pdk_get
+
+
+fi
+
+ # # 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 [ "$SKY130_SOURCE_PATH" != "" ]; then
+ SKY130_SOURCE_PATH=`readlink -f $SKY130_SOURCE_PATH`
+
+ # basic check that the PDK exists there (the path must exist in any case)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Checking specified path for 'sky130' at $SKY130_SOURCE_PATH" >&5
$as_echo "$as_me: Checking specified path for 'sky130' at $SKY130_SOURCE_PATH" >&6;}
- as_ac_File=`$as_echo "ac_cv_file_$SKY130_SOURCE_PATH" | $as_tr_sh`
+ as_ac_File=`$as_echo "ac_cv_file_$SKY130_SOURCE_PATH" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SKY130_SOURCE_PATH" >&5
$as_echo_n "checking for $SKY130_SOURCE_PATH... " >&6; }
if eval \${$as_ac_File+:} false; then :
@@ -1790,72 +1900,57 @@
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_ac_File"\" = x"yes"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: 'sky130' source path found at $SKY130_SOURCE_PATH" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: 'sky130' source path found at $SKY130_SOURCE_PATH" >&5
$as_echo "$as_me: 'sky130' source path found at $SKY130_SOURCE_PATH" >&6;}
else
- as_fn_error $? "Specified path for 'sky130' at $SKY130_SOURCE_PATH not found" "$LINENO" 5
+ as_fn_error $? "Specified path for 'sky130' at $SKY130_SOURCE_PATH not found" "$LINENO" 5
fi
-
-
-
- # --with-pdk-local-path=PDK_LOCAL_PATH
-
-
- SKY130_LOCAL_PATH_=""
+ # --with-pdk-local-path=PDK_LOCAL_PATH
# Check whether --with-sky130-local-path was given.
if test "${with_sky130_local_path+set}" = set; then :
- withval=$with_sky130_local_path; SKY130_LOCAL_PATH_=$withval
+ withval=$with_sky130_local_path; SKY130_LOCAL_PATH=$withval
fi
- # Require this argument
- { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether local path is specified for 'sky130'" >&5
+
+ # Require this argument
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether local path is specified for 'sky130'" >&5
$as_echo "$as_me: Checking whether local path is specified for 'sky130'" >&6;}
- if test "x$SKY130_LOCAL_PATH_" == "x" ; then
- as_fn_error $? "Option --with-sky130-local-path=<path> not specified!" "$LINENO" 5
- SKY130_LOCAL_PATH=""
- else
- SKY130_LOCAL_PATH=`readlink -f $SKY130_LOCAL_PATH_`
- fi
+ if test "x$SKY130_LOCAL_PATH" == "x" ; then
+ as_fn_error $? "Option --with-sky130-local-path=<path> not specified!" "$LINENO" 5
+ SKY130_LOCAL_PATH=""
+ else
+ SKY130_LOCAL_PATH=`readlink -f $SKY130_LOCAL_PATH`
+ fi
-
-
- # --with-pdk-dist-path=PDK_DIST_PATH
-
-
- SKY130_DIST_PATH_=""
+ # --with-pdk-dist-path=PDK_DIST_PATH
# Check whether --with-sky130-dist-path was given.
if test "${with_sky130_dist_path+set}" = set; then :
- withval=$with_sky130_dist_path; SKY130_DIST_PATH_=$withval
+ withval=$with_sky130_dist_path; SKY130_DIST_PATH=$withval
fi
- # Require this argument
- { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether distribution path is specified for 'sky130'" >&5
+
+
+ # "Require" this argument
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Checking whether distribution path is specified for 'sky130'" >&5
$as_echo "$as_me: Checking whether distribution path is specified for 'sky130'" >&6;}
- if test "x$SKY130_DIST_PATH_" == "x" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: Option --with-sky130-dist-path=<path> not specified. Local install only.\"" >&5
-$as_echo "$as_me: Option --with-sky130-dist-path=<path> not specified. Local install only.\"" >&6;}
- SKY130_DIST_PATH=""
- else
- SKY130_DIST_PATH=`readlink -f $SKY130_DIST_PATH_`
- fi
+ if test "x$SKY130_DIST_PATH" == "x" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Option --with-sky130-dist-path=<path> not specified. Local install only." >&5
+$as_echo "$as_me: Option --with-sky130-dist-path=<path> not specified. Local install only." >&6;}
+ SKY130_DIST_PATH=""
+ else
+ SKY130_DIST_PATH=`readlink -f $SKY130_DIST_PATH`
+ fi
-
-
- # --with-pdk-link-targets=PDK_LINK_TARGETS
-
-
- # Default link_targets = "none"
- SKY130_LINK_TARGETS="none"
-
+ # --with-pdk-link-targets=PDK_LINK_TARGETS
# Check whether --with-sky130-link-targets was given.
if test "${with_sky130_link_targets+set}" = set; then :
@@ -1864,8 +1959,377 @@
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: Link targets set to $SKY130_LINK_TARGETS" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Link targets set to $SKY130_LINK_TARGETS" >&5
$as_echo "$as_me: Link targets set to $SKY130_LINK_TARGETS" >&6;}
+ fi
+
+
+
+
+
+
+
+
+# Set variables for tool setups
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: Found tools: klayout magic netgen openlane qflow" >&5
+$as_echo "$as_me: Found tools: klayout magic netgen openlane qflow" >&6;}
+
+
+
+
+
+ KLAYOUT_DISABLED=0
+ # Check whether --enable-klayout was given.
+if test "${enable_klayout+set}" = set; then :
+ enableval=$enable_klayout;
+ if test "$enableval" == "no" -o "$enableval" == "NO"; then
+ KLAYOUT_DISABLED=1
+ fi
+
+
+fi
+
+
+
+
+
+ MAGIC_DISABLED=0
+ # Check whether --enable-magic was given.
+if test "${enable_magic+set}" = set; then :
+ enableval=$enable_magic;
+ if test "$enableval" == "no" -o "$enableval" == "NO"; then
+ MAGIC_DISABLED=1
+ fi
+
+
+fi
+
+
+
+
+
+ NETGEN_DISABLED=0
+ # Check whether --enable-netgen was given.
+if test "${enable_netgen+set}" = set; then :
+ enableval=$enable_netgen;
+ if test "$enableval" == "no" -o "$enableval" == "NO"; then
+ NETGEN_DISABLED=1
+ fi
+
+
+fi
+
+
+
+
+
+ OPENLANE_DISABLED=0
+ # Check whether --enable-openlane was given.
+if test "${enable_openlane+set}" = set; then :
+ enableval=$enable_openlane;
+ if test "$enableval" == "no" -o "$enableval" == "NO"; then
+ OPENLANE_DISABLED=1
+ fi
+
+
+fi
+
+
+
+
+
+ QFLOW_DISABLED=0
+ # Check whether --enable-qflow was given.
+if test "${enable_qflow+set}" = set; then :
+ enableval=$enable_qflow;
+ if test "$enableval" == "no" -o "$enableval" == "NO"; then
+ QFLOW_DISABLED=1
+ fi
+
+
+fi
+
+
+
+
+
+# Magic
+# Extract the first word of "magic", so it can be a program name with args.
+set dummy magic; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MAGIC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MAGIC="$MAGIC" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_MAGIC="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+MAGIC=$ac_cv_path_MAGIC
+if test -n "$MAGIC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC" >&5
+$as_echo "$MAGIC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test -z "$MAGIC"; then
+ as_fn_error $? "You need 'magic' to generate the needed various cell views." "$LINENO" 5
+fi
+
+# Other installations (libraries or tools if applicable)
+mkdir -p ../libs
+mkdir -p ../tools
+
+
+
+
+
+
+
+
+
+ # echo target targetvar flag url location
+
+ OSU_PATH=""
+ OSU_GET() {
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../libs/osu" >&5
+$as_echo_n "checking for ../libs/osu... " >&6; }
+if ${ac_cv_file____libs_osu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ test "$cross_compiling" = yes &&
+ as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
+if test -r "../libs/osu"; then
+ ac_cv_file____libs_osu=yes
+else
+ ac_cv_file____libs_osu=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____libs_osu" >&5
+$as_echo "$ac_cv_file____libs_osu" >&6; }
+if test "x$ac_cv_file____libs_osu" = xyes; then :
+
+ echo "Using pre-existing osu download..."
+
+else
+
+ mkdir -p ../libs/osu
+ sh ./download.sh 'https://vlsiarch.ecen.okstate.edu/flows/MOSIS_SCMOS/osu_stdcells_v2.4/osu_stdcells_lib.v2.4.tar.gz' ../libs/osu.tar.gz
+ (echo "Extracting osu..." && cd ../libs && tar -xf osu.tar.gz --strip-components 1 -C ../libs/osu)
+
+
+fi
+
+ export OSU_PATH=../libs/osu
+ }
+
+ # Check whether --enable-osu-lib was given.
+if test "${enable_osu_lib+set}" = set; then :
+ enableval=$enable_osu_lib;
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ OSU_GET
+ XSCHEM_INST=1
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ echo "Disabling osu..."
+ XSCHEM_DISABLED=1
+ else
+ OSU_PATH=$enableval
+ fi
+ OSU_PATH=`readlink -f $OSU_PATH`
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ # echo target targetvar flag url location
+
+ SKY130_ML_XX_HD_PATH=""
+ SKY130_ML_XX_HD_GET() {
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../libs/sky130_ml_xx_hd" >&5
+$as_echo_n "checking for ../libs/sky130_ml_xx_hd... " >&6; }
+if ${ac_cv_file____libs_sky130_ml_xx_hd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ test "$cross_compiling" = yes &&
+ as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
+if test -r "../libs/sky130_ml_xx_hd"; then
+ ac_cv_file____libs_sky130_ml_xx_hd=yes
+else
+ ac_cv_file____libs_sky130_ml_xx_hd=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____libs_sky130_ml_xx_hd" >&5
+$as_echo "$ac_cv_file____libs_sky130_ml_xx_hd" >&6; }
+if test "x$ac_cv_file____libs_sky130_ml_xx_hd" = xyes; then :
+
+ echo "Using pre-existing sky130_ml_xx_hd download..."
+
+else
+
+ mkdir -p ../libs/sky130_ml_xx_hd
+ sh ./download.sh 'https://github.com/PaulSchulz/sky130_pschulz_xx_hd/archive/master.tar.gz' ../libs/sky130_ml_xx_hd.tar.gz
+ (echo "Extracting sky130_ml_xx_hd..." && cd ../libs && tar -xf sky130_ml_xx_hd.tar.gz --strip-components 1 -C ../libs/sky130_ml_xx_hd)
+
+
+fi
+
+ export SKY130_ML_XX_HD_PATH=../libs/sky130_ml_xx_hd
+ }
+
+ # Check whether --enable-alpha-lib was given.
+if test "${enable_alpha_lib+set}" = set; then :
+ enableval=$enable_alpha_lib;
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ SKY130_ML_XX_HD_GET
+ XSCHEM_INST=1
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ echo "Disabling sky130_ml_xx_hd..."
+ XSCHEM_DISABLED=1
+ else
+ SKY130_ML_XX_HD_PATH=$enableval
+ fi
+ SKY130_ML_XX_HD_PATH=`readlink -f $SKY130_ML_XX_HD_PATH`
+
+fi
+
+
+
+
+
+
+
+XSCHEM_DISABLED=0
+XSCHEM_INST=0
+
+
+
+
+
+
+
+ # echo target targetvar flag url location
+
+ XSCHEM_PATH=""
+ XSCHEM_GET() {
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../tools/xschem" >&5
+$as_echo_n "checking for ../tools/xschem... " >&6; }
+if ${ac_cv_file____tools_xschem+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ test "$cross_compiling" = yes &&
+ as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
+if test -r "../tools/xschem"; then
+ ac_cv_file____tools_xschem=yes
+else
+ ac_cv_file____tools_xschem=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____tools_xschem" >&5
+$as_echo "$ac_cv_file____tools_xschem" >&6; }
+if test "x$ac_cv_file____tools_xschem" = xyes; then :
+
+ echo "Using pre-existing xschem download..."
+
+else
+
+ mkdir -p ../tools/xschem
+ sh ./download.sh 'https://github.com/StefanSchippers/xschem/archive/master.tar.gz' ../tools/xschem.tar.gz
+ (echo "Extracting xschem..." && cd ../tools && tar -xf xschem.tar.gz --strip-components 1 -C ../tools/xschem)
+
+
+fi
+
+ export XSCHEM_PATH=../tools/xschem
+ }
+
+ # Check whether --enable-xschem was given.
+if test "${enable_xschem+set}" = set; then :
+ enableval=$enable_xschem;
+ if test "$enableval" == "yes" -o "$enableval" == "YES"; then
+ XSCHEM_GET
+ XSCHEM_INST=1
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ echo "Disabling xschem..."
+ XSCHEM_DISABLED=1
+ else
+ XSCHEM_PATH=$enableval
+ fi
+ XSCHEM_PATH=`readlink -f $XSCHEM_PATH`
+
+fi
+
+
+
+ if [ "$XSCHEM_INST" = 1 ]; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ../tools/xschem-install" >&5
+$as_echo_n "checking for ../tools/xschem-install... " >&6; }
+if ${ac_cv_file____tools_xschem_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ test "$cross_compiling" = yes &&
+ as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5
+if test -r "../tools/xschem-install"; then
+ ac_cv_file____tools_xschem_install=yes
+else
+ ac_cv_file____tools_xschem_install=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file____tools_xschem_install" >&5
+$as_echo "$ac_cv_file____tools_xschem_install" >&6; }
+if test "x$ac_cv_file____tools_xschem_install" = xyes; then :
+
+ echo "Using pre-existing xschem installation..."
+
+else
+
+ 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
+
+ fi
+
+
@@ -2238,60 +2702,16 @@
fi
-# Extract the first word of "magic", so it can be a program name with args.
-set dummy magic; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MAGIC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $MAGIC in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_MAGIC="$MAGIC" # Let the user override the test with a path.
- ;;
- *)
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_MAGIC="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-fi
-MAGIC=$ac_cv_path_MAGIC
-if test -n "$MAGIC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC" >&5
-$as_echo "$MAGIC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-if test -z "$MAGIC"; then
- as_fn_error $? "You need 'magic' to generate the needed various cell views" "$LINENO" 5
-fi
-
# Check for "--with-ef-style"
EF_STYLE=0
# Check whether --with-ef-style was given.
if test "${with_ef_style+set}" = set; then :
withval=$with_ef_style;
- pdks_ef_style=$withval
- if test "$withval" == "yes" -o "$withval" == "YES"; then
- EF_STYLE=1
- fi
+ pdks_ef_style=$withval
+ if test "$withval" == "yes" -o "$withval" == "YES"; then
+ EF_STYLE=1
+ fi
fi
diff --git a/scripts/configure.ac b/scripts/configure.ac
index b615f48..1c06fcf 100755
--- a/scripts/configure.ac
+++ b/scripts/configure.ac
@@ -1,95 +1,118 @@
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 -name "Makefile.in" -exec dirname {} \; | tr "\n" " "))])
+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],
-[
- # --with-pdk-source=PDK_SOURCE_PATH
+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_=""
- AC_ARG_WITH(pdk-source,
- [AS_HELP_STRING([--with-pdk-source=/path/to/pdk/source], "location of the source files for pdk")],
- [pdkvar[]_SOURCE_PATH_=$withval]
+ 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]_url, [
+ AC_CHECK_FILE(../pdks/pdk,[
+ echo "Using pre-existing pdk download..."
+ ], [
+ mkdir -p ../pdks/pdk
+ sh dl $(cat "../pdk/pdk_get") ../pdks/pdk.tar.gz;
+ (echo "Extracting pdk..." && cd ../pdks && tar -xf pdk.tar.gz --strip-components 1 -C ../pdks/pdk)
+ ])
+ export pdkvar[]_SOURCE_PATH=../pdks/pdk
+ ], [
+ AC_MSG_ERROR([PDK pdk cannot be automatically downloaded and requires a path.])
+ ])
+ }
+
+ 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_get
+ elif test "$enableval" == "no" -o "$enableval" == "NO"; then
+ echo "Disabling pdk..."
+ else
+ export pdkvar[]_SOURCE_PATH=$enableval
+ fi
+ ], [
+ pdk_get
+ ]
)
+ # # 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
- # 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`
- 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])
+ ])
- # 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])
- ])
- AC_SUBST([]pdkvar[]_SOURCE_PATH)
- ])
+ # --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]
+ )
- # --with-pdk-local-path=PDK_LOCAL_PATH
- m4_foreach_w(pdk, $1, [
- m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z" "A-Z"))])
- pdkvar[]_LOCAL_PATH_=""
- AC_ARG_WITH(pdk-local-path,
- [AS_HELP_STRING([--with-pdk-local-path=/path/to/install/pdks], "run-time location of the PDKs")],
- [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
- AC_SUBST([]pdkvar[]_LOCAL_PATH)
- ])
+
+ # "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-dist-path=PDK_DIST_PATH
- m4_foreach_w(pdk, $1, [
- m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z" "A-Z"))])
- pdkvar[]_DIST_PATH_=""
- AC_ARG_WITH(pdk-dist-path,
- [AS_HELP_STRING([--with-pdk-dist-path=/path/to/install/pdks], "staging location to install the PDKs 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
- AC_SUBST([]pdkvar[]_DIST_PATH)
- ])
+ # --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
- # --with-pdk-link-targets=PDK_LINK_TARGETS
- m4_foreach_w(pdk, $1, [
- m4_define([pdkvar], [m4_normalize(m4_esyscmd(echo pdk | tr "a-z" "A-Z"))])
- # Default link_targets = "none"
- pdkvar[]_LINK_TARGETS="none"
-
- 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])
+ AC_SUBST(pdkvar[]_SOURCE_PATH)
+ AC_SUBST(pdkvar[]_LOCAL_PATH)
+ AC_SUBST(pdkvar[]_DIST_PATH)
+ AC_SUBST(pdkvar[]_LINK_TARGETS)
])
])
@@ -97,6 +120,110 @@
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"))])
@@ -126,22 +253,20 @@
AM_PATH_PYTHON([3.4])
AX_PYTHON_MODULE([distutils],[])
-AC_PATH_PROG(MAGIC, magic)
-if test -z "$MAGIC"; then
- AC_MSG_ERROR([You need 'magic' to generate the needed various cell views])
-fi
-
# 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_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)
diff --git a/scripts/print_tools_make.pl b/scripts/print_tools_make.pl
new file mode 100644
index 0000000..0a54494
--- /dev/null
+++ b/scripts/print_tools_make.pl
@@ -0,0 +1,21 @@
+#!/usr/bin/env perl
+#
+# This is a simple script that generates Makefile "TOOLS" flags.
+#
+# This is not used at all during part of any build or CI. It's a convenience
+# tool for open_pdks contributors.
+#
+open(FH, '<', "./tools.txt") or die $!;
+while (<FH>) {
+ chomp $_;
+ my $capitalized = uc $_;
+ my $disable_macro = "$capitalized\_DISABLED";
+ print <<"HD"
+# $disable_macro = 0 | 1
+$disable_macro = \@$disable_macro\@
+ifneq (\${$disable_macro}, 1)
+ TOOLS += $_
+endif
+
+HD
+}
\ No newline at end of file