@@ -130,11 +130,6 @@ int main ()
130130 AC_MSG_ERROR ( [ could not determine libv8 version] )
131131 fi
132132
133- AC_LANG_RESTORE
134- LIBS=$old_LIBS
135- LDFLAGS=$old_LDFLAGS
136- CPPFLAGS=$old_CPPFLAGS
137-
138133 if test "$V8_API_VERSION" -ge 3029036 ; then
139134 dnl building for v8 3.29.36 or later, which requires us to
140135 dnl initialize and provide a platform; hence we need to
@@ -169,10 +164,101 @@ int main ()
169164 AC_MSG_ERROR ( [ Please provide $static_link_extra_file next to the libv8.so, see README.md for details] )
170165 fi
171166
172- LDFLAGS="$LDFLAGS $static_link_dir/$static_link_extra_file"
167+ LDFLAGS_libplatform=" $static_link_dir/$static_link_extra_file"
173168 done
169+
170+ # modify flags for (possibly) succeeding V8 startup check
171+ CPPFLAGS="$CPPFLAGS -I$V8_DIR"
172+ LIBS="$LIBS $LDFLAGS_libplatform"
174173 fi
175174
175+ if test "$V8_API_VERSION" -ge 4004010 ; then
176+ dnl building for v8 4.4.10 or later, which requires us to
177+ dnl provide startup data, if V8 wasn't compiled with snapshot=off.
178+ AC_MSG_CHECKING ( [ whether V8 requires startup data] )
179+ AC_TRY_RUN ( [
180+ #include <v8.h>
181+ #include <libplatform/libplatform.h>
182+ #include <stdlib.h>
183+ #include <string.h>
184+
185+ #if PHP_V8_API_VERSION >= 4004010
186+ class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
187+ public:
188+ virtual void* Allocate(size_t length) {
189+ void* data = AllocateUninitialized(length);
190+ return data == NULL ? data : memset(data, 0, length);
191+ }
192+ virtual void* AllocateUninitialized(size_t length) { return malloc(length); }
193+ virtual void Free(void* data, size_t) { free(data); }
194+ };
195+ #endif
196+
197+ int main ()
198+ {
199+ v8::Platform *v8_platform = v8::platform::CreateDefaultPlatform();
200+ v8::V8::InitializePlatform(v8_platform);
201+ v8::V8::Initialize();
202+
203+ #if PHP_V8_API_VERSION >= 4004044
204+ static ArrayBufferAllocator array_buffer_allocator;
205+ v8::Isolate::CreateParams create_params;
206+ create_params.array_buffer_allocator = &array_buffer_allocator;
207+
208+ v8::Isolate::New(create_params);
209+ #else /* PHP_V8_API_VERSION < 4004044 */
210+ v8::Isolate::New();
211+ #endif
212+ return 0;
213+ }
214+ ] , [
215+ AC_MSG_RESULT ( [ no] )
216+ ] , [
217+ AC_MSG_RESULT ( [ yes] )
218+ AC_DEFINE ( [ PHP_V8_USE_EXTERNAL_STARTUP_DATA] , [ 1] , [ Whether V8 requires (and can be provided with custom versions of) external startup data] )
219+
220+ SEARCH_PATH="$V8_DIR/lib $V8_DIR/share/v8"
221+
222+ AC_MSG_CHECKING ( [ for natives_blob.bin] )
223+ SEARCH_FOR="natives_blob.bin"
224+
225+ for i in $SEARCH_PATH ; do
226+ if test -r $i/$SEARCH_FOR; then
227+ AC_MSG_RESULT ( [ found ($i/$SEARCH_FOR)] )
228+ AC_DEFINE_UNQUOTED ( [ PHP_V8_NATIVES_BLOB_PATH] , "$i/$SEARCH_FOR" , [ Full path to natives_blob.bin file] )
229+ native_blob_found=1
230+ fi
231+ done
232+
233+ if test -z "$native_blob_found"; then
234+ AC_MSG_RESULT ( [ not found] )
235+ AC_MSG_ERROR ( [ Please provide V8 native blob as needed] )
236+ fi
237+
238+ AC_MSG_CHECKING ( [ for snapshot_blob.bin] )
239+ SEARCH_FOR="snapshot_blob.bin"
240+
241+ for i in $SEARCH_PATH ; do
242+ if test -r $i/$SEARCH_FOR; then
243+ AC_MSG_RESULT ( [ found ($i/$SEARCH_FOR)] )
244+ AC_DEFINE_UNQUOTED ( [ PHP_V8_SNAPSHOT_BLOB_PATH] , "$i/$SEARCH_FOR" , [ Full path to snapshot_blob.bin file] )
245+ snapshot_blob_found=1
246+ fi
247+ done
248+
249+ if test -z "$snapshot_blob_found"; then
250+ AC_MSG_RESULT ( [ not found] )
251+ AC_MSG_ERROR ( [ Please provide V8 snapshot blob as needed] )
252+ fi
253+ ] )
254+ fi
255+
256+ AC_LANG_RESTORE
257+ LIBS=$old_LIBS
258+ LDFLAGS="$old_LDFLAGS $LDFLAGS_libplatform"
259+ CPPFLAGS=$old_CPPFLAGS
260+
261+
176262 PHP_NEW_EXTENSION(v8js, [ \
177263 v8js_array_access.cc \
178264 v8js.cc \
0 commit comments