1 # generated automatically by aclocal 1.16.1 -*- Autoconf -*- 2 3 # Copyright (C) 1996-2018 Free Software Foundation, Inc. 4 5 # This file is free software; the Free Software Foundation 6 # gives unlimited permission to copy and/or distribute it, 7 # with or without modifications, as long as this notice is preserved. 8 9 # This program is distributed in the hope that it will be useful, 10 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without 11 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A 12 # PARTICULAR PURPOSE. 13 14 m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) 15 m4_ifndef([AC_AUTOCONF_VERSION], 16 [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl 17 m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, 18 [m4_warning([this file was generated for autoconf 2.69. 19 You have another version of autoconf. It may work, but is not guaranteed to. 20 If you have problems, you may need to regenerate the build system entirely. 21 To do so, use the procedure documented by the package, typically 'autoreconf'.])]) 22 23 # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- 24 # serial 12 (pkg-config-0.29.2) 25 26 dnl Copyright © 2004 Scott James Remnant<EMAIL_ADDRESS>27 dnl Copyright © 2012-2015 Dan Nicholson<EMAIL_ADDRESS>28 dnl 29 dnl This program is free software; you can redistribute it and/or modify 30 dnl it under the terms of the GNU General Public License as published by 31 dnl the Free Software Foundation; either version 2 of the License, or 32 dnl (at your option) any later version. 33 dnl 34 dnl This program is distributed in the hope that it will be useful, but 35 dnl WITHOUT ANY WARRANTY; without even the implied warranty of 36 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 37 dnl General Public License for more details. 38 dnl 39 dnl You should have received a copy of the GNU General Public License 40 dnl along with this program; if not, write to the Free Software 41 dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 42 dnl 02111-1307, USA. 43 dnl 44 dnl As a special exception to the GNU General Public License, if you 45 dnl distribute this file as part of a program that contains a 46 dnl configuration script generated by Autoconf, you may include it under 47 dnl the same distribution terms that you use for the rest of that 48 dnl program. 49 50 dnl PKG_PREREQ(MIN-VERSION) 51 dnl ----------------------- 52 dnl Since: 0.29 53 dnl 54 dnl Verify that the version of the pkg-config macros are at least 55 dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's 56 dnl installed version of pkg-config, this checks the developer's version 57 dnl of pkg.m4 when generating configure. 58 dnl 59 dnl To ensure that this macro is defined, also add: 60 dnl m4_ifndef([PKG_PREREQ], 61 dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) 62 dnl 63 dnl See the "Since" comment for each macro you use to see what version 64 dnl of the macros you require. 65 m4_defun([PKG_PREREQ], 66 [m4_define([PKG_MACROS_VERSION], [0.29.2]) 67 m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, 68 [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) 69 ])dnl PKG_PREREQ 70 71 dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) 72 dnl ---------------------------------- 73 dnl Since: 0.16 74 dnl 75 dnl Search for the pkg-config tool and set the PKG_CONFIG variable to 76 dnl first found in the path. Checks that the version of pkg-config found 77 dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is 78 dnl used since that's the first version where most current features of 79 dnl pkg-config existed. 80 AC_DEFUN([PKG_PROG_PKG_CONFIG], 81 [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) 82 m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) 83 m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) 84 AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) 85 AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) 86 AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) 87 88 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then 89 AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) 90 fi 91 if test -n "$PKG_CONFIG"; then 92 _pkg_min_version=m4_default([$1], [0.9.0]) 93 AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) 94 if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then 95 AC_MSG_RESULT([yes]) 96 else 97 AC_MSG_RESULT([no]) 98 PKG_CONFIG="" 99 fi 100 fi[]dnl 101 ])dnl PKG_PROG_PKG_CONFIG 102 103 dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) 104 dnl ------------------------------------------------------------------- 105 dnl Since: 0.18 106 dnl 107 dnl Check to see whether a particular set of modules exists. Similar to 108 dnl PKG_CHECK_MODULES(), but does not set variables or print errors. 109 dnl 110 dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) 111 dnl only at the first occurence in configure.ac, so if the first place 112 dnl it's called might be skipped (such as if it is within an "if", you 113 dnl have to call PKG_CHECK_EXISTS manually 114 AC_DEFUN([PKG_CHECK_EXISTS], 115 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl 116 if test -n "$PKG_CONFIG" && \ 117 AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then 118 m4_default([$2], [:]) 119 m4_ifvaln([$3], [else 120 $3])dnl 121 fi]) 122 123 dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) 124 dnl --------------------------------------------- 125 dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting 126 dnl pkg_failed based on the result. 127 m4_define([_PKG_CONFIG], 128 [if test -n "$$1"; then 129 pkg_cv_[]$1="$$1" 130 elif test -n "$PKG_CONFIG"; then 131 PKG_CHECK_EXISTS([$3], 132 [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` 133 test "x$?" != "x0" && pkg_failed=yes ], 134 [pkg_failed=yes]) 135 else 136 pkg_failed=untried 137 fi[]dnl 138 ])dnl _PKG_CONFIG 139 140 dnl _PKG_SHORT_ERRORS_SUPPORTED 141 dnl --------------------------- 142 dnl Internal check to see if pkg-config supports short errors. 143 AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], 144 [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) 145 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then 146 _pkg_short_errors_supported=yes 147 else 148 _pkg_short_errors_supported=no 149 fi[]dnl 150 ])dnl _PKG_SHORT_ERRORS_SUPPORTED 151 152 153 dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], 154 dnl [ACTION-IF-NOT-FOUND]) 155 dnl -------------------------------------------------------------- 156 dnl Since: 0.4.0 157 dnl 158 dnl Note that if there is a possibility the first call to 159 dnl PKG_CHECK_MODULES might not happen, you should be sure to include an 160 dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac 161 AC_DEFUN([PKG_CHECK_MODULES], 162 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl 163 AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl 164 AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl 165 166 pkg_failed=no 167 AC_MSG_CHECKING([for $2]) 168 169 _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) 170 _PKG_CONFIG([$1][_LIBS], [libs], [$2]) 171 172 m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS 173 and $1[]_LIBS to avoid the need to call pkg-config. 174 See the pkg-config man page for more details.]) 175 176 if test $pkg_failed = yes; then 177 AC_MSG_RESULT([no]) 178 _PKG_SHORT_ERRORS_SUPPORTED 179 if test $_pkg_short_errors_supported = yes; then 180 $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` 181 else 182 $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` 183 fi 184 # Put the nasty error message in config.log where it belongs 185 echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD 186 187 m4_default([$4], [AC_MSG_ERROR( 188 [Package requirements ($2) were not met: 189 190 $$1_PKG_ERRORS 191 192 Consider adjusting the PKG_CONFIG_PATH environment variable if you 193 installed software in a non-standard prefix. 194 195 _PKG_TEXT])[]dnl 196 ]) 197 elif test $pkg_failed = untried; then 198 AC_MSG_RESULT([no]) 199 m4_default([$4], [AC_MSG_FAILURE( 200 [The pkg-config script could not be found or is too old. Make sure it 201 is in your PATH or set the PKG_CONFIG environment variable to the full 202 path to pkg-config. 203 204 _PKG_TEXT 205 206 To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl 207 ]) 208 else 209 $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS 210 $1[]_LIBS=$pkg_cv_[]$1[]_LIBS 211 AC_MSG_RESULT([yes]) 212 $3 213 fi[]dnl 214 ])dnl PKG_CHECK_MODULES 215 216 217 dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], 218 dnl [ACTION-IF-NOT-FOUND]) 219 dnl --------------------------------------------------------------------- 220 dnl Since: 0.29 221 dnl 222 dnl Checks for existence of MODULES and gathers its build flags with 223 dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags 224 dnl and VARIABLE-PREFIX_LIBS from --libs. 225 dnl 226 dnl Note that if there is a possibility the first call to 227 dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to 228 dnl include an explicit call to PKG_PROG_PKG_CONFIG in your 229 dnl configure.ac. 230 AC_DEFUN([PKG_CHECK_MODULES_STATIC], 231 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl 232 _save_PKG_CONFIG=$PKG_CONFIG 233 PKG_CONFIG="$PKG_CONFIG --static" 234 PKG_CHECK_MODULES($@) 235 PKG_CONFIG=$_save_PKG_CONFIG[]dnl 236 ])dnl PKG_CHECK_MODULES_STATIC 237 238 239 dnl PKG_INSTALLDIR([DIRECTORY]) 240 dnl ------------------------- 241 dnl Since: 0.27 242 dnl 243 dnl Substitutes the variable pkgconfigdir as the location where a module 244 dnl should install pkg-config .pc files. By default the directory is 245 dnl $libdir/pkgconfig, but the default can be changed by passing 246 dnl DIRECTORY. The user can override through the --with-pkgconfigdir 247 dnl parameter. 248 AC_DEFUN([PKG_INSTALLDIR], 249 [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) 250 m4_pushdef([pkg_description], 251 [pkg-config installation directory @<:@]pkg_default[@:>@]) 252 AC_ARG_WITH([pkgconfigdir], 253 [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, 254 [with_pkgconfigdir=]pkg_default) 255 AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) 256 m4_popdef([pkg_default]) 257 m4_popdef([pkg_description]) 258 ])dnl PKG_INSTALLDIR 259 260 261 dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) 262 dnl -------------------------------- 263 dnl Since: 0.27 264 dnl 265 dnl Substitutes the variable noarch_pkgconfigdir as the location where a 266 dnl module should install arch-independent pkg-config .pc files. By 267 dnl default the directory is $datadir/pkgconfig, but the default can be 268 dnl changed by passing DIRECTORY. The user can override through the 269 dnl --with-noarch-pkgconfigdir parameter. 270 AC_DEFUN([PKG_NOARCH_INSTALLDIR], 271 [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) 272 m4_pushdef([pkg_description], 273 [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) 274 AC_ARG_WITH([noarch-pkgconfigdir], 275 [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, 276 [with_noarch_pkgconfigdir=]pkg_default) 277 AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) 278 m4_popdef([pkg_default]) 279 m4_popdef([pkg_description]) 280 ])dnl PKG_NOARCH_INSTALLDIR 281 282 283 dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, 284 dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) 285 dnl ------------------------------------------- 286 dnl Since: 0.28 287 dnl 288 dnl Retrieves the value of the pkg-config variable for the given module. 289 AC_DEFUN([PKG_CHECK_VAR], 290 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl 291 AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl 292 293 _PKG_CONFIG([$1], [variable="][$3]["], [$2]) 294 AS_VAR_COPY([$1], [pkg_cv_][$1]) 295 296 AS_VAR_IF([$1], [""], [$5], [$4])dnl 297 ])dnl PKG_CHECK_VAR 298 299 # Copyright (C) 2002-2018 Free Software Foundation, Inc. 300 # 301 # This file is free software; the Free Software Foundation 302 # gives unlimited permission to copy and/or distribute it, 303 # with or without modifications, as long as this notice is preserved. 304 305 # AM_AUTOMAKE_VERSION(VERSION) 306 # ---------------------------- 307 # Automake X.Y traces this macro to ensure aclocal.m4 has been 308 # generated from the m4 files accompanying Automake X.Y. 309 # (This private macro should not be called outside this file.) 310 AC_DEFUN([AM_AUTOMAKE_VERSION], 311 [am__api_version='1.16' 312 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to 313 dnl require some minimum version. Point them to the right macro. 314 m4_if([$1], [1.16.1], [], 315 [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl 316 ]) 317 318 # _AM_AUTOCONF_VERSION(VERSION) 319 # ----------------------------- 320 # aclocal traces this macro to find the Autoconf version. 321 # This is a private macro too. Using m4_define simplifies 322 # the logic in aclocal, which can simply ignore this definition. 323 m4_define([_AM_AUTOCONF_VERSION], []) 324 325 # AM_SET_CURRENT_AUTOMAKE_VERSION 326 # ------------------------------- 327 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. 328 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. 329 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], 330 [AM_AUTOMAKE_VERSION([1.16.1])dnl 331 m4_ifndef([AC_AUTOCONF_VERSION], 332 [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl 333 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) 334 335 # AM_AUX_DIR_EXPAND -*- Autoconf -*- 336 337 # Copyright (C) 2001-2018 Free Software Foundation, Inc. 338 # 339 # This file is free software; the Free Software Foundation 340 # gives unlimited permission to copy and/or distribute it, 341 # with or without modifications, as long as this notice is preserved. 342 343 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets 344 # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to 345 # '$srcdir', '$srcdir/..', or '$srcdir/../..'. 346 # 347 # Of course, Automake must honor this variable whenever it calls a 348 # tool from the auxiliary directory. The problem is that $srcdir (and 349 # therefore $ac_aux_dir as well) can be either absolute or relative, 350 # depending on how configure is run. This is pretty annoying, since 351 # it makes $ac_aux_dir quite unusable in subdirectories: in the top 352 # source directory, any form will work fine, but in subdirectories a 353 # relative path needs to be adjusted first. 354 # 355 # $ac_aux_dir/missing 356 # fails when called from a subdirectory if $ac_aux_dir is relative 357 # $top_srcdir/$ac_aux_dir/missing 358 # fails if $ac_aux_dir is absolute, 359 # fails when called from a subdirectory in a VPATH build with 360 # a relative $ac_aux_dir 361 # 362 # The reason of the latter failure is that $top_srcdir and $ac_aux_dir 363 # are both prefixed by $srcdir. In an in-source build this is usually 364 # harmless because $srcdir is '.', but things will broke when you 365 # start a VPATH build or use an absolute $srcdir. 366 # 367 # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, 368 # iff we strip the leading $srcdir from $ac_aux_dir. That would be: 369 # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` 370 # and then we would define $MISSING as 371 # MISSING="\${SHELL} $am_aux_dir/missing" 372 # This will work as long as MISSING is not called from configure, because 373 # unfortunately $(top_srcdir) has no meaning in configure. 374 # However there are other variables, like CC, which are often used in 375 # configure, and could therefore not use this "fixed" $ac_aux_dir. 376 # 377 # Another solution, used here, is to always expand $ac_aux_dir to an 378 # absolute PATH. The drawback is that using absolute paths prevent a 379 # configured tree to be moved without reconfiguration. 380 381 AC_DEFUN([AM_AUX_DIR_EXPAND], 382 [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl 383 # Expand $ac_aux_dir to an absolute path. 384 am_aux_dir=`cd "$ac_aux_dir" && pwd` 385 ]) 386 387 # AM_CONDITIONAL -*- Autoconf -*- 388 389 # Copyright (C) 1997-2018 Free Software Foundation, Inc. 390 # 391 # This file is free software; the Free Software Foundation 392 # gives unlimited permission to copy and/or distribute it, 393 # with or without modifications, as long as this notice is preserved. 394 395 # AM_CONDITIONAL(NAME, SHELL-CONDITION) 396 # ------------------------------------- 397 # Define a conditional. 398 AC_DEFUN([AM_CONDITIONAL], 399 [AC_PREREQ([2.52])dnl 400 m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], 401 [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl 402 AC_SUBST([$1_TRUE])dnl 403 AC_SUBST([$1_FALSE])dnl 404 _AM_SUBST_NOTMAKE([$1_TRUE])dnl 405 _AM_SUBST_NOTMAKE([$1_FALSE])dnl 406 m4_define([_AM_COND_VALUE_$1], [$2])dnl 407 if $2; then 408 $1_TRUE= 409 $1_FALSE='#' 410 else 411 $1_TRUE='#' 412 $1_FALSE= 413 fi 414 AC_CONFIG_COMMANDS_PRE( 415 [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then 416 AC_MSG_ERROR([[conditional "$1" was never defined. 417 Usually this means the macro was only invoked conditionally.]]) 418 fi])]) 419 420 # Copyright (C) 1999-2018 Free Software Foundation, Inc. 421 # 422 # This file is free software; the Free Software Foundation 423 # gives unlimited permission to copy and/or distribute it, 424 # with or without modifications, as long as this notice is preserved. 425 426 427 # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be 428 # written in clear, in which case automake, when reading aclocal.m4, 429 # will think it sees a *use*, and therefore will trigger all it's 430 # C support machinery. Also note that it means that autoscan, seeing 431 # CC etc. in the Makefile, will ask for an AC_PROG_CC use... 432 433 434 # _AM_DEPENDENCIES(NAME) 435 # ---------------------- 436 # See how the compiler implements dependency checking. 437 # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". 438 # We try a few techniques and use that to set a single cache variable. 439 # 440 # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was 441 # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular 442 # dependency, and given that the user is not expected to run this macro, 443 # just rely on AC_PROG_CC. 444 AC_DEFUN([_AM_DEPENDENCIES], 445 [AC_REQUIRE([AM_SET_DEPDIR])dnl 446 AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl 447 AC_REQUIRE([AM_MAKE_INCLUDE])dnl 448 AC_REQUIRE([AM_DEP_TRACK])dnl 449 450 m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], 451 [$1], [CXX], [depcc="$CXX" am_compiler_list=], 452 [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], 453 [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], 454 [$1], [UPC], [depcc="$UPC" am_compiler_list=], 455 [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], 456 [depcc="$$1" am_compiler_list=]) 457 458 AC_CACHE_CHECK([dependency style of $depcc], 459 [am_cv_$1_dependencies_compiler_type], 460 [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then 461 # We make a subdir and do the tests there. Otherwise we can end up 462 # making bogus files that we don't know about and never remove. For 463 # instance it was reported that on HP-UX the gcc test will end up 464 # making a dummy file named 'D' -- because '-MD' means "put the output 465 # in D". 466 rm -rf conftest.dir 467 mkdir conftest.dir 468 # Copy depcomp to subdir because otherwise we won't find it if we're 469 # using a relative directory. 470 cp "$am_depcomp" conftest.dir 471 cd conftest.dir 472 # We will build objects and dependencies in a subdirectory because 473 # it helps to detect inapplicable dependency modes. For instance 474 # both Tru64's cc and ICC support -MD to output dependencies as a 475 # side effect of compilation, but ICC will put the dependencies in 476 # the current directory while Tru64 will put them in the object 477 # directory. 478 mkdir sub 479 480 am_cv_$1_dependencies_compiler_type=none 481 if test "$am_compiler_list" = ""; then 482 am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` 483 fi 484 am__universal=false 485 m4_case([$1], [CC], 486 [case " $depcc " in #( 487 *\ -arch\ *\ -arch\ *) am__universal=true ;; 488 esac], 489 [CXX], 490 [case " $depcc " in #( 491 *\ -arch\ *\ -arch\ *) am__universal=true ;; 492 esac]) 493 494 for depmode in $am_compiler_list; do 495 # Setup a source with many dependencies, because some compilers 496 # like to wrap large dependency lists on column 80 (with \), and 497 # we should not choose a depcomp mode which is confused by this. 498 # 499 # We need to recreate these files for each test, as the compiler may 500 # overwrite some of them when testing with obscure command lines. 501 # This happens at least with the AIX C compiler. 502 : > sub/conftest.c 503 for i in 1 2 3 4 5 6; do 504 echo '#include "conftst'$i'.h"' >> sub/conftest.c 505 # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with 506 # Solaris 10 /bin/sh. 507 echo '/* dummy */' > sub/conftst$i.h 508 done 509 echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf 510 511 # We check with '-c' and '-o' for the sake of the "dashmstdout" 512 # mode. It turns out that the SunPro C++ compiler does not properly 513 # handle '-M -o', and we need to detect this. Also, some Intel 514 # versions had trouble with output in subdirs. 515 am__obj=sub/conftest.${OBJEXT-o} 516 am__minus_obj="-o $am__obj" 517 case $depmode in 518 gcc) 519 # This depmode causes a compiler race in universal mode. 520 test "$am__universal" = false || continue 521 ;; 522 nosideeffect) 523 # After this tag, mechanisms are not by side-effect, so they'll 524 # only be used when explicitly requested. 525 if test "x$enable_dependency_tracking" = xyes; then 526 continue 527 else 528 break 529 fi 530 ;; 531 msvc7 | msvc7msys | msvisualcpp | msvcmsys) 532 # This compiler won't grok '-c -o', but also, the minuso test has 533 # not run yet. These depmodes are late enough in the game, and 534 # so weak that their functioning should not be impacted. 535 am__obj=conftest.${OBJEXT-o} 536 am__minus_obj= 537 ;; 538 none) break ;; 539 esac 540 if depmode=$depmode \ 541 source=sub/conftest.c object=$am__obj \ 542 depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ 543 $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ 544 >/dev/null 2>conftest.err && 545 grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && 546 grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && 547 grep $am__obj sub/conftest.Po > /dev/null 2>&1 && 548 ${MAKE-make} -s -f confmf > /dev/null 2>&1; then 549 # icc doesn't choke on unknown options, it will just issue warnings 550 # or remarks (even with -Werror). So we grep stderr for any message 551 # that says an option was ignored or not supported. 552 # When given -MP, icc 7.0 and 7.1 complain thusly: 553 # icc: Command line warning: ignoring option '-M'; no argument required 554 # The diagnosis changed in icc 8.0: 555 # icc: Command line remark: option '-MP' not supported 556 if (grep 'ignoring option' conftest.err || 557 grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else 558 am_cv_$1_dependencies_compiler_type=$depmode 559 break 560 fi 561 fi 562 done 563 564 cd .. 565 rm -rf conftest.dir 566 else 567 am_cv_$1_dependencies_compiler_type=none 568 fi 569 ]) 570 AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) 571 AM_CONDITIONAL([am__fastdep$1], [ 572 test "x$enable_dependency_tracking" != xno \ 573 && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) 574 ]) 575 576 577 # AM_SET_DEPDIR 578 # ------------- 579 # Choose a directory name for dependency files. 580 # This macro is AC_REQUIREd in _AM_DEPENDENCIES. 581 AC_DEFUN([AM_SET_DEPDIR], 582 [AC_REQUIRE([AM_SET_LEADING_DOT])dnl 583 AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl 584 ]) 585 586 587 # AM_DEP_TRACK 588 # ------------ 589 AC_DEFUN([AM_DEP_TRACK], 590 [AC_ARG_ENABLE([dependency-tracking], [dnl 591 AS_HELP_STRING( 592 [--enable-dependency-tracking], 593 [do not reject slow dependency extractors]) 594 AS_HELP_STRING( 595 [--disable-dependency-tracking], 596 [speeds up one-time build])]) 597 if test "x$enable_dependency_tracking" != xno; then 598 am_depcomp="$ac_aux_dir/depcomp" 599 AMDEPBACKSLASH='\' 600 am__nodep='_no' 601 fi 602 AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) 603 AC_SUBST([AMDEPBACKSLASH])dnl 604 _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl 605 AC_SUBST([am__nodep])dnl 606 _AM_SUBST_NOTMAKE([am__nodep])dnl 607 ]) 608 609 # Generate code to set up dependency tracking. -*- Autoconf -*- 610 611 # Copyright (C) 1999-2018 Free Software Foundation, Inc. 612 # 613 # This file is free software; the Free Software Foundation 614 # gives unlimited permission to copy and/or distribute it, 615 # with or without modifications, as long as this notice is preserved. 616 617 # _AM_OUTPUT_DEPENDENCY_COMMANDS 618 # ------------------------------ 619 AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], 620 [{ 621 # Older Autoconf quotes --file arguments for eval, but not when files 622 # are listed without --file. Let's play safe and only enable the eval 623 # if we detect the quoting. 624 # TODO: see whether this extra hack can be removed once we start 625 # requiring Autoconf 2.70 or later. 626 AS_CASE([$CONFIG_FILES], 627 [*\'*], [eval set x "$CONFIG_FILES"], 628 [*], [set x $CONFIG_FILES]) 629 shift 630 # Used to flag and report bootstrapping failures. 631 am_rc=0 632 for am_mf 633 do 634 # Strip MF so we end up with the name of the file. 635 am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` 636 # Check whether this is an Automake generated Makefile which includes 637 # dependency-tracking related rules and includes. 638 # Grep'ing the whole file directly is not great: AIX grep has a line 639 # limit of 2048, but all sed's we know have understand at least 4000. 640 sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ 641 || continue 642 am_dirpart=`AS_DIRNAME(["$am_mf"])` 643 am_filepart=`AS_BASENAME(["$am_mf"])` 644 AM_RUN_LOG([cd "$am_dirpart" \ 645 && sed -e '/# am--include-marker/d' "$am_filepart" \ 646 | $MAKE -f - am--depfiles]) || am_rc=$? 647 done 648 if test $am_rc -ne 0; then 649 AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments 650 for automatic dependency tracking. Try re-running configure with the 651 '--disable-dependency-tracking' option to at least be able to build 652 the package (albeit without support for automatic dependency tracking).]) 653 fi 654 AS_UNSET([am_dirpart]) 655 AS_UNSET([am_filepart]) 656 AS_UNSET([am_mf]) 657 AS_UNSET([am_rc]) 658 rm -f conftest-deps.mk 659 } 660 ])# _AM_OUTPUT_DEPENDENCY_COMMANDS 661 662 663 # AM_OUTPUT_DEPENDENCY_COMMANDS 664 # ----------------------------- 665 # This macro should only be invoked once -- use via AC_REQUIRE. 666 # 667 # This code is only required when automatic dependency tracking is enabled. 668 # This creates each '.Po' and '.Plo' makefile fragment that we'll need in 669 # order to bootstrap the dependency handling code. 670 AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], 671 [AC_CONFIG_COMMANDS([depfiles], 672 [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], 673 [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) 674 675 # Do all the work for Automake. -*- Autoconf -*- 676 677 # Copyright (C) 1996-2018 Free Software Foundation, Inc. 678 # 679 # This file is free software; the Free Software Foundation 680 # gives unlimited permission to copy and/or distribute it, 681 # with or without modifications, as long as this notice is preserved. 682 683 # This macro actually does too much. Some checks are only needed if 684 # your package does certain things. But this isn't really a big deal. 685 686 dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. 687 m4_define([AC_PROG_CC], 688 m4_defn([AC_PROG_CC]) 689 [_AM_PROG_CC_C_O 690 ]) 691 692 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) 693 # AM_INIT_AUTOMAKE([OPTIONS]) 694 # ----------------------------------------------- 695 # The call with PACKAGE and VERSION arguments is the old style 696 # call (pre autoconf-2.50), which is being phased out. PACKAGE 697 # and VERSION should now be passed to AC_INIT and removed from 698 # the call to AM_INIT_AUTOMAKE. 699 # We support both call styles for the transition. After 700 # the next Automake release, Autoconf can make the AC_INIT 701 # arguments mandatory, and then we can depend on a new Autoconf 702 # release and drop the old call support. 703 AC_DEFUN([AM_INIT_AUTOMAKE], 704 [AC_PREREQ([2.65])dnl 705 dnl Autoconf wants to disallow AM_ names. We explicitly allow 706 dnl the ones we care about. 707 m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl 708 AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl 709 AC_REQUIRE([AC_PROG_INSTALL])dnl 710 if test "`cd $srcdir && pwd`" != "`pwd`"; then 711 # Use -I$(srcdir) only when $(srcdir) != ., so that make's output 712 # is not polluted with repeated "-I." 713 AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl 714 # test to see if srcdir already configured 715 if test -f $srcdir/config.status; then 716 AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) 717 fi 718 fi 719 720 # test whether we have cygpath 721 if test -z "$CYGPATH_W"; then 722 if (cygpath --version) >/dev/null 2>/dev/null; then 723 CYGPATH_W='cygpath -w' 724 else 725 CYGPATH_W=echo 726 fi 727 fi 728 AC_SUBST([CYGPATH_W]) 729 730 # Define the identity of the package. 731 dnl Distinguish between old-style and new-style calls. 732 m4_ifval([$2], 733 [AC_DIAGNOSE([obsolete], 734 [$0: two- and three-arguments forms are deprecated.]) 735 m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl 736 AC_SUBST([PACKAGE], [$1])dnl 737 AC_SUBST([VERSION], [$2])], 738 [_AM_SET_OPTIONS([$1])dnl 739 dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. 740 m4_if( 741 m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), 742 [ok:ok],, 743 [m4_fatal([AC_INIT should be called with package and version arguments])])dnl 744 AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl 745 AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl 746 747 _AM_IF_OPTION([no-define],, 748 [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) 749 AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl 750 751 # Some tools Automake needs. 752 AC_REQUIRE([AM_SANITY_CHECK])dnl 753 AC_REQUIRE([AC_ARG_PROGRAM])dnl 754 AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) 755 AM_MISSING_PROG([AUTOCONF], [autoconf]) 756 AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) 757 AM_MISSING_PROG([AUTOHEADER], [autoheader]) 758 AM_MISSING_PROG([MAKEINFO], [makeinfo]) 759 AC_REQUIRE([AM_PROG_INSTALL_SH])dnl 760 AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl 761 AC_REQUIRE([AC_PROG_MKDIR_P])dnl 762 # For better backward compatibility. To be removed once Automake 1.9.x 763 # dies out for good. For more background, see: 764 # <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> 765 # <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> 766 AC_SUBST([mkdir_p], ['$(MKDIR_P)']) 767 # We need awk for the "check" target (and possibly the TAP driver). The 768 # system "awk" is bad on some platforms. 769 AC_REQUIRE([AC_PROG_AWK])dnl 770 AC_REQUIRE([AC_PROG_MAKE_SET])dnl 771 AC_REQUIRE([AM_SET_LEADING_DOT])dnl 772 _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], 773 [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], 774 [_AM_PROG_TAR([v7])])]) 775 _AM_IF_OPTION([no-dependencies],, 776 [AC_PROVIDE_IFELSE([AC_PROG_CC], 777 [_AM_DEPENDENCIES([CC])], 778 [m4_define([AC_PROG_CC], 779 m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl 780 AC_PROVIDE_IFELSE([AC_PROG_CXX], 781 [_AM_DEPENDENCIES([CXX])], 782 [m4_define([AC_PROG_CXX], 783 m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl 784 AC_PROVIDE_IFELSE([AC_PROG_OBJC], 785 [_AM_DEPENDENCIES([OBJC])], 786 [m4_define([AC_PROG_OBJC], 787 m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl 788 AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], 789 [_AM_DEPENDENCIES([OBJCXX])], 790 [m4_define([AC_PROG_OBJCXX], 791 m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl 792 ]) 793 AC_REQUIRE([AM_SILENT_RULES])dnl 794 dnl The testsuite driver may need to know about EXEEXT, so add the 795 dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This 796 dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. 797 AC_CONFIG_COMMANDS_PRE(dnl 798 [m4_provide_if([_AM_COMPILER_EXEEXT], 799 [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl 800 801 # POSIX will say in a future version that running "rm -f" with no argument 802 # is OK; and we want to be able to make that assumption in our Makefile 803 # recipes. So use an aggressive probe to check that the usage we want is 804 # actually supported "in the wild" to an acceptable degree. 805 # See automake bug#10828. 806 # To make any issue more visible, cause the running configure to be aborted 807 # by default if the 'rm' program in use doesn't match our expectations; the 808 # user can still override this though. 809 if rm -f && rm -fr && rm -rf; then : OK; else 810 cat >&2 <<'END' 811 Oops! 812 813 Your 'rm' program seems unable to run without file operands specified 814 on the command line, even when the '-f' option is present. This is contrary 815 to the behaviour of most rm programs out there, and not conforming with 816 the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> 817 818 Please tell<EMAIL_ADDRESS>about your system, including the value 819 of your $PATH and any error possibly output before this message. This 820 can help us improve future automake versions. 821 822 END 823 if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then 824 echo 'Configuration will proceed anyway, since you have set the' >&2 825 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 826 echo >&2 827 else 828 cat >&2 <<'END' 829 Aborting the configuration process, to ensure you take notice of the issue. 830 831 You can download and install GNU coreutils to get an 'rm' implementation 832 that behaves properly: <https://www.gnu.org/software/coreutils/>. 833 834 If you want to complete the configuration process using your problematic 835 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM 836 to "yes", and re-run configure. 837 838 END 839 AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) 840 fi 841 fi 842 dnl The trailing newline in this macro's definition is deliberate, for 843 dnl backward compatibility and to allow trailing 'dnl'-style comments 844 dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. 845 ]) 846 847 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not 848 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further 849 dnl mangled by Autoconf and run in a shell conditional statement. 850 m4_define([_AC_COMPILER_EXEEXT], 851 m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) 852 853 # When config.status generates a header, we must update the stamp-h file. 854 # This file resides in the same directory as the config header 855 # that is generated. The stamp files are numbered to have different names. 856 857 # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the 858 # loop where config.status creates the headers, so we can generate 859 # our stamp files there. 860 AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], 861 [# Compute $1's index in $config_headers. 862 _am_arg=$1 863 _am_stamp_count=1 864 for _am_header in $config_headers :; do 865 case $_am_header in 866 $_am_arg | $_am_arg:* ) 867 break ;; 868 * ) 869 _am_stamp_count=`expr $_am_stamp_count + 1` ;; 870 esac 871 done 872 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) 873 874 # Copyright (C) 2001-2018 Free Software Foundation, Inc. 875 # 876 # This file is free software; the Free Software Foundation 877 # gives unlimited permission to copy and/or distribute it, 878 # with or without modifications, as long as this notice is preserved. 879 880 # AM_PROG_INSTALL_SH 881 # ------------------ 882 # Define $install_sh. 883 AC_DEFUN([AM_PROG_INSTALL_SH], 884 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 885 if test x"${install_sh+set}" != xset; then 886 case $am_aux_dir in 887 *\ * | *\ *) 888 install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; 889 *) 890 install_sh="\${SHELL} $am_aux_dir/install-sh" 891 esac 892 fi 893 AC_SUBST([install_sh])]) 894 895 # Copyright (C) 2003-2018 Free Software Foundation, Inc. 896 # 897 # This file is free software; the Free Software Foundation 898 # gives unlimited permission to copy and/or distribute it, 899 # with or without modifications, as long as this notice is preserved. 900 901 # Check whether the underlying file-system supports filenames 902 # with a leading dot. For instance MS-DOS doesn't. 903 AC_DEFUN([AM_SET_LEADING_DOT], 904 [rm -rf .tst 2>/dev/null 905 mkdir .tst 2>/dev/null 906 if test -d .tst; then 907 am__leading_dot=. 908 else 909 am__leading_dot=_ 910 fi 911 rmdir .tst 2>/dev/null 912 AC_SUBST([am__leading_dot])]) 913 914 # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- 915 # From Jim Meyering 916 917 # Copyright (C) 1996-2018 Free Software Foundation, Inc. 918 # 919 # This file is free software; the Free Software Foundation 920 # gives unlimited permission to copy and/or distribute it, 921 # with or without modifications, as long as this notice is preserved. 922 923 # AM_MAINTAINER_MODE([DEFAULT-MODE]) 924 # ---------------------------------- 925 # Control maintainer-specific portions of Makefiles. 926 # Default is to disable them, unless 'enable' is passed literally. 927 # For symmetry, 'disable' may be passed as well. Anyway, the user 928 # can override the default with the --enable/--disable switch. 929 AC_DEFUN([AM_MAINTAINER_MODE], 930 [m4_case(m4_default([$1], [disable]), 931 [enable], [m4_define([am_maintainer_other], [disable])], 932 [disable], [m4_define([am_maintainer_other], [enable])], 933 [m4_define([am_maintainer_other], [enable]) 934 m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) 935 AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) 936 dnl maintainer-mode's default is 'disable' unless 'enable' is passed 937 AC_ARG_ENABLE([maintainer-mode], 938 [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], 939 am_maintainer_other[ make rules and dependencies not useful 940 (and sometimes confusing) to the casual installer])], 941 [USE_MAINTAINER_MODE=$enableval], 942 [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) 943 AC_MSG_RESULT([$USE_MAINTAINER_MODE]) 944 AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) 945 MAINT=$MAINTAINER_MODE_TRUE 946 AC_SUBST([MAINT])dnl 947 ] 948 ) 949 950 # Check to see how 'make' treats includes. -*- Autoconf -*- 951 952 # Copyright (C) 2001-2018 Free Software Foundation, Inc. 953 # 954 # This file is free software; the Free Software Foundation 955 # gives unlimited permission to copy and/or distribute it, 956 # with or without modifications, as long as this notice is preserved. 957 958 # AM_MAKE_INCLUDE() 959 # ----------------- 960 # Check whether make has an 'include' directive that can support all 961 # the idioms we need for our automatic dependency tracking code. 962 AC_DEFUN([AM_MAKE_INCLUDE], 963 [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) 964 cat > confinc.mk << 'END' 965 am__doit: 966 @echo this is the am__doit target >confinc.out 967 .PHONY: am__doit 968 END 969 am__include="#" 970 am__quote= 971 # BSD make does it like this. 972 echo '.include "confinc.mk" # ignored' > confmf.BSD 973 # Other make implementations (GNU, Solaris 10, AIX) do it like this. 974 echo 'include confinc.mk # ignored' > confmf.GNU 975 _am_result=no 976 for s in GNU BSD; do 977 AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) 978 AS_CASE([$?:`cat confinc.out 2>/dev/null`], 979 ['0:this is the am__doit target'], 980 [AS_CASE([$s], 981 [BSD], [am__include='.include' am__quote='"'], 982 [am__include='include' am__quote=''])]) 983 if test "$am__include" != "#"; then 984 _am_result="yes ($s style)" 985 break 986 fi 987 done 988 rm -f confinc.* confmf.* 989 AC_MSG_RESULT([${_am_result}]) 990 AC_SUBST([am__include])]) 991 AC_SUBST([am__quote])]) 992 993 # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- 994 995 # Copyright (C) 1997-2018 Free Software Foundation, Inc. 996 # 997 # This file is free software; the Free Software Foundation 998 # gives unlimited permission to copy and/or distribute it, 999 # with or without modifications, as long as this notice is preserved. 1000 1001 # AM_MISSING_PROG(NAME, PROGRAM) 1002 # ------------------------------ 1003 AC_DEFUN([AM_MISSING_PROG], 1004 [AC_REQUIRE([AM_MISSING_HAS_RUN]) 1005 $1=${$1-"${am_missing_run}$2"} 1006 AC_SUBST($1)]) 1007 1008 # AM_MISSING_HAS_RUN 1009 # ------------------ 1010 # Define MISSING if not defined so far and test if it is modern enough. 1011 # If it is, set am_missing_run to use it, otherwise, to nothing. 1012 AC_DEFUN([AM_MISSING_HAS_RUN], 1013 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 1014 AC_REQUIRE_AUX_FILE([missing])dnl 1015 if test x"${MISSING+set}" != xset; then 1016 case $am_aux_dir in 1017 *\ * | *\ *) 1018 MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; 1019 *) 1020 MISSING="\${SHELL} $am_aux_dir/missing" ;; 1021 esac 1022 fi 1023 # Use eval to expand $SHELL 1024 if eval "$MISSING --is-lightweight"; then 1025 am_missing_run="$MISSING " 1026 else 1027 am_missing_run= 1028 AC_MSG_WARN(['missing' script is too old or missing]) 1029 fi 1030 ]) 1031 1032 # Helper functions for option handling. -*- Autoconf -*- 1033 1034 # Copyright (C) 2001-2018 Free Software Foundation, Inc. 1035 # 1036 # This file is free software; the Free Software Foundation 1037 # gives unlimited permission to copy and/or distribute it, 1038 # with or without modifications, as long as this notice is preserved. 1039 1040 # _AM_MANGLE_OPTION(NAME) 1041 # ----------------------- 1042 AC_DEFUN([_AM_MANGLE_OPTION], 1043 [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) 1044 1045 # _AM_SET_OPTION(NAME) 1046 # -------------------- 1047 # Set option NAME. Presently that only means defining a flag for this option. 1048 AC_DEFUN([_AM_SET_OPTION], 1049 [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) 1050 1051 # _AM_SET_OPTIONS(OPTIONS) 1052 # ------------------------ 1053 # OPTIONS is a space-separated list of Automake options. 1054 AC_DEFUN([_AM_SET_OPTIONS], 1055 [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) 1056 1057 # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) 1058 # ------------------------------------------- 1059 # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. 1060 AC_DEFUN([_AM_IF_OPTION], 1061 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) 1062 1063 # Copyright (C) 1999-2018 Free Software Foundation, Inc. 1064 # 1065 # This file is free software; the Free Software Foundation 1066 # gives unlimited permission to copy and/or distribute it, 1067 # with or without modifications, as long as this notice is preserved. 1068 1069 # _AM_PROG_CC_C_O 1070 # --------------- 1071 # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC 1072 # to automatically call this. 1073 AC_DEFUN([_AM_PROG_CC_C_O], 1074 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 1075 AC_REQUIRE_AUX_FILE([compile])dnl 1076 AC_LANG_PUSH([C])dnl 1077 AC_CACHE_CHECK( 1078 [whether $CC understands -c and -o together], 1079 [am_cv_prog_cc_c_o], 1080 [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) 1081 # Make sure it works both with $CC and with simple cc. 1082 # Following AC_PROG_CC_C_O, we do the test twice because some 1083 # compilers refuse to overwrite an existing .o file with -o, 1084 # though they will create one. 1085 am_cv_prog_cc_c_o=yes 1086 for am_i in 1 2; do 1087 if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ 1088 && test -f conftest2.$ac_objext; then 1089 : OK 1090 else 1091 am_cv_prog_cc_c_o=no 1092 break 1093 fi 1094 done 1095 rm -f core conftest* 1096 unset am_i]) 1097 if test "$am_cv_prog_cc_c_o" != yes; then 1098 # Losing compiler, so override with the script. 1099 # FIXME: It is wrong to rewrite CC. 1100 # But if we don't then we get into trouble of one sort or another. 1101 # A longer-term fix would be to have automake use am__CC in this case, 1102 # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" 1103 CC="$am_aux_dir/compile $CC" 1104 fi 1105 AC_LANG_POP([C])]) 1106 1107 # For backward compatibility. 1108 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) 1109 1110 # Copyright (C) 2001-2018 Free Software Foundation, Inc. 1111 # 1112 # This file is free software; the Free Software Foundation 1113 # gives unlimited permission to copy and/or distribute it, 1114 # with or without modifications, as long as this notice is preserved. 1115 1116 # AM_RUN_LOG(COMMAND) 1117 # ------------------- 1118 # Run COMMAND, save the exit status in ac_status, and log it. 1119 # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) 1120 AC_DEFUN([AM_RUN_LOG], 1121 [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD 1122 ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD 1123 ac_status=$? 1124 echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD 1125 (exit $ac_status); }]) 1126 1127 # Check to make sure that the build environment is sane. -*- Autoconf -*- 1128 1129 # Copyright (C) 1996-2018 Free Software Foundation, Inc. 1130 # 1131 # This file is free software; the Free Software Foundation 1132 # gives unlimited permission to copy and/or distribute it, 1133 # with or without modifications, as long as this notice is preserved. 1134 1135 # AM_SANITY_CHECK 1136 # --------------- 1137 AC_DEFUN([AM_SANITY_CHECK], 1138 [AC_MSG_CHECKING([whether build environment is sane]) 1139 # Reject unsafe characters in $srcdir or the absolute working directory 1140 # name. Accept space and tab only in the latter. 1141 am_lf=' 1142 ' 1143 case `pwd` in 1144 *[[\\\"\#\$\&\'\`$am_lf]]*) 1145 AC_MSG_ERROR([unsafe absolute working directory name]);; 1146 esac 1147 case $srcdir in 1148 *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) 1149 AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; 1150 esac 1151 1152 # Do 'set' in a subshell so we don't clobber the current shell's 1153 # arguments. Must try -L first in case configure is actually a 1154 # symlink; some systems play weird games with the mod time of symlinks 1155 # (eg FreeBSD returns the mod time of the symlink's containing 1156 # directory). 1157 if ( 1158 am_has_slept=no 1159 for am_try in 1 2; do 1160 echo "timestamp, slept: $am_has_slept" > conftest.file 1161 set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` 1162 if test "$[*]" = "X"; then 1163 # -L didn't work. 1164 set X `ls -t "$srcdir/configure" conftest.file` 1165 fi 1166 if test "$[*]" != "X $srcdir/configure conftest.file" \ 1167 && test "$[*]" != "X conftest.file $srcdir/configure"; then 1168 1169 # If neither matched, then we have a broken ls. This can happen 1170 # if, for instance, CONFIG_SHELL is bash and it inherits a 1171 # broken ls alias from the environment. This has actually 1172 # happened. Such a system could not be considered "sane". 1173 AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken 1174 alias in your environment]) 1175 fi 1176 if test "$[2]" = conftest.file || test $am_try -eq 2; then 1177 break 1178 fi 1179 # Just in case. 1180 sleep 1 1181 am_has_slept=yes 1182 done 1183 test "$[2]" = conftest.file 1184 ) 1185 then 1186 # Ok. 1187 : 1188 else 1189 AC_MSG_ERROR([newly created file is older than distributed files! 1190 Check your system clock]) 1191 fi 1192 AC_MSG_RESULT([yes]) 1193 # If we didn't sleep, we still need to ensure time stamps of config.status and 1194 # generated files are strictly newer. 1195 am_sleep_pid= 1196 if grep 'slept: no' conftest.file >/dev/null 2>&1; then 1197 ( sleep 1 ) & 1198 am_sleep_pid=$! 1199 fi 1200 AC_CONFIG_COMMANDS_PRE( 1201 [AC_MSG_CHECKING([that generated files are newer than configure]) 1202 if test -n "$am_sleep_pid"; then 1203 # Hide warnings about reused PIDs. 1204 wait $am_sleep_pid 2>/dev/null 1205 fi 1206 AC_MSG_RESULT([done])]) 1207 rm -f conftest.file 1208 ]) 1209 1210 # Copyright (C) 2009-2018 Free Software Foundation, Inc. 1211 # 1212 # This file is free software; the Free Software Foundation 1213 # gives unlimited permission to copy and/or distribute it, 1214 # with or without modifications, as long as this notice is preserved. 1215 1216 # AM_SILENT_RULES([DEFAULT]) 1217 # -------------------------- 1218 # Enable less verbose build rules; with the default set to DEFAULT 1219 # ("yes" being less verbose, "no" or empty being verbose). 1220 AC_DEFUN([AM_SILENT_RULES], 1221 [AC_ARG_ENABLE([silent-rules], [dnl 1222 AS_HELP_STRING( 1223 [--enable-silent-rules], 1224 [less verbose build output (undo: "make V=1")]) 1225 AS_HELP_STRING( 1226 [--disable-silent-rules], 1227 [verbose build output (undo: "make V=0")])dnl 1228 ]) 1229 case $enable_silent_rules in @%:@ ((( 1230 yes) AM_DEFAULT_VERBOSITY=0;; 1231 no) AM_DEFAULT_VERBOSITY=1;; 1232 *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; 1233 esac 1234 dnl 1235 dnl A few 'make' implementations (e.g., NonStop OS and NextStep) 1236 dnl do not support nested variable expansions. 1237 dnl See automake bug#9928 and bug#10237. 1238 am_make=${MAKE-make} 1239 AC_CACHE_CHECK([whether $am_make supports nested variables], 1240 [am_cv_make_support_nested_variables], 1241 [if AS_ECHO([['TRUE=$(BAR$(V)) 1242 BAR0=false 1243 BAR1=true 1244 V=1 1245 am__doit: 1246 @$(TRUE) 1247 .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then 1248 am_cv_make_support_nested_variables=yes 1249 else 1250 am_cv_make_support_nested_variables=no 1251 fi]) 1252 if test $am_cv_make_support_nested_variables = yes; then 1253 dnl Using '$V' instead of '$(V)' breaks IRIX make. 1254 AM_V='$(V)' 1255 AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' 1256 else 1257 AM_V=$AM_DEFAULT_VERBOSITY 1258 AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY 1259 fi 1260 AC_SUBST([AM_V])dnl 1261 AM_SUBST_NOTMAKE([AM_V])dnl 1262 AC_SUBST([AM_DEFAULT_V])dnl 1263 AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl 1264 AC_SUBST([AM_DEFAULT_VERBOSITY])dnl 1265 AM_BACKSLASH='\' 1266 AC_SUBST([AM_BACKSLASH])dnl 1267 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl 1268 ]) 1269 1270 # Copyright (C) 2001-2018 Free Software Foundation, Inc. 1271 # 1272 # This file is free software; the Free Software Foundation 1273 # gives unlimited permission to copy and/or distribute it, 1274 # with or without modifications, as long as this notice is preserved. 1275 1276 # AM_PROG_INSTALL_STRIP 1277 # --------------------- 1278 # One issue with vendor 'install' (even GNU) is that you can't 1279 # specify the program used to strip binaries. This is especially 1280 # annoying in cross-compiling environments, where the build's strip 1281 # is unlikely to handle the host's binaries. 1282 # Fortunately install-sh will honor a STRIPPROG variable, so we 1283 # always use install-sh in "make install-strip", and initialize 1284 # STRIPPROG with the value of the STRIP variable (set by the user). 1285 AC_DEFUN([AM_PROG_INSTALL_STRIP], 1286 [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl 1287 # Installed binaries are usually stripped using 'strip' when the user 1288 # run "make install-strip". However 'strip' might not be the right 1289 # tool to use in cross-compilation environments, therefore Automake 1290 # will honor the 'STRIP' environment variable to overrule this program. 1291 dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. 1292 if test "$cross_compiling" != no; then 1293 AC_CHECK_TOOL([STRIP], [strip], :) 1294 fi 1295 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" 1296 AC_SUBST([INSTALL_STRIP_PROGRAM])]) 1297 1298 # Copyright (C) 2006-2018 Free Software Foundation, Inc. 1299 # 1300 # This file is free software; the Free Software Foundation 1301 # gives unlimited permission to copy and/or distribute it, 1302 # with or without modifications, as long as this notice is preserved. 1303 1304 # _AM_SUBST_NOTMAKE(VARIABLE) 1305 # --------------------------- 1306 # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. 1307 # This macro is traced by Automake. 1308 AC_DEFUN([_AM_SUBST_NOTMAKE]) 1309 1310 # AM_SUBST_NOTMAKE(VARIABLE) 1311 # -------------------------- 1312 # Public sister of _AM_SUBST_NOTMAKE. 1313 AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) 1314 1315 # Check how to create a tarball. -*- Autoconf -*- 1316 1317 # Copyright (C) 2004-2018 Free Software Foundation, Inc. 1318 # 1319 # This file is free software; the Free Software Foundation 1320 # gives unlimited permission to copy and/or distribute it, 1321 # with or without modifications, as long as this notice is preserved. 1322 1323 # _AM_PROG_TAR(FORMAT) 1324 # -------------------- 1325 # Check how to create a tarball in format FORMAT. 1326 # FORMAT should be one of 'v7', 'ustar', or 'pax'. 1327 # 1328 # Substitute a variable $(am__tar) that is a command 1329 # writing to stdout a FORMAT-tarball containing the directory 1330 # $tardir. 1331 # tardir=directory && $(am__tar) > result.tar 1332 # 1333 # Substitute a variable $(am__untar) that extract such 1334 # a tarball read from stdin. 1335 # $(am__untar) < result.tar 1336 # 1337 AC_DEFUN([_AM_PROG_TAR], 1338 [# Always define AMTAR for backward compatibility. Yes, it's still used 1339 # in the wild :-( We should find a proper way to deprecate it ... 1340 AC_SUBST([AMTAR], ['$${TAR-tar}']) 1341 1342 # We'll loop over all known methods to create a tar archive until one works. 1343 _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' 1344 1345 m4_if([$1], [v7], 1346 [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], 1347 1348 [m4_case([$1], 1349 [ustar], 1350 [# The POSIX 1988 'ustar' format is defined with fixed-size fields. 1351 # There is notably a 21 bits limit for the UID and the GID. In fact, 1352 # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 1353 # and bug#13588). 1354 am_max_uid=2097151 # 2^21 - 1 1355 am_max_gid=$am_max_uid 1356 # The $UID and $GID variables are not portable, so we need to resort 1357 # to the POSIX-mandated id(1) utility. Errors in the 'id' calls 1358 # below are definitely unexpected, so allow the users to see them 1359 # (that is, avoid stderr redirection). 1360 am_uid=`id -u || echo unknown` 1361 am_gid=`id -g || echo unknown` 1362 AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) 1363 if test $am_uid -le $am_max_uid; then 1364 AC_MSG_RESULT([yes]) 1365 else 1366 AC_MSG_RESULT([no]) 1367 _am_tools=none 1368 fi 1369 AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) 1370 if test $am_gid -le $am_max_gid; then 1371 AC_MSG_RESULT([yes]) 1372 else 1373 AC_MSG_RESULT([no]) 1374 _am_tools=none 1375 fi], 1376 1377 [pax], 1378 [], 1379 1380 [m4_fatal([Unknown tar format])]) 1381 1382 AC_MSG_CHECKING([how to create a $1 tar archive]) 1383 1384 # Go ahead even if we have the value already cached. We do so because we 1385 # need to set the values for the 'am__tar' and 'am__untar' variables. 1386 _am_tools=${am_cv_prog_tar_$1-$_am_tools} 1387 1388 for _am_tool in $_am_tools; do 1389 case $_am_tool in 1390 gnutar) 1391 for _am_tar in tar gnutar gtar; do 1392 AM_RUN_LOG([$_am_tar --version]) && break 1393 done 1394 am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' 1395 am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' 1396 am__untar="$_am_tar -xf -" 1397 ;; 1398 plaintar) 1399 # Must skip GNU tar: if it does not support --format= it doesn't create 1400 # ustar tarball either. 1401 (tar --version) >/dev/null 2>&1 && continue 1402 am__tar='tar chf - "$$tardir"' 1403 am__tar_='tar chf - "$tardir"' 1404 am__untar='tar xf -' 1405 ;; 1406 pax) 1407 am__tar='pax -L -x $1 -w "$$tardir"' 1408 am__tar_='pax -L -x $1 -w "$tardir"' 1409 am__untar='pax -r' 1410 ;; 1411 cpio) 1412 am__tar='find "$$tardir" -print | cpio -o -H $1 -L' 1413 am__tar_='find "$tardir" -print | cpio -o -H $1 -L' 1414 am__untar='cpio -i -H $1 -d' 1415 ;; 1416 none) 1417 am__tar=false 1418 am__tar_=false 1419 am__untar=false 1420 ;; 1421 esac 1422 1423 # If the value was cached, stop now. We just wanted to have am__tar 1424 # and am__untar set. 1425 test -n "${am_cv_prog_tar_$1}" && break 1426 1427 # tar/untar a dummy directory, and stop if the command works. 1428 rm -rf conftest.dir 1429 mkdir conftest.dir 1430 echo GrepMe > conftest.dir/file 1431 AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) 1432 rm -rf conftest.dir 1433 if test -s conftest.tar; then 1434 AM_RUN_LOG([$am__untar <conftest.tar]) 1435 AM_RUN_LOG([cat conftest.dir/file]) 1436 grep GrepMe conftest.dir/file >/dev/null 2>&1 && break 1437 fi 1438 done 1439 rm -rf conftest.dir 1440 1441 AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) 1442 AC_MSG_RESULT([$am_cv_prog_tar_$1])]) 1443 1444 AC_SUBST([am__tar]) 1445 AC_SUBST([am__untar]) 1446 ]) # _AM_PROG_TAR 1447 1448 m4_include([m4/libtool.m4]) 1449 m4_include([m4/ltoptions.m4]) 1450 m4_include([m4/ltsugar.m4]) 1451 m4_include([m4/ltversion.m4]) 1452 m4_include([m4/lt~obsolete.m4]) 1453 m4_include([acinclude.m4])


Let’s draw some one dimensional cellular automata!
module CA where
import qualified Codec.Picture as JP
import qualified Data.List as L
import qualified Data.Set as S
A cellular automaton is a discrete model of “space”. It consists of
It’s not too hard to see that these properties make cellular automata (CA for short) a very special and restricted model of how the universe appears to work. That’s not at all to say that the actual universe “is” a CA, any more than brains “are” neural networks; this is just a mathematical model that happens to do some cool stuff and show that complex rules are not necessary for systems to exhibit complex behavior.
If a CA is small enough we can draw pictures of it, which is super fun! Conway’s Game of Life, Langston’s Ant, and Wireworld are super neato examples of cellular automata. These examples are also two-dimensional, because they take place on a square grid. (Although it turns out nailing down exactly what dimension means for a discrete space is surprisingly tricky!) Any particular configuration of the grid is a generation, and we can visualize time moving forward by animating the grid – one frame per generation.
Even simpler are the one-dimensional automata. These inhabit a universe where every location in space corresponds to an integer, and the immediate neighbors of location \(k\) are locations \(k-1\) and \(k+1\). Now we can visualize the evolution of the automaton with a single static image – each generation is represented by a row of pixels, and time flows down.
Let’s write some code that draws one-dimensional automata. To keep it simple we can restrict even further. Every CA needs, in addition to the space it inhabits, two pieces of information: the state space for each location, and the rules that govern how states change from one time step to the next. Typically the rules are set up so that states can only influence each other within some maximum radius.
The simplest possible one-dimensional CA have two states (Black/White or On/Off) and the rules have radius 1. These very simple examples are sometimes called elementary.
We need a way to represent a single generation. Since our CA has only two states (On and Off) it’s enough to keep track of which cells are On, and since the space is one dimensional it’s enough to keep track of which integers have On cells in them. If we make the reasonably mild assumption that only finitely many cells can be on in a given generation, we can represent generations using finite sets of integers. As a minor optimization we’ll also keep track of the largest and smallest On cells. (I’m not sure this is necessary but it seemed like a good idea at the time!)
data Generation = G
{ borders :: (Integer, Integer) -- extreme set bits
, setBits :: S.Set Integer
} deriving Show
Given a generation and a cell address, we can ask whether that cell is On or Off.
isOn
:: Generation -> Integer -> Bool
isOn (G (lo,hi) m) k =
if (k < lo) || (hi < k)
then False
else S.member k m
Given a generation and a range of cell addresses, we can get a list of booleans representing the pattern of On and Off cells in those addresses.
getGeneration
:: (Integer, Integer) -- render window
-> Generation
-> [Bool]
getGeneration (a, b) g =
map (isOn g) [a..b]
Finally, given a generation we can construct the next generation. In order to do this we need an update rule. For elementary CA the value of cell \(k\) at time step \(i\) depends only on the values of \(k-1\), \(k\), and \(k+1\) at time step \(i-1\). So we can model the update rule using a single function that takes 3 booleans and returns a boolean. Also note that the boundary values expand by 1 at each step.
nextGeneration
:: (Bool -> Bool -> Bool -> Bool) -- update rule
-> Generation
-> Generation
nextGeneration f (G (a,b) m) = G (a-1, b+1) $
S.fromList $ filter h [(a-1)..(b+1)]
where
h i = f
(S.member (i-1) m)
(S.member i m)
(S.member (i+1) m)
For visual debugging in the terminal, we also define a function that renders a single generation to text.
renderGeneration
:: (Integer, Integer) -- render window
-> Generation
-> String
renderGeneration (a, b) g =
map renderCell $ getGeneration (a,b) g
renderCell
:: Bool -> Char
renderCell p =
if p then 'X' else ' '
Now we can represent the future of a CA as a list of generations…
…and we can get a list of lists of booleans representing the state of the CA over a range of times and cell addresses.
getHistory
:: (Integer, Integer) -- height (time)
-> (Integer, Integer) -- width (space)
-> History
-> [[Bool]]
getHistory (u,v) w (H gs) =
map (getGeneration w) $ L.genericTake (v-u) $ L.genericDrop (u-1) gs
Again, for debugging at the terminal here’s a function that renders a CA as a string.
renderHistory
:: (Integer, Integer) -- height
-> (Integer, Integer) -- width
-> History
-> String
renderHistory (u,v) w g =
L.unlines $ map (map renderCell) $ getHistory (u,v) w g
Next we have a helper function that constructs the history of a CA from its initial state and update function.
populate
:: Generation -- first generation
-> (Bool -> Bool -> Bool -> Bool) -- update rule
-> History
populate initial update = H (f initial)
where
f :: Generation -> [Generation]
f g = g : f (nextGeneration update g)
And a helper function for constructing the initial generation by supplying a list of set locations.
We’re almost there. The only remaining bit is to define at least one specific update rule. For elementary CA there are only \(256 = 2^8\) possible rules, which have a natural indexing scheme. Most of the possible rules are not very interesting, but one particularly cool example is the so-called rule 30, defined like this:
rule30 :: Bool -> Bool -> Bool -> Bool
rule30 p1 p2 p3 = case (p1, p2, p3) of
(True, True, True) -> False
(True, True, False) -> False
(True, False, True) -> False
(True, False, False) -> True
(False, True, True) -> True
(False, True, False) -> True
(False, False, True) -> True
(False, False, False) -> False
To actually visualize the evolution of a CA we’ll define two more helpers.  But the chunky resolution of text means there’s a pretty low limit to how much of the CA’s history we can see at once. To get around this we can also render them as PNGs:
renderPng
:: FilePath
-> Generation
-> (Integer, Integer)
-> (Integer, Integer)
-> IO ()
renderPng path initial (h1, h2) (w1, w2) = do
let
imgWidth = fromIntegral $ w2 - w1
imgHeight = fromIntegral $ h2 - h1
png = JP.generateImage px imgWidth imgHeight
h = getHistory (h1, h2) (w1, w2) $ populate initial rule30
px i j = if (h !! j) !! i
then JP.PixelRGB8 0 0 0
else JP.PixelRGB8 255 255 255
JP.savePngImage path (JP.ImageRGB8 png)
Here’s some examples. These take a few seconds to render. (View image to zoom in!)
$> renderPng "foo.png" (withBits [0]) (0,1000) (-1000,1000)
$> renderPng "foo.png" (withBits [-500,500]) (0,1000) (-1000,1000)
$> renderPng "foo.png" (withBits [0]) (1000,2000) (-1000,1000)