| 1 | dnl Cycript - The Truly Universal Scripting Language |
| 2 | dnl Copyright (C) 2009-2016 Jay Freeman (saurik) |
| 3 | |
| 4 | dnl GNU Affero General Public License, Version 3 {{{ |
| 5 | dnl |
| 6 | dnl This program is free software: you can redistribute it and/or modify |
| 7 | dnl it under the terms of the GNU Affero General Public License as published by |
| 8 | dnl the Free Software Foundation, either version 3 of the License, or |
| 9 | dnl (at your option) any later version. |
| 10 | dnl |
| 11 | dnl This program is distributed in the hope that it will be useful, |
| 12 | dnl but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | dnl GNU Affero General Public License for more details. |
| 15 | dnl |
| 16 | dnl You should have received a copy of the GNU Affero General Public License |
| 17 | dnl along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 18 | dnl }}} |
| 19 | |
| 20 | AC_PREREQ([2.65]) |
| 21 | AC_INIT([Cycript], [0.9], [saurik@saurik.com], [cycript], [http://www.cycript.org/]) |
| 22 | AC_COPYRIGHT([Copyright (C) 2009-2016 Jay Freeman (saurik)]) |
| 23 | |
| 24 | AC_CONFIG_SRCDIR([Console.cpp]) |
| 25 | AC_CONFIG_AUX_DIR([.]) |
| 26 | AC_CONFIG_MACRO_DIR([m4]) |
| 27 | AC_CONFIG_HEADERS([config.h]) |
| 28 | |
| 29 | AM_INIT_AUTOMAKE([-Wall -Werror foreign]) |
| 30 | AM_MAINTAINER_MODE([disable]) |
| 31 | |
| 32 | AC_PROG_CC |
| 33 | AC_PROG_CXX |
| 34 | AC_PROG_OBJCXX |
| 35 | |
| 36 | AX_PROG_CXX_FOR_BUILD |
| 37 | |
| 38 | AM_PROG_AR |
| 39 | AC_PROG_INSTALL |
| 40 | |
| 41 | LT_INIT([disable-static]) |
| 42 | |
| 43 | AC_LANG([C++]) |
| 44 | |
| 45 | AX_CXX_COMPILE_STDCXX_11([ext], [mandatory]) |
| 46 | OBJCXXFLAGS="${OBJCXXFLAGS} ${CXXFLAGS##*' '}" |
| 47 | |
| 48 | PKG_PROG_PKG_CONFIG([0.22]) |
| 49 | |
| 50 | AC_PATH_PROG([GIT], [git]) |
| 51 | AC_PATH_PROG([TIME], [time]) |
| 52 | |
| 53 | dnl CY_CHECK_PROGS_VERSION {{{ |
| 54 | AC_DEFUN([CY_CHECK_PROGS_VERSION], [ |
| 55 | AC_ARG_VAR(]$1[, ]$3[) |
| 56 | |
| 57 | AC_MSG_CHECKING(for ]$2[ >= ]$5[) |
| 58 | AC_PATH_PROGS_FEATURE_CHECK(]$1[, ]$2[, |
| 59 | AS_VAR_SET(version, [`$ac_path_]$1[ ]$4[`]) |
| 60 | AS_VAR_IF(version, [], , |
| 61 | AS_VERSION_COMPARE($version, ]$5[, , |
| 62 | ac_cv_path_]$1[=$ac_path_]$1[, |
| 63 | ac_cv_path_]$1[=$ac_path_]$1[)) |
| 64 | , AC_MSG_RESULT(no)) |
| 65 | |
| 66 | AS_IF([true], [ |
| 67 | AC_SUBST(]$1[, $ac_cv_path_]$1[) |
| 68 | AC_MSG_RESULT($]$1[) |
| 69 | ], AS_IF([true], [ |
| 70 | AC_MSG_ERROR(You need ]$2[ ]$5[ or greater) |
| 71 | ], [ |
| 72 | AC_SUBST(]$1[, [:]) |
| 73 | AC_MSG_RESULT([no]) |
| 74 | ])) |
| 75 | ]) dnl }}} |
| 76 | |
| 77 | CY_CHECK_PROGS_VERSION([BISON], [bison], [GNU Project parser generator (yacc replacement)], |
| 78 | [-V | $SED -e '1 s/^bison (GNU Bison) \(.*\)$/\1/p;d'], [3.0]) |
| 79 | CY_CHECK_PROGS_VERSION([FLEX], [flex], [the fast lexical analyser generator], |
| 80 | [--version | $SED -e '1 s/^@<:@^0-9.@:>@* \(@<:@0-9.@:>@*\).*$/\1/p;d'], [2.5.33]) |
| 81 | CY_CHECK_PROGS_VERSION([GPERF], [gperf], [perfect hash function generator], |
| 82 | [--version | $SED -e '1 s/^.* \(@<:@0-9.@:>@*\)$/\1/p;d'], [3.0.3]) |
| 83 | CY_CHECK_PROGS_VERSION([GNUTAR], [tar gtar gnutar], [a very sticky lump of files], |
| 84 | [--version | $SED -e '1 s/^tar (GNU tar) \(.*\)$/\1/p;d'], [1.19]) |
| 85 | |
| 86 | dnl CY_TRY {{{ |
| 87 | AC_DEFUN([CY_SUCCESS], [cy_good=1]) |
| 88 | AC_DEFUN([CY_FAILURE], [cy_good=0]) |
| 89 | |
| 90 | AC_DEFUN([CY_TRY], [ |
| 91 | cy_save=$]$1[ |
| 92 | AC_LIB_APPENDTOVAR(]$1[, ]$2[) |
| 93 | ]$3[ |
| 94 | ]$1[=$cy_save |
| 95 | AS_IF([test "x$cy_good" = x1], ]$4[, ]$5[) |
| 96 | ]) dnl }}} |
| 97 | |
| 98 | AC_ARG_VAR([LFLAGS], [flex flags]) |
| 99 | AS_IF([test "x$LFLAGS" = x], [LFLAGS="--full --ecs"]) |
| 100 | |
| 101 | AC_DEFUN([CY_TEST_FLAG_], [ |
| 102 | AC_LANG_PUSH(]$2[) |
| 103 | AC_MSG_CHECKING([for ]]$4[[ ]]$1[) |
| 104 | CY_TRY(]$3[, $1, [ |
| 105 | AC_COMPILE_IFELSE([AC_LANG_SOURCE([])], |
| 106 | [CY_SUCCESS], [CY_FAILURE]) |
| 107 | ], [ |
| 108 | AC_MSG_RESULT([yes]) |
| 109 | AC_LIB_APPENDTOVAR(]$3[, ]$1[) |
| 110 | ], [AC_MSG_RESULT([no])]) |
| 111 | AC_LANG_POP(]$2[) |
| 112 | ]) |
| 113 | |
| 114 | AC_DEFUN([CY_TEST_FLAG], [ |
| 115 | CY_TEST_FLAG_(]$1[, [C], [CFLAGS], [cc]) |
| 116 | CY_TEST_FLAG_(]$1[, [C++], [CXXFLAGS], [c++]) |
| 117 | CY_TEST_FLAG_(]$1[, [Objective C++], [OBJCXXFLAGS], [c++ -ObjC]) |
| 118 | ]) |
| 119 | |
| 120 | AX_CFLAGS_WARN_ALL |
| 121 | AX_CXXFLAGS_WARN_ALL |
| 122 | AX_FLAGS_WARN_ALL |
| 123 | |
| 124 | CY_TEST_FLAG([-Werror]) |
| 125 | |
| 126 | dnl XXX: this is used to support GNU Objective-C struct objc_method |
| 127 | CY_TEST_FLAG([-Wno-deprecated-declarations]) |
| 128 | |
| 129 | CY_TEST_FLAG([-Wno-dangling-else]) |
| 130 | CY_TEST_FLAG([-Wno-empty-body]) |
| 131 | CY_TEST_FLAG([-Wno-overloaded-virtual]) |
| 132 | CY_TEST_FLAG([-Wno-parentheses]) |
| 133 | CY_TEST_FLAG([-Wno-tautological-undefined-compare]) |
| 134 | CY_TEST_FLAG([-Wno-unneeded-internal-declaration]) |
| 135 | |
| 136 | AX_PTHREAD |
| 137 | |
| 138 | AC_DEFUN([CY_LT_LIB], [ |
| 139 | cy_save=$LIBS |
| 140 | LIBS= |
| 141 | ]$2[ |
| 142 | ]$1[=$LIBS |
| 143 | LIBS=$cy_save |
| 144 | AC_SUBST(]$1[) |
| 145 | ]) |
| 146 | |
| 147 | dnl --enable-javascript {{{ |
| 148 | AC_DEFUN([CY_CHECK_JAVASCRIPTCORE], [ |
| 149 | CY_LT_LIB([LTJAVASCRIPTCORE], [AC_SEARCH_LIBS([JSEvaluateScript], [JavaScriptCore], [ |
| 150 | AC_SUBST([CY_EXECUTE], [1]) |
| 151 | ], [AC_CHECK_FRAMEWORK([JavaScriptCore], [ |
| 152 | #include <JavaScriptCore/JSBase.h> |
| 153 | ], [ |
| 154 | JSEvaluateScript(0, 0, 0, 0, 0, 0); |
| 155 | ], [ |
| 156 | AC_SUBST([CY_EXECUTE], [1]) |
| 157 | ], [ |
| 158 | for cy_webkit_pkg in "javascriptcoregtk-4.0"; do |
| 159 | PKG_CHECK_MODULES([WEBKIT], [$cy_webkit_pkg], [ |
| 160 | AC_SUBST([CY_EXECUTE], [1]) |
| 161 | AC_LIB_APPENDTOVAR([CPPFLAGS], [`$PKG_CONFIG --cflags $cy_webkit_pkg`]) |
| 162 | AC_LIB_APPENDTOVAR([LIBS], [`$PKG_CONFIG --libs $cy_webkit_pkg`]) |
| 163 | ], [:]); if test "x$CY_EXECUTE" = x1; then break; fi |
| 164 | done |
| 165 | ])])]) |
| 166 | ]) |
| 167 | |
| 168 | AC_DEFUN([CY_CHECK_JAVASCRIPT], [ |
| 169 | CY_CHECK_JAVASCRIPTCORE]) |
| 170 | |
| 171 | AC_ARG_ENABLE([javascript], [AS_HELP_STRING( |
| 172 | [--enable-javascript@<:@=ENGINE@:>@], |
| 173 | [use a JavaScript runtime (currently the only available option for ENGINE is JavaScriptCore) @<:@default=yes@:>@] |
| 174 | )], [ |
| 175 | AS_CASE([$enableval], |
| 176 | [yes], [ |
| 177 | CY_CHECK_JAVASCRIPT], |
| 178 | [no], [ |
| 179 | AC_SUBST([CY_EXECUTE], [0])], |
| 180 | [JavaScriptCore], [ |
| 181 | CY_CHECK_JAVASCRIPTCORE], |
| 182 | [AC_MSG_ERROR([Unknown JavaScript engine: $enableval])]) |
| 183 | ], [CY_CHECK_JAVASCRIPT]) |
| 184 | dnl }}} |
| 185 | |
| 186 | AC_ARG_ENABLE([console], AS_HELP_STRING([--disable-console], [disable console])) |
| 187 | AM_CONDITIONAL([CY_CONSOLE], [test "x$enable_console" != "xno"]) |
| 188 | |
| 189 | AC_ARG_ENABLE([attach], AS_HELP_STRING([--disable-attach], [disable attach])) |
| 190 | AM_CONDITIONAL([CY_ATTACH], [test "x$enable_attach" != "xno" -a "x$CY_EXECUTE" = x1]) |
| 191 | |
| 192 | AC_DEFUN([CY_CHECK_PKG_CONFIG_LIBFFI], [ |
| 193 | PKG_CHECK_MODULES([LIBFFI], [libffi], [ |
| 194 | AC_LIB_APPENDTOVAR([CPPFLAGS], [`$PKG_CONFIG --cflags libffi`]) |
| 195 | AC_LIB_APPENDTOVAR([LIBS], [`$PKG_CONFIG --libs libffi`]) |
| 196 | ], [AC_MSG_ERROR([missing "libffi"])])]) |
| 197 | |
| 198 | AM_CONDITIONAL([CY_EXECUTE], [test "x$CY_EXECUTE" = x1]) |
| 199 | |
| 200 | if test "x$CY_SYSTEM" = x; then CY_SYSTEM=1; fi |
| 201 | AC_SUBST([CY_SYSTEM]) |
| 202 | |
| 203 | AS_CASE([$CY_EXECUTE], [1], [ |
| 204 | CY_LT_LIB([LTLIBUV], [AC_CHECK_HEADERS([uv.h], [ |
| 205 | AC_SEARCH_LIBS([uv_loop_init], [uv]) |
| 206 | ])]) |
| 207 | |
| 208 | CY_LT_LIB([LTLIBSQLITE3], [AC_CHECK_HEADERS([sqlite3.h], [ |
| 209 | AC_SEARCH_LIBS([sqlite3_open_v2], [sqlite3 sqlite]) |
| 210 | ])]) |
| 211 | |
| 212 | AC_CHECK_HEADERS([ffi.h ffi/ffi.h], [break]) |
| 213 | |
| 214 | CY_LT_LIB([LTLIBFFI], [AS_IF([test "x$ac_cv_header_ffi_h" = xno && test "x$ac_cv_header_ffi_ffi_h" = xno], [ |
| 215 | CY_CHECK_PKG_CONFIG_LIBFFI |
| 216 | ], [ |
| 217 | AC_SEARCH_LIBS([ffi_call], [ffi]) |
| 218 | AS_CASE([$ac_cv_search_ffi_call], [no], [CY_CHECK_PKG_CONFIG_LIBFFI]) |
| 219 | AC_CHECK_FUNCS([ffi_prep_cif_var]) |
| 220 | ])]) |
| 221 | |
| 222 | CY_LT_LIB([LTJAVA], [AC_CHECK_FRAMEWORK([JavaVM], [ |
| 223 | #include <JavaVM/jni.h> |
| 224 | ], [JNI_GetCreatedJavaVMs(NULL, 0, NULL);], [ |
| 225 | AC_SUBST([CY_JAVA], [1]) |
| 226 | ], [AC_CHECK_HEADER([jni.h], [ |
| 227 | AC_SUBST([CY_JAVA], [1]) |
| 228 | AC_SEARCH_LIBS([JNI_GetCreatedJavaVMs], [art dvm], [ |
| 229 | ]) |
| 230 | ], [ |
| 231 | AC_SUBST([CY_JAVA], [0]) |
| 232 | ])])]) |
| 233 | |
| 234 | CY_LT_LIB([LTRUBY], [PKG_CHECK_MODULES([LIBRUBY21], [ruby-2.1], [ |
| 235 | AC_SUBST([CY_RUBY], [1]) |
| 236 | AC_LIB_APPENDTOVAR([CPPFLAGS], [`$PKG_CONFIG --cflags ruby-2.1`]) |
| 237 | AC_LIB_APPENDTOVAR([LIBS], [`$PKG_CONFIG --libs ruby-2.1`]) |
| 238 | ], [AC_CHECK_FRAMEWORK([Ruby], [ |
| 239 | #include <Ruby/ruby.h> |
| 240 | ], [ruby_init();], [ |
| 241 | AC_SUBST([CY_RUBY], [1]) |
| 242 | ], [AC_CHECK_HEADERS([ruby.h], [ |
| 243 | AC_SUBST([CY_RUBY], [1]) |
| 244 | AC_SEARCH_LIBS([ruby_init], [ruby], [ |
| 245 | ]) |
| 246 | ], [ |
| 247 | AC_SUBST([CY_RUBY], [0]) |
| 248 | ])])])]) |
| 249 | |
| 250 | AC_ARG_WITH([python], AS_HELP_STRING([--with-python], [support python (pass the path to python-config)]), [], [with_python=no]) |
| 251 | |
| 252 | AS_IF([test "x$with_python" != "xno"], [ |
| 253 | AC_SUBST([CY_PYTHON], [1]) |
| 254 | CY_LT_LIB([LTPYTHON], [ |
| 255 | AC_LIB_APPENDTOVAR([CPPFLAGS], [`$with_python --includes`]) |
| 256 | AC_LIB_APPENDTOVAR([LIBS], [`$with_python --ldflags`]) |
| 257 | ]) |
| 258 | ], [ |
| 259 | AC_SUBST([CY_PYTHON], [0]) |
| 260 | ]) |
| 261 | |
| 262 | AM_CONDITIONAL([CY_PRELINK], [test "x$with_python" != "xno"]) |
| 263 | |
| 264 | AC_LANG_PUSH([Objective C++]) |
| 265 | |
| 266 | AC_MSG_CHECKING([if we really have Objective C++]) |
| 267 | AC_COMPILE_IFELSE([AC_LANG_SOURCE([])], [ |
| 268 | CY_OBJECTIVEC=1 |
| 269 | AC_MSG_RESULT([yes]) |
| 270 | ], [AC_MSG_RESULT([no])]) |
| 271 | |
| 272 | AS_IF([test "x$CY_OBJECTIVEC" = x1], [ |
| 273 | CY_LT_LIB([LTOBJECTIVEC], [AC_CHECK_FRAMEWORK([CoreFoundation], [ |
| 274 | #include <CoreFoundation/CFBase.h> |
| 275 | ], [CFAllocatorGetDefault();], [ |
| 276 | AC_SUBST([CY_OBJECTIVEC], [1]) |
| 277 | |
| 278 | AC_CHECK_FRAMEWORK([Foundation], [ |
| 279 | #include <Foundation/NSObject.h> |
| 280 | ], [[[[NSObject alloc] init];]]) |
| 281 | ], [ |
| 282 | AC_ARG_VAR([GNUSTEP_CONFIG], [prints information about the current gnustep installation]) |
| 283 | AC_CHECK_PROGS([GNUSTEP_CONFIG], [gnustep-config]) |
| 284 | |
| 285 | AS_IF([test "x$GNUSTEP_CONFIG" != x], [ |
| 286 | AC_SUBST([CY_OBJECTIVEC], [1]) |
| 287 | AC_LIB_APPENDTOVAR([OBJCXXFLAGS], [`$GNUSTEP_CONFIG --objc-flags`]) |
| 288 | AC_LIB_APPENDTOVAR([LIBS], [`$GNUSTEP_CONFIG --base-libs`]) |
| 289 | ], [AC_SUBST([CY_OBJECTIVEC], [0])]) |
| 290 | ])]) |
| 291 | ], [ |
| 292 | AC_SUBST([CY_OBJECTIVEC], [0]) |
| 293 | ]) |
| 294 | |
| 295 | AC_LANG_POP([Objective C++]) |
| 296 | ]) |
| 297 | |
| 298 | AM_CONDITIONAL([CY_JAVA], [test "x$CY_JAVA" = x1]) |
| 299 | AM_CONDITIONAL([CY_RUBY], [test "x$CY_RUBY" = x1]) |
| 300 | AM_CONDITIONAL([CY_PYTHON], [test "x$CY_PYTHON" = x1]) |
| 301 | AM_CONDITIONAL([CY_OBJECTIVEC], [test "x$CY_OBJECTIVEC" = x1]) |
| 302 | |
| 303 | AC_ARG_WITH([libclang], AS_HELP_STRING([--with-libclang], [build bridge definitions using this libclang]), [], [with_libclang=no]) |
| 304 | |
| 305 | AS_IF([test "x$with_libclang" != "xno"], [ |
| 306 | AC_SUBST([CY_LIBCLANG], ["$with_libclang"])]) |
| 307 | AM_CONDITIONAL([CY_PRELINK], [test "x$with_libclang" != "xno"]) |
| 308 | |
| 309 | CY_LT_LIB([LTLIBREADLINE], [AX_LIB_READLINE]) |
| 310 | AS_CASE([$ax_cv_lib_readline], [no], [AC_MSG_ERROR([missing "libreadline"])]) |
| 311 | |
| 312 | CY_LT_LIB([LTLIBTERMCAP], [AC_SEARCH_LIBS([cur_term], [termcap ncurses])]) |
| 313 | |
| 314 | AC_SUBST([LTLIBGCC]) |
| 315 | |
| 316 | AC_SUBST([LTFLAGS]) |
| 317 | AC_SUBST([SO], [$acl_shlibext]) |
| 318 | |
| 319 | AC_CONFIG_FILES([Makefile]) |
| 320 | AC_OUTPUT |