diff --git a/.firefox.metadata b/.firefox.metadata new file mode 100644 index 0000000..350360a --- /dev/null +++ b/.firefox.metadata @@ -0,0 +1,10 @@ +a9effcc06cf80eaa22f12c1f7d6aa4266a1c4966 SOURCES/cbindgen-vendor-0.14.3.tar.xz +ee847b1d1c9aed9f14ec10ad6825c8ffe445b310 SOURCES/firefox-78.13.0esr.processed-source.tar.xz +140765234e3d4340710e09632d9af4a88ea10ba7 SOURCES/firefox-langpacks-78.13.0esr-20210805.tar.xz +0de63f863b158454b9429234b52ed28a397ec45c SOURCES/gtk3-private-3.22.26-1.el6.src.rpm +e188ab1a444697bc649e223c28389d82ca94c472 SOURCES/libffi-3.0.13-18.el7_3.src.rpm +5715f987bc0024ce5d72993cb101b8268350033b SOURCES/nodejs-10.21.0-5.fc32.src.rpm +07d67c90367c3ec0d6cebc1a5793c21076d34b78 SOURCES/nspr-4.25.0-1.el8_0.src.rpm +223c02166b1cb9863b9f453ef687d7805a93e7af SOURCES/nss-3.53.1-3.fc32.src.rpm +a379070abf5000cde61411c97af7e733b267a4d3 SOURCES/openssl-1.0.2k-19.6.bundle.el7_7.src.rpm +77fd30f7ebc12a629a31c1e252cec06af55a71fe SOURCES/yasm-1.2.0-3.el5.src.rpm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..92fff6a --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +SOURCES/cbindgen-vendor-0.14.3.tar.xz +SOURCES/firefox-78.13.0esr.processed-source.tar.xz +SOURCES/firefox-langpacks-78.13.0esr-20210805.tar.xz +SOURCES/gtk3-private-3.22.26-1.el6.src.rpm +SOURCES/libffi-3.0.13-18.el7_3.src.rpm +SOURCES/nodejs-10.21.0-5.fc32.src.rpm +SOURCES/nspr-4.25.0-1.el8_0.src.rpm +SOURCES/nss-3.53.1-3.fc32.src.rpm +SOURCES/openssl-1.0.2k-19.6.bundle.el7_7.src.rpm +SOURCES/yasm-1.2.0-3.el5.src.rpm diff --git a/SOURCES/D110204-fscreen.diff b/SOURCES/D110204-fscreen.diff new file mode 100644 index 0000000..0249fd0 --- /dev/null +++ b/SOURCES/D110204-fscreen.diff @@ -0,0 +1,70 @@ +diff -up firefox-78.9.0/widget/gtk/nsWindow.cpp.D110204-fscreen firefox-78.9.0/widget/gtk/nsWindow.cpp +--- firefox-78.9.0/widget/gtk/nsWindow.cpp.D110204-fscreen 2021-03-30 13:28:56.212009697 +0200 ++++ firefox-78.9.0/widget/gtk/nsWindow.cpp 2021-03-30 13:37:41.925850585 +0200 +@@ -139,6 +139,7 @@ using namespace mozilla::widget; + + #include + #include "nsPresContext.h" ++#include "nsIBrowserHandler.h" + + using namespace mozilla; + using namespace mozilla::gfx; +@@ -416,6 +417,7 @@ nsWindow::nsWindow() { + mRetryPointerGrab = false; + mWindowType = eWindowType_child; + mSizeState = nsSizeMode_Normal; ++ mPendingFullscreen = false; + mBoundsAreValid = true; + mAspectRatio = 0.0f; + mAspectRatioSaved = 0.0f; +@@ -3887,6 +3889,19 @@ void nsWindow::OnWindowStateEvent(GtkWid + } + } + } ++ ++ // Hack to ensure window switched to fullscreen - avoid to fail when starting ++ // in kiosk mode ++ if (mPendingFullscreen && ++ !(aEvent->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) { ++ LOG( ++ (" Window should be fullscreen, but it's not, retrying set to " ++ "fullscreen.\n")); ++ MakeFullScreen(true); ++ } else { ++ LOG((" Window successfully switched to fullscreen, happy now\n")); ++ mPendingFullscreen = false; ++ } + } + + void nsWindow::ThemeChanged() { +@@ -6010,6 +6025,19 @@ nsresult nsWindow::MakeFullScreen(bool a + } + } + ++ // if in kiosk, ensure the fullscreen is called ++ nsCOMPtr browserHandler = ++ do_GetService("@mozilla.org/browser/clh;1"); ++ if (browserHandler) { ++ bool isKiosk; ++ browserHandler->GetKiosk(&isKiosk); ++ if (isKiosk) { ++ LOG((" is kiosk, ensure the window switch to fullscreen\n")); ++ mPendingFullscreen = true; ++ } ++ } else { ++ LOG((" Cannot find the browserHandler service.\n")); ++ } + gtk_window_fullscreen(GTK_WINDOW(mShell)); + } else { + mSizeMode = mLastSizeMode; +diff -up firefox-78.9.0/widget/gtk/nsWindow.h.D110204-fscreen firefox-78.9.0/widget/gtk/nsWindow.h +--- firefox-78.9.0/widget/gtk/nsWindow.h.D110204-fscreen 2021-03-15 16:52:42.000000000 +0100 ++++ firefox-78.9.0/widget/gtk/nsWindow.h 2021-03-30 13:28:56.237009784 +0200 +@@ -703,6 +703,7 @@ class nsWindow final : public nsBaseWidg + nsRect mPreferredPopupRect; + bool mPreferredPopupRectFlushed; + bool mWaitingForMoveToRectCB; ++ bool mPendingFullscreen; + LayoutDeviceIntRect mPendingSizeRect; + + /** diff --git a/SOURCES/D117297-clone3.diff b/SOURCES/D117297-clone3.diff new file mode 100644 index 0000000..662a9d8 --- /dev/null +++ b/SOURCES/D117297-clone3.diff @@ -0,0 +1,24 @@ +diff --git a/security/sandbox/linux/SandboxFilter.cpp b/security/sandbox/linux/SandboxFilter.cpp +--- a/security/sandbox/linux/SandboxFilter.cpp ++++ b/security/sandbox/linux/SandboxFilter.cpp +@@ -858,6 +858,9 @@ + case __NR_clone: + return ClonePolicy(InvalidSyscall()); + ++ case __NR_clone3: ++ return Error(ENOSYS); ++ + // More thread creation. + #ifdef __NR_set_robust_list + case __NR_set_robust_list: +@@ -1504,6 +1507,9 @@ + case __NR_clone: + return ClonePolicy(Error(EPERM)); + ++ case __NR_clone3: ++ return Error(ENOSYS); ++ + # ifdef __NR_fadvise64 + case __NR_fadvise64: + return Allow(); + diff --git a/SOURCES/D87019-thin-vec-big-endian.diff b/SOURCES/D87019-thin-vec-big-endian.diff new file mode 100644 index 0000000..4785900 --- /dev/null +++ b/SOURCES/D87019-thin-vec-big-endian.diff @@ -0,0 +1,681 @@ +--- firefox-78.9.0/Cargo.lock.D87019-thin-vec-big-endian.diff 2021-03-18 15:53:29.520861862 +0100 ++++ firefox-78.9.0/Cargo.lock 2021-03-18 15:56:14.193397228 +0100 +@@ -4792,9 +4792,9 @@ checksum = "8eaa81235c7058867fa8c0e7314f + + [[package]] + name = "thin-vec" +-version = "0.1.2" ++version = "0.2.1" + source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "3a93c9ade36a827a69257925808463db46ffcf193442fad01eb9bdc1d31aed81" ++checksum = "dcc760ada4a9f56fc6d0e81bd143984ebc7bb1b875a6891aa2fa613ca7394fc0" + + [[package]] + name = "thiserror" +--- firefox-78.9.0/gfx/webrender_bindings/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:33.000000000 +0100 ++++ firefox-78.9.0/gfx/webrender_bindings/Cargo.toml 2021-03-18 15:53:29.522861856 +0100 +@@ -20,7 +20,7 @@ nsstring = { path = "../../xpcom/rust/ns + bincode = "1.0" + uuid = { version = "0.8", features = ["v4"] } + fxhash = "0.2.1" +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } + swgl = { path = "../wr/swgl" } + + [dependencies.webrender] +--- firefox-78.9.0/intl/l10n/rust/fluent-ffi/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:33.000000000 +0100 ++++ firefox-78.9.0/intl/l10n/rust/fluent-ffi/Cargo.toml 2021-03-18 15:53:29.524861850 +0100 +@@ -10,4 +10,4 @@ fluent-pseudo = "0.2" + intl-memoizer = "0.4" + unic-langid = "0.8" + nsstring = { path = "../../../../xpcom/rust/nsstring" } +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } +--- firefox-78.9.0/intl/locale/rust/fluent-langneg-ffi/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:33.000000000 +0100 ++++ firefox-78.9.0/intl/locale/rust/fluent-langneg-ffi/Cargo.toml 2021-03-18 15:53:29.525861847 +0100 +@@ -9,7 +9,7 @@ edition = "2018" + nserror = { path = "../../../../xpcom/rust/nserror" } + nsstring = { path = "../../../../xpcom/rust/nsstring" } + xpcom = { path = "../../../../xpcom/rust/xpcom" } +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } + fluent-langneg = { version = "0.12.1", features = ["cldr"] } + unic-langid = "0.8" + unic-langid-ffi = { path = "../unic-langid-ffi" } +--- firefox-78.9.0/intl/locale/rust/unic-langid-ffi/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:33.000000000 +0100 ++++ firefox-78.9.0/intl/locale/rust/unic-langid-ffi/Cargo.toml 2021-03-18 15:53:29.526861844 +0100 +@@ -9,5 +9,5 @@ edition = "2018" + nserror = { path = "../../../../xpcom/rust/nserror" } + nsstring = { path = "../../../../xpcom/rust/nsstring" } + xpcom = { path = "../../../../xpcom/rust/xpcom" } +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } + unic-langid = { version = "0.8", features = ["likelysubtags"] } +--- firefox-78.9.0/netwerk/socket/neqo_glue/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:37.000000000 +0100 ++++ firefox-78.9.0/netwerk/socket/neqo_glue/Cargo.toml 2021-03-18 15:53:29.527861842 +0100 +@@ -14,7 +14,7 @@ neqo-common = { tag = "v0.2.4", git = "h + nserror = { path = "../../../xpcom/rust/nserror" } + nsstring = { path = "../../../xpcom/rust/nsstring" } + xpcom = { path = "../../../xpcom/rust/xpcom" } +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } + + [dependencies.neqo-crypto] + tag = "v0.2.4" +--- firefox-78.9.0/security/manager/ssl/cert_storage/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:37.000000000 +0100 ++++ firefox-78.9.0/security/manager/ssl/cert_storage/Cargo.toml 2021-03-18 15:53:29.528861839 +0100 +@@ -18,6 +18,6 @@ rust_cascade = "0.6.0" + sha2 = "^0.8" + storage_variant = { path = "../../../../storage/variant" } + tempfile = "3" +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } + time = "0.1" + xpcom = { path = "../../../../xpcom/rust/xpcom" } +--- firefox-78.9.0/services/fxaccounts/rust-bridge/firefox-accounts-bridge/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:38.000000000 +0100 ++++ firefox-78.9.0/services/fxaccounts/rust-bridge/firefox-accounts-bridge/Cargo.toml 2021-03-18 15:53:29.528861839 +0100 +@@ -20,5 +20,5 @@ nserror = { path = "../../../../xpcom/ru + nsstring = { path = "../../../../xpcom/rust/nsstring" } + xpcom = { path = "../../../../xpcom/rust/xpcom" } + storage_variant = { path = "../../../../storage/variant" } +-thin-vec = { version = "0.1", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } + fxa-client = { git = "https://github.com/mozilla/application-services", rev = "61dcc364ac0d6d0816ab88a494bbf20d824b009b", features = ["gecko"] } +--- firefox-78.9.0/services/sync/golden_gate/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:38.000000000 +0100 ++++ firefox-78.9.0/services/sync/golden_gate/Cargo.toml 2021-03-18 15:53:29.529861836 +0100 +@@ -19,5 +19,5 @@ sync15-traits = { git = "https://github. + xpcom = { path = "../../../xpcom/rust/xpcom" } + + [dependencies.thin-vec] +-version = "0.1.0" ++version = "0.2.1" + features = ["gecko-ffi"] +--- firefox-78.9.0/third_party/rust/thin-vec/.cargo-checksum.json.D87019-thin-vec-big-endian.diff 2021-03-18 15:53:29.529861836 +0100 ++++ firefox-78.9.0/third_party/rust/thin-vec/.cargo-checksum.json 2021-03-18 15:57:43.631168890 +0100 +@@ -1 +1 @@ +-{"files":{"Cargo.toml":"7b164cc8a702a204a4732cb4da2940711b8e3be915c258e2a972d4874d767b4c","README.md":"c26d7101e3031e7dd8890ce938e50cad7a1e6adf7fc2f2b0d3c36b03afe68c0b","src/lib.rs":"9f2a087cabfe0b6f83818323bb9004b45fe7548c51376816fd8d4572256bd0e8","src/range.rs":"bac59bcb6230367a39c7e28ac15263e4526f966cd8c72015873017f17c115aaa"},"package":"3a93c9ade36a827a69257925808463db46ffcf193442fad01eb9bdc1d31aed81"} +\ No newline at end of file ++{"files":{"Cargo.toml":"754c05523d17eb7591c3ea2c9294e47c05fbb257fed04b78546fb2ec7cafa8b4","README.md":"c26d7101e3031e7dd8890ce938e50cad7a1e6adf7fc2f2b0d3c36b03afe68c0b","src/lib.rs":"627c6094c3f0286dba25bc73f5672c06c5061c25b01c513d213cbdda100673a2"},"package":"dcc760ada4a9f56fc6d0e81bd143984ebc7bb1b875a6891aa2fa613ca7394fc0"} +--- firefox-78.9.0/third_party/rust/thin-vec/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:42.000000000 +0100 ++++ firefox-78.9.0/third_party/rust/thin-vec/Cargo.toml 2021-03-18 15:59:34.162886751 +0100 +@@ -11,8 +11,9 @@ + # will likely look very different (and much more reasonable) + + [package] ++edition = "2018" + name = "thin-vec" +-version = "0.1.2" ++version = "0.2.1" + authors = ["Alexis Beingessner "] + description = "a vec that takes up less space on the stack" + homepage = "https://github.com/gankro/thin-vec" +--- firefox-78.9.0/third_party/rust/thin-vec/src/lib.rs.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:42.000000000 +0100 ++++ firefox-78.9.0/third_party/rust/thin-vec/src/lib.rs 2021-03-18 16:08:47.212871917 +0100 +@@ -1,47 +1,252 @@ +-mod range; ++//! ThinVec is exactly the same as Vec, except that it stores its `len` and `capacity` in the buffer ++//! it allocates. ++//! ++//! This makes the memory footprint of ThinVecs lower; notably in cases where space is reserved for ++//! a non-existence ThinVec. So `Vec>` and `Option>::None` will waste less ++//! space. Being pointer-sized also means it can be passed/stored in registers. ++//! ++//! Of course, any actually constructed ThinVec will theoretically have a bigger allocation, but ++//! the fuzzy nature of allocators means that might not actually be the case. ++//! ++//! Properties of Vec that are preserved: ++//! * `ThinVec::new()` doesn't allocate (it points to a statically allocated singleton) ++//! * reallocation can be done in place ++//! * `size_of::>()` == `size_of::>>()` ++//! ++//! Properties of Vec that aren't preserved: ++//! * `ThinVec` can't ever be zero-cost roundtripped to a `Box<[T]>`, `String`, or `*mut T` ++//! * `from_raw_parts` doesn't exist ++//! * ThinVec currently doesn't bother to not-allocate for Zero Sized Types (e.g. `ThinVec<()>`), ++//! but it could be done if someone cared enough to implement it. ++//! ++//! ++//! ++//! # Gecko FFI ++//! ++//! If you enable the gecko-ffi feature, ThinVec will verbatim bridge with the nsTArray type in ++//! Gecko (Firefox). That is, ThinVec and nsTArray have identical layouts *but not ABIs*, ++//! so nsTArrays/ThinVecs an be natively manipulated by C++ and Rust, and ownership can be ++//! transferred across the FFI boundary (**IF YOU ARE CAREFUL, SEE BELOW!!**). ++//! ++//! While this feature is handy, it is also inherently dangerous to use because Rust and C++ do not ++//! know about eachother. Specifically, this can be an issue with non-POD types (types which ++//! have destructors, move constructors, or are `!Copy`). ++//! ++//! ## Do Not Pass By Value ++//! ++//! The biggest thing to keep in mind is that **FFI functions cannot pass ThinVec/nsTArray ++//! by-value**. That is, these are busted APIs: ++//! ++//! ```rust,ignore ++//! // BAD WRONG ++//! extern fn process_data(data: ThinVec) { ... } ++//! // BAD WRONG ++//! extern fn get_data() -> ThinVec { ... } ++//! ``` ++//! ++//! You must instead pass by-reference: ++//! ++//! ```rust ++//! # use thin_vec::*; ++//! # use std::mem; ++//! ++//! // Read-only access, ok! ++//! extern fn process_data(data: &ThinVec) { ++//! for val in data { ++//! println!("{}", val); ++//! } ++//! } ++//! ++//! // Replace with empty instance to take ownership, ok! ++//! extern fn consume_data(data: &mut ThinVec) { ++//! let owned = mem::replace(data, ThinVec::new()); ++//! mem::drop(owned); ++//! } ++//! ++//! // Mutate input, ok! ++//! extern fn add_data(dataset: &mut ThinVec) { ++//! dataset.push(37); ++//! dataset.push(12); ++//! } ++//! ++//! // Return via out-param, usually ok! ++//! // ++//! // WARNING: output must be initialized! (Empty nsTArrays are free, so just do it!) ++//! extern fn get_data(output: &mut ThinVec) { ++//! *output = thin_vec![1, 2, 3, 4, 5]; ++//! } ++//! ``` ++//! ++//! Ignorable Explanation For Those Who Really Want To Know Why: ++//! ++//! > The fundamental issue is that Rust and C++ can't currently communicate about destructors, and ++//! > the semantics of C++ require destructors of function arguments to be run when the function ++//! > returns. Whether the callee or caller is responsible for this is also platform-specific, so ++//! > trying to hack around it manually would be messy. ++//! > ++//! > Also a type having a destructor changes its C++ ABI, because that type must actually exist ++//! > in memory (unlike a trivial struct, which is often passed in registers). We don't currently ++//! > have a way to communicate to Rust that this is happening, so even if we worked out the ++//! > destructor issue with say, MaybeUninit, it would still be a non-starter without some RFCs ++//! > to add explicit rustc support. ++//! > ++//! > Realistically, the best answer here is to have a "heavier" bindgen that can secretly ++//! > generate FFI glue so we can pass things "by value" and have it generate by-reference code ++//! > behind our back (like the cxx crate does). This would muddy up debugging/searchfox though. ++//! ++//! ## Types Should Be Trivially Relocatable ++//! ++//! Types in Rust are always trivially relocatable (unless suitably borrowed/[pinned][]/hidden). ++//! This means all Rust types are legal to relocate with a bitwise copy, you cannot provide ++//! copy or move constructors to execute when this happens, and the old location won't have its ++//! destructor run. This will cause problems for types which have a significant location ++//! (types that intrusively point into themselves or have their location registered with a service). ++//! ++//! While relocations are generally predictable if you're very careful, **you should avoid using ++//! types with significant locations with Rust FFI**. ++//! ++//! Specifically, ThinVec will trivially relocate its contents whenever it needs to reallocate its ++//! buffer to change its capacity. This is the default reallocation strategy for nsTArray, and is ++//! suitable for the vast majority of types. Just be aware of this limitation! ++//! ++//! ## Auto Arrays Are Dangerous ++//! ++//! ThinVec has *some* support for handling auto arrays which store their buffer on the stack, ++//! but this isn't well tested. ++//! ++//! Regardless of how much support we provide, Rust won't be aware of the buffer's limited lifetime, ++//! so standard auto array safety caveats apply about returning/storing them! ThinVec won't ever ++//! produce an auto array on its own, so this is only an issue for transferring an nsTArray into ++//! Rust. ++//! ++//! ## Other Issues ++//! ++//! Standard FFI caveats also apply: ++//! ++//! * Rust is more strict about POD types being initialized (use MaybeUninit if you must) ++//! * `ThinVec` has no idea if the C++ version of `T` has move/copy/assign/delete overloads ++//! * `nsTArray` has no idea if the Rust version of `T` has a Drop/Clone impl ++//! * C++ can do all sorts of unsound things that Rust can't catch ++//! * C++ and Rust don't agree on how zero-sized/empty types should be handled ++//! ++//! The gecko-ffi feature will not work if you aren't linking with code that has nsTArray ++//! defined. Specifically, we must share the symbol for nsTArray's empty singleton. You will get ++//! linking errors if that isn't defined. ++//! ++//! The gecko-ffi feature also limits ThinVec to the legacy behaviors of nsTArray. Most notably, ++//! nsTArray has a maximum capacity of i32::MAX (~2.1 billion items). Probably not an issue. ++//! Probably. ++//! ++//! [pinned]: https://doc.rust-lang.org/std/pin/index.html + + use std::{fmt, io, ptr, mem, slice}; + use std::collections::Bound; + use std::iter::FromIterator; + use std::slice::IterMut; +-use std::ops::{Deref, DerefMut}; ++use std::ops::{Deref, DerefMut, RangeBounds}; + use std::marker::PhantomData; + use std::alloc::*; + use std::cmp::*; + use std::hash::*; + use std::borrow::*; +-use range::RangeArgument; + use std::ptr::NonNull; + +-#[cfg(not(feature = "gecko-ffi"))] +-type SizeType = usize; +-#[cfg(feature = "gecko-ffi")] +-type SizeType = u32; ++use impl_details::*; + +-#[cfg(feature = "gecko-ffi")] +-const AUTO_MASK: u32 = 1 << 31; +-#[cfg(feature = "gecko-ffi")] +-const CAP_MASK: u32 = !AUTO_MASK; ++// modules: a simple way to cfg a whole bunch of impl details at once + + #[cfg(not(feature = "gecko-ffi"))] +-const MAX_CAP: usize = !0; +-#[cfg(feature = "gecko-ffi")] +-const MAX_CAP: usize = i32::max_value() as usize; ++mod impl_details { ++ pub type SizeType = usize; ++ pub const MAX_CAP: usize = !0; + +-#[cfg(not(feature = "gecko-ffi"))] +-#[inline(always)] +-fn assert_size(x: usize) -> SizeType { x } ++ #[inline(always)] ++ pub fn assert_size(x: usize) -> SizeType { x } ++} + + #[cfg(feature = "gecko-ffi")] +-#[inline] +-fn assert_size(x: usize) -> SizeType { +- if x > MAX_CAP as usize { +- panic!("nsTArray size may not exceed the capacity of a 32-bit sized int"); ++mod impl_details { ++ // Support for briding a gecko nsTArray verbatim into a ThinVec. ++ // ++ // ThinVec can't see copy/move/delete implementations ++ // from C++ ++ // ++ // The actual layout of an nsTArray is: ++ // ++ // ```cpp ++ // struct { ++ // uint32_t mLength; ++ // uint32_t mCapacity: 31; ++ // uint32_t mIsAutoArray: 1; ++ // } ++ // ``` ++ // ++ // Rust doesn't natively support bit-fields, so we manually mask ++ // and shift the bit. When the "auto" bit is set, the header and buffer ++ // are actually on the stack, meaning the ThinVec pointer-to-header ++ // is essentially an "owned borrow", and therefore dangerous to handle. ++ // There are no safety guards for this situation. ++ // ++ // On little-endian platforms, the auto bit will be the high-bit of ++ // our capacity u32. On big-endian platforms, it will be the low bit. ++ // Hence we need some platform-specific CFGs for the necessary masking/shifting. ++ // ++ // ThinVec won't ever construct an auto array. They only happen when ++ // bridging from C++. This means we don't need to ever set/preserve the bit. ++ // We just need to be able to read and handle it if it happens to be there. ++ // ++ // Handling the auto bit mostly just means not freeing/reallocating the buffer. ++ ++ pub type SizeType = u32; ++ ++ pub const MAX_CAP: usize = i32::max_value() as usize; ++ ++ // Little endian: the auto bit is the high bit, and the capacity is ++ // verbatim. So we just need to mask off the high bit. Note that ++ // this masking is unnecessary when packing, because assert_size ++ // guards against the high bit being set. ++ #[cfg(target_endian = "little")] ++ pub fn pack_capacity(cap: SizeType) -> SizeType { ++ cap as SizeType ++ } ++ #[cfg(target_endian = "little")] ++ pub fn unpack_capacity(cap: SizeType) -> usize { ++ (cap as usize) & !(1 << 31) ++ } ++ #[cfg(target_endian = "little")] ++ pub fn is_auto(cap: SizeType) -> bool { ++ (cap & (1 << 31)) != 0 ++ } ++ ++ // Big endian: the auto bit is the low bit, and the capacity is ++ // shifted up one bit. Masking out the auto bit is unnecessary, ++ // as rust shifts always shift in 0's for unsigned integers. ++ #[cfg(target_endian = "big")] ++ pub fn pack_capacity(cap: SizeType) -> SizeType { ++ (cap as SizeType) << 1 ++ } ++ #[cfg(target_endian = "big")] ++ pub fn unpack_capacity(cap: SizeType) -> usize { ++ (cap >> 1) as usize ++ } ++ #[cfg(target_endian = "big")] ++ pub fn is_auto(cap: SizeType) -> bool { ++ (cap & 1) != 0 + } +- x as SizeType ++ ++ #[inline] ++ pub fn assert_size(x: usize) -> SizeType { ++ if x > MAX_CAP as usize { ++ panic!("nsTArray size may not exceed the capacity of a 32-bit sized int"); ++ } ++ x as SizeType ++ } ++ + } + +-/// The header of a ThinVec ++/// The header of a ThinVec. ++/// ++/// The _cap can be a bitfield, so use accessors to avoid trouble. + #[repr(C)] + struct Header { + _len: SizeType, +@@ -53,38 +258,10 @@ impl Header { + self._len as usize + } + +- #[cfg(feature = "gecko-ffi")] +- fn cap(&self) -> usize { +- (self._cap & CAP_MASK) as usize +- } +- +- #[cfg(not(feature = "gecko-ffi"))] +- fn cap(&self) -> usize { +- self._cap as usize +- } +- + fn set_len(&mut self, len: usize) { + self._len = assert_size(len); + } + +- #[cfg(feature = "gecko-ffi")] +- fn set_cap(&mut self, cap: usize) { +- debug_assert!(cap & (CAP_MASK as usize) == cap); +- // FIXME: this is busted because it reads uninit memory +- // debug_assert!(!self.uses_stack_allocated_buffer()); +- self._cap = assert_size(cap) & CAP_MASK; +- } +- +- #[cfg(feature = "gecko-ffi")] +- fn uses_stack_allocated_buffer(&self) -> bool { +- self._cap & AUTO_MASK != 0 +- } +- +- #[cfg(not(feature = "gecko-ffi"))] +- fn set_cap(&mut self, cap: usize) { +- self._cap = assert_size(cap); +- } +- + fn data(&self) -> *mut T { + let header_size = mem::size_of::
(); + let padding = padding::(); +@@ -102,6 +279,41 @@ impl Header { + } + } + ++ ++#[cfg(feature = "gecko-ffi")] ++impl Header { ++ fn cap(&self) -> usize { ++ unpack_capacity(self._cap) ++ } ++ ++ fn set_cap(&mut self, cap: usize) { ++ // debug check that our packing is working ++ debug_assert_eq!(unpack_capacity(pack_capacity(cap as SizeType)), cap); ++ // FIXME: this assert is busted because it reads uninit memory ++ // debug_assert!(!self.uses_stack_allocated_buffer()); ++ ++ // NOTE: this always stores a cleared auto bit, because set_cap ++ // is only invoked by Rust, and Rust doesn't create auto arrays. ++ self._cap = pack_capacity(assert_size(cap)); ++ } ++ ++ fn uses_stack_allocated_buffer(&self) -> bool { ++ is_auto(self._cap) ++ } ++} ++ ++#[cfg(not(feature = "gecko-ffi"))] ++impl Header { ++ fn cap(&self) -> usize { ++ self._cap as usize ++ } ++ ++ fn set_cap(&mut self, cap: usize) { ++ self._cap = assert_size(cap); ++ } ++} ++ ++ + /// Singleton that all empty collections share. + /// Note: can't store non-zero ZSTs, we allocate in that case. We could + /// optimize everything to not do that (basically, make ptr == len and branch +@@ -118,9 +330,7 @@ extern { + + // TODO: overflow checks everywhere + +-// Utils +- +-fn oom() -> ! { std::process::abort() } ++// Utils for computing layouts of allocations + + fn alloc_size(cap: usize) -> usize { + // Compute "real" header size with pointer math +@@ -165,9 +375,10 @@ fn layout(cap: usize) -> Layout { + fn header_with_capacity(cap: usize) -> NonNull
{ + debug_assert!(cap > 0); + unsafe { +- let header = alloc(layout::(cap)) as *mut Header; ++ let layout = layout::(cap); ++ let header = alloc(layout) as *mut Header; + +- if header.is_null() { oom() } ++ if header.is_null() { handle_alloc_error(layout) } + + // "Infinite" capacity for zero-sized types: + (*header).set_cap(if mem::size_of::() == 0 { MAX_CAP } else { cap }); +@@ -179,28 +390,8 @@ fn header_with_capacity(cap: usize) - + + + +-/// ThinVec is exactly the same as Vec, except that it stores its `len` and `capacity` in the buffer +-/// it allocates. +-/// +-/// This makes the memory footprint of ThinVecs lower; notably in cases where space is reserved for +-/// a non-existence ThinVec. So `Vec>` and `Option>::None` will waste less +-/// space. Being pointer-sized also means it can be passed/stored in registers. +-/// +-/// Of course, any actually constructed ThinVec will theoretically have a bigger allocation, but +-/// the fuzzy nature of allocators means that might not actually be the case. +-/// +-/// Properties of Vec that are preserved: +-/// * `ThinVec::new()` doesn't allocate (it points to a statically allocated singleton) +-/// * reallocation can be done in place +-/// * `size_of::>()` == `size_of::>>()` +-/// * NOTE: This is only possible when the `unstable` feature is used. +-/// +-/// Properties of Vec that aren't preserved: +-/// * `ThinVec` can't ever be zero-cost roundtripped to a `Box<[T]>`, `String`, or `*mut T` +-/// * `from_raw_parts` doesn't exist +-/// * ThinVec currently doesn't bother to not-allocate for Zero Sized Types (e.g. `ThinVec<()>`), +-/// but it could be done if someone cared enough to implement it. +-#[cfg_attr(feature = "gecko-ffi", repr(C))] ++/// See the crate's top level documentation for a description of this type. ++#[repr(C)] + pub struct ThinVec { + ptr: NonNull
, + boo: PhantomData, +@@ -630,15 +821,15 @@ impl ThinVec { + } + + pub fn drain(&mut self, range: R) -> Drain +- where R: RangeArgument ++ where R: RangeBounds + { + let len = self.len(); +- let start = match range.start() { ++ let start = match range.start_bound() { + Bound::Included(&n) => n, + Bound::Excluded(&n) => n + 1, + Bound::Unbounded => 0, + }; +- let end = match range.end() { ++ let end = match range.end_bound() { + Bound::Included(&n) => n + 1, + Bound::Excluded(&n) => n, + Bound::Unbounded => len, +@@ -688,11 +879,30 @@ impl ThinVec { + alloc_size::(new_cap), + ) as *mut Header; + +- if ptr.is_null() { oom() } ++ if ptr.is_null() { handle_alloc_error(layout::(new_cap)) } + (*ptr).set_cap(new_cap); + self.ptr = NonNull::new_unchecked(ptr); + } else { +- self.ptr = header_with_capacity::(new_cap); ++ let mut new_header = header_with_capacity::(new_cap); ++ ++ // If we get here and have a non-zero len, then we must be handling ++ // a gecko auto array, and we have items in a stack buffer. We shouldn't ++ // free it, but we should memcopy the contents out of it and mark it as empty. ++ // ++ // T is assumed to be trivially relocatable, as this is ~required ++ // for Rust compatibility anyway. Furthermore, we assume C++ won't try ++ // to unconditionally destroy the contents of the stack allocated buffer ++ // (i.e. it's obfuscated behind a union). ++ // ++ // In effect, we are partially reimplementing the auto array move constructor ++ // by leaving behind a valid empty instance. ++ let len = self.len(); ++ if cfg!(feature = "gecko-ffi") && len > 0 { ++ new_header.as_mut().data::().copy_from_nonoverlapping(self.data_raw(), len); ++ self.set_len(0); ++ } ++ ++ self.ptr = new_header; + } + } + +@@ -1093,10 +1303,7 @@ mod tests { + use std::mem::size_of; + assert_eq!(size_of::>(), size_of::<&u8>()); + +- // We don't perform the null-pointer optimization on stable rust. +- if cfg!(feature = "unstable") { +- assert_eq!(size_of::>>(), size_of::<&u8>()); +- } ++ assert_eq!(size_of::>>(), size_of::<&u8>()); + } + + #[test] +@@ -1731,7 +1938,6 @@ mod std_tests { + assert_eq!(v, &[(), ()]); + } + +-/* TODO: support inclusive ranges + #[test] + fn test_drain_inclusive_range() { + let mut v = thin_vec!['a', 'b', 'c', 'd', 'e']; +@@ -1761,6 +1967,7 @@ mod std_tests { + } + + #[test] ++ #[cfg(not(feature = "gecko-ffi"))] + fn test_drain_max_vec_size() { + let mut v = ThinVec::<()>::with_capacity(usize::max_value()); + unsafe { v.set_len(usize::max_value()); } +@@ -1781,7 +1988,6 @@ mod std_tests { + let mut v = thin_vec![1, 2, 3, 4, 5]; + v.drain(5..=5); + } +-*/ + + /* TODO: implement splice? + #[test] +@@ -2187,7 +2393,7 @@ mod std_tests { + assert!(v.capacity() >= 33) + } + +-/* TODO: implement try_reserve ++/* TODO: implement try_reserve + #[test] + fn test_try_reserve() { + +--- firefox-78.9.0/toolkit/components/cascade_bloom_filter/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:42.000000000 +0100 ++++ firefox-78.9.0/toolkit/components/cascade_bloom_filter/Cargo.toml 2021-03-18 15:54:35.137670977 +0100 +@@ -8,5 +8,5 @@ nserror = { path = "../../../xpcom/rust/ + nsstring = { path = "../../../xpcom/rust/nsstring" } + rental = "0.5.5" + rust_cascade = "0.6.0" +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } + xpcom = { path = "../../../xpcom/rust/xpcom" } +--- firefox-78.9.0/toolkit/components/extensions/storage/webext_storage_bridge/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:42.000000000 +0100 ++++ firefox-78.9.0/toolkit/components/extensions/storage/webext_storage_bridge/Cargo.toml 2021-03-18 15:54:35.139670971 +0100 +@@ -13,7 +13,7 @@ moz_task = { path = "../../../../../xpco + nserror = { path = "../../../../../xpcom/rust/nserror" } + nsstring = { path = "../../../../../xpcom/rust/nsstring" } + once_cell = "1" +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } + xpcom = { path = "../../../../../xpcom/rust/xpcom" } + serde = "1" + serde_json = "1" +--- firefox-78.9.0/toolkit/components/kvstore/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:42.000000000 +0100 ++++ firefox-78.9.0/toolkit/components/kvstore/Cargo.toml 2021-03-18 15:54:35.141670966 +0100 +@@ -18,7 +18,7 @@ rkv = "0.10.2" + storage_variant = { path = "../../../storage/variant" } + xpcom = { path = "../../../xpcom/rust/xpcom" } + tempfile = "3" +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } + + # Get rid of failure's dependency on backtrace. Eventually + # backtrace will move into Rust core, but we don't need it here. +--- firefox-78.9.0/toolkit/components/places/bookmark_sync/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:42.000000000 +0100 ++++ firefox-78.9.0/toolkit/components/places/bookmark_sync/Cargo.toml 2021-03-18 15:54:35.142670963 +0100 +@@ -19,5 +19,5 @@ url = "2.0" + xpcom = { path = "../../../../xpcom/rust/xpcom" } + + [dependencies.thin-vec] +-version = "0.1.0" ++version = "0.2.1" + features = ["gecko-ffi"] +--- firefox-78.9.0/tools/profiler/rust-helper/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:42.000000000 +0100 ++++ firefox-78.9.0/tools/profiler/rust-helper/Cargo.toml 2021-03-18 15:54:35.143670960 +0100 +@@ -23,7 +23,7 @@ features = ["endian_fd", "elf32", "elf64 + default-features = false + + [dependencies.thin-vec] +-version = "0.1.0" ++version = "0.2.1" + features = ["gecko-ffi"] + + [features] +--- firefox-78.9.0/xpcom/rust/xpcom/Cargo.toml.D87019-thin-vec-big-endian.diff 2021-03-15 16:52:43.000000000 +0100 ++++ firefox-78.9.0/xpcom/rust/xpcom/Cargo.toml 2021-03-18 15:54:35.149670942 +0100 +@@ -9,4 +9,4 @@ nsstring = { path = "../nsstring" } + nserror = { path = "../nserror" } + threadbound = "0.1" + xpcom_macros = { path = "xpcom_macros" } +-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] } ++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] } diff --git a/SOURCES/D89554-autoconf1.diff b/SOURCES/D89554-autoconf1.diff new file mode 100644 index 0000000..5b97812 --- /dev/null +++ b/SOURCES/D89554-autoconf1.diff @@ -0,0 +1,5771 @@ +diff -up firefox-78.8.0/build/autoconf/acgeneral.m4.D89554-autoconf1.diff firefox-78.8.0/build/autoconf/acgeneral.m4 +--- firefox-78.8.0/build/autoconf/acgeneral.m4.D89554-autoconf1.diff 2021-02-25 13:48:13.603993474 +0100 ++++ firefox-78.8.0/build/autoconf/acgeneral.m4 2021-02-25 13:48:13.603993474 +0100 +@@ -0,0 +1,2607 @@ ++dnl Parameterized macros. ++dnl Requires GNU m4. ++dnl This file is part of Autoconf. ++dnl Copyright (C) 1992, 93, 94, 95, 96, 1998 Free Software Foundation, Inc. ++dnl ++dnl This program is free software; you can redistribute it and/or modify ++dnl it under the terms of the GNU General Public License as published by ++dnl the Free Software Foundation; either version 2, or (at your option) ++dnl any later version. ++dnl ++dnl This program is distributed in the hope that it will be useful, ++dnl but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++dnl GNU General Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License ++dnl along with this program; if not, write to the Free Software ++dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ++dnl 02111-1307, USA. ++dnl ++dnl As a special exception, the Free Software Foundation gives unlimited ++dnl permission to copy, distribute and modify the configure scripts that ++dnl are the output of Autoconf. You need not follow the terms of the GNU ++dnl General Public License when using or distributing such scripts, even ++dnl though portions of the text of Autoconf appear in them. The GNU ++dnl General Public License (GPL) does govern all other use of the material ++dnl that constitutes the Autoconf program. ++dnl ++dnl Certain portions of the Autoconf source text are designed to be copied ++dnl (in certain cases, depending on the input) into the output of ++dnl Autoconf. We call these the "data" portions. The rest of the Autoconf ++dnl source text consists of comments plus executable code that decides which ++dnl of the data portions to output in any given case. We call these ++dnl comments and executable code the "non-data" portions. Autoconf never ++dnl copies any of the non-data portions into its output. ++dnl ++dnl This special exception to the GPL applies to versions of Autoconf ++dnl released by the Free Software Foundation. When you make and ++dnl distribute a modified version of Autoconf, you may extend this special ++dnl exception to the GPL to apply to your modified version as well, *unless* ++dnl your modified version has the potential to copy into its output some ++dnl of the text that was the non-data portion of the version that you started ++dnl with. (In other words, unless your change moves or copies text from ++dnl the non-data portions to the data portions.) If your modification has ++dnl such potential, you must delete any notice of this special exception ++dnl to the GPL from your modified version. ++dnl ++dnl Written by David MacKenzie, with help from ++dnl Franc,ois Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor, ++dnl Roland McGrath, Noah Friedman, david d zuhn, and many others. ++dnl ++divert(-1)dnl Throw away output until AC_INIT is called. ++changequote([, ]) ++ ++define(AC_ACVERSION, 2.13) ++ ++dnl Some old m4's don't support m4exit. But they provide ++dnl equivalent functionality by core dumping because of the ++dnl long macros we define. ++ifdef([__gnu__], , [errprint(Autoconf requires GNU m4. ++Install it before installing Autoconf or set the ++M4 environment variable to its path name. ++)m4exit(2)]) ++ ++undefine([eval]) ++undefine([include]) ++undefine([shift]) ++undefine([format]) ++ ++ ++dnl ### Defining macros ++ ++ ++dnl m4 output diversions. We let m4 output them all in order at the end, ++dnl except that we explicitly undivert AC_DIVERSION_SED, AC_DIVERSION_CMDS, ++dnl and AC_DIVERSION_ICMDS. ++ ++dnl AC_DIVERSION_NOTICE - 1 (= 0) AC_REQUIRE'd #! /bin/sh line ++define(AC_DIVERSION_NOTICE, 1)dnl copyright notice & option help strings ++define(AC_DIVERSION_INIT, 2)dnl initialization code ++define(AC_DIVERSION_NORMAL_4, 3)dnl AC_REQUIRE'd code, 4 level deep ++define(AC_DIVERSION_NORMAL_3, 4)dnl AC_REQUIRE'd code, 3 level deep ++define(AC_DIVERSION_NORMAL_2, 5)dnl AC_REQUIRE'd code, 2 level deep ++define(AC_DIVERSION_NORMAL_1, 6)dnl AC_REQUIRE'd code, 1 level deep ++define(AC_DIVERSION_NORMAL, 7)dnl the tests and output code ++define(AC_DIVERSION_SED, 8)dnl variable substitutions in config.status ++define(AC_DIVERSION_CMDS, 9)dnl extra shell commands in config.status ++define(AC_DIVERSION_ICMDS, 10)dnl extra initialization in config.status ++ ++dnl Change the diversion stream to STREAM, while stacking old values. ++dnl AC_DIVERT_PUSH(STREAM) ++define(AC_DIVERT_PUSH, ++[pushdef([AC_DIVERSION_CURRENT], $1)dnl ++divert(AC_DIVERSION_CURRENT)dnl ++]) ++ ++dnl Change the diversion stream to its previous value, unstacking it. ++dnl AC_DIVERT_POP() ++define(AC_DIVERT_POP, ++[popdef([AC_DIVERSION_CURRENT])dnl ++divert(AC_DIVERSION_CURRENT)dnl ++]) ++ ++dnl Initialize the diversion setup. ++define([AC_DIVERSION_CURRENT], AC_DIVERSION_NORMAL) ++dnl This will be popped by AC_REQUIRE in AC_INIT. ++pushdef([AC_DIVERSION_CURRENT], AC_DIVERSION_NOTICE) ++ ++dnl The prologue for Autoconf macros. ++dnl AC_PRO(MACRO-NAME) ++define(AC_PRO, ++[define([AC_PROVIDE_$1], )dnl ++ifelse(AC_DIVERSION_CURRENT, AC_DIVERSION_NORMAL, ++[AC_DIVERT_PUSH(builtin(eval, AC_DIVERSION_CURRENT - 1))], ++[pushdef([AC_DIVERSION_CURRENT], AC_DIVERSION_CURRENT)])dnl ++]) ++ ++dnl The Epilogue for Autoconf macros. ++dnl AC_EPI() ++define(AC_EPI, ++[AC_DIVERT_POP()dnl ++ifelse(AC_DIVERSION_CURRENT, AC_DIVERSION_NORMAL, ++[undivert(AC_DIVERSION_NORMAL_4)dnl ++undivert(AC_DIVERSION_NORMAL_3)dnl ++undivert(AC_DIVERSION_NORMAL_2)dnl ++undivert(AC_DIVERSION_NORMAL_1)dnl ++])dnl ++]) ++ ++dnl Define a macro which automatically provides itself. Add machinery ++dnl so the macro automatically switches expansion to the diversion ++dnl stack if it is not already using it. In this case, once finished, ++dnl it will bring back all the code accumulated in the diversion stack. ++dnl This, combined with AC_REQUIRE, achieves the topological ordering of ++dnl macros. We don't use this macro to define some frequently called ++dnl macros that are not involved in ordering constraints, to save m4 ++dnl processing. ++dnl AC_DEFUN(NAME, EXPANSION) ++define([AC_DEFUN], ++[define($1, [AC_PRO([$1])$2[]AC_EPI()])]) ++ ++ ++dnl ### Initialization ++ ++ ++dnl AC_INIT_NOTICE() ++AC_DEFUN(AC_INIT_NOTICE, ++[# Guess values for system-dependent variables and create Makefiles. ++# Generated automatically using autoconf version] AC_ACVERSION [ ++# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. ++# ++# This configure script is free software; the Free Software Foundation ++# gives unlimited permission to copy, distribute and modify it. ++ ++# Defaults: ++ac_help= ++ac_default_prefix=/usr/local ++[#] Any additions from configure.in:]) ++ ++dnl AC_PREFIX_DEFAULT(PREFIX) ++AC_DEFUN(AC_PREFIX_DEFAULT, ++[AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl ++ac_default_prefix=$1 ++AC_DIVERT_POP()]) ++ ++dnl AC_INIT_PARSE_ARGS() ++AC_DEFUN(AC_INIT_PARSE_ARGS, ++[ ++# Initialize some variables set by options. ++# The variables have the same names as the options, with ++# dashes changed to underlines. ++build=NONE ++cache_file=./config.cache ++exec_prefix=NONE ++host=NONE ++no_create= ++nonopt=NONE ++no_recursion= ++prefix=NONE ++program_prefix=NONE ++program_suffix=NONE ++program_transform_name=s,x,x, ++silent= ++site= ++srcdir= ++target=NONE ++verbose= ++x_includes=NONE ++x_libraries=NONE ++dnl Installation directory options. ++dnl These are left unexpanded so users can "make install exec_prefix=/foo" ++dnl and all the variables that are supposed to be based on exec_prefix ++dnl by default will actually change. ++dnl Use braces instead of parens because sh, perl, etc. also accept them. ++bindir='${exec_prefix}/bin' ++sbindir='${exec_prefix}/sbin' ++libexecdir='${exec_prefix}/libexec' ++datadir='${prefix}/share' ++sysconfdir='${prefix}/etc' ++sharedstatedir='${prefix}/com' ++localstatedir='${prefix}/var' ++libdir='${exec_prefix}/lib' ++includedir='${prefix}/include' ++oldincludedir='/usr/include' ++infodir='${prefix}/info' ++mandir='${prefix}/man' ++ ++# Initialize some other variables. ++subdirs= ++MFLAGS= MAKEFLAGS= ++SHELL=${CONFIG_SHELL-/bin/sh} ++# Maximum number of lines to put in a shell here document. ++ac_max_here_lines=12 ++ ++ac_prev= ++for ac_option ++do ++ ++ # If the previous option needs an argument, assign it. ++ if test -n "$ac_prev"; then ++ eval "$ac_prev=\$ac_option" ++ ac_prev= ++ continue ++ fi ++ ++ case "$ac_option" in ++changequote(, )dnl ++ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; ++changequote([, ])dnl ++ *) ac_optarg= ;; ++ esac ++ ++ # Accept the important Cygnus configure options, so we can diagnose typos. ++ ++ case "$ac_option" in ++ ++ -bindir | --bindir | --bindi | --bind | --bin | --bi) ++ ac_prev=bindir ;; ++ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) ++ bindir="$ac_optarg" ;; ++ ++ -build | --build | --buil | --bui | --bu) ++ ac_prev=build ;; ++ -build=* | --build=* | --buil=* | --bui=* | --bu=*) ++ build="$ac_optarg" ;; ++ ++ -cache-file | --cache-file | --cache-fil | --cache-fi \ ++ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ++ ac_prev=cache_file ;; ++ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ ++ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) ++ cache_file="$ac_optarg" ;; ++ ++ -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ++ ac_prev=datadir ;; ++ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ ++ | --da=*) ++ datadir="$ac_optarg" ;; ++ ++ -disable-* | --disable-*) ++ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` ++ # Reject names that are not valid shell variable names. ++changequote(, )dnl ++ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then ++changequote([, ])dnl ++ AC_MSG_ERROR($ac_feature: invalid feature name) ++ fi ++ ac_feature=`echo $ac_feature| sed 's/-/_/g'` ++ eval "enable_${ac_feature}=no" ;; ++ ++ -enable-* | --enable-*) ++ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` ++ # Reject names that are not valid shell variable names. ++changequote(, )dnl ++ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then ++changequote([, ])dnl ++ AC_MSG_ERROR($ac_feature: invalid feature name) ++ fi ++ ac_feature=`echo $ac_feature| sed 's/-/_/g'` ++ case "$ac_option" in ++ *=*) ;; ++ *) ac_optarg=yes ;; ++ esac ++ eval "enable_${ac_feature}='$ac_optarg'" ;; ++ ++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ ++ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ ++ | --exec | --exe | --ex) ++ ac_prev=exec_prefix ;; ++ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ ++ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ ++ | --exec=* | --exe=* | --ex=*) ++ exec_prefix="$ac_optarg" ;; ++ ++ -gas | --gas | --ga | --g) ++ # Obsolete; use --with-gas. ++ with_gas=yes ;; ++ ++ -help | --help | --hel | --he) ++ # Omit some internal or obsolete options to make the list less imposing. ++ # This message is too long to be a string in the A/UX 3.1 sh. ++ cat << EOF ++changequote(, )dnl ++Usage: configure [options] [host] ++Options: [defaults in brackets after descriptions] ++Configuration: ++ --cache-file=FILE cache test results in FILE ++ --help print this message ++ --no-create do not create output files ++ --quiet, --silent do not print \`checking...' messages ++ --version print the version of autoconf that created configure ++Directory and file names: ++ --prefix=PREFIX install architecture-independent files in PREFIX ++ [$ac_default_prefix] ++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX ++ [same as prefix] ++ --bindir=DIR user executables in DIR [EPREFIX/bin] ++ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] ++ --libexecdir=DIR program executables in DIR [EPREFIX/libexec] ++ --datadir=DIR read-only architecture-independent data in DIR ++ [PREFIX/share] ++ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] ++ --sharedstatedir=DIR modifiable architecture-independent data in DIR ++ [PREFIX/com] ++ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] ++ --libdir=DIR object code libraries in DIR [EPREFIX/lib] ++ --includedir=DIR C header files in DIR [PREFIX/include] ++ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] ++ --infodir=DIR info documentation in DIR [PREFIX/info] ++ --mandir=DIR man documentation in DIR [PREFIX/man] ++ --srcdir=DIR find the sources in DIR [configure dir or ..] ++ --program-prefix=PREFIX prepend PREFIX to installed program names ++ --program-suffix=SUFFIX append SUFFIX to installed program names ++ --program-transform-name=PROGRAM ++ run sed PROGRAM on installed program names ++EOF ++ cat << EOF ++Host type: ++ --build=BUILD configure for building on BUILD [BUILD=HOST] ++ --host=HOST configure for HOST [guessed] ++ --target=TARGET configure for TARGET [TARGET=HOST] ++Features and packages: ++ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) ++ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] ++ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] ++ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) ++ --x-includes=DIR X include files are in DIR ++ --x-libraries=DIR X library files are in DIR ++changequote([, ])dnl ++EOF ++ if test -n "$ac_help"; then ++ echo "--enable and --with options recognized:$ac_help" ++ fi ++ exit 0 ;; ++ ++ -host | --host | --hos | --ho) ++ ac_prev=host ;; ++ -host=* | --host=* | --hos=* | --ho=*) ++ host="$ac_optarg" ;; ++ ++ -includedir | --includedir | --includedi | --included | --include \ ++ | --includ | --inclu | --incl | --inc) ++ ac_prev=includedir ;; ++ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ ++ | --includ=* | --inclu=* | --incl=* | --inc=*) ++ includedir="$ac_optarg" ;; ++ ++ -infodir | --infodir | --infodi | --infod | --info | --inf) ++ ac_prev=infodir ;; ++ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) ++ infodir="$ac_optarg" ;; ++ ++ -libdir | --libdir | --libdi | --libd) ++ ac_prev=libdir ;; ++ -libdir=* | --libdir=* | --libdi=* | --libd=*) ++ libdir="$ac_optarg" ;; ++ ++ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ ++ | --libexe | --libex | --libe) ++ ac_prev=libexecdir ;; ++ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ ++ | --libexe=* | --libex=* | --libe=*) ++ libexecdir="$ac_optarg" ;; ++ ++ -localstatedir | --localstatedir | --localstatedi | --localstated \ ++ | --localstate | --localstat | --localsta | --localst \ ++ | --locals | --local | --loca | --loc | --lo) ++ ac_prev=localstatedir ;; ++ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ ++ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ ++ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) ++ localstatedir="$ac_optarg" ;; ++ ++ -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ++ ac_prev=mandir ;; ++ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) ++ mandir="$ac_optarg" ;; ++ ++ -nfp | --nfp | --nf) ++ # Obsolete; use --without-fp. ++ with_fp=no ;; ++ ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c) ++ no_create=yes ;; ++ ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ++ no_recursion=yes ;; ++ ++ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ ++ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ ++ | --oldin | --oldi | --old | --ol | --o) ++ ac_prev=oldincludedir ;; ++ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ ++ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ ++ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) ++ oldincludedir="$ac_optarg" ;; ++ ++ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ++ ac_prev=prefix ;; ++ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ++ prefix="$ac_optarg" ;; ++ ++ -program-prefix | --program-prefix | --program-prefi | --program-pref \ ++ | --program-pre | --program-pr | --program-p) ++ ac_prev=program_prefix ;; ++ -program-prefix=* | --program-prefix=* | --program-prefi=* \ ++ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) ++ program_prefix="$ac_optarg" ;; ++ ++ -program-suffix | --program-suffix | --program-suffi | --program-suff \ ++ | --program-suf | --program-su | --program-s) ++ ac_prev=program_suffix ;; ++ -program-suffix=* | --program-suffix=* | --program-suffi=* \ ++ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) ++ program_suffix="$ac_optarg" ;; ++ ++ -program-transform-name | --program-transform-name \ ++ | --program-transform-nam | --program-transform-na \ ++ | --program-transform-n | --program-transform- \ ++ | --program-transform | --program-transfor \ ++ | --program-transfo | --program-transf \ ++ | --program-trans | --program-tran \ ++ | --progr-tra | --program-tr | --program-t) ++ ac_prev=program_transform_name ;; ++ -program-transform-name=* | --program-transform-name=* \ ++ | --program-transform-nam=* | --program-transform-na=* \ ++ | --program-transform-n=* | --program-transform-=* \ ++ | --program-transform=* | --program-transfor=* \ ++ | --program-transfo=* | --program-transf=* \ ++ | --program-trans=* | --program-tran=* \ ++ | --progr-tra=* | --program-tr=* | --program-t=*) ++ program_transform_name="$ac_optarg" ;; ++ ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ silent=yes ;; ++ ++ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ++ ac_prev=sbindir ;; ++ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ ++ | --sbi=* | --sb=*) ++ sbindir="$ac_optarg" ;; ++ ++ -sharedstatedir | --sharedstatedir | --sharedstatedi \ ++ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ ++ | --sharedst | --shareds | --shared | --share | --shar \ ++ | --sha | --sh) ++ ac_prev=sharedstatedir ;; ++ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ ++ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ ++ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ ++ | --sha=* | --sh=*) ++ sharedstatedir="$ac_optarg" ;; ++ ++ -site | --site | --sit) ++ ac_prev=site ;; ++ -site=* | --site=* | --sit=*) ++ site="$ac_optarg" ;; ++ ++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ++ ac_prev=srcdir ;; ++ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ++ srcdir="$ac_optarg" ;; ++ ++ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ ++ | --syscon | --sysco | --sysc | --sys | --sy) ++ ac_prev=sysconfdir ;; ++ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ ++ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) ++ sysconfdir="$ac_optarg" ;; ++ ++ -target | --target | --targe | --targ | --tar | --ta | --t) ++ ac_prev=target ;; ++ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) ++ target="$ac_optarg" ;; ++ ++ -v | -verbose | --verbose | --verbos | --verbo | --verb) ++ verbose=yes ;; ++ ++ -version | --version | --versio | --versi | --vers) ++ echo "configure generated by autoconf version AC_ACVERSION" ++ exit 0 ;; ++ ++ -with-* | --with-*) ++ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` ++ # Reject names that are not valid shell variable names. ++changequote(, )dnl ++ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then ++changequote([, ])dnl ++ AC_MSG_ERROR($ac_package: invalid package name) ++ fi ++ ac_package=`echo $ac_package| sed 's/-/_/g'` ++ case "$ac_option" in ++ *=*) ;; ++ *) ac_optarg=yes ;; ++ esac ++ eval "with_${ac_package}='$ac_optarg'" ;; ++ ++ -without-* | --without-*) ++ ac_package=`echo $ac_option|sed -e 's/-*without-//'` ++ # Reject names that are not valid shell variable names. ++changequote(, )dnl ++ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then ++changequote([, ])dnl ++ AC_MSG_ERROR($ac_package: invalid package name) ++ fi ++ ac_package=`echo $ac_package| sed 's/-/_/g'` ++ eval "with_${ac_package}=no" ;; ++ ++ --x) ++ # Obsolete; use --with-x. ++ with_x=yes ;; ++ ++ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ ++ | --x-incl | --x-inc | --x-in | --x-i) ++ ac_prev=x_includes ;; ++ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ ++ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) ++ x_includes="$ac_optarg" ;; ++ ++ -x-libraries | --x-libraries | --x-librarie | --x-librari \ ++ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ++ ac_prev=x_libraries ;; ++ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ ++ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) ++ x_libraries="$ac_optarg" ;; ++ ++ -*) AC_MSG_ERROR([$ac_option: invalid option; use --help to show usage]) ++ ;; ++ ++ *) ++changequote(, )dnl ++ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then ++changequote([, ])dnl ++ AC_MSG_WARN($ac_option: invalid host type) ++ fi ++ if test "x$nonopt" != xNONE; then ++ AC_MSG_ERROR(can only configure for one host and one target at a time) ++ fi ++ nonopt="$ac_option" ++ ;; ++ ++ esac ++done ++ ++if test -n "$ac_prev"; then ++ AC_MSG_ERROR(missing argument to --`echo $ac_prev | sed 's/_/-/g'`) ++fi ++]) ++ ++dnl Try to have only one #! line, so the script doesn't look funny ++dnl for users of AC_REVISION. ++dnl AC_INIT_BINSH() ++AC_DEFUN(AC_INIT_BINSH, ++[#! /bin/sh ++]) ++ ++dnl AC_INIT(UNIQUE-FILE-IN-SOURCE-DIR) ++AC_DEFUN(AC_INIT, ++[sinclude(acsite.m4)dnl ++sinclude(./aclocal.m4)dnl ++AC_REQUIRE([AC_INIT_BINSH])dnl ++AC_INIT_NOTICE ++AC_DIVERT_POP()dnl to NORMAL ++AC_DIVERT_PUSH(AC_DIVERSION_INIT)dnl ++AC_INIT_PARSE_ARGS ++AC_INIT_PREPARE($1)dnl ++AC_DIVERT_POP()dnl to NORMAL ++]) ++ ++dnl AC_INIT_PREPARE(UNIQUE-FILE-IN-SOURCE-DIR) ++AC_DEFUN(AC_INIT_PREPARE, ++[trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 ++ ++# File descriptor usage: ++# 0 standard input ++# 1 file creation ++# 2 errors and warnings ++# 3 some systems may open it to /dev/tty ++# 4 used on the Kubota Titan ++define(AC_FD_MSG, 6)dnl ++[#] AC_FD_MSG checking for... messages and results ++define(AC_FD_CC, 5)dnl ++[#] AC_FD_CC compiler messages saved in config.log ++if test "$silent" = yes; then ++ exec AC_FD_MSG>/dev/null ++else ++ exec AC_FD_MSG>&1 ++fi ++exec AC_FD_CC>./config.log ++ ++echo "\ ++This file contains any messages produced by compilers while ++running configure, to aid debugging if configure makes a mistake. ++" 1>&AC_FD_CC ++ ++# Strip out --no-create and --no-recursion so they do not pile up. ++# Also quote any args containing shell metacharacters. ++ac_configure_args= ++for ac_arg ++do ++ case "$ac_arg" in ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c) ;; ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; ++changequote(<<, >>)dnl ++dnl If you change this globbing pattern, test it on an old shell -- ++dnl it's sensitive. Putting any kind of quote in it causes syntax errors. ++ *" "*|*" "*|*[\[\]\~\<<#>>\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ++ ac_configure_args="$ac_configure_args '$ac_arg'" ;; ++changequote([, ])dnl ++ *) ac_configure_args="$ac_configure_args $ac_arg" ;; ++ esac ++done ++ ++# NLS nuisances. ++# Only set these to C if already set. These must not be set unconditionally ++# because not all systems understand e.g. LANG=C (notably SCO). ++# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! ++# Non-C LC_CTYPE values break the ctype check. ++if test "${LANG+set}" = set; then LANG=C; export LANG; fi ++if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi ++if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi ++if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi ++ ++# confdefs.h avoids OS command line length limits that DEFS can exceed. ++rm -rf conftest* confdefs.h ++# AIX cpp loses on an empty file, so make sure it contains at least a newline. ++echo > confdefs.h ++ ++# A filename unique to this package, relative to the directory that ++# configure is in, which we can look for to find out if srcdir is correct. ++ac_unique_file=$1 ++ ++# Find the source files, if location was not specified. ++if test -z "$srcdir"; then ++ ac_srcdir_defaulted=yes ++ # Try the directory containing this script, then its parent. ++ ac_prog=[$]0 ++changequote(, )dnl ++ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` ++changequote([, ])dnl ++ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. ++ srcdir=$ac_confdir ++ if test ! -r $srcdir/$ac_unique_file; then ++ srcdir=.. ++ fi ++else ++ ac_srcdir_defaulted=no ++fi ++if test ! -r $srcdir/$ac_unique_file; then ++ if test "$ac_srcdir_defaulted" = yes; then ++ AC_MSG_ERROR(can not find sources in $ac_confdir or ..) ++ else ++ AC_MSG_ERROR(can not find sources in $srcdir) ++ fi ++fi ++dnl Double slashes in pathnames in object file debugging info ++dnl mess up M-x gdb in Emacs. ++changequote(, )dnl ++srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` ++changequote([, ])dnl ++ ++dnl Let the site file select an alternate cache file if it wants to. ++AC_SITE_LOAD ++AC_CACHE_LOAD ++AC_LANG_C ++dnl By default always use an empty string as the executable ++dnl extension. Only change it if the script calls AC_EXEEXT. ++ac_exeext= ++dnl By default assume that objects files use an extension of .o. Only ++dnl change it if the script calls AC_OBJEXT. ++ac_objext=o ++AC_PROG_ECHO_N ++dnl Substitute for predefined variables. ++AC_SUBST(SHELL)dnl ++AC_SUBST(CFLAGS)dnl ++AC_SUBST(CPPFLAGS)dnl ++AC_SUBST(CXXFLAGS)dnl ++AC_SUBST(FFLAGS)dnl ++AC_SUBST(DEFS)dnl ++AC_SUBST(LDFLAGS)dnl ++AC_SUBST(LIBS)dnl ++AC_SUBST(exec_prefix)dnl ++AC_SUBST(prefix)dnl ++AC_SUBST(program_transform_name)dnl ++dnl Installation directory options. ++AC_SUBST(bindir)dnl ++AC_SUBST(sbindir)dnl ++AC_SUBST(libexecdir)dnl ++AC_SUBST(datadir)dnl ++AC_SUBST(sysconfdir)dnl ++AC_SUBST(sharedstatedir)dnl ++AC_SUBST(localstatedir)dnl ++AC_SUBST(libdir)dnl ++AC_SUBST(includedir)dnl ++AC_SUBST(oldincludedir)dnl ++AC_SUBST(infodir)dnl ++AC_SUBST(mandir)dnl ++]) ++ ++ ++dnl ### Selecting optional features ++ ++ ++dnl AC_ARG_ENABLE(FEATURE, HELP-STRING, ACTION-IF-TRUE [, ACTION-IF-FALSE]) ++AC_DEFUN(AC_ARG_ENABLE, ++[AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl ++ac_help="$ac_help ++[$2]" ++AC_DIVERT_POP()dnl ++[#] Check whether --enable-[$1] or --disable-[$1] was given. ++if test "[${enable_]patsubst([$1], -, _)+set}" = set; then ++ enableval="[$enable_]patsubst([$1], -, _)" ++ ifelse([$3], , :, [$3]) ++ifelse([$4], , , [else ++ $4 ++])dnl ++fi ++]) ++ ++AC_DEFUN(AC_ENABLE, ++[AC_OBSOLETE([$0], [; instead use AC_ARG_ENABLE])dnl ++AC_ARG_ENABLE([$1], [ --enable-$1], [$2], [$3])dnl ++]) ++ ++ ++dnl ### Working with optional software ++ ++ ++dnl AC_ARG_WITH(PACKAGE, HELP-STRING, ACTION-IF-TRUE [, ACTION-IF-FALSE]) ++AC_DEFUN(AC_ARG_WITH, ++[AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl ++ac_help="$ac_help ++[$2]" ++AC_DIVERT_POP()dnl ++[#] Check whether --with-[$1] or --without-[$1] was given. ++if test "[${with_]patsubst([$1], -, _)+set}" = set; then ++ withval="[$with_]patsubst([$1], -, _)" ++ ifelse([$3], , :, [$3]) ++ifelse([$4], , , [else ++ $4 ++])dnl ++fi ++]) ++ ++AC_DEFUN(AC_WITH, ++[AC_OBSOLETE([$0], [; instead use AC_ARG_WITH])dnl ++AC_ARG_WITH([$1], [ --with-$1], [$2], [$3])dnl ++]) ++ ++ ++dnl ### Transforming program names. ++ ++ ++dnl AC_ARG_PROGRAM() ++AC_DEFUN(AC_ARG_PROGRAM, ++[if test "$program_transform_name" = s,x,x,; then ++ program_transform_name= ++else ++ # Double any \ or $. echo might interpret backslashes. ++ cat <<\EOF_SED > conftestsed ++s,\\,\\\\,g; s,\$,$$,g ++EOF_SED ++ program_transform_name="`echo $program_transform_name|sed -f conftestsed`" ++ rm -f conftestsed ++fi ++test "$program_prefix" != NONE && ++ program_transform_name="s,^,${program_prefix},; $program_transform_name" ++# Use a double $ so make ignores it. ++test "$program_suffix" != NONE && ++ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" ++ ++# sed with no file args requires a program. ++test "$program_transform_name" = "" && program_transform_name="s,x,x," ++]) ++ ++ ++dnl ### Version numbers ++ ++ ++dnl AC_REVISION(REVISION-INFO) ++AC_DEFUN(AC_REVISION, ++[AC_REQUIRE([AC_INIT_BINSH])dnl ++[# From configure.in] translit([$1], $")]) ++ ++dnl Subroutines of AC_PREREQ. ++ ++dnl Change the dots in NUMBER into commas. ++dnl AC_PREREQ_SPLIT(NUMBER) ++define(AC_PREREQ_SPLIT, ++[translit($1, ., [, ])]) ++ ++dnl Default the ternary version number to 0 (e.g., 1, 7 -> 1, 7, 0). ++dnl AC_PREREQ_CANON(MAJOR, MINOR [,TERNARY]) ++define(AC_PREREQ_CANON, ++[$1, $2, ifelse([$3], , 0, [$3])]) ++ ++dnl Complain and exit if version number 1 is less than version number 2. ++dnl PRINTABLE2 is the printable version of version number 2. ++dnl AC_PREREQ_COMPARE(MAJOR1, MINOR1, TERNARY1, MAJOR2, MINOR2, TERNARY2, ++dnl PRINTABLE2) ++define(AC_PREREQ_COMPARE, ++[ifelse(builtin([eval], ++[$3 + $2 * 1000 + $1 * 1000000 < $6 + $5 * 1000 + $4 * 1000000]), 1, ++[errprint(dnl ++FATAL ERROR: Autoconf version $7 or higher is required for this script ++)m4exit(3)])]) ++ ++dnl Complain and exit if the Autoconf version is less than VERSION. ++dnl AC_PREREQ(VERSION) ++define(AC_PREREQ, ++[AC_PREREQ_COMPARE(AC_PREREQ_CANON(AC_PREREQ_SPLIT(AC_ACVERSION)), ++AC_PREREQ_CANON(AC_PREREQ_SPLIT([$1])), [$1])]) ++ ++ ++dnl ### Getting the canonical system type ++ ++ ++dnl Find install-sh, config.sub, config.guess, and Cygnus configure ++dnl in directory DIR. These are auxiliary files used in configuration. ++dnl DIR can be either absolute or relative to $srcdir. ++dnl AC_CONFIG_AUX_DIR(DIR) ++AC_DEFUN(AC_CONFIG_AUX_DIR, ++[AC_CONFIG_AUX_DIRS($1 $srcdir/$1)]) ++ ++dnl The default is `$srcdir' or `$srcdir/..' or `$srcdir/../..'. ++dnl There's no need to call this macro explicitly; just AC_REQUIRE it. ++AC_DEFUN(AC_CONFIG_AUX_DIR_DEFAULT, ++[AC_CONFIG_AUX_DIRS($srcdir $srcdir/.. $srcdir/../..)]) ++ ++dnl Internal subroutine. ++dnl Search for the configuration auxiliary files in directory list $1. ++dnl We look only for install-sh, so users of AC_PROG_INSTALL ++dnl do not automatically need to distribute the other auxiliary files. ++dnl AC_CONFIG_AUX_DIRS(DIR ...) ++AC_DEFUN(AC_CONFIG_AUX_DIRS, ++[ac_aux_dir= ++for ac_dir in $1; do ++ if test -f $ac_dir/install-sh; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install-sh -c" ++ break ++ elif test -f $ac_dir/install.sh; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install.sh -c" ++ break ++ fi ++done ++if test -z "$ac_aux_dir"; then ++ AC_MSG_ERROR([can not find install-sh or install.sh in $1]) ++fi ++ac_config_guess=$ac_aux_dir/config.guess ++ac_config_sub=$ac_aux_dir/config.sub ++ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. ++AC_PROVIDE([AC_CONFIG_AUX_DIR_DEFAULT])dnl ++]) ++ ++dnl Canonicalize the host, target, and build system types. ++AC_DEFUN(AC_CANONICAL_SYSTEM, ++[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl ++AC_BEFORE([$0], [AC_ARG_PROGRAM]) ++# Do some error checking and defaulting for the host and target type. ++# The inputs are: ++# configure --host=HOST --target=TARGET --build=BUILD NONOPT ++# ++# The rules are: ++# 1. You are not allowed to specify --host, --target, and nonopt at the ++# same time. ++# 2. Host defaults to nonopt. ++# 3. If nonopt is not specified, then host defaults to the current host, ++# as determined by config.guess. ++# 4. Target and build default to nonopt. ++# 5. If nonopt is not specified, then target and build default to host. ++ ++# The aliases save the names the user supplied, while $host etc. ++# will get canonicalized. ++case $host---$target---$nonopt in ++NONE---*---* | *---NONE---* | *---*---NONE) ;; ++*) AC_MSG_ERROR(can only configure for one host and one target at a time) ;; ++esac ++ ++AC_CANONICAL_HOST ++AC_CANONICAL_TARGET ++AC_CANONICAL_BUILD ++test "$host_alias" != "$target_alias" && ++ test "$program_prefix$program_suffix$program_transform_name" = \ ++ NONENONEs,x,x, && ++ program_prefix=${target_alias}- ++]) ++ ++dnl Subroutines of AC_CANONICAL_SYSTEM. ++ ++AC_DEFUN(AC_CANONICAL_HOST, ++[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl ++ ++# Make sure we can run config.sub. ++if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : ++else AC_MSG_ERROR(can not run $ac_config_sub) ++fi ++ ++AC_MSG_CHECKING(host system type) ++ ++dnl Set host_alias. ++host_alias=$host ++case "$host_alias" in ++NONE) ++ case $nonopt in ++ NONE) ++ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : ++ else AC_MSG_ERROR(can not guess host type; you must specify one) ++ fi ;; ++ *) host_alias=$nonopt ;; ++ esac ;; ++esac ++ ++dnl Set the other host vars. ++changequote(<<, >>)dnl ++host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` ++host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` ++host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` ++host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` ++changequote([, ])dnl ++AC_MSG_RESULT($host) ++AC_SUBST(host)dnl ++AC_SUBST(host_alias)dnl ++AC_SUBST(host_cpu)dnl ++AC_SUBST(host_vendor)dnl ++AC_SUBST(host_os)dnl ++]) ++ ++dnl Internal use only. ++AC_DEFUN(AC_CANONICAL_TARGET, ++[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl ++AC_MSG_CHECKING(target system type) ++ ++dnl Set target_alias. ++target_alias=$target ++case "$target_alias" in ++NONE) ++ case $nonopt in ++ NONE) target_alias=$host_alias ;; ++ *) target_alias=$nonopt ;; ++ esac ;; ++esac ++ ++dnl Set the other target vars. ++changequote(<<, >>)dnl ++target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` ++target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` ++target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` ++target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` ++changequote([, ])dnl ++AC_MSG_RESULT($target) ++AC_SUBST(target)dnl ++AC_SUBST(target_alias)dnl ++AC_SUBST(target_cpu)dnl ++AC_SUBST(target_vendor)dnl ++AC_SUBST(target_os)dnl ++]) ++ ++dnl Internal use only. ++AC_DEFUN(AC_CANONICAL_BUILD, ++[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl ++AC_MSG_CHECKING(build system type) ++ ++dnl Set build_alias. ++build_alias=$build ++case "$build_alias" in ++NONE) ++ case $nonopt in ++ NONE) build_alias=$host_alias ;; ++ *) build_alias=$nonopt ;; ++ esac ;; ++esac ++ ++dnl Set the other build vars. ++changequote(<<, >>)dnl ++build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` ++build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` ++build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` ++build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` ++changequote([, ])dnl ++AC_MSG_RESULT($build) ++AC_SUBST(build)dnl ++AC_SUBST(build_alias)dnl ++AC_SUBST(build_cpu)dnl ++AC_SUBST(build_vendor)dnl ++AC_SUBST(build_os)dnl ++]) ++ ++ ++dnl AC_VALIDATE_CACHED_SYSTEM_TUPLE[(cmd)] ++dnl if the cache file is inconsistent with the current host, ++dnl target and build system types, execute CMD or print a default ++dnl error message. ++AC_DEFUN(AC_VALIDATE_CACHED_SYSTEM_TUPLE, [ ++ AC_REQUIRE([AC_CANONICAL_SYSTEM]) ++ AC_MSG_CHECKING([cached system tuple]) ++ if { test x"${ac_cv_host_system_type+set}" = x"set" && ++ test x"$ac_cv_host_system_type" != x"$host"; } || ++ { test x"${ac_cv_build_system_type+set}" = x"set" && ++ test x"$ac_cv_build_system_type" != x"$build"; } || ++ { test x"${ac_cv_target_system_type+set}" = x"set" && ++ test x"$ac_cv_target_system_type" != x"$target"; }; then ++ AC_MSG_RESULT([different]) ++ ifelse($#, 1, [$1], ++ [AC_MSG_ERROR([remove config.cache and re-run configure])]) ++ else ++ AC_MSG_RESULT(ok) ++ fi ++ ac_cv_host_system_type="$host" ++ ac_cv_build_system_type="$build" ++ ac_cv_target_system_type="$target" ++]) ++ ++ ++dnl ### Caching test results ++ ++ ++dnl Look for site or system specific initialization scripts. ++dnl AC_SITE_LOAD() ++define(AC_SITE_LOAD, ++[# Prefer explicitly selected file to automatically selected ones. ++if test -z "$CONFIG_SITE"; then ++ if test "x$prefix" != xNONE; then ++ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ++ else ++ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" ++ fi ++fi ++for ac_site_file in $CONFIG_SITE; do ++ if test -r "$ac_site_file"; then ++ echo "loading site script $ac_site_file" ++ . "$ac_site_file" ++ fi ++done ++]) ++ ++dnl AC_CACHE_LOAD() ++define(AC_CACHE_LOAD, ++[if test -r "$cache_file"; then ++ echo "loading cache $cache_file" ++ . $cache_file ++else ++ echo "creating cache $cache_file" ++ > $cache_file ++fi ++]) ++ ++dnl AC_CACHE_SAVE() ++define(AC_CACHE_SAVE, ++[cat > confcache <<\EOF ++# This file is a shell script that caches the results of configure ++# tests run on this system so they can be shared between configure ++# scripts and configure runs. It is not useful on other systems. ++# If it contains results you don't want to keep, you may remove or edit it. ++# ++# By default, configure uses ./config.cache as the cache file, ++# creating it if it does not exist already. You can give configure ++# the --cache-file=FILE option to use a different cache file; that is ++# what configure does when it calls configure scripts in ++# subdirectories, so they share the cache. ++# Giving --cache-file=/dev/null disables caching, for debugging configure. ++# config.status only pays attention to the cache file if you give it the ++# --recheck option to rerun configure. ++# ++EOF ++dnl Allow a site initialization script to override cache values. ++# The following way of writing the cache mishandles newlines in values, ++# but we know of no workaround that is simple, portable, and efficient. ++# So, don't put newlines in cache variables' values. ++# Ultrix sh set writes to stderr and can't be redirected directly, ++# and sets the high bit in the cache file unless we assign to the vars. ++changequote(, )dnl ++(set) 2>&1 | ++ case `(ac_space=' '; set | grep ac_space) 2>&1` in ++ *ac_space=\ *) ++ # `set' does not quote correctly, so add quotes (double-quote substitution ++ # turns \\\\ into \\, and sed turns \\ into \). ++ sed -n \ ++ -e "s/'/'\\\\''/g" \ ++ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ++ ;; ++ *) ++ # `set' quotes correctly as required by POSIX, so do not add quotes. ++ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ++ ;; ++ esac >> confcache ++changequote([, ])dnl ++if cmp -s $cache_file confcache; then ++ : ++else ++ if test -w $cache_file; then ++ echo "updating cache $cache_file" ++ cat confcache > $cache_file ++ else ++ echo "not updating unwritable cache $cache_file" ++ fi ++fi ++rm -f confcache ++]) ++ ++dnl The name of shell var CACHE-ID must contain `_cv_' in order to get saved. ++dnl AC_CACHE_VAL(CACHE-ID, COMMANDS-TO-SET-IT) ++define(AC_CACHE_VAL, ++[dnl We used to use the below line, but it fails if the 1st arg is a ++dnl shell variable, so we need the eval. ++dnl if test "${$1+set}" = set; then ++dnl the '' avoids an AIX 4.1 sh bug ("invalid expansion"). ++if eval "test \"`echo '$''{'$1'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&AC_FD_MSG ++else ++ $2 ++fi ++]) ++ ++dnl AC_CACHE_CHECK(MESSAGE, CACHE-ID, COMMANDS) ++define(AC_CACHE_CHECK, ++[AC_MSG_CHECKING([$1]) ++AC_CACHE_VAL([$2], [$3]) ++AC_MSG_RESULT([$]$2)]) ++ ++ ++dnl ### Defining symbols ++ ++ ++dnl Set VARIABLE to VALUE, verbatim, or 1. ++dnl AC_DEFINE(VARIABLE [, VALUE]) ++define(AC_DEFINE, ++[cat >> confdefs.h <<\EOF ++[#define] $1 ifelse($#, 2, [$2], $#, 3, [$2], 1) ++EOF ++]) ++ ++dnl Similar, but perform shell substitutions $ ` \ once on VALUE. ++define(AC_DEFINE_UNQUOTED, ++[cat >> confdefs.h <&AC_FD_MSG ++echo "configure:__oline__: checking $1" >&AC_FD_CC]) ++ ++dnl AC_CHECKING(FEATURE-DESCRIPTION) ++define(AC_CHECKING, ++[echo "checking $1" 1>&AC_FD_MSG ++echo "configure:__oline__: checking $1" >&AC_FD_CC]) ++ ++dnl AC_MSG_RESULT(RESULT-DESCRIPTION) ++define(AC_MSG_RESULT, ++[echo "$ac_t""$1" 1>&AC_FD_MSG]) ++ ++dnl AC_VERBOSE(RESULT-DESCRIPTION) ++define(AC_VERBOSE, ++[AC_OBSOLETE([$0], [; instead use AC_MSG_RESULT])dnl ++echo " $1" 1>&AC_FD_MSG]) ++ ++dnl AC_MSG_WARN(PROBLEM-DESCRIPTION) ++define(AC_MSG_WARN, ++[echo "configure: warning: $1" 1>&2]) ++ ++dnl AC_MSG_ERROR(ERROR-DESCRIPTION) ++define(AC_MSG_ERROR, ++[{ echo "configure: error: $1" 1>&2; exit 1; }]) ++ ++ ++dnl ### Selecting which language to use for testing ++ ++ ++dnl AC_LANG_C() ++AC_DEFUN(AC_LANG_C, ++[define([AC_LANG], [C])dnl ++ac_ext=c ++# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&AC_FD_CC' ++ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' ++cross_compiling=$ac_cv_prog_cc_cross ++]) ++ ++dnl AC_LANG_CPLUSPLUS() ++AC_DEFUN(AC_LANG_CPLUSPLUS, ++[define([AC_LANG], [CPLUSPLUS])dnl ++ac_ext=C ++# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_cpp='$CXXCPP $CPPFLAGS' ++ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&AC_FD_CC' ++ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' ++cross_compiling=$ac_cv_prog_cxx_cross ++]) ++ ++dnl AC_LANG_FORTRAN77() ++AC_DEFUN(AC_LANG_FORTRAN77, ++[define([AC_LANG], [FORTRAN77])dnl ++ac_ext=f ++ac_compile='${F77-f77} -c $FFLAGS conftest.$ac_ext 1>&AC_FD_CC' ++ac_link='${F77-f77} -o conftest${ac_exeext} $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' ++cross_compiling=$ac_cv_prog_f77_cross ++]) ++ ++dnl Push the current language on a stack. ++dnl AC_LANG_SAVE() ++define(AC_LANG_SAVE, ++[pushdef([AC_LANG_STACK], AC_LANG)]) ++ ++dnl Restore the current language from the stack. ++dnl AC_LANG_RESTORE() ++pushdef([AC_LANG_RESTORE], ++[ifelse(AC_LANG_STACK, [C], [AC_LANG_C],dnl ++AC_LANG_STACK, [CPLUSPLUS], [AC_LANG_CPLUSPLUS],dnl ++AC_LANG_STACK, [FORTRAN77], [AC_LANG_FORTRAN77])[]popdef([AC_LANG_STACK])]) ++ ++ ++dnl ### Compiler-running mechanics ++ ++ ++dnl The purpose of this macro is to "configure:123: command line" ++dnl written into config.log for every test run. ++dnl AC_TRY_EVAL(VARIABLE) ++AC_DEFUN(AC_TRY_EVAL, ++[{ (eval echo configure:__oline__: \"[$]$1\") 1>&AC_FD_CC; dnl ++(eval [$]$1) 2>&AC_FD_CC; }]) ++ ++dnl AC_TRY_COMMAND(COMMAND) ++AC_DEFUN(AC_TRY_COMMAND, ++[{ ac_try='$1'; AC_TRY_EVAL(ac_try); }]) ++ ++ ++dnl ### Dependencies between macros ++ ++ ++dnl AC_BEFORE(THIS-MACRO-NAME, CALLED-MACRO-NAME) ++define(AC_BEFORE, ++[ifdef([AC_PROVIDE_$2], [errprint(__file__:__line__: [$2 was called before $1 ++])])]) ++ ++dnl AC_REQUIRE(MACRO-NAME) ++define(AC_REQUIRE, ++[ifdef([AC_PROVIDE_$1], , ++[AC_DIVERT_PUSH(builtin(eval, AC_DIVERSION_CURRENT - 1))dnl ++indir([$1]) ++AC_DIVERT_POP()dnl ++])]) ++ ++dnl AC_PROVIDE(MACRO-NAME) ++define(AC_PROVIDE, ++[define([AC_PROVIDE_$1], )]) ++ ++dnl AC_OBSOLETE(THIS-MACRO-NAME [, SUGGESTION]) ++define(AC_OBSOLETE, ++[errprint(__file__:__line__: warning: [$1] is obsolete[$2] ++)]) ++ ++ ++dnl ### Checking for programs ++ ++ ++dnl AC_CHECK_PROG(VARIABLE, PROG-TO-CHECK-FOR, VALUE-IF-FOUND ++dnl [, [VALUE-IF-NOT-FOUND] [, [PATH] [, [REJECT]]]]) ++AC_DEFUN(AC_CHECK_PROG, ++[# Extract the first word of "$2", so it can be a program name with args. ++set dummy $2; ac_word=[$]2 ++AC_MSG_CHECKING([for $ac_word]) ++AC_CACHE_VAL(ac_cv_prog_$1, ++[if test -n "[$]$1"; then ++ ac_cv_prog_$1="[$]$1" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ifelse([$6], , , [ ac_prog_rejected=no ++])dnl ++dnl $ac_dummy forces splitting on constant user-supplied paths. ++dnl POSIX.2 word splitting is done only on the output of word expansions, ++dnl not every word. This closes a longstanding sh security hole. ++ ac_dummy="ifelse([$5], , $PATH, [$5])" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ifelse([$6], , , dnl ++[ if test "[$ac_dir/$ac_word]" = "$6"; then ++ ac_prog_rejected=yes ++ continue ++ fi ++])dnl ++ ac_cv_prog_$1="$3" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ifelse([$6], , , [if test $ac_prog_rejected = yes; then ++ # We found a bogon in the path, so make sure we never use it. ++ set dummy [$]ac_cv_prog_$1 ++ shift ++ if test [$]# -gt 0; then ++ # We chose a different compiler from the bogus one. ++ # However, it has the same basename, so the bogon will be chosen ++ # first if we set $1 to just the basename; use the full file name. ++ shift ++ set dummy "$ac_dir/$ac_word" "[$]@" ++ shift ++ ac_cv_prog_$1="[$]@" ++ifelse([$2], [$4], dnl ++[ else ++ # Default is a loser. ++ AC_MSG_ERROR([$1=$6 unacceptable, but no other $4 found in dnl ++ifelse([$5], , [\$]PATH, [$5])]) ++])dnl ++ fi ++fi ++])dnl ++dnl If no 4th arg is given, leave the cache variable unset, ++dnl so AC_CHECK_PROGS will keep looking. ++ifelse([$4], , , [ test -z "[$]ac_cv_prog_$1" && ac_cv_prog_$1="$4" ++])dnl ++fi])dnl ++$1="$ac_cv_prog_$1" ++if test -n "[$]$1"; then ++ AC_MSG_RESULT([$]$1) ++else ++ AC_MSG_RESULT(no) ++fi ++AC_SUBST($1)dnl ++]) ++ ++dnl AC_PATH_PROG(VARIABLE, PROG-TO-CHECK-FOR [, VALUE-IF-NOT-FOUND [, PATH]]) ++AC_DEFUN(AC_PATH_PROG, ++[# Extract the first word of "$2", so it can be a program name with args. ++set dummy $2; ac_word=[$]2 ++AC_MSG_CHECKING([for $ac_word]) ++AC_CACHE_VAL(ac_cv_path_$1, ++[case "[$]$1" in ++ /*) ++ ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ++ ;; ++ ?:/*) ++ ac_cv_path_$1="[$]$1" # Let the user override the test with a dos path. ++ ;; ++ *) ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++dnl $ac_dummy forces splitting on constant user-supplied paths. ++dnl POSIX.2 word splitting is done only on the output of word expansions, ++dnl not every word. This closes a longstanding sh security hole. ++ ac_dummy="ifelse([$4], , $PATH, [$4])" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_path_$1="$ac_dir/$ac_word" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++dnl If no 3rd arg is given, leave the cache variable unset, ++dnl so AC_PATH_PROGS will keep looking. ++ifelse([$3], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$3" ++])dnl ++ ;; ++esac])dnl ++$1="$ac_cv_path_$1" ++if test -n "[$]$1"; then ++ AC_MSG_RESULT([$]$1) ++else ++ AC_MSG_RESULT(no) ++fi ++AC_SUBST($1)dnl ++]) ++ ++dnl AC_CHECK_PROGS(VARIABLE, PROGS-TO-CHECK-FOR [, VALUE-IF-NOT-FOUND ++dnl [, PATH]]) ++AC_DEFUN(AC_CHECK_PROGS, ++[for ac_prog in $2 ++do ++AC_CHECK_PROG($1, [$]ac_prog, [$]ac_prog, , $4) ++test -n "[$]$1" && break ++done ++ifelse([$3], , , [test -n "[$]$1" || $1="$3" ++])]) ++ ++dnl AC_PATH_PROGS(VARIABLE, PROGS-TO-CHECK-FOR [, VALUE-IF-NOT-FOUND ++dnl [, PATH]]) ++AC_DEFUN(AC_PATH_PROGS, ++[for ac_prog in $2 ++do ++AC_PATH_PROG($1, [$]ac_prog, , $4) ++test -n "[$]$1" && break ++done ++ifelse([$3], , , [test -n "[$]$1" || $1="$3" ++])]) ++ ++dnl Internal subroutine. ++AC_DEFUN(AC_CHECK_TOOL_PREFIX, ++[AC_REQUIRE([AC_CANONICAL_HOST])AC_REQUIRE([AC_CANONICAL_BUILD])dnl ++if test $host != $build; then ++ ac_tool_prefix=${host_alias}- ++else ++ ac_tool_prefix= ++fi ++]) ++ ++dnl AC_CHECK_TOOL(VARIABLE, PROG-TO-CHECK-FOR[, VALUE-IF-NOT-FOUND [, PATH]]) ++AC_DEFUN(AC_CHECK_TOOL, ++[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl ++AC_CHECK_PROG($1, ${ac_tool_prefix}$2, ${ac_tool_prefix}$2, ++ ifelse([$3], , [$2], ), $4) ++ifelse([$3], , , [ ++if test -z "$ac_cv_prog_$1"; then ++if test -n "$ac_tool_prefix"; then ++ AC_CHECK_PROG($1, $2, $2, $3) ++else ++ $1="$3" ++fi ++fi]) ++]) ++ ++dnl Guess the value for the `prefix' variable by looking for ++dnl the argument program along PATH and taking its parent. ++dnl Example: if the argument is `gcc' and we find /usr/local/gnu/bin/gcc, ++dnl set `prefix' to /usr/local/gnu. ++dnl This comes too late to find a site file based on the prefix, ++dnl and it might use a cached value for the path. ++dnl No big loss, I think, since most configures don't use this macro anyway. ++dnl AC_PREFIX_PROGRAM(PROGRAM) ++AC_DEFUN(AC_PREFIX_PROGRAM, ++[if test "x$prefix" = xNONE; then ++changequote(<<, >>)dnl ++define(<>, translit($1, [a-z], [A-Z]))dnl ++changequote([, ])dnl ++dnl We reimplement AC_MSG_CHECKING (mostly) to avoid the ... in the middle. ++echo $ac_n "checking for prefix by $ac_c" 1>&AC_FD_MSG ++AC_PATH_PROG(AC_VAR_NAME, $1) ++changequote(<<, >>)dnl ++ if test -n "$ac_cv_path_<<>>AC_VAR_NAME"; then ++ prefix=`echo $ac_cv_path_<<>>AC_VAR_NAME|sed 's%/[^/][^/]*//*[^/][^/]*$%%'` ++changequote([, ])dnl ++ fi ++fi ++undefine([AC_VAR_NAME])dnl ++]) ++ ++dnl Try to compile, link and execute TEST-PROGRAM. Set WORKING-VAR to ++dnl `yes' if the current compiler works, otherwise set it ti `no'. Set ++dnl CROSS-VAR to `yes' if the compiler and linker produce non-native ++dnl executables, otherwise set it to `no'. Before calling ++dnl `AC_TRY_COMPILER()', call `AC_LANG_*' to set-up for the right ++dnl language. ++dnl ++dnl AC_TRY_COMPILER(TEST-PROGRAM, WORKING-VAR, CROSS-VAR) ++AC_DEFUN(AC_TRY_COMPILER, ++[cat > conftest.$ac_ext << EOF ++ifelse(AC_LANG, [FORTRAN77], , ++[ ++[#]line __oline__ "configure" ++#include "confdefs.h" ++]) ++[$1] ++EOF ++if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then ++ [$2]=yes ++ # If we can't run a trivial program, we are probably using a cross compiler. ++ if (./conftest; exit) 2>/dev/null; then ++ [$3]=no ++ else ++ [$3]=yes ++ fi ++else ++ echo "configure: failed program was:" >&AC_FD_CC ++ cat conftest.$ac_ext >&AC_FD_CC ++ [$2]=no ++fi ++rm -fr conftest*]) ++ ++ ++dnl ### Checking for libraries ++ ++ ++dnl AC_TRY_LINK_FUNC(func, action-if-found, action-if-not-found) ++dnl Try to link a program that calls FUNC, handling GCC builtins. If ++dnl the link succeeds, execute ACTION-IF-FOUND; otherwise, execute ++dnl ACTION-IF-NOT-FOUND. ++ ++AC_DEFUN(AC_TRY_LINK_FUNC, ++AC_TRY_LINK(dnl ++ifelse([$1], [main], , dnl Avoid conflicting decl of main. ++[/* Override any gcc2 internal prototype to avoid an error. */ ++]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus ++extern "C" ++#endif ++])dnl ++[/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $1(); ++]), ++[$1()], ++[$2], ++[$3])) ++ ++ ++dnl AC_SEARCH_LIBS(FUNCTION, SEARCH-LIBS [, ACTION-IF-FOUND ++dnl [, ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]]) ++dnl Search for a library defining FUNC, if it's not already available. ++ ++AC_DEFUN(AC_SEARCH_LIBS, ++[AC_PREREQ([2.13]) ++AC_CACHE_CHECK([for library containing $1], [ac_cv_search_$1], ++[ac_func_search_save_LIBS="$LIBS" ++ac_cv_search_$1="no" ++AC_TRY_LINK_FUNC([$1], [ac_cv_search_$1="none required"]) ++test "$ac_cv_search_$1" = "no" && for i in $2; do ++LIBS="-l$i $5 $ac_func_search_save_LIBS" ++AC_TRY_LINK_FUNC([$1], ++[ac_cv_search_$1="-l$i" ++break]) ++done ++LIBS="$ac_func_search_save_LIBS"]) ++if test "$ac_cv_search_$1" != "no"; then ++ test "$ac_cv_search_$1" = "none required" || LIBS="$ac_cv_search_$1 $LIBS" ++ $3 ++else : ++ $4 ++fi]) ++ ++ ++ ++dnl AC_CHECK_LIB(LIBRARY, FUNCTION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ++dnl [, OTHER-LIBRARIES]]]) ++AC_DEFUN(AC_CHECK_LIB, ++[AC_MSG_CHECKING([for $2 in -l$1]) ++dnl Use a cache variable name containing both the library and function name, ++dnl because the test really is for library $1 defining function $2, not ++dnl just for library $1. Separate tests with the same $1 and different $2s ++dnl may have different results. ++ac_lib_var=`echo $1['_']$2 | sed 'y%./+-%__p_%'` ++AC_CACHE_VAL(ac_cv_lib_$ac_lib_var, ++[ac_save_LIBS="$LIBS" ++LIBS="-l$1 $5 $LIBS" ++AC_TRY_LINK(dnl ++ifelse(AC_LANG, [FORTRAN77], , ++ifelse([$2], [main], , dnl Avoid conflicting decl of main. ++[/* Override any gcc2 internal prototype to avoid an error. */ ++]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus ++extern "C" ++#endif ++])dnl ++[/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $2(); ++])), ++ [$2()], ++ eval "ac_cv_lib_$ac_lib_var=yes", ++ eval "ac_cv_lib_$ac_lib_var=no") ++LIBS="$ac_save_LIBS" ++])dnl ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ AC_MSG_RESULT(yes) ++ ifelse([$3], , ++[changequote(, )dnl ++ ac_tr_lib=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` ++changequote([, ])dnl ++ AC_DEFINE_UNQUOTED($ac_tr_lib) ++ LIBS="-l$1 $LIBS" ++], [$3]) ++else ++ AC_MSG_RESULT(no) ++ifelse([$4], , , [$4 ++])dnl ++fi ++]) ++ ++dnl AC_HAVE_LIBRARY(LIBRARY, [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ++dnl [, OTHER-LIBRARIES]]]) ++AC_DEFUN(AC_HAVE_LIBRARY, ++[AC_OBSOLETE([$0], [; instead use AC_CHECK_LIB])dnl ++changequote(<<, >>)dnl ++define(<>, dnl ++patsubst(patsubst($1, <>, <<\1>>), <<-l>>, <<>>))dnl ++define(<>, ac_cv_lib_<<>>AC_LIB_NAME)dnl ++changequote([, ])dnl ++AC_MSG_CHECKING([for -l[]AC_LIB_NAME]) ++AC_CACHE_VAL(AC_CV_NAME, ++[ac_save_LIBS="$LIBS" ++LIBS="-l[]AC_LIB_NAME[] $4 $LIBS" ++AC_TRY_LINK( , [main()], AC_CV_NAME=yes, AC_CV_NAME=no) ++LIBS="$ac_save_LIBS" ++])dnl ++AC_MSG_RESULT($AC_CV_NAME) ++if test "$AC_CV_NAME" = yes; then ++ ifelse([$2], , ++[AC_DEFINE([HAVE_LIB]translit(AC_LIB_NAME, [a-z], [A-Z])) ++ LIBS="-l[]AC_LIB_NAME[] $LIBS" ++], [$2]) ++ifelse([$3], , , [else ++ $3 ++])dnl ++fi ++undefine([AC_LIB_NAME])dnl ++undefine([AC_CV_NAME])dnl ++]) ++ ++ ++dnl ### Examining declarations ++ ++ ++dnl AC_TRY_CPP(INCLUDES, [ACTION-IF-TRUE [, ACTION-IF-FALSE]]) ++AC_DEFUN(AC_TRY_CPP, ++[AC_REQUIRE_CPP()dnl ++cat > conftest.$ac_ext <&AC_FD_CC ++ echo "configure: failed program was:" >&AC_FD_CC ++ cat conftest.$ac_ext >&AC_FD_CC ++ifelse([$3], , , [ rm -rf conftest* ++ $3 ++])dnl ++fi ++rm -f conftest*]) ++ ++dnl AC_EGREP_HEADER(PATTERN, HEADER-FILE, ACTION-IF-FOUND [, ++dnl ACTION-IF-NOT-FOUND]) ++AC_DEFUN(AC_EGREP_HEADER, ++[AC_EGREP_CPP([$1], [#include <$2>], [$3], [$4])]) ++ ++dnl Because this macro is used by AC_PROG_GCC_TRADITIONAL, which must ++dnl come early, it is not included in AC_BEFORE checks. ++dnl AC_EGREP_CPP(PATTERN, PROGRAM, [ACTION-IF-FOUND [, ++dnl ACTION-IF-NOT-FOUND]]) ++AC_DEFUN(AC_EGREP_CPP, ++[AC_REQUIRE_CPP()dnl ++cat > conftest.$ac_ext <&AC_FD_CC | ++dnl Prevent m4 from eating character classes: ++changequote(, )dnl ++ egrep "$1" >/dev/null 2>&1; then ++changequote([, ])dnl ++ ifelse([$3], , :, [rm -rf conftest* ++ $3]) ++ifelse([$4], , , [else ++ rm -rf conftest* ++ $4 ++])dnl ++fi ++rm -f conftest* ++]) ++ ++ ++dnl ### Examining syntax ++ ++ ++dnl AC_TRY_COMPILE(INCLUDES, FUNCTION-BODY, ++dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) ++AC_DEFUN(AC_TRY_COMPILE, ++[cat > conftest.$ac_ext <&AC_FD_CC ++ cat conftest.$ac_ext >&AC_FD_CC ++ifelse([$4], , , [ rm -rf conftest* ++ $4 ++])dnl ++fi ++rm -f conftest*]) ++ ++ ++dnl ### Examining libraries ++ ++ ++dnl AC_COMPILE_CHECK(ECHO-TEXT, INCLUDES, FUNCTION-BODY, ++dnl ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) ++AC_DEFUN(AC_COMPILE_CHECK, ++[AC_OBSOLETE([$0], [; instead use AC_TRY_COMPILE or AC_TRY_LINK, and AC_MSG_CHECKING and AC_MSG_RESULT])dnl ++ifelse([$1], , , [AC_CHECKING([for $1]) ++])dnl ++AC_TRY_LINK([$2], [$3], [$4], [$5]) ++]) ++ ++dnl AC_TRY_LINK(INCLUDES, FUNCTION-BODY, ++dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) ++AC_DEFUN(AC_TRY_LINK, ++[cat > conftest.$ac_ext <&AC_FD_CC ++ cat conftest.$ac_ext >&AC_FD_CC ++ifelse([$4], , , [ rm -rf conftest* ++ $4 ++])dnl ++fi ++rm -f conftest*]) ++ ++ ++dnl ### Checking for run-time features ++ ++ ++dnl AC_TRY_RUN(PROGRAM, [ACTION-IF-TRUE [, ACTION-IF-FALSE ++dnl [, ACTION-IF-CROSS-COMPILING]]]) ++AC_DEFUN(AC_TRY_RUN, ++[if test "$cross_compiling" = yes; then ++ ifelse([$4], , ++ [errprint(__file__:__line__: warning: [AC_TRY_RUN] called without default to allow cross compiling ++)dnl ++ AC_MSG_ERROR(can not run test program while cross compiling)], ++ [$4]) ++else ++ AC_TRY_RUN_NATIVE([$1], [$2], [$3]) ++fi ++]) ++ ++dnl Like AC_TRY_RUN but assumes a native-environment (non-cross) compiler. ++dnl AC_TRY_RUN_NATIVE(PROGRAM, [ACTION-IF-TRUE [, ACTION-IF-FALSE]]) ++AC_DEFUN(AC_TRY_RUN_NATIVE, ++[cat > conftest.$ac_ext </dev/null ++then ++dnl Don't remove the temporary files here, so they can be examined. ++ ifelse([$2], , :, [$2]) ++else ++ echo "configure: failed program was:" >&AC_FD_CC ++ cat conftest.$ac_ext >&AC_FD_CC ++ifelse([$3], , , [ rm -fr conftest* ++ $3 ++])dnl ++fi ++rm -fr conftest*]) ++ ++ ++dnl ### Checking for header files ++ ++ ++dnl AC_CHECK_HEADER(HEADER-FILE, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) ++AC_DEFUN(AC_CHECK_HEADER, ++[dnl Do the transliteration at runtime so arg 1 can be a shell variable. ++ac_safe=`echo "$1" | sed 'y%./+-%__p_%'` ++AC_MSG_CHECKING([for $1]) ++AC_CACHE_VAL(ac_cv_header_$ac_safe, ++[AC_TRY_CPP([#include <$1>], eval "ac_cv_header_$ac_safe=yes", ++ eval "ac_cv_header_$ac_safe=no")])dnl ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ AC_MSG_RESULT(yes) ++ ifelse([$2], , :, [$2]) ++else ++ AC_MSG_RESULT(no) ++ifelse([$3], , , [$3 ++])dnl ++fi ++]) ++ ++dnl AC_CHECK_HEADERS(HEADER-FILE... [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) ++AC_DEFUN(AC_CHECK_HEADERS, ++[for ac_hdr in $1 ++do ++AC_CHECK_HEADER($ac_hdr, ++[changequote(, )dnl ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++changequote([, ])dnl ++ AC_DEFINE_UNQUOTED($ac_tr_hdr) $2], $3)dnl ++done ++]) ++ ++ ++dnl ### Checking for the existence of files ++ ++dnl AC_CHECK_FILE(FILE, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) ++AC_DEFUN(AC_CHECK_FILE, ++[AC_REQUIRE([AC_PROG_CC]) ++dnl Do the transliteration at runtime so arg 1 can be a shell variable. ++ac_safe=`echo "$1" | sed 'y%./+-%__p_%'` ++AC_MSG_CHECKING([for $1]) ++AC_CACHE_VAL(ac_cv_file_$ac_safe, ++[if test "$cross_compiling" = yes; then ++ errprint(__file__:__line__: warning: Cannot check for file existence when cross compiling ++)dnl ++ AC_MSG_ERROR(Cannot check for file existence when cross compiling) ++else ++ if test -r $1; then ++ eval "ac_cv_file_$ac_safe=yes" ++ else ++ eval "ac_cv_file_$ac_safe=no" ++ fi ++fi])dnl ++if eval "test \"`echo '$ac_cv_file_'$ac_safe`\" = yes"; then ++ AC_MSG_RESULT(yes) ++ ifelse([$2], , :, [$2]) ++else ++ AC_MSG_RESULT(no) ++ifelse([$3], , , [$3]) ++fi ++]) ++ ++dnl AC_CHECK_FILES(FILE... [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) ++AC_DEFUN(AC_CHECK_FILES, ++[for ac_file in $1 ++do ++AC_CHECK_FILE($ac_file, ++[changequote(, )dnl ++ ac_tr_file=HAVE_`echo $ac_file | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++changequote([, ])dnl ++ AC_DEFINE_UNQUOTED($ac_tr_file) $2], $3)dnl ++done ++]) ++ ++ ++dnl ### Checking for library functions ++ ++ ++dnl AC_CHECK_FUNC(FUNCTION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) ++AC_DEFUN(AC_CHECK_FUNC, ++[AC_MSG_CHECKING([for $1]) ++AC_CACHE_VAL(ac_cv_func_$1, ++[AC_TRY_LINK( ++dnl Don't include because on OSF/1 3.0 it includes ++dnl which includes which contains a prototype for ++dnl select. Similarly for bzero. ++[/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $1(); below. */ ++#include ++/* Override any gcc2 internal prototype to avoid an error. */ ++]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus ++extern "C" ++#endif ++])dnl ++[/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $1(); ++], [ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$1) || defined (__stub___$1) ++choke me ++#else ++$1(); ++#endif ++], eval "ac_cv_func_$1=yes", eval "ac_cv_func_$1=no")]) ++if eval "test \"`echo '$ac_cv_func_'$1`\" = yes"; then ++ AC_MSG_RESULT(yes) ++ ifelse([$2], , :, [$2]) ++else ++ AC_MSG_RESULT(no) ++ifelse([$3], , , [$3 ++])dnl ++fi ++]) ++ ++dnl AC_CHECK_FUNCS(FUNCTION... [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) ++AC_DEFUN(AC_CHECK_FUNCS, ++[for ac_func in $1 ++do ++AC_CHECK_FUNC($ac_func, ++[changequote(, )dnl ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++changequote([, ])dnl ++ AC_DEFINE_UNQUOTED($ac_tr_func) $2], $3)dnl ++done ++]) ++ ++dnl AC_REPLACE_FUNCS(FUNCTION...) ++AC_DEFUN(AC_REPLACE_FUNCS, ++[AC_CHECK_FUNCS([$1], , [LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"]) ++AC_SUBST(LIBOBJS)dnl ++]) ++ ++ ++dnl ### Checking compiler characteristics ++ ++ ++dnl AC_CHECK_SIZEOF(TYPE [, CROSS-SIZE]) ++AC_DEFUN(AC_CHECK_SIZEOF, ++[changequote(<<, >>)dnl ++dnl The name to #define. ++define(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl ++dnl The cache variable name. ++define(<>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl ++changequote([, ])dnl ++AC_MSG_CHECKING(size of $1) ++AC_CACHE_VAL(AC_CV_NAME, ++[AC_TRY_RUN([#include ++main() ++{ ++ FILE *f=fopen("conftestval", "w"); ++ if (!f) exit(1); ++ fprintf(f, "%d\n", sizeof($1)); ++ exit(0); ++}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, ifelse([$2], , , AC_CV_NAME=$2))])dnl ++AC_MSG_RESULT($AC_CV_NAME) ++AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME) ++undefine([AC_TYPE_NAME])dnl ++undefine([AC_CV_NAME])dnl ++]) ++ ++ ++dnl ### Checking for typedefs ++ ++ ++dnl AC_CHECK_TYPE(TYPE, DEFAULT) ++AC_DEFUN(AC_CHECK_TYPE, ++[AC_REQUIRE([AC_HEADER_STDC])dnl ++AC_MSG_CHECKING(for $1) ++AC_CACHE_VAL(ac_cv_type_$1, ++[AC_EGREP_CPP(dnl ++changequote(<<,>>)dnl ++<<(^|[^a-zA-Z_0-9])$1[^a-zA-Z_0-9]>>dnl ++changequote([,]), [#include ++#if STDC_HEADERS ++#include ++#include ++#endif], ac_cv_type_$1=yes, ac_cv_type_$1=no)])dnl ++AC_MSG_RESULT($ac_cv_type_$1) ++if test $ac_cv_type_$1 = no; then ++ AC_DEFINE($1, $2) ++fi ++]) ++ ++ ++dnl ### Creating output files ++ ++ ++dnl AC_CONFIG_HEADER(HEADER-TO-CREATE ...) ++AC_DEFUN(AC_CONFIG_HEADER, ++[define(AC_LIST_HEADER, $1)]) ++ ++dnl Link each of the existing files SOURCE... to the corresponding ++dnl link name in DEST... ++dnl AC_LINK_FILES(SOURCE..., DEST...) ++AC_DEFUN(AC_LINK_FILES, ++[dnl ++define([AC_LIST_FILES], ifdef([AC_LIST_FILES], [AC_LIST_FILES ],)[$1])dnl ++define([AC_LIST_LINKS], ifdef([AC_LIST_LINKS], [AC_LIST_LINKS ],)[$2])]) ++ ++dnl Add additional commands for AC_OUTPUT to put into config.status. ++dnl Use diversions instead of macros so we can be robust in the ++dnl presence of commas in $1 and/or $2. ++dnl AC_OUTPUT_COMMANDS(EXTRA-CMDS, INIT-CMDS) ++AC_DEFUN(AC_OUTPUT_COMMANDS, ++[AC_DIVERT_PUSH(AC_DIVERSION_CMDS)dnl ++[$1] ++AC_DIVERT_POP()dnl ++AC_DIVERT_PUSH(AC_DIVERSION_ICMDS)dnl ++[$2] ++AC_DIVERT_POP()]) ++ ++dnl AC_CONFIG_SUBDIRS(DIR ...) ++AC_DEFUN(AC_CONFIG_SUBDIRS, ++[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl ++define([AC_LIST_SUBDIRS], ifdef([AC_LIST_SUBDIRS], [AC_LIST_SUBDIRS ],)[$1])dnl ++subdirs="AC_LIST_SUBDIRS" ++AC_SUBST(subdirs)dnl ++]) ++ ++dnl The big finish. ++dnl Produce config.status, config.h, and links; and configure subdirs. ++dnl AC_OUTPUT([FILE...] [, EXTRA-CMDS] [, INIT-CMDS]) ++define(AC_OUTPUT, ++[trap '' 1 2 15 ++AC_CACHE_SAVE ++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 ++ ++test "x$prefix" = xNONE && prefix=$ac_default_prefix ++# Let make expand exec_prefix. ++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' ++ ++# Any assignment to VPATH causes Sun make to only execute ++# the first set of double-colon rules, so remove it if not needed. ++# If there is a colon in the path, we need to keep it. ++if test "x$srcdir" = x.; then ++changequote(, )dnl ++ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' ++changequote([, ])dnl ++fi ++ ++trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 ++ ++ifdef([AC_LIST_HEADER], [DEFS=-DHAVE_CONFIG_H], [AC_OUTPUT_MAKE_DEFS()]) ++ ++# Without the "./", some shells look in PATH for config.status. ++: ${CONFIG_STATUS=./config.status} ++ ++echo creating $CONFIG_STATUS ++rm -f $CONFIG_STATUS ++cat > $CONFIG_STATUS </dev/null | sed 1q`: ++# ++[#] [$]0 [$]ac_configure_args ++# ++# Compiler output produced by configure, useful for debugging ++# configure, is in ./config.log if it exists. ++ ++changequote(, )dnl ++ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" ++changequote([, ])dnl ++for ac_option ++do ++ case "[\$]ac_option" in ++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ++ echo "running [\$]{CONFIG_SHELL-/bin/sh} [$]0 [$]ac_configure_args --no-create --no-recursion" ++ exec [\$]{CONFIG_SHELL-/bin/sh} [$]0 [$]ac_configure_args --no-create --no-recursion ;; ++ -version | --version | --versio | --versi | --vers | --ver | --ve | --v) ++ echo "$CONFIG_STATUS generated by autoconf version AC_ACVERSION" ++ exit 0 ;; ++ -help | --help | --hel | --he | --h) ++ echo "[\$]ac_cs_usage"; exit 0 ;; ++ *) echo "[\$]ac_cs_usage"; exit 1 ;; ++ esac ++done ++ ++ac_given_srcdir=$srcdir ++ifdef([AC_PROVIDE_AC_PROG_INSTALL], [ac_given_INSTALL="$INSTALL" ++])dnl ++ ++changequote(<<, >>)dnl ++ifdef(<>, ++<>, ++<>) ++changequote([, ])dnl ++EOF ++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF ++undivert(AC_DIVERSION_CMDS)dnl ++$2 ++exit 0 ++EOF ++chmod +x $CONFIG_STATUS ++rm -fr confdefs* $ac_clean_files ++test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 ++dnl config.status should not do recursion. ++ifdef([AC_LIST_SUBDIRS], [AC_OUTPUT_SUBDIRS(AC_LIST_SUBDIRS)])dnl ++])dnl ++ ++dnl Set the DEFS variable to the -D options determined earlier. ++dnl This is a subroutine of AC_OUTPUT. ++dnl It is called inside configure, outside of config.status. ++dnl AC_OUTPUT_MAKE_DEFS() ++define(AC_OUTPUT_MAKE_DEFS, ++[# Transform confdefs.h into DEFS. ++dnl Using a here document instead of a string reduces the quoting nightmare. ++# Protect against shell expansion while executing Makefile rules. ++# Protect against Makefile macro expansion. ++cat > conftest.defs <<\EOF ++changequote(<<, >>)dnl ++s%<<#define>> \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g ++s%[ `~<<#>>$^&*(){}\\|;'"<>?]%\\&%g ++s%\[%\\&%g ++s%\]%\\&%g ++s%\$%$$%g ++changequote([, ])dnl ++EOF ++DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` ++rm -f conftest.defs ++]) ++ ++dnl Do the variable substitutions to create the Makefiles or whatever. ++dnl This is a subroutine of AC_OUTPUT. It is called inside an unquoted ++dnl here document whose contents are going into config.status, but ++dnl upon returning, the here document is being quoted. ++dnl AC_OUTPUT_FILES(FILE...) ++define(AC_OUTPUT_FILES, ++[# Protect against being on the right side of a sed subst in config.status. ++changequote(, )dnl ++sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; ++ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF ++changequote([, ])dnl ++dnl These here document variables are unquoted when configure runs ++dnl but quoted when config.status runs, so variables are expanded once. ++$ac_vpsub ++dnl Shell code in configure.in might set extrasub. ++$extrasub ++dnl Insert the sed substitutions of variables. ++undivert(AC_DIVERSION_SED) ++CEOF ++EOF ++ ++cat >> $CONFIG_STATUS <<\EOF ++ ++# Split the substitutions into bite-sized pieces for seds with ++# small command number limits, like on Digital OSF/1 and HP-UX. ++ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ++ac_file=1 # Number of current file. ++ac_beg=1 # First line for current file. ++ac_end=$ac_max_sed_cmds # Line after last line for current file. ++ac_more_lines=: ++ac_sed_cmds="" ++while $ac_more_lines; do ++ if test $ac_beg -gt 1; then ++ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file ++ else ++ sed "${ac_end}q" conftest.subs > conftest.s$ac_file ++ fi ++ if test ! -s conftest.s$ac_file; then ++ ac_more_lines=false ++ rm -f conftest.s$ac_file ++ else ++ if test -z "$ac_sed_cmds"; then ++ ac_sed_cmds="sed -f conftest.s$ac_file" ++ else ++ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" ++ fi ++ ac_file=`expr $ac_file + 1` ++ ac_beg=$ac_end ++ ac_end=`expr $ac_end + $ac_max_sed_cmds` ++ fi ++done ++if test -z "$ac_sed_cmds"; then ++ ac_sed_cmds=cat ++fi ++EOF ++ ++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF ++for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ++changequote(, )dnl ++ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". ++ case "$ac_file" in ++ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ++ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; ++ *) ac_file_in="${ac_file}.in" ;; ++ esac ++ ++ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. ++ ++ # Remove last slash and all that follows it. Not all systems have dirname. ++ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` ++changequote([, ])dnl ++ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then ++ # The file is in a subdirectory. ++ test ! -d "$ac_dir" && mkdir "$ac_dir" ++ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" ++ # A "../" for each directory in $ac_dir_suffix. ++changequote(, )dnl ++ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` ++changequote([, ])dnl ++ else ++ ac_dir_suffix= ac_dots= ++ fi ++ ++ case "$ac_given_srcdir" in ++ .) srcdir=. ++ if test -z "$ac_dots"; then top_srcdir=. ++ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; ++ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; ++ *) # Relative path. ++ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" ++ top_srcdir="$ac_dots$ac_given_srcdir" ;; ++ esac ++ ++ifdef([AC_PROVIDE_AC_PROG_INSTALL], ++[ case "$ac_given_INSTALL" in ++changequote(, )dnl ++ [/$]*) INSTALL="$ac_given_INSTALL" ;; ++changequote([, ])dnl ++ *) INSTALL="$ac_dots$ac_given_INSTALL" ;; ++ esac ++])dnl ++ ++ echo creating "$ac_file" ++ rm -f "$ac_file" ++ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." ++ case "$ac_file" in ++ *Makefile*) ac_comsub="1i\\ ++# $configure_input" ;; ++ *) ac_comsub= ;; ++ esac ++ ++ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` ++ sed -e "$ac_comsub ++s%@configure_input@%$configure_input%g ++s%@srcdir@%$srcdir%g ++s%@top_srcdir@%$top_srcdir%g ++ifdef([AC_PROVIDE_AC_PROG_INSTALL], [s%@INSTALL@%$INSTALL%g ++])dnl ++dnl The parens around the eval prevent an "illegal io" in Ultrix sh. ++" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file ++dnl This would break Makefile dependencies. ++dnl if cmp -s $ac_file conftest.out 2>/dev/null; then ++dnl echo "$ac_file is unchanged" ++dnl rm -f conftest.out ++dnl else ++dnl rm -f $ac_file ++dnl mv conftest.out $ac_file ++dnl fi ++fi; done ++rm -f conftest.s* ++]) ++ ++dnl Create the config.h files from the config.h.in files. ++dnl This is a subroutine of AC_OUTPUT. It is called inside a quoted ++dnl here document whose contents are going into config.status. ++dnl AC_OUTPUT_HEADER(HEADER-FILE...) ++define(AC_OUTPUT_HEADER, ++[changequote(<<, >>)dnl ++# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where ++# NAME is the cpp macro being defined and VALUE is the value it is being given. ++# ++# ac_d sets the value in "#define NAME VALUE" lines. ++ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' ++ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' ++ac_dC='\3' ++ac_dD='%g' ++# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". ++ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ++ac_uB='\([ ]\)%\1#\2define\3' ++ac_uC=' ' ++ac_uD='\4%g' ++# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ++ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ++ac_eB='<<$>>%\1#\2define\3' ++ac_eC=' ' ++ac_eD='%g' ++changequote([, ])dnl ++ ++if test "${CONFIG_HEADERS+set}" != set; then ++EOF ++dnl Support passing AC_CONFIG_HEADER a value containing shell variables. ++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF ++fi ++for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then ++changequote(, )dnl ++ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". ++ case "$ac_file" in ++ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ++ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; ++ *) ac_file_in="${ac_file}.in" ;; ++ esac ++changequote([, ])dnl ++ ++ echo creating $ac_file ++ ++ rm -f conftest.frag conftest.in conftest.out ++ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` ++ cat $ac_file_inputs > conftest.in ++ ++EOF ++ ++# Transform confdefs.h into a sed script conftest.vals that substitutes ++# the proper values into config.h.in to produce config.h. And first: ++# Protect against being on the right side of a sed subst in config.status. ++# Protect against being in an unquoted here document in config.status. ++rm -f conftest.vals ++dnl Using a here document instead of a string reduces the quoting nightmare. ++dnl Putting comments in sed scripts is not portable. ++cat > conftest.hdr <<\EOF ++changequote(<<, >>)dnl ++s/[\\&%]/\\&/g ++s%[\\$`]%\\&%g ++s%<<#define>> \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp ++s%ac_d%ac_u%gp ++s%ac_u%ac_e%gp ++changequote([, ])dnl ++EOF ++sed -n -f conftest.hdr confdefs.h > conftest.vals ++rm -f conftest.hdr ++ ++# This sed command replaces #undef with comments. This is necessary, for ++# example, in the case of _POSIX_SOURCE, which is predefined and required ++# on some systems where configure will not decide to define it. ++cat >> conftest.vals <<\EOF ++changequote(, )dnl ++s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% ++changequote([, ])dnl ++EOF ++ ++# Break up conftest.vals because some shells have a limit on ++# the size of here documents, and old seds have small limits too. ++ ++rm -f conftest.tail ++while : ++do ++ ac_lines=`grep -c . conftest.vals` ++ # grep -c gives empty output for an empty file on some AIX systems. ++ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi ++ # Write a limited-size here document to conftest.frag. ++ echo ' cat > conftest.frag <> $CONFIG_STATUS ++ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS ++ echo 'CEOF ++ sed -f conftest.frag conftest.in > conftest.out ++ rm -f conftest.in ++ mv conftest.out conftest.in ++' >> $CONFIG_STATUS ++ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail ++ rm -f conftest.vals ++ mv conftest.tail conftest.vals ++done ++rm -f conftest.vals ++ ++dnl Now back to your regularly scheduled config.status. ++cat >> $CONFIG_STATUS <<\EOF ++ rm -f conftest.frag conftest.h ++ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h ++ cat conftest.in >> conftest.h ++ rm -f conftest.in ++ if cmp -s $ac_file conftest.h 2>/dev/null; then ++ echo "$ac_file is unchanged" ++ rm -f conftest.h ++ else ++ # Remove last slash and all that follows it. Not all systems have dirname. ++ changequote(, )dnl ++ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` ++ changequote([, ])dnl ++ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then ++ # The file is in a subdirectory. ++ test ! -d "$ac_dir" && mkdir "$ac_dir" ++ fi ++ rm -f $ac_file ++ mv conftest.h $ac_file ++ fi ++fi; done ++ ++]) ++ ++dnl This is a subroutine of AC_OUTPUT. It is called inside a quoted ++dnl here document whose contents are going into config.status. ++dnl AC_OUTPUT_LINKS(SOURCE..., DEST...) ++define(AC_OUTPUT_LINKS, ++[EOF ++ ++cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF ++srcdir=$ac_given_srcdir ++while test -n "$ac_sources"; do ++ set $ac_dests; ac_dest=[$]1; shift; ac_dests=[$]* ++ set $ac_sources; ac_source=[$]1; shift; ac_sources=[$]* ++ ++ echo "linking $srcdir/$ac_source to $ac_dest" ++ ++ if test ! -r $srcdir/$ac_source; then ++ AC_MSG_ERROR($srcdir/$ac_source: File not found) ++ fi ++ rm -f $ac_dest ++ ++ # Make relative symlinks. ++ # Remove last slash and all that follows it. Not all systems have dirname. ++changequote(, )dnl ++ ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'` ++changequote([, ])dnl ++ if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then ++ # The dest file is in a subdirectory. ++ test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir" ++ ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`" ++ # A "../" for each directory in $ac_dest_dir_suffix. ++changequote(, )dnl ++ ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'` ++changequote([, ])dnl ++ else ++ ac_dest_dir_suffix= ac_dots= ++ fi ++ ++ case "$srcdir" in ++changequote(, )dnl ++ [/$]*) ac_rel_source="$srcdir/$ac_source" ;; ++changequote([, ])dnl ++ *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;; ++ esac ++ ++ # Make a symlink if possible; otherwise try a hard link. ++ if ln -s $ac_rel_source $ac_dest 2>/dev/null || ++ ln $srcdir/$ac_source $ac_dest; then : ++ else ++ AC_MSG_ERROR(can not link $ac_dest to $srcdir/$ac_source) ++ fi ++done ++]) ++ ++dnl This is a subroutine of AC_OUTPUT. ++dnl It is called after running config.status. ++dnl AC_OUTPUT_SUBDIRS(DIRECTORY...) ++define(AC_OUTPUT_SUBDIRS, ++[ ++if test "$no_recursion" != yes; then ++ ++ # Remove --cache-file and --srcdir arguments so they do not pile up. ++ ac_sub_configure_args= ++ ac_prev= ++ for ac_arg in $ac_configure_args; do ++ if test -n "$ac_prev"; then ++ ac_prev= ++ continue ++ fi ++ case "$ac_arg" in ++ -cache-file | --cache-file | --cache-fil | --cache-fi \ ++ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ++ ac_prev=cache_file ;; ++ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ ++ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) ++ ;; ++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ++ ac_prev=srcdir ;; ++ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ++ ;; ++ *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; ++ esac ++ done ++ ++ for ac_config_dir in $1; do ++ ++ # Do not complain, so a configure script can configure whichever ++ # parts of a large source tree are present. ++ if test ! -d $srcdir/$ac_config_dir; then ++ continue ++ fi ++ ++ echo configuring in $ac_config_dir ++ ++ case "$srcdir" in ++ .) ;; ++ *) ++ if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :; ++ else ++ AC_MSG_ERROR(can not create `pwd`/$ac_config_dir) ++ fi ++ ;; ++ esac ++ ++ ac_popdir=`pwd` ++ cd $ac_config_dir ++ ++changequote(, )dnl ++ # A "../" for each directory in /$ac_config_dir. ++ ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` ++changequote([, ])dnl ++ ++ case "$srcdir" in ++ .) # No --srcdir option. We are building in place. ++ ac_sub_srcdir=$srcdir ;; ++ /*) # Absolute path. ++ ac_sub_srcdir=$srcdir/$ac_config_dir ;; ++ *) # Relative path. ++ ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;; ++ esac ++ ++ # Check for guested configure; otherwise get Cygnus style configure. ++ if test -f $ac_sub_srcdir/configure; then ++ ac_sub_configure=$ac_sub_srcdir/configure ++ elif test -f $ac_sub_srcdir/configure.in; then ++ ac_sub_configure=$ac_configure ++ else ++ AC_MSG_WARN(no configuration information is in $ac_config_dir) ++ ac_sub_configure= ++ fi ++ ++ # The recursion is here. ++ if test -n "$ac_sub_configure"; then ++ ++ # Make the cache file name correct relative to the subdirectory. ++ case "$cache_file" in ++ /*) ac_sub_cache_file=$cache_file ;; ++ *) # Relative path. ++ ac_sub_cache_file="$ac_dots$cache_file" ;; ++ esac ++ifdef([AC_PROVIDE_AC_PROG_INSTALL], ++ [ case "$ac_given_INSTALL" in ++changequote(, )dnl ++ [/$]*) INSTALL="$ac_given_INSTALL" ;; ++changequote([, ])dnl ++ *) INSTALL="$ac_dots$ac_given_INSTALL" ;; ++ esac ++])dnl ++ ++ echo "[running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file] --srcdir=$ac_sub_srcdir" ++ # The eval makes quoting arguments work. ++ if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir ++ then : ++ else ++ AC_MSG_ERROR($ac_sub_configure failed for $ac_config_dir) ++ fi ++ fi ++ ++ cd $ac_popdir ++ done ++fi ++]) +diff -up firefox-78.8.0/build/autoconf/acoldnames.m4.D89554-autoconf1.diff firefox-78.8.0/build/autoconf/acoldnames.m4 +--- firefox-78.8.0/build/autoconf/acoldnames.m4.D89554-autoconf1.diff 2021-02-25 13:48:13.604993478 +0100 ++++ firefox-78.8.0/build/autoconf/acoldnames.m4 2021-02-25 13:48:13.604993478 +0100 +@@ -0,0 +1,80 @@ ++dnl Map old names of Autoconf macros to new regularized names. ++dnl This file is part of Autoconf. ++dnl Copyright (C) 1994 Free Software Foundation, Inc. ++dnl ++dnl This program is free software; you can redistribute it and/or modify ++dnl it under the terms of the GNU General Public License as published by ++dnl the Free Software Foundation; either version 2, or (at your option) ++dnl any later version. ++dnl ++dnl This program is distributed in the hope that it will be useful, ++dnl but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++dnl GNU General Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License ++dnl along with this program; if not, write to the Free Software ++dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ++dnl 02111-1307, USA. ++dnl ++dnl General macros. ++dnl ++define(AC_WARN, [indir([AC_MSG_WARN], $@)])dnl ++define(AC_ERROR, [indir([AC_MSG_ERROR], $@)])dnl ++AC_DEFUN(AC_PROGRAM_CHECK, [indir([AC_CHECK_PROG], $@)])dnl ++AC_DEFUN(AC_PROGRAM_PATH, [indir([AC_PATH_PROG], $@)])dnl ++AC_DEFUN(AC_PROGRAMS_CHECK, [indir([AC_CHECK_PROGS], $@)])dnl ++AC_DEFUN(AC_PROGRAMS_PATH, [indir([AC_PATH_PROGS], $@)])dnl ++AC_DEFUN(AC_PREFIX, [indir([AC_PREFIX_PROGRAM], $@)])dnl ++AC_DEFUN(AC_HEADER_EGREP, [indir([AC_EGREP_HEADER], $@)])dnl ++AC_DEFUN(AC_PROGRAM_EGREP, [indir([AC_EGREP_CPP], $@)])dnl ++AC_DEFUN(AC_TEST_PROGRAM, [indir([AC_TRY_RUN], $@)])dnl ++AC_DEFUN(AC_TEST_CPP, [indir([AC_TRY_CPP], $@)])dnl ++AC_DEFUN(AC_HEADER_CHECK, [indir([AC_CHECK_HEADER], $@)])dnl ++AC_DEFUN(AC_FUNC_CHECK, [indir([AC_CHECK_FUNC], $@)])dnl ++AC_DEFUN(AC_HAVE_FUNCS, [indir([AC_CHECK_FUNCS], $@)])dnl ++AC_DEFUN(AC_HAVE_HEADERS, [indir([AC_CHECK_HEADERS], $@)])dnl ++AC_DEFUN(AC_SIZEOF_TYPE, [indir([AC_CHECK_SIZEOF], $@)])dnl ++dnl ++dnl Specific macros. ++dnl ++AC_DEFUN(AC_GCC_TRADITIONAL, [indir([AC_PROG_GCC_TRADITIONAL])])dnl ++AC_DEFUN(AC_MINUS_C_MINUS_O, [indir([AC_PROG_CC_C_O])])dnl ++AC_DEFUN(AC_SET_MAKE, [indir([AC_PROG_MAKE_SET])])dnl ++AC_DEFUN(AC_YYTEXT_POINTER, [indir([AC_DECL_YYTEXT])])dnl ++AC_DEFUN(AC_LN_S, [indir([AC_PROG_LN_S])])dnl ++AC_DEFUN(AC_STDC_HEADERS, [indir([AC_HEADER_STDC])])dnl ++AC_DEFUN(AC_MAJOR_HEADER, [indir([AC_HEADER_MAJOR])])dnl ++AC_DEFUN(AC_STAT_MACROS_BROKEN, [indir([AC_HEADER_STAT])])dnl ++AC_DEFUN(AC_SYS_SIGLIST_DECLARED, [indir([AC_DECL_SYS_SIGLIST])])dnl ++AC_DEFUN(AC_GETGROUPS_T, [indir([AC_TYPE_GETGROUPS])])dnl ++AC_DEFUN(AC_UID_T, [indir([AC_TYPE_UID_T])])dnl ++AC_DEFUN(AC_SIZE_T, [indir([AC_TYPE_SIZE_T])])dnl ++AC_DEFUN(AC_PID_T, [indir([AC_TYPE_PID_T])])dnl ++AC_DEFUN(AC_OFF_T, [indir([AC_TYPE_OFF_T])])dnl ++AC_DEFUN(AC_MODE_T, [indir([AC_TYPE_MODE_T])])dnl ++AC_DEFUN(AC_RETSIGTYPE, [indir([AC_TYPE_SIGNAL])])dnl ++AC_DEFUN(AC_MMAP, [indir([AC_FUNC_MMAP])])dnl ++AC_DEFUN(AC_VPRINTF, [indir([AC_FUNC_VPRINTF])])dnl ++AC_DEFUN(AC_VFORK, [indir([AC_FUNC_VFORK])])dnl ++AC_DEFUN(AC_WAIT3, [indir([AC_FUNC_WAIT3])])dnl ++AC_DEFUN(AC_ALLOCA, [indir([AC_FUNC_ALLOCA])])dnl ++AC_DEFUN(AC_GETLOADAVG, [indir([AC_FUNC_GETLOADAVG])])dnl ++AC_DEFUN(AC_UTIME_NULL, [indir([AC_FUNC_UTIME_NULL])])dnl ++AC_DEFUN(AC_STRCOLL, [indir([AC_FUNC_STRCOLL])])dnl ++AC_DEFUN(AC_SETVBUF_REVERSED, [indir([AC_FUNC_SETVBUF_REVERSED])])dnl ++AC_DEFUN(AC_TIME_WITH_SYS_TIME, [indir([AC_HEADER_TIME])])dnl ++AC_DEFUN(AC_TIMEZONE, [indir([AC_STRUCT_TIMEZONE])])dnl ++AC_DEFUN(AC_ST_BLOCKS, [indir([AC_STRUCT_ST_BLOCKS])])dnl ++AC_DEFUN(AC_ST_BLKSIZE, [indir([AC_STRUCT_ST_BLKSIZE])])dnl ++AC_DEFUN(AC_ST_RDEV, [indir([AC_STRUCT_ST_RDEV])])dnl ++AC_DEFUN(AC_CROSS_CHECK, [indir([AC_C_CROSS])])dnl ++AC_DEFUN(AC_CHAR_UNSIGNED, [indir([AC_C_CHAR_UNSIGNED])])dnl ++AC_DEFUN(AC_LONG_DOUBLE, [indir([AC_C_LONG_DOUBLE])])dnl ++AC_DEFUN(AC_WORDS_BIGENDIAN, [indir([AC_C_BIGENDIAN])])dnl ++AC_DEFUN(AC_INLINE, [indir([AC_C_INLINE])])dnl ++AC_DEFUN(AC_CONST, [indir([AC_C_CONST])])dnl ++AC_DEFUN(AC_LONG_FILE_NAMES, [indir([AC_SYS_LONG_FILE_NAMES])])dnl ++AC_DEFUN(AC_RESTARTABLE_SYSCALLS, [indir([AC_SYS_RESTARTABLE_SYSCALLS])])dnl ++AC_DEFUN(AC_FIND_X, [indir([AC_PATH_X])])dnl ++AC_DEFUN(AC_FIND_XTRA, [indir([AC_PATH_XTRA])])dnl +diff -up firefox-78.8.0/build/autoconf/acspecific.m4.D89554-autoconf1.diff firefox-78.8.0/build/autoconf/acspecific.m4 +--- firefox-78.8.0/build/autoconf/acspecific.m4.D89554-autoconf1.diff 2021-02-25 13:48:13.605993481 +0100 ++++ firefox-78.8.0/build/autoconf/acspecific.m4 2021-02-25 13:48:13.605993481 +0100 +@@ -0,0 +1,2758 @@ ++dnl Macros that test for specific features. ++dnl This file is part of Autoconf. ++dnl Copyright (C) 1992, 93, 94, 95, 96, 1998 Free Software Foundation, Inc. ++dnl ++dnl This program is free software; you can redistribute it and/or modify ++dnl it under the terms of the GNU General Public License as published by ++dnl the Free Software Foundation; either version 2, or (at your option) ++dnl any later version. ++dnl ++dnl This program is distributed in the hope that it will be useful, ++dnl but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++dnl GNU General Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License ++dnl along with this program; if not, write to the Free Software ++dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ++dnl 02111-1307, USA. ++dnl ++dnl As a special exception, the Free Software Foundation gives unlimited ++dnl permission to copy, distribute and modify the configure scripts that ++dnl are the output of Autoconf. You need not follow the terms of the GNU ++dnl General Public License when using or distributing such scripts, even ++dnl though portions of the text of Autoconf appear in them. The GNU ++dnl General Public License (GPL) does govern all other use of the material ++dnl that constitutes the Autoconf program. ++dnl ++dnl Certain portions of the Autoconf source text are designed to be copied ++dnl (in certain cases, depending on the input) into the output of ++dnl Autoconf. We call these the "data" portions. The rest of the Autoconf ++dnl source text consists of comments plus executable code that decides which ++dnl of the data portions to output in any given case. We call these ++dnl comments and executable code the "non-data" portions. Autoconf never ++dnl copies any of the non-data portions into its output. ++dnl ++dnl This special exception to the GPL applies to versions of Autoconf ++dnl released by the Free Software Foundation. When you make and ++dnl distribute a modified version of Autoconf, you may extend this special ++dnl exception to the GPL to apply to your modified version as well, *unless* ++dnl your modified version has the potential to copy into its output some ++dnl of the text that was the non-data portion of the version that you started ++dnl with. (In other words, unless your change moves or copies text from ++dnl the non-data portions to the data portions.) If your modification has ++dnl such potential, you must delete any notice of this special exception ++dnl to the GPL from your modified version. ++dnl ++dnl Written by David MacKenzie, with help from ++dnl Franc,ois Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor, ++dnl Roland McGrath, Noah Friedman, david d zuhn, and many others. ++ ++ ++dnl ### Checks for programs ++ ++ ++dnl Check whether to use -n, \c, or newline-tab to separate ++dnl checking messages from result messages. ++dnl Idea borrowed from dist 3.0. ++dnl Internal use only. ++AC_DEFUN(AC_PROG_ECHO_N, ++[if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then ++ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. ++ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ++ ac_n= ac_c=' ++' ac_t=' ' ++ else ++ ac_n=-n ac_c= ac_t= ++ fi ++else ++ ac_n= ac_c='\c' ac_t= ++fi ++]) ++ ++AC_DEFUN(AC_PROG_CC, ++[AC_BEFORE([$0], [AC_PROG_CPP])dnl ++AC_CHECK_PROG(CC, gcc, gcc) ++if test -z "$CC"; then ++ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc) ++ if test -z "$CC"; then ++ case "`uname -s`" in ++ *win32* | *WIN32*) ++ AC_CHECK_PROG(CC, cl, cl) ;; ++ esac ++ fi ++ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH]) ++fi ++ ++AC_PROG_CC_WORKS ++AC_PROG_CC_GNU ++ ++if test $ac_cv_prog_gcc = yes; then ++ GCC=yes ++else ++ GCC= ++fi ++ ++dnl Check whether -g works, even if CFLAGS is set, in case the package ++dnl plays around with CFLAGS (such as to build both debugging and ++dnl normal versions of a library), tasteless as that idea is. ++ac_test_CFLAGS="${CFLAGS+set}" ++ac_save_CFLAGS="$CFLAGS" ++CFLAGS= ++AC_PROG_CC_G ++if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++elif test $ac_cv_prog_cc_g = yes; then ++ if test "$GCC" = yes; then ++ CFLAGS="-g -O2" ++ else ++ CFLAGS="-g" ++ fi ++else ++ if test "$GCC" = yes; then ++ CFLAGS="-O2" ++ else ++ CFLAGS= ++ fi ++fi ++]) ++ ++AC_DEFUN(AC_PROG_CXX, ++[AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl ++AC_CHECK_PROGS(CXX, $CCC c++ g++ gcc CC cxx cc++ cl, gcc) ++ ++AC_PROG_CXX_WORKS ++AC_PROG_CXX_GNU ++ ++if test $ac_cv_prog_gxx = yes; then ++ GXX=yes ++else ++ GXX= ++fi ++ ++dnl Check whether -g works, even if CXXFLAGS is set, in case the package ++dnl plays around with CXXFLAGS (such as to build both debugging and ++dnl normal versions of a library), tasteless as that idea is. ++ac_test_CXXFLAGS="${CXXFLAGS+set}" ++ac_save_CXXFLAGS="$CXXFLAGS" ++CXXFLAGS= ++AC_PROG_CXX_G ++if test "$ac_test_CXXFLAGS" = set; then ++ CXXFLAGS="$ac_save_CXXFLAGS" ++elif test $ac_cv_prog_cxx_g = yes; then ++ if test "$GXX" = yes; then ++ CXXFLAGS="-g -O2" ++ else ++ CXXFLAGS="-g" ++ fi ++else ++ if test "$GXX" = yes; then ++ CXXFLAGS="-O2" ++ else ++ CXXFLAGS= ++ fi ++fi ++]) ++ ++dnl Determine a Fortran 77 compiler to use. If `F77' is not already set ++dnl in the environment, check for `g77', `f77' and `f2c', in that order. ++dnl Set the output variable `F77' to the name of the compiler found. ++dnl ++dnl If using `g77' (the GNU Fortran 77 compiler), then `AC_PROG_F77' ++dnl will set the shell variable `G77' to `yes', and empty otherwise. If ++dnl the output variable `FFLAGS' was not already set in the environment, ++dnl then set it to `-g -02' for `g77' (or `-O2' where `g77' does not ++dnl accept `-g'). Otherwise, set `FFLAGS' to `-g' for all other Fortran ++dnl 77 compilers. ++dnl ++dnl AC_PROG_F77() ++AC_DEFUN(AC_PROG_F77, ++[AC_BEFORE([$0], [AC_PROG_CPP])dnl ++if test -z "$F77"; then ++ AC_CHECK_PROGS(F77, g77 f77 f2c) ++ test -z "$F77" && AC_MSG_ERROR([no acceptable Fortran 77 compiler found in \$PATH]) ++fi ++ ++AC_PROG_F77_WORKS ++AC_PROG_F77_GNU ++ ++if test $ac_cv_prog_g77 = yes; then ++ G77=yes ++dnl Check whether -g works, even if FFLAGS is set, in case the package ++dnl plays around with FFLAGS (such as to build both debugging and ++dnl normal versions of a library), tasteless as that idea is. ++ ac_test_FFLAGS="${FFLAGS+set}" ++ ac_save_FFLAGS="$FFLAGS" ++ FFLAGS= ++ AC_PROG_F77_G ++ if test "$ac_test_FFLAGS" = set; then ++ FFLAGS="$ac_save_FFLAGS" ++ elif test $ac_cv_prog_f77_g = yes; then ++ FFLAGS="-g -O2" ++ else ++ FFLAGS="-O2" ++ fi ++else ++ G77= ++ test "${FFLAGS+set}" = set || FFLAGS="-g" ++fi ++]) ++ ++AC_DEFUN(AC_PROG_CC_WORKS, ++[AC_MSG_CHECKING([whether the C compiler ($CC $CFLAGS $LDFLAGS) works]) ++AC_LANG_SAVE ++AC_LANG_C ++AC_TRY_COMPILER([main(){return(0);}], ac_cv_prog_cc_works, ac_cv_prog_cc_cross) ++AC_LANG_RESTORE ++AC_MSG_RESULT($ac_cv_prog_cc_works) ++if test $ac_cv_prog_cc_works = no; then ++ AC_MSG_ERROR([installation or configuration problem: C compiler cannot create executables.]) ++fi ++AC_MSG_CHECKING([whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler]) ++AC_MSG_RESULT($ac_cv_prog_cc_cross) ++cross_compiling=$ac_cv_prog_cc_cross ++]) ++ ++AC_DEFUN(AC_PROG_CXX_WORKS, ++[AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works]) ++AC_LANG_SAVE ++AC_LANG_CPLUSPLUS ++AC_TRY_COMPILER([int main(){return(0);}], ac_cv_prog_cxx_works, ac_cv_prog_cxx_cross) ++AC_LANG_RESTORE ++AC_MSG_RESULT($ac_cv_prog_cxx_works) ++if test $ac_cv_prog_cxx_works = no; then ++ AC_MSG_ERROR([installation or configuration problem: C++ compiler cannot create executables.]) ++fi ++AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler]) ++AC_MSG_RESULT($ac_cv_prog_cxx_cross) ++cross_compiling=$ac_cv_prog_cxx_cross ++]) ++ ++dnl Test whether the Fortran 77 compiler can compile and link a trivial ++dnl Fortran program. Also, test whether the Fortran 77 compiler is a ++dnl cross-compiler (which may realistically be the case if the Fortran ++dnl compiler is `g77'). ++dnl ++dnl AC_PROG_F77_WORKS() ++AC_DEFUN(AC_PROG_F77_WORKS, ++[AC_MSG_CHECKING([whether the Fortran 77 compiler ($F77 $FFLAGS $LDFLAGS) works]) ++AC_LANG_SAVE ++AC_LANG_FORTRAN77 ++AC_TRY_COMPILER(dnl ++[ program conftest ++ end ++], ac_cv_prog_f77_works, ac_cv_prog_f77_cross) ++AC_LANG_RESTORE ++AC_MSG_RESULT($ac_cv_prog_f77_works) ++if test $ac_cv_prog_f77_works = no; then ++ AC_MSG_ERROR([installation or configuration problem: Fortran 77 compiler cannot create executables.]) ++fi ++AC_MSG_CHECKING([whether the Fortran 77 compiler ($F77 $FFLAGS $LDFLAGS) is a cross-compiler]) ++AC_MSG_RESULT($ac_cv_prog_f77_cross) ++cross_compiling=$ac_cv_prog_f77_cross ++]) ++ ++AC_DEFUN(AC_PROG_CC_GNU, ++[AC_CACHE_CHECK(whether we are using GNU C, ac_cv_prog_gcc, ++[dnl The semicolon is to pacify NeXT's syntax-checking cpp. ++cat > conftest.c </dev/null 2>&1; then ++ ac_cv_prog_gcc=yes ++else ++ ac_cv_prog_gcc=no ++fi])]) ++ ++AC_DEFUN(AC_PROG_CXX_GNU, ++[AC_CACHE_CHECK(whether we are using GNU C++, ac_cv_prog_gxx, ++[dnl The semicolon is to pacify NeXT's syntax-checking cpp. ++cat > conftest.C </dev/null 2>&1; then ++ ac_cv_prog_gxx=yes ++else ++ ac_cv_prog_gxx=no ++fi])]) ++ ++dnl Test whether for Fortran 77 compiler is `g77' (the GNU Fortran 77 ++dnl Compiler). This test depends on whether the Fortran 77 compiler can ++dnl do CPP pre-processing. ++dnl ++dnl AC_PROG_F77_GNU() ++AC_DEFUN(AC_PROG_F77_GNU, ++[AC_CACHE_CHECK(whether we are using GNU Fortran 77, ac_cv_prog_g77, ++[cat > conftest.fpp </dev/null 2>&1; then ++ ac_cv_prog_g77=yes ++else ++ ac_cv_prog_g77=no ++fi])]) ++ ++AC_DEFUN(AC_PROG_CC_G, ++[AC_CACHE_CHECK(whether ${CC-cc} accepts -g, ac_cv_prog_cc_g, ++[echo 'void f(){}' > conftest.c ++if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ++ ac_cv_prog_cc_g=yes ++else ++ ac_cv_prog_cc_g=no ++fi ++rm -f conftest* ++])]) ++ ++AC_DEFUN(AC_PROG_CXX_G, ++[AC_CACHE_CHECK(whether ${CXX-g++} accepts -g, ac_cv_prog_cxx_g, ++[echo 'void f(){}' > conftest.cc ++if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then ++ ac_cv_prog_cxx_g=yes ++else ++ ac_cv_prog_cxx_g=no ++fi ++rm -f conftest* ++])]) ++ ++dnl Test whether the Fortran 77 compiler can accept the `-g' option to ++dnl enable debugging. ++dnl ++dnl AC_PROG_F77_G() ++AC_DEFUN(AC_PROG_F77_G, ++[AC_CACHE_CHECK(whether $F77 accepts -g, ac_cv_prog_f77_g, ++[cat > conftest.f << EOF ++ program conftest ++ end ++EOF ++if test -z "`$F77 -g -c conftest.f 2>&1`"; then ++ ac_cv_prog_f77_g=yes ++else ++ ac_cv_prog_f77_g=no ++fi ++rm -f conftest* ++])]) ++ ++AC_DEFUN(AC_PROG_GCC_TRADITIONAL, ++[AC_REQUIRE([AC_PROG_CC])dnl ++AC_REQUIRE([AC_PROG_CPP])dnl ++if test $ac_cv_prog_gcc = yes; then ++ AC_CACHE_CHECK(whether ${CC-cc} needs -traditional, ++ ac_cv_prog_gcc_traditional, ++[ ac_pattern="Autoconf.*'x'" ++ AC_EGREP_CPP($ac_pattern, [#include ++Autoconf TIOCGETP], ++ ac_cv_prog_gcc_traditional=yes, ac_cv_prog_gcc_traditional=no) ++ ++ if test $ac_cv_prog_gcc_traditional = no; then ++ AC_EGREP_CPP($ac_pattern, [#include ++Autoconf TCGETA], ++ ac_cv_prog_gcc_traditional=yes) ++ fi]) ++ if test $ac_cv_prog_gcc_traditional = yes; then ++ CC="$CC -traditional" ++ fi ++fi ++]) ++ ++AC_DEFUN(AC_PROG_CC_C_O, ++[if test "x$CC" != xcc; then ++ AC_MSG_CHECKING(whether $CC and cc understand -c and -o together) ++else ++ AC_MSG_CHECKING(whether cc understands -c and -o together) ++fi ++set dummy $CC; ac_cc="`echo [$]2 | ++changequote(, )dnl ++ sed -e 's/[^a-zA-Z0-9_]/_/g' -e 's/^[0-9]/_/'`" ++changequote([, ])dnl ++AC_CACHE_VAL(ac_cv_prog_cc_${ac_cc}_c_o, ++[echo 'foo(){}' > conftest.c ++# Make sure it works both with $CC and with simple cc. ++# We do the test twice because some compilers refuse to overwrite an ++# existing .o file with -o, though they will create one. ++ac_try='${CC-cc} -c conftest.c -o conftest.o 1>&AC_FD_CC' ++if AC_TRY_EVAL(ac_try) && ++ test -f conftest.o && AC_TRY_EVAL(ac_try); ++then ++ eval ac_cv_prog_cc_${ac_cc}_c_o=yes ++ if test "x$CC" != xcc; then ++ # Test first that cc exists at all. ++ if AC_TRY_COMMAND(cc -c conftest.c 1>&AC_FD_CC); then ++ ac_try='cc -c conftest.c -o conftest.o 1>&AC_FD_CC' ++ if AC_TRY_EVAL(ac_try) && ++ test -f conftest.o && AC_TRY_EVAL(ac_try); ++ then ++ # cc works too. ++ : ++ else ++ # cc exists but doesn't like -o. ++ eval ac_cv_prog_cc_${ac_cc}_c_o=no ++ fi ++ fi ++ fi ++else ++ eval ac_cv_prog_cc_${ac_cc}_c_o=no ++fi ++rm -f conftest* ++])dnl ++if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" = yes"; then ++ AC_MSG_RESULT(yes) ++else ++ AC_MSG_RESULT(no) ++ AC_DEFINE(NO_MINUS_C_MINUS_O) ++fi ++]) ++ ++dnl Test if the Fortran 77 compiler accepts the options `-c' and `-o' ++dnl simultaneously, and define `F77_NO_MINUS_C_MINUS_O' if it does not. ++dnl ++dnl The usefulness of this macro is questionable, as I can't really see ++dnl why anyone would use it. The only reason I include it is for ++dnl completeness, since a similar test exists for the C compiler. ++dnl ++dnl AC_PROG_F77_C_O ++AC_DEFUN(AC_PROG_F77_C_O, ++[AC_BEFORE([$0], [AC_PROG_F77])dnl ++AC_MSG_CHECKING(whether $F77 understand -c and -o together) ++set dummy $F77; ac_f77="`echo [$]2 | ++changequote(, )dnl ++sed -e 's/[^a-zA-Z0-9_]/_/g' -e 's/^[0-9]/_/'`" ++changequote([, ])dnl ++AC_CACHE_VAL(ac_cv_prog_f77_${ac_f77}_c_o, ++[cat > conftest.f << EOF ++ program conftest ++ end ++EOF ++# We do the `AC_TRY_EVAL' test twice because some compilers refuse to ++# overwrite an existing `.o' file with `-o', although they will create ++# one. ++ac_try='$F77 $FFLAGS -c conftest.f -o conftest.o 1>&AC_FD_CC' ++if AC_TRY_EVAL(ac_try) && test -f conftest.o && AC_TRY_EVAL(ac_try); then ++ eval ac_cv_prog_f77_${ac_f77}_c_o=yes ++else ++ eval ac_cv_prog_f77_${ac_f77}_c_o=no ++fi ++rm -f conftest* ++])dnl ++if eval "test \"`echo '$ac_cv_prog_f77_'${ac_f77}_c_o`\" = yes"; then ++ AC_MSG_RESULT(yes) ++else ++ AC_MSG_RESULT(no) ++ AC_DEFINE(F77_NO_MINUS_C_MINUS_O) ++fi ++]) ++ ++dnl Define SET_MAKE to set ${MAKE} if make doesn't. ++AC_DEFUN(AC_PROG_MAKE_SET, ++[AC_MSG_CHECKING(whether ${MAKE-make} sets \${MAKE}) ++set dummy ${MAKE-make}; ac_make=`echo "[$]2" | sed 'y%./+-%__p_%'` ++AC_CACHE_VAL(ac_cv_prog_make_${ac_make}_set, ++[cat > conftestmake <<\EOF ++all: ++ @echo 'ac_maketemp="${MAKE}"' ++EOF ++changequote(, )dnl ++# GNU make sometimes prints "make[1]: Entering...", which would confuse us. ++eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` ++changequote([, ])dnl ++if test -n "$ac_maketemp"; then ++ eval ac_cv_prog_make_${ac_make}_set=yes ++else ++ eval ac_cv_prog_make_${ac_make}_set=no ++fi ++rm -f conftestmake])dnl ++if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then ++ AC_MSG_RESULT(yes) ++ SET_MAKE= ++else ++ AC_MSG_RESULT(no) ++ SET_MAKE="MAKE=${MAKE-make}" ++fi ++AC_SUBST([SET_MAKE])dnl ++]) ++ ++AC_DEFUN(AC_PROG_RANLIB, ++[AC_CHECK_PROG(RANLIB, ranlib, ranlib, :)]) ++ ++dnl Check for mawk first since it's generally faster. ++AC_DEFUN(AC_PROG_AWK, ++[AC_CHECK_PROGS(AWK, mawk gawk nawk awk, )]) ++ ++AC_DEFUN(AC_PROG_YACC, ++[AC_CHECK_PROGS(YACC, 'bison -y' byacc, yacc)]) ++ ++AC_DEFUN(AC_PROG_CPP, ++[AC_MSG_CHECKING(how to run the C preprocessor) ++# On Suns, sometimes $CPP names a directory. ++if test -n "$CPP" && test -d "$CPP"; then ++ CPP= ++fi ++if test -z "$CPP"; then ++AC_CACHE_VAL(ac_cv_prog_CPP, ++[ # This must be in double quotes, not single quotes, because CPP may get ++ # substituted into the Makefile and "${CC-cc}" will confuse make. ++ CPP="${CC-cc} -E" ++ # On the NeXT, cc -E runs the code through the compiler's parser, ++ # not just through cpp. ++dnl Use a header file that comes with gcc, so configuring glibc ++dnl with a fresh cross-compiler works. ++ AC_TRY_CPP([#include ++Syntax Error], , ++ CPP="${CC-cc} -E -traditional-cpp" ++ AC_TRY_CPP([#include ++Syntax Error], , ++ CPP="${CC-cc} -nologo -E" ++ AC_TRY_CPP([#include ++Syntax Error], , CPP=/lib/cpp))) ++ ac_cv_prog_CPP="$CPP"])dnl ++ CPP="$ac_cv_prog_CPP" ++else ++ ac_cv_prog_CPP="$CPP" ++fi ++AC_MSG_RESULT($CPP) ++AC_SUBST(CPP)dnl ++]) ++ ++AC_DEFUN(AC_PROG_CXXCPP, ++[AC_MSG_CHECKING(how to run the C++ preprocessor) ++if test -z "$CXXCPP"; then ++AC_CACHE_VAL(ac_cv_prog_CXXCPP, ++[AC_LANG_SAVE[]dnl ++AC_LANG_CPLUSPLUS[]dnl ++ CXXCPP="${CXX-g++} -E" ++ AC_TRY_CPP([#include ], , CXXCPP=/lib/cpp) ++ ac_cv_prog_CXXCPP="$CXXCPP" ++AC_LANG_RESTORE[]dnl ++fi])dnl ++CXXCPP="$ac_cv_prog_CXXCPP" ++AC_MSG_RESULT($CXXCPP) ++AC_SUBST(CXXCPP)dnl ++]) ++ ++dnl Require finding the C or C++ preprocessor, whichever is the ++dnl current language. ++AC_DEFUN(AC_REQUIRE_CPP, ++[ifelse(AC_LANG, C, [AC_REQUIRE([AC_PROG_CPP])], [AC_REQUIRE([AC_PROG_CXXCPP])])]) ++ ++AC_DEFUN(AC_PROG_LEX, ++[AC_CHECK_PROG(LEX, flex, flex, lex) ++if test -z "$LEXLIB" ++then ++ case "$LEX" in ++ flex*) ac_lib=fl ;; ++ *) ac_lib=l ;; ++ esac ++ AC_CHECK_LIB($ac_lib, yywrap, LEXLIB="-l$ac_lib") ++fi ++AC_SUBST(LEXLIB)]) ++ ++dnl Check if lex declares yytext as a char * by default, not a char[]. ++undefine([AC_DECL_YYTEXT]) ++AC_DEFUN(AC_DECL_YYTEXT, ++[AC_REQUIRE_CPP()dnl ++AC_REQUIRE([AC_PROG_LEX])dnl ++AC_CACHE_CHECK(lex output file root, ac_cv_prog_lex_root, ++[# The minimal lex program is just a single line: %%. But some broken lexes ++# (Solaris, I think it was) want two %% lines, so accommodate them. ++echo '%% ++%%' | $LEX ++if test -f lex.yy.c; then ++ ac_cv_prog_lex_root=lex.yy ++elif test -f lexyy.c; then ++ ac_cv_prog_lex_root=lexyy ++else ++ AC_MSG_ERROR(cannot find output from $LEX; giving up) ++fi]) ++LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root ++AC_SUBST(LEX_OUTPUT_ROOT)dnl ++ ++AC_CACHE_CHECK(whether yytext is a pointer, ac_cv_prog_lex_yytext_pointer, ++[# POSIX says lex can declare yytext either as a pointer or an array; the ++# default is implementation-dependent. Figure out which it is, since ++# not all implementations provide the %pointer and %array declarations. ++ac_cv_prog_lex_yytext_pointer=no ++echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c ++ac_save_LIBS="$LIBS" ++LIBS="$LIBS $LEXLIB" ++AC_TRY_LINK(`cat $LEX_OUTPUT_ROOT.c`, , ac_cv_prog_lex_yytext_pointer=yes) ++LIBS="$ac_save_LIBS" ++rm -f "${LEX_OUTPUT_ROOT}.c" ++]) ++dnl ++if test $ac_cv_prog_lex_yytext_pointer = yes; then ++ AC_DEFINE(YYTEXT_POINTER) ++fi ++]) ++ ++AC_DEFUN(AC_PROG_INSTALL, ++[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl ++# Find a good install program. We prefer a C program (faster), ++# so one script is as good as another. But avoid the broken or ++# incompatible versions: ++# SysV /etc/install, /usr/sbin/install ++# SunOS /usr/etc/install ++# IRIX /sbin/install ++# AIX /bin/install ++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag ++# AFS /usr/afsws/bin/install, which mishandles nonexistent args ++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# ./install, which can be erroneously created by make from ./install.sh. ++AC_MSG_CHECKING(for a BSD compatible install) ++if test -z "$INSTALL"; then ++AC_CACHE_VAL(ac_cv_path_install, ++[ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" ++ for ac_dir in $PATH; do ++ # Account for people who put trailing slashes in PATH elements. ++ case "$ac_dir/" in ++ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; ++ *) ++ # OSF1 and SCO ODT 3.0 have their own names for install. ++ # Don't use installbsd from OSF since it installs stuff as root ++ # by default. ++ for ac_prog in ginstall scoinst install; do ++ if test -f $ac_dir/$ac_prog; then ++ if test $ac_prog = install && ++ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ else ++ ac_cv_path_install="$ac_dir/$ac_prog -c" ++ break 2 ++ fi ++ fi ++ done ++ ;; ++ esac ++ done ++ IFS="$ac_save_IFS" ++])dnl ++ if test "${ac_cv_path_install+set}" = set; then ++ INSTALL="$ac_cv_path_install" ++ else ++ # As a last resort, use the slow shell script. We don't cache a ++ # path for INSTALL within a source directory, because that will ++ # break other packages using the cache if that directory is ++ # removed, or if the path is relative. ++ INSTALL="$ac_install_sh" ++ fi ++fi ++dnl We do special magic for INSTALL instead of AC_SUBST, to get ++dnl relative paths right. ++AC_MSG_RESULT($INSTALL) ++ ++# Use test -z because SunOS4 sh mishandles braces in ${var-val}. ++# It thinks the first close brace ends the variable substitution. ++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' ++AC_SUBST(INSTALL_PROGRAM)dnl ++ ++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' ++AC_SUBST(INSTALL_SCRIPT)dnl ++ ++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ++AC_SUBST(INSTALL_DATA)dnl ++]) ++ ++AC_DEFUN(AC_PROG_LN_S, ++[AC_MSG_CHECKING(whether ln -s works) ++AC_CACHE_VAL(ac_cv_prog_LN_S, ++[rm -f conftestdata ++if ln -s X conftestdata 2>/dev/null ++then ++ rm -f conftestdata ++ ac_cv_prog_LN_S="ln -s" ++else ++ ac_cv_prog_LN_S=ln ++fi])dnl ++LN_S="$ac_cv_prog_LN_S" ++if test "$ac_cv_prog_LN_S" = "ln -s"; then ++ AC_MSG_RESULT(yes) ++else ++ AC_MSG_RESULT(no) ++fi ++AC_SUBST(LN_S)dnl ++]) ++ ++define(AC_RSH, ++[errprint(__file__:__line__: [$0] has been removed; replace it with equivalent code ++)m4exit(4)]) ++ ++ ++dnl ### Checks for header files ++ ++ ++AC_DEFUN(AC_HEADER_STDC, ++[AC_REQUIRE_CPP()dnl ++AC_CACHE_CHECK(for ANSI C header files, ac_cv_header_stdc, ++[AC_TRY_CPP([#include ++#include ++#include ++#include ], ac_cv_header_stdc=yes, ac_cv_header_stdc=no) ++ ++if test $ac_cv_header_stdc = yes; then ++ # SunOS 4.x string.h does not declare mem*, contrary to ANSI. ++AC_EGREP_HEADER(memchr, string.h, , ac_cv_header_stdc=no) ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. ++AC_EGREP_HEADER(free, stdlib.h, , ac_cv_header_stdc=no) ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. ++AC_TRY_RUN([#include ++#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') ++#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) ++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) ++int main () { int i; for (i = 0; i < 256; i++) ++if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); ++exit (0); } ++], , ac_cv_header_stdc=no, :) ++fi]) ++if test $ac_cv_header_stdc = yes; then ++ AC_DEFINE(STDC_HEADERS) ++fi ++]) ++ ++AC_DEFUN(AC_UNISTD_H, ++[AC_OBSOLETE([$0], [; instead use AC_CHECK_HEADERS(unistd.h)])dnl ++AC_CHECK_HEADER(unistd.h, AC_DEFINE(HAVE_UNISTD_H))]) ++ ++AC_DEFUN(AC_USG, ++[AC_OBSOLETE([$0], ++ [; instead use AC_CHECK_HEADERS(string.h) and HAVE_STRING_H])dnl ++AC_MSG_CHECKING([for BSD string and memory functions]) ++AC_TRY_LINK([#include ], [rindex(0, 0); bzero(0, 0);], ++ [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no); AC_DEFINE(USG)])]) ++ ++ ++dnl If memchr and the like aren't declared in , include . ++dnl To avoid problems, don't check for gcc2 built-ins. ++AC_DEFUN(AC_MEMORY_H, ++[AC_OBSOLETE([$0], [; instead use AC_CHECK_HEADERS(memory.h) and HAVE_MEMORY_H])dnl ++AC_MSG_CHECKING(whether string.h declares mem functions) ++AC_EGREP_HEADER(memchr, string.h, ac_found=yes, ac_found=no) ++AC_MSG_RESULT($ac_found) ++if test $ac_found = no; then ++ AC_CHECK_HEADER(memory.h, [AC_DEFINE(NEED_MEMORY_H)]) ++fi ++]) ++ ++AC_DEFUN(AC_HEADER_MAJOR, ++[AC_CACHE_CHECK(whether sys/types.h defines makedev, ++ ac_cv_header_sys_types_h_makedev, ++[AC_TRY_LINK([#include ], [return makedev(0, 0);], ++ ac_cv_header_sys_types_h_makedev=yes, ac_cv_header_sys_types_h_makedev=no) ++]) ++ ++if test $ac_cv_header_sys_types_h_makedev = no; then ++AC_CHECK_HEADER(sys/mkdev.h, [AC_DEFINE(MAJOR_IN_MKDEV)]) ++ ++ if test $ac_cv_header_sys_mkdev_h = no; then ++AC_CHECK_HEADER(sys/sysmacros.h, [AC_DEFINE(MAJOR_IN_SYSMACROS)]) ++ fi ++fi ++]) ++ ++AC_DEFUN(AC_HEADER_DIRENT, ++[ac_header_dirent=no ++AC_CHECK_HEADERS_DIRENT(dirent.h sys/ndir.h sys/dir.h ndir.h, ++ [ac_header_dirent=$ac_hdr; break]) ++# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. ++if test $ac_header_dirent = dirent.h; then ++AC_CHECK_LIB(dir, opendir, LIBS="$LIBS -ldir") ++else ++AC_CHECK_LIB(x, opendir, LIBS="$LIBS -lx") ++fi ++]) ++ ++dnl Like AC_CHECK_HEADER, except also make sure that HEADER-FILE ++dnl defines the type `DIR'. dirent.h on NextStep 3.2 doesn't. ++dnl AC_CHECK_HEADER_DIRENT(HEADER-FILE, ACTION-IF-FOUND) ++AC_DEFUN(AC_CHECK_HEADER_DIRENT, ++[ac_safe=`echo "$1" | sed 'y%./+-%__p_%'` ++AC_MSG_CHECKING([for $1 that defines DIR]) ++AC_CACHE_VAL(ac_cv_header_dirent_$ac_safe, ++[AC_TRY_COMPILE([#include ++#include <$1>], [DIR *dirp = 0;], ++ eval "ac_cv_header_dirent_$ac_safe=yes", ++ eval "ac_cv_header_dirent_$ac_safe=no")])dnl ++if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then ++ AC_MSG_RESULT(yes) ++ $2 ++else ++ AC_MSG_RESULT(no) ++fi ++]) ++ ++dnl Like AC_CHECK_HEADERS, except succeed only for a HEADER-FILE that ++dnl defines `DIR'. ++dnl AC_CHECK_HEADERS_DIRENT(HEADER-FILE... [, ACTION]) ++define(AC_CHECK_HEADERS_DIRENT, ++[for ac_hdr in $1 ++do ++AC_CHECK_HEADER_DIRENT($ac_hdr, ++[changequote(, )dnl ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++changequote([, ])dnl ++ AC_DEFINE_UNQUOTED($ac_tr_hdr) $2])dnl ++done]) ++ ++AC_DEFUN(AC_DIR_HEADER, ++[AC_OBSOLETE([$0], [; instead use AC_HEADER_DIRENT])dnl ++ac_header_dirent=no ++for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do ++ AC_CHECK_HEADER_DIRENT($ac_hdr, [ac_header_dirent=$ac_hdr; break]) ++done ++ ++case "$ac_header_dirent" in ++dirent.h) AC_DEFINE(DIRENT) ;; ++sys/ndir.h) AC_DEFINE(SYSNDIR) ;; ++sys/dir.h) AC_DEFINE(SYSDIR) ;; ++ndir.h) AC_DEFINE(NDIR) ;; ++esac ++ ++AC_CACHE_CHECK(whether closedir returns void, ac_cv_func_closedir_void, ++[AC_TRY_RUN([#include ++#include <$ac_header_dirent> ++int closedir(); main() { exit(closedir(opendir(".")) != 0); }], ++ ac_cv_func_closedir_void=no, ac_cv_func_closedir_void=yes, ac_cv_func_closedir_void=yes)]) ++if test $ac_cv_func_closedir_void = yes; then ++ AC_DEFINE(VOID_CLOSEDIR) ++fi ++]) ++ ++AC_DEFUN(AC_HEADER_STAT, ++[AC_CACHE_CHECK(whether stat file-mode macros are broken, ++ ac_cv_header_stat_broken, ++[AC_EGREP_CPP([You lose], [#include ++#include ++ ++#if defined(S_ISBLK) && defined(S_IFDIR) ++# if S_ISBLK (S_IFDIR) ++You lose. ++# endif ++#endif ++ ++#if defined(S_ISBLK) && defined(S_IFCHR) ++# if S_ISBLK (S_IFCHR) ++You lose. ++# endif ++#endif ++ ++#if defined(S_ISLNK) && defined(S_IFREG) ++# if S_ISLNK (S_IFREG) ++You lose. ++# endif ++#endif ++ ++#if defined(S_ISSOCK) && defined(S_IFREG) ++# if S_ISSOCK (S_IFREG) ++You lose. ++# endif ++#endif ++], ac_cv_header_stat_broken=yes, ac_cv_header_stat_broken=no)]) ++if test $ac_cv_header_stat_broken = yes; then ++ AC_DEFINE(STAT_MACROS_BROKEN) ++fi ++]) ++ ++AC_DEFUN(AC_DECL_SYS_SIGLIST, ++[AC_CACHE_CHECK([for sys_siglist declaration in signal.h or unistd.h], ++ ac_cv_decl_sys_siglist, ++[AC_TRY_COMPILE([#include ++#include ++/* NetBSD declares sys_siglist in unistd.h. */ ++#ifdef HAVE_UNISTD_H ++#include ++#endif], [char *msg = *(sys_siglist + 1);], ++ ac_cv_decl_sys_siglist=yes, ac_cv_decl_sys_siglist=no)]) ++if test $ac_cv_decl_sys_siglist = yes; then ++ AC_DEFINE(SYS_SIGLIST_DECLARED) ++fi ++]) ++ ++AC_DEFUN(AC_HEADER_SYS_WAIT, ++[AC_CACHE_CHECK([for sys/wait.h that is POSIX.1 compatible], ++ ac_cv_header_sys_wait_h, ++[AC_TRY_COMPILE([#include ++#include ++#ifndef WEXITSTATUS ++#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) ++#endif ++#ifndef WIFEXITED ++#define WIFEXITED(stat_val) (((stat_val) & 255) == 0) ++#endif], [int s; ++wait (&s); ++s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;], ++ac_cv_header_sys_wait_h=yes, ac_cv_header_sys_wait_h=no)]) ++if test $ac_cv_header_sys_wait_h = yes; then ++ AC_DEFINE(HAVE_SYS_WAIT_H) ++fi ++]) ++ ++ ++dnl ### Checks for typedefs ++ ++ ++AC_DEFUN(AC_TYPE_GETGROUPS, ++[AC_REQUIRE([AC_TYPE_UID_T])dnl ++AC_CACHE_CHECK(type of array argument to getgroups, ac_cv_type_getgroups, ++[AC_TRY_RUN( ++changequote(<<, >>)dnl ++<< ++/* Thanks to Mike Rendell for this test. */ ++#include ++#define NGID 256 ++#undef MAX ++#define MAX(x, y) ((x) > (y) ? (x) : (y)) ++main() ++{ ++ gid_t gidset[NGID]; ++ int i, n; ++ union { gid_t gval; long lval; } val; ++ ++ val.lval = -1; ++ for (i = 0; i < NGID; i++) ++ gidset[i] = val.gval; ++ n = getgroups (sizeof (gidset) / MAX (sizeof (int), sizeof (gid_t)) - 1, ++ gidset); ++ /* Exit non-zero if getgroups seems to require an array of ints. This ++ happens when gid_t is short but getgroups modifies an array of ints. */ ++ exit ((n > 0 && gidset[n] != val.gval) ? 1 : 0); ++} ++>>, ++changequote([, ])dnl ++ ac_cv_type_getgroups=gid_t, ac_cv_type_getgroups=int, ++ ac_cv_type_getgroups=cross) ++if test $ac_cv_type_getgroups = cross; then ++ dnl When we can't run the test program (we are cross compiling), presume ++ dnl that has either an accurate prototype for getgroups or none. ++ dnl Old systems without prototypes probably use int. ++ AC_EGREP_HEADER([getgroups.*int.*gid_t], unistd.h, ++ ac_cv_type_getgroups=gid_t, ac_cv_type_getgroups=int) ++fi]) ++AC_DEFINE_UNQUOTED(GETGROUPS_T, $ac_cv_type_getgroups) ++]) ++ ++AC_DEFUN(AC_TYPE_UID_T, ++[AC_CACHE_CHECK(for uid_t in sys/types.h, ac_cv_type_uid_t, ++[AC_EGREP_HEADER(uid_t, sys/types.h, ++ ac_cv_type_uid_t=yes, ac_cv_type_uid_t=no)]) ++if test $ac_cv_type_uid_t = no; then ++ AC_DEFINE(uid_t, int) ++ AC_DEFINE(gid_t, int) ++fi ++]) ++ ++AC_DEFUN(AC_TYPE_SIZE_T, ++[AC_CHECK_TYPE(size_t, unsigned)]) ++ ++AC_DEFUN(AC_TYPE_PID_T, ++[AC_CHECK_TYPE(pid_t, int)]) ++ ++AC_DEFUN(AC_TYPE_OFF_T, ++[AC_CHECK_TYPE(off_t, long)]) ++ ++AC_DEFUN(AC_TYPE_MODE_T, ++[AC_CHECK_TYPE(mode_t, int)]) ++ ++dnl Note that identifiers starting with SIG are reserved by ANSI C. ++AC_DEFUN(AC_TYPE_SIGNAL, ++[AC_CACHE_CHECK([return type of signal handlers], ac_cv_type_signal, ++[AC_TRY_COMPILE([#include ++#include ++#ifdef signal ++#undef signal ++#endif ++#ifdef __cplusplus ++extern "C" void (*signal (int, void (*)(int)))(int); ++#else ++void (*signal ()) (); ++#endif ++], ++[int i;], ac_cv_type_signal=void, ac_cv_type_signal=int)]) ++AC_DEFINE_UNQUOTED(RETSIGTYPE, $ac_cv_type_signal) ++]) ++ ++ ++dnl ### Checks for functions ++ ++ ++AC_DEFUN(AC_FUNC_CLOSEDIR_VOID, ++[AC_REQUIRE([AC_HEADER_DIRENT])dnl ++AC_CACHE_CHECK(whether closedir returns void, ac_cv_func_closedir_void, ++[AC_TRY_RUN([#include ++#include <$ac_header_dirent> ++int closedir(); main() { exit(closedir(opendir(".")) != 0); }], ++ ac_cv_func_closedir_void=no, ac_cv_func_closedir_void=yes, ac_cv_func_closedir_void=yes)]) ++if test $ac_cv_func_closedir_void = yes; then ++ AC_DEFINE(CLOSEDIR_VOID) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_FNMATCH, ++[AC_CACHE_CHECK(for working fnmatch, ac_cv_func_fnmatch_works, ++# Some versions of Solaris or SCO have a broken fnmatch function. ++# So we run a test program. If we are cross-compiling, take no chance. ++# Thanks to John Oleynick and Franc,ois Pinard for this test. ++[AC_TRY_RUN([main() { exit (fnmatch ("a*", "abc", 0) != 0); }], ++ac_cv_func_fnmatch_works=yes, ac_cv_func_fnmatch_works=no, ++ac_cv_func_fnmatch_works=no)]) ++if test $ac_cv_func_fnmatch_works = yes; then ++ AC_DEFINE(HAVE_FNMATCH) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_MMAP, ++[AC_CHECK_HEADERS(unistd.h) ++AC_CHECK_FUNCS(getpagesize) ++AC_CACHE_CHECK(for working mmap, ac_cv_func_mmap_fixed_mapped, ++[AC_TRY_RUN([ ++/* Thanks to Mike Haertel and Jim Avera for this test. ++ Here is a matrix of mmap possibilities: ++ mmap private not fixed ++ mmap private fixed at somewhere currently unmapped ++ mmap private fixed at somewhere already mapped ++ mmap shared not fixed ++ mmap shared fixed at somewhere currently unmapped ++ mmap shared fixed at somewhere already mapped ++ For private mappings, we should verify that changes cannot be read() ++ back from the file, nor mmap's back from the file at a different ++ address. (There have been systems where private was not correctly ++ implemented like the infamous i386 svr4.0, and systems where the ++ VM page cache was not coherent with the filesystem buffer cache ++ like early versions of FreeBSD and possibly contemporary NetBSD.) ++ For shared mappings, we should conversely verify that changes get ++ propogated back to all the places they're supposed to be. ++ ++ Grep wants private fixed already mapped. ++ The main things grep needs to know about mmap are: ++ * does it exist and is it safe to write into the mmap'd area ++ * how to use it (BSD variants) */ ++#include ++#include ++#include ++ ++/* This mess was copied from the GNU getpagesize.h. */ ++#ifndef HAVE_GETPAGESIZE ++# ifdef HAVE_UNISTD_H ++# include ++# endif ++ ++/* Assume that all systems that can run configure have sys/param.h. */ ++# ifndef HAVE_SYS_PARAM_H ++# define HAVE_SYS_PARAM_H 1 ++# endif ++ ++# ifdef _SC_PAGESIZE ++# define getpagesize() sysconf(_SC_PAGESIZE) ++# else /* no _SC_PAGESIZE */ ++# ifdef HAVE_SYS_PARAM_H ++# include ++# ifdef EXEC_PAGESIZE ++# define getpagesize() EXEC_PAGESIZE ++# else /* no EXEC_PAGESIZE */ ++# ifdef NBPG ++# define getpagesize() NBPG * CLSIZE ++# ifndef CLSIZE ++# define CLSIZE 1 ++# endif /* no CLSIZE */ ++# else /* no NBPG */ ++# ifdef NBPC ++# define getpagesize() NBPC ++# else /* no NBPC */ ++# ifdef PAGESIZE ++# define getpagesize() PAGESIZE ++# endif /* PAGESIZE */ ++# endif /* no NBPC */ ++# endif /* no NBPG */ ++# endif /* no EXEC_PAGESIZE */ ++# else /* no HAVE_SYS_PARAM_H */ ++# define getpagesize() 8192 /* punt totally */ ++# endif /* no HAVE_SYS_PARAM_H */ ++# endif /* no _SC_PAGESIZE */ ++ ++#endif /* no HAVE_GETPAGESIZE */ ++ ++#ifdef __cplusplus ++extern "C" { void *malloc(unsigned); } ++#else ++char *malloc(); ++#endif ++ ++int ++main() ++{ ++ char *data, *data2, *data3; ++ int i, pagesize; ++ int fd; ++ ++ pagesize = getpagesize(); ++ ++ /* ++ * First, make a file with some known garbage in it. ++ */ ++ data = malloc(pagesize); ++ if (!data) ++ exit(1); ++ for (i = 0; i < pagesize; ++i) ++ *(data + i) = rand(); ++ umask(0); ++ fd = creat("conftestmmap", 0600); ++ if (fd < 0) ++ exit(1); ++ if (write(fd, data, pagesize) != pagesize) ++ exit(1); ++ close(fd); ++ ++ /* ++ * Next, try to mmap the file at a fixed address which ++ * already has something else allocated at it. If we can, ++ * also make sure that we see the same garbage. ++ */ ++ fd = open("conftestmmap", O_RDWR); ++ if (fd < 0) ++ exit(1); ++ data2 = malloc(2 * pagesize); ++ if (!data2) ++ exit(1); ++ data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); ++ if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_FIXED, fd, 0L)) ++ exit(1); ++ for (i = 0; i < pagesize; ++i) ++ if (*(data + i) != *(data2 + i)) ++ exit(1); ++ ++ /* ++ * Finally, make sure that changes to the mapped area ++ * do not percolate back to the file as seen by read(). ++ * (This is a bug on some variants of i386 svr4.0.) ++ */ ++ for (i = 0; i < pagesize; ++i) ++ *(data2 + i) = *(data2 + i) + 1; ++ data3 = malloc(pagesize); ++ if (!data3) ++ exit(1); ++ if (read(fd, data3, pagesize) != pagesize) ++ exit(1); ++ for (i = 0; i < pagesize; ++i) ++ if (*(data + i) != *(data3 + i)) ++ exit(1); ++ close(fd); ++ unlink("conftestmmap"); ++ exit(0); ++} ++], ac_cv_func_mmap_fixed_mapped=yes, ac_cv_func_mmap_fixed_mapped=no, ++ac_cv_func_mmap_fixed_mapped=no)]) ++if test $ac_cv_func_mmap_fixed_mapped = yes; then ++ AC_DEFINE(HAVE_MMAP) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_GETPGRP, ++[AC_CACHE_CHECK(whether getpgrp takes no argument, ac_cv_func_getpgrp_void, ++[AC_TRY_RUN([ ++/* ++ * If this system has a BSD-style getpgrp(), ++ * which takes a pid argument, exit unsuccessfully. ++ * ++ * Snarfed from Chet Ramey's bash pgrp.c test program ++ */ ++#include ++#include ++ ++int pid; ++int pg1, pg2, pg3, pg4; ++int ng, np, s, child; ++ ++main() ++{ ++ pid = getpid(); ++ pg1 = getpgrp(0); ++ pg2 = getpgrp(); ++ pg3 = getpgrp(pid); ++ pg4 = getpgrp(1); ++ ++ /* ++ * If all of these values are the same, it's pretty sure that ++ * we're on a system that ignores getpgrp's first argument. ++ */ ++ if (pg2 == pg4 && pg1 == pg3 && pg2 == pg3) ++ exit(0); ++ ++ child = fork(); ++ if (child < 0) ++ exit(1); ++ else if (child == 0) { ++ np = getpid(); ++ /* ++ * If this is Sys V, this will not work; pgrp will be ++ * set to np because setpgrp just changes a pgrp to be ++ * the same as the pid. ++ */ ++ setpgrp(np, pg1); ++ ng = getpgrp(0); /* Same result for Sys V and BSD */ ++ if (ng == pg1) { ++ exit(1); ++ } else { ++ exit(0); ++ } ++ } else { ++ wait(&s); ++ exit(s>>8); ++ } ++} ++], ac_cv_func_getpgrp_void=yes, ac_cv_func_getpgrp_void=no, ++ AC_MSG_ERROR(cannot check getpgrp if cross compiling)) ++]) ++if test $ac_cv_func_getpgrp_void = yes; then ++ AC_DEFINE(GETPGRP_VOID) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_SETPGRP, ++[AC_CACHE_CHECK(whether setpgrp takes no argument, ac_cv_func_setpgrp_void, ++AC_TRY_RUN([ ++#ifdef HAVE_UNISTD_H ++#include ++#endif ++ ++/* ++ * If this system has a BSD-style setpgrp, which takes arguments, exit ++ * successfully. ++ */ ++main() ++{ ++ if (setpgrp(1,1) == -1) ++ exit(0); ++ else ++ exit(1); ++} ++], ac_cv_func_setpgrp_void=no, ac_cv_func_setpgrp_void=yes, ++ AC_MSG_ERROR(cannot check setpgrp if cross compiling)) ++) ++if test $ac_cv_func_setpgrp_void = yes; then ++ AC_DEFINE(SETPGRP_VOID) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_VPRINTF, ++[AC_CHECK_FUNC(vprintf, AC_DEFINE(HAVE_VPRINTF)) ++if test "$ac_cv_func_vprintf" != yes; then ++AC_CHECK_FUNC(_doprnt, AC_DEFINE(HAVE_DOPRNT)) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_VFORK, ++[AC_REQUIRE([AC_TYPE_PID_T])dnl ++AC_CHECK_HEADER(vfork.h, AC_DEFINE(HAVE_VFORK_H)) ++AC_CACHE_CHECK(for working vfork, ac_cv_func_vfork_works, ++[AC_TRY_RUN([/* Thanks to Paul Eggert for this test. */ ++#include ++#include ++#include ++#ifdef HAVE_UNISTD_H ++#include ++#endif ++#ifdef HAVE_VFORK_H ++#include ++#endif ++/* On some sparc systems, changes by the child to local and incoming ++ argument registers are propagated back to the parent. ++ The compiler is told about this with #include , ++ but some compilers (e.g. gcc -O) don't grok . ++ Test for this by using a static variable whose address ++ is put into a register that is clobbered by the vfork. */ ++static ++#ifdef __cplusplus ++sparc_address_test (int arg) ++#else ++sparc_address_test (arg) int arg; ++#endif ++{ ++ static pid_t child; ++ if (!child) { ++ child = vfork (); ++ if (child < 0) { ++ perror ("vfork"); ++ _exit(2); ++ } ++ if (!child) { ++ arg = getpid(); ++ write(-1, "", 0); ++ _exit (arg); ++ } ++ } ++} ++main() { ++ pid_t parent = getpid (); ++ pid_t child; ++ ++ sparc_address_test (); ++ ++ child = vfork (); ++ ++ if (child == 0) { ++ /* Here is another test for sparc vfork register problems. ++ This test uses lots of local variables, at least ++ as many local variables as main has allocated so far ++ including compiler temporaries. 4 locals are enough for ++ gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. ++ A buggy compiler should reuse the register of parent ++ for one of the local variables, since it will think that ++ parent can't possibly be used any more in this routine. ++ Assigning to the local variable will thus munge parent ++ in the parent process. */ ++ pid_t ++ p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), ++ p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); ++ /* Convince the compiler that p..p7 are live; otherwise, it might ++ use the same hardware register for all 8 local variables. */ ++ if (p != p1 || p != p2 || p != p3 || p != p4 ++ || p != p5 || p != p6 || p != p7) ++ _exit(1); ++ ++ /* On some systems (e.g. IRIX 3.3), ++ vfork doesn't separate parent from child file descriptors. ++ If the child closes a descriptor before it execs or exits, ++ this munges the parent's descriptor as well. ++ Test for this by closing stdout in the child. */ ++ _exit(close(fileno(stdout)) != 0); ++ } else { ++ int status; ++ struct stat st; ++ ++ while (wait(&status) != child) ++ ; ++ exit( ++ /* Was there some problem with vforking? */ ++ child < 0 ++ ++ /* Did the child fail? (This shouldn't happen.) */ ++ || status ++ ++ /* Did the vfork/compiler bug occur? */ ++ || parent != getpid() ++ ++ /* Did the file descriptor bug occur? */ ++ || fstat(fileno(stdout), &st) != 0 ++ ); ++ } ++}], ++ac_cv_func_vfork_works=yes, ac_cv_func_vfork_works=no, AC_CHECK_FUNC(vfork) ++ac_cv_func_vfork_works=$ac_cv_func_vfork)]) ++if test $ac_cv_func_vfork_works = no; then ++ AC_DEFINE(vfork, fork) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_WAIT3, ++[AC_CACHE_CHECK(for wait3 that fills in rusage, ac_cv_func_wait3_rusage, ++[AC_TRY_RUN([#include ++#include ++#include ++#include ++/* HP-UX has wait3 but does not fill in rusage at all. */ ++main() { ++ struct rusage r; ++ int i; ++ /* Use a field that we can force nonzero -- ++ voluntary context switches. ++ For systems like NeXT and OSF/1 that don't set it, ++ also use the system CPU time. And page faults (I/O) for Linux. */ ++ r.ru_nvcsw = 0; ++ r.ru_stime.tv_sec = 0; ++ r.ru_stime.tv_usec = 0; ++ r.ru_majflt = r.ru_minflt = 0; ++ switch (fork()) { ++ case 0: /* Child. */ ++ sleep(1); /* Give up the CPU. */ ++ _exit(0); ++ case -1: _exit(0); /* What can we do? */ ++ default: /* Parent. */ ++ wait3(&i, 0, &r); ++ sleep(2); /* Avoid "text file busy" from rm on fast HP-UX machines. */ ++ exit(r.ru_nvcsw == 0 && r.ru_majflt == 0 && r.ru_minflt == 0 ++ && r.ru_stime.tv_sec == 0 && r.ru_stime.tv_usec == 0); ++ } ++}], ac_cv_func_wait3_rusage=yes, ac_cv_func_wait3_rusage=no, ++ac_cv_func_wait3_rusage=no)]) ++if test $ac_cv_func_wait3_rusage = yes; then ++ AC_DEFINE(HAVE_WAIT3) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_ALLOCA, ++[AC_REQUIRE_CPP()dnl Set CPP; we run AC_EGREP_CPP conditionally. ++# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works ++# for constant arguments. Useless! ++AC_CACHE_CHECK([for working alloca.h], ac_cv_header_alloca_h, ++[AC_TRY_LINK([#include ], [char *p = alloca(2 * sizeof(int));], ++ ac_cv_header_alloca_h=yes, ac_cv_header_alloca_h=no)]) ++if test $ac_cv_header_alloca_h = yes; then ++ AC_DEFINE(HAVE_ALLOCA_H) ++fi ++ ++AC_CACHE_CHECK([for alloca], ac_cv_func_alloca_works, ++[AC_TRY_LINK([ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# ifdef _MSC_VER ++# include ++# define alloca _alloca ++# else ++# if HAVE_ALLOCA_H ++# include ++# else ++# ifdef _AIX ++ #pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char *alloca (); ++# endif ++# endif ++# endif ++# endif ++#endif ++], [char *p = (char *) alloca(1);], ++ ac_cv_func_alloca_works=yes, ac_cv_func_alloca_works=no)]) ++if test $ac_cv_func_alloca_works = yes; then ++ AC_DEFINE(HAVE_ALLOCA) ++fi ++ ++if test $ac_cv_func_alloca_works = no; then ++ # The SVR3 libPW and SVR4 libucb both contain incompatible functions ++ # that cause trouble. Some versions do not even contain alloca or ++ # contain a buggy version. If you still want to use their alloca, ++ # use ar to extract alloca.o from them instead of compiling alloca.c. ++ ALLOCA=alloca.${ac_objext} ++ AC_DEFINE(C_ALLOCA) ++ ++AC_CACHE_CHECK(whether alloca needs Cray hooks, ac_cv_os_cray, ++[AC_EGREP_CPP(webecray, ++[#if defined(CRAY) && ! defined(CRAY2) ++webecray ++#else ++wenotbecray ++#endif ++], ac_cv_os_cray=yes, ac_cv_os_cray=no)]) ++if test $ac_cv_os_cray = yes; then ++for ac_func in _getb67 GETB67 getb67; do ++ AC_CHECK_FUNC($ac_func, [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func) ++ break]) ++done ++fi ++ ++AC_CACHE_CHECK(stack direction for C alloca, ac_cv_c_stack_direction, ++[AC_TRY_RUN([find_stack_direction () ++{ ++ static char *addr = 0; ++ auto char dummy; ++ if (addr == 0) ++ { ++ addr = &dummy; ++ return find_stack_direction (); ++ } ++ else ++ return (&dummy > addr) ? 1 : -1; ++} ++main () ++{ ++ exit (find_stack_direction() < 0); ++}], ac_cv_c_stack_direction=1, ac_cv_c_stack_direction=-1, ++ ac_cv_c_stack_direction=0)]) ++AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction) ++fi ++AC_SUBST(ALLOCA)dnl ++]) ++ ++AC_DEFUN(AC_FUNC_GETLOADAVG, ++[ac_have_func=no # yes means we've found a way to get the load average. ++ ++# Some systems with -lutil have (and need) -lkvm as well, some do not. ++# On Solaris, -lkvm requires nlist from -lelf, so check that first ++# to get the right answer into the cache. ++AC_CHECK_LIB(elf, elf_begin, LIBS="-lelf $LIBS") ++AC_CHECK_LIB(kvm, kvm_open, LIBS="-lkvm $LIBS") ++# Check for the 4.4BSD definition of getloadavg. ++AC_CHECK_LIB(util, getloadavg, ++ [LIBS="-lutil $LIBS" ac_have_func=yes ac_cv_func_getloadavg_setgid=yes]) ++ ++if test $ac_have_func = no; then ++ # There is a commonly available library for RS/6000 AIX. ++ # Since it is not a standard part of AIX, it might be installed locally. ++ ac_getloadavg_LIBS="$LIBS"; LIBS="-L/usr/local/lib $LIBS" ++ AC_CHECK_LIB(getloadavg, getloadavg, ++ LIBS="-lgetloadavg $LIBS", LIBS="$ac_getloadavg_LIBS") ++fi ++ ++# Make sure it is really in the library, if we think we found it. ++AC_REPLACE_FUNCS(getloadavg) ++ ++if test $ac_cv_func_getloadavg = yes; then ++ AC_DEFINE(HAVE_GETLOADAVG) ++ ac_have_func=yes ++else ++ # Figure out what our getloadavg.c needs. ++ ac_have_func=no ++ AC_CHECK_HEADER(sys/dg_sys_info.h, ++ [ac_have_func=yes; AC_DEFINE(DGUX) ++ AC_CHECK_LIB(dgc, dg_sys_info)]) ++ ++ # We cannot check for , because Solaris 2 does not use dwarf (it ++ # uses stabs), but it is still SVR4. We cannot check for because ++ # Irix 4.0.5F has the header but not the library. ++ if test $ac_have_func = no && test $ac_cv_lib_elf_elf_begin = yes; then ++ ac_have_func=yes; AC_DEFINE(SVR4) ++ fi ++ ++ if test $ac_have_func = no; then ++ AC_CHECK_HEADER(inq_stats/cpustats.h, ++ [ac_have_func=yes; AC_DEFINE(UMAX) ++ AC_DEFINE(UMAX4_3)]) ++ fi ++ ++ if test $ac_have_func = no; then ++ AC_CHECK_HEADER(sys/cpustats.h, ++ [ac_have_func=yes; AC_DEFINE(UMAX)]) ++ fi ++ ++ if test $ac_have_func = no; then ++ AC_CHECK_HEADERS(mach/mach.h) ++ fi ++ ++ AC_CHECK_HEADER(nlist.h, ++ [AC_DEFINE(NLIST_STRUCT) ++ AC_CACHE_CHECK([for n_un in struct nlist], ac_cv_struct_nlist_n_un, ++ [AC_TRY_COMPILE([#include ], ++ [struct nlist n; n.n_un.n_name = 0;], ++ ac_cv_struct_nlist_n_un=yes, ac_cv_struct_nlist_n_un=no)]) ++ if test $ac_cv_struct_nlist_n_un = yes; then ++ AC_DEFINE(NLIST_NAME_UNION) ++ fi ++ ])dnl ++fi # Do not have getloadavg in system libraries. ++ ++# Some definitions of getloadavg require that the program be installed setgid. ++dnl FIXME Don't hardwire the path of getloadavg.c in the top-level directory. ++AC_CACHE_CHECK(whether getloadavg requires setgid, ++ ac_cv_func_getloadavg_setgid, ++[AC_EGREP_CPP([Yowza Am I SETGID yet], ++[#include "$srcdir/getloadavg.c" ++#ifdef LDAV_PRIVILEGED ++Yowza Am I SETGID yet ++#endif], ++ ac_cv_func_getloadavg_setgid=yes, ac_cv_func_getloadavg_setgid=no)]) ++if test $ac_cv_func_getloadavg_setgid = yes; then ++ NEED_SETGID=true; AC_DEFINE(GETLOADAVG_PRIVILEGED) ++else ++ NEED_SETGID=false ++fi ++AC_SUBST(NEED_SETGID)dnl ++ ++if test $ac_cv_func_getloadavg_setgid = yes; then ++ AC_CACHE_CHECK(group of /dev/kmem, ac_cv_group_kmem, ++[changequote(, )dnl ++ # On Solaris, /dev/kmem is a symlink. Get info on the real file. ++ ac_ls_output=`ls -lgL /dev/kmem 2>/dev/null` ++ # If we got an error (system does not support symlinks), try without -L. ++ test -z "$ac_ls_output" && ac_ls_output=`ls -lg /dev/kmem` ++ ac_cv_group_kmem=`echo $ac_ls_output \ ++ | sed -ne 's/[ ][ ]*/ /g; ++ s/^.[sSrwx-]* *[0-9]* *\([^0-9]*\) *.*/\1/; ++ / /s/.* //;p;'` ++changequote([, ])dnl ++]) ++ KMEM_GROUP=$ac_cv_group_kmem ++fi ++AC_SUBST(KMEM_GROUP)dnl ++]) ++ ++AC_DEFUN(AC_FUNC_UTIME_NULL, ++[AC_CACHE_CHECK(whether utime accepts a null argument, ac_cv_func_utime_null, ++[rm -f conftestdata; > conftestdata ++# Sequent interprets utime(file, 0) to mean use start of epoch. Wrong. ++AC_TRY_RUN([#include ++#include ++main() { ++struct stat s, t; ++exit(!(stat ("conftestdata", &s) == 0 && utime("conftestdata", (long *)0) == 0 ++&& stat("conftestdata", &t) == 0 && t.st_mtime >= s.st_mtime ++&& t.st_mtime - s.st_mtime < 120)); ++}], ac_cv_func_utime_null=yes, ac_cv_func_utime_null=no, ++ ac_cv_func_utime_null=no) ++rm -f core core.* *.core]) ++if test $ac_cv_func_utime_null = yes; then ++ AC_DEFINE(HAVE_UTIME_NULL) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_STRCOLL, ++[AC_CACHE_CHECK(for working strcoll, ac_cv_func_strcoll_works, ++[AC_TRY_RUN([#include ++main () ++{ ++ exit (strcoll ("abc", "def") >= 0 || ++ strcoll ("ABC", "DEF") >= 0 || ++ strcoll ("123", "456") >= 0); ++}], ac_cv_func_strcoll_works=yes, ac_cv_func_strcoll_works=no, ++ac_cv_func_strcoll_works=no)]) ++if test $ac_cv_func_strcoll_works = yes; then ++ AC_DEFINE(HAVE_STRCOLL) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_SETVBUF_REVERSED, ++[AC_CACHE_CHECK(whether setvbuf arguments are reversed, ++ ac_cv_func_setvbuf_reversed, ++[AC_TRY_RUN([#include ++/* If setvbuf has the reversed format, exit 0. */ ++main () { ++ /* This call has the arguments reversed. ++ A reversed system may check and see that the address of main ++ is not _IOLBF, _IONBF, or _IOFBF, and return nonzero. */ ++ if (setvbuf(stdout, _IOLBF, (char *) main, BUFSIZ) != 0) ++ exit(1); ++ putc('\r', stdout); ++ exit(0); /* Non-reversed systems segv here. */ ++}], ac_cv_func_setvbuf_reversed=yes, ac_cv_func_setvbuf_reversed=no) ++rm -f core core.* *.core]) ++if test $ac_cv_func_setvbuf_reversed = yes; then ++ AC_DEFINE(SETVBUF_REVERSED) ++fi ++]) ++ ++AC_DEFUN(AC_FUNC_GETMNTENT, ++[# getmntent is in -lsun on Irix 4, -lseq on Dynix/PTX, -lgen on Unixware. ++AC_CHECK_LIB(sun, getmntent, LIBS="-lsun $LIBS", ++ [AC_CHECK_LIB(seq, getmntent, LIBS="-lseq $LIBS", ++ [AC_CHECK_LIB(gen, getmntent, LIBS="-lgen $LIBS")])]) ++AC_CHECK_FUNC(getmntent, [AC_DEFINE(HAVE_GETMNTENT)])]) ++ ++AC_DEFUN(AC_FUNC_STRFTIME, ++[AC_CHECK_FUNC(strftime, [AC_DEFINE(HAVE_STRFTIME)], ++[# strftime is in -lintl on SCO UNIX. ++AC_CHECK_LIB(intl, strftime, ++[AC_DEFINE(HAVE_STRFTIME) ++LIBS="-lintl $LIBS"])])]) ++ ++AC_DEFUN(AC_FUNC_MEMCMP, ++[AC_CACHE_CHECK(for 8-bit clean memcmp, ac_cv_func_memcmp_clean, ++[AC_TRY_RUN([ ++main() ++{ ++ char c0 = 0x40, c1 = 0x80, c2 = 0x81; ++ exit(memcmp(&c0, &c2, 1) < 0 && memcmp(&c1, &c2, 1) < 0 ? 0 : 1); ++} ++], ac_cv_func_memcmp_clean=yes, ac_cv_func_memcmp_clean=no, ++ac_cv_func_memcmp_clean=no)]) ++test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}" ++AC_SUBST(LIBOBJS)dnl ++]) ++ ++AC_DEFUN(AC_FUNC_SELECT_ARGTYPES, ++[AC_MSG_CHECKING([types of arguments for select()]) ++ AC_CACHE_VAL(ac_cv_func_select_arg234,dnl ++ [AC_CACHE_VAL(ac_cv_func_select_arg1,dnl ++ [AC_CACHE_VAL(ac_cv_func_select_arg5,dnl ++ [for ac_cv_func_select_arg234 in 'fd_set *' 'int *' 'void *'; do ++ for ac_cv_func_select_arg1 in 'int' 'size_t' 'unsigned long' 'unsigned'; do ++ for ac_cv_func_select_arg5 in 'struct timeval *' 'const struct timeval *'; do ++ AC_TRY_COMPILE(dnl ++[#ifdef HAVE_SYS_TYPES_H ++#include ++#endif ++#ifdef HAVE_SYS_TIME_H ++#include ++#endif ++#ifdef HAVE_SYS_SELECT_H ++#include ++#endif ++#ifdef HAVE_SYS_SOCKET_H ++#include ++#endif ++extern select ($ac_cv_func_select_arg1,$ac_cv_func_select_arg234,$ac_cv_func_select_arg234,$ac_cv_func_select_arg234,$ac_cv_func_select_arg5);],,dnl ++ [ac_not_found=no ; break 3],ac_not_found=yes) ++ done ++ done ++ done ++ ])dnl AC_CACHE_VAL ++ ])dnl AC_CACHE_VAL ++ ])dnl AC_CACHE_VAL ++ if test "$ac_not_found" = yes; then ++ ac_cv_func_select_arg1=int ++ ac_cv_func_select_arg234='int *' ++ ac_cv_func_select_arg5='struct timeval *' ++ fi ++ AC_MSG_RESULT([$ac_cv_func_select_arg1,$ac_cv_func_select_arg234,$ac_cv_func_select_arg5]) ++ AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG1,$ac_cv_func_select_arg1) ++ AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG234,($ac_cv_func_select_arg234)) ++ AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG5,($ac_cv_func_select_arg5)) ++]) ++ ++ ++dnl ### Checks for structure members ++ ++ ++AC_DEFUN(AC_HEADER_TIME, ++[AC_CACHE_CHECK([whether time.h and sys/time.h may both be included], ++ ac_cv_header_time, ++[AC_TRY_COMPILE([#include ++#include ++#include ], ++[struct tm *tp;], ac_cv_header_time=yes, ac_cv_header_time=no)]) ++if test $ac_cv_header_time = yes; then ++ AC_DEFINE(TIME_WITH_SYS_TIME) ++fi ++]) ++ ++AC_DEFUN(AC_STRUCT_TM, ++[AC_CACHE_CHECK([whether struct tm is in sys/time.h or time.h], ++ ac_cv_struct_tm, ++[AC_TRY_COMPILE([#include ++#include ], ++[struct tm *tp; tp->tm_sec;], ++ ac_cv_struct_tm=time.h, ac_cv_struct_tm=sys/time.h)]) ++if test $ac_cv_struct_tm = sys/time.h; then ++ AC_DEFINE(TM_IN_SYS_TIME) ++fi ++]) ++ ++AC_DEFUN(AC_STRUCT_TIMEZONE, ++[AC_REQUIRE([AC_STRUCT_TM])dnl ++AC_CACHE_CHECK([for tm_zone in struct tm], ac_cv_struct_tm_zone, ++[AC_TRY_COMPILE([#include ++#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_zone;], ++ ac_cv_struct_tm_zone=yes, ac_cv_struct_tm_zone=no)]) ++if test "$ac_cv_struct_tm_zone" = yes; then ++ AC_DEFINE(HAVE_TM_ZONE) ++else ++ AC_CACHE_CHECK(for tzname, ac_cv_var_tzname, ++[AC_TRY_LINK( ++changequote(<<, >>)dnl ++<<#include ++#ifndef tzname /* For SGI. */ ++extern char *tzname[]; /* RS6000 and others reject char **tzname. */ ++#endif>>, ++changequote([, ])dnl ++[atoi(*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)]) ++ if test $ac_cv_var_tzname = yes; then ++ AC_DEFINE(HAVE_TZNAME) ++ fi ++fi ++]) ++ ++AC_DEFUN(AC_STRUCT_ST_BLOCKS, ++[AC_CACHE_CHECK([for st_blocks in struct stat], ac_cv_struct_st_blocks, ++[AC_TRY_COMPILE([#include ++#include ], [struct stat s; s.st_blocks;], ++ac_cv_struct_st_blocks=yes, ac_cv_struct_st_blocks=no)]) ++if test $ac_cv_struct_st_blocks = yes; then ++ AC_DEFINE(HAVE_ST_BLOCKS) ++else ++ LIBOBJS="$LIBOBJS fileblocks.${ac_objext}" ++fi ++AC_SUBST(LIBOBJS)dnl ++]) ++ ++AC_DEFUN(AC_STRUCT_ST_BLKSIZE, ++[AC_CACHE_CHECK([for st_blksize in struct stat], ac_cv_struct_st_blksize, ++[AC_TRY_COMPILE([#include ++#include ], [struct stat s; s.st_blksize;], ++ac_cv_struct_st_blksize=yes, ac_cv_struct_st_blksize=no)]) ++if test $ac_cv_struct_st_blksize = yes; then ++ AC_DEFINE(HAVE_ST_BLKSIZE) ++fi ++]) ++ ++AC_DEFUN(AC_STRUCT_ST_RDEV, ++[AC_CACHE_CHECK([for st_rdev in struct stat], ac_cv_struct_st_rdev, ++[AC_TRY_COMPILE([#include ++#include ], [struct stat s; s.st_rdev;], ++ac_cv_struct_st_rdev=yes, ac_cv_struct_st_rdev=no)]) ++if test $ac_cv_struct_st_rdev = yes; then ++ AC_DEFINE(HAVE_ST_RDEV) ++fi ++]) ++ ++ ++dnl ### Checks for compiler characteristics ++ ++ ++AC_DEFUN(AC_C_CROSS, ++[AC_OBSOLETE([$0], [; it has been merged into AC_PROG_CC])]) ++ ++AC_DEFUN(AC_C_CHAR_UNSIGNED, ++[AC_CACHE_CHECK(whether char is unsigned, ac_cv_c_char_unsigned, ++[if test "$GCC" = yes; then ++ # GCC predefines this symbol on systems where it applies. ++AC_EGREP_CPP(yes, ++[#ifdef __CHAR_UNSIGNED__ ++ yes ++#endif ++], ac_cv_c_char_unsigned=yes, ac_cv_c_char_unsigned=no) ++else ++AC_TRY_RUN( ++[/* volatile prevents gcc2 from optimizing the test away on sparcs. */ ++#if !defined(__STDC__) || __STDC__ != 1 ++#define volatile ++#endif ++main() { ++ volatile char c = 255; exit(c < 0); ++}], ac_cv_c_char_unsigned=yes, ac_cv_c_char_unsigned=no) ++fi]) ++if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then ++ AC_DEFINE(__CHAR_UNSIGNED__) ++fi ++]) ++ ++AC_DEFUN(AC_C_LONG_DOUBLE, ++[AC_CACHE_CHECK(for long double, ac_cv_c_long_double, ++[if test "$GCC" = yes; then ++ ac_cv_c_long_double=yes ++else ++AC_TRY_RUN([int main() { ++/* The Stardent Vistra knows sizeof(long double), but does not support it. */ ++long double foo = 0.0; ++/* On Ultrix 4.3 cc, long double is 4 and double is 8. */ ++exit(sizeof(long double) < sizeof(double)); }], ++ac_cv_c_long_double=yes, ac_cv_c_long_double=no) ++fi]) ++if test $ac_cv_c_long_double = yes; then ++ AC_DEFINE(HAVE_LONG_DOUBLE) ++fi ++]) ++ ++AC_DEFUN(AC_INT_16_BITS, ++[AC_OBSOLETE([$0], [; instead use AC_CHECK_SIZEOF(int)])dnl ++AC_MSG_CHECKING(whether int is 16 bits) ++AC_TRY_RUN([main() { exit(sizeof(int) != 2); }], ++ [AC_MSG_RESULT(yes) ++ AC_DEFINE(INT_16_BITS)], AC_MSG_RESULT(no)) ++]) ++ ++AC_DEFUN(AC_LONG_64_BITS, ++[AC_OBSOLETE([$0], [; instead use AC_CHECK_SIZEOF(long)])dnl ++AC_MSG_CHECKING(whether long int is 64 bits) ++AC_TRY_RUN([main() { exit(sizeof(long int) != 8); }], ++ [AC_MSG_RESULT(yes) ++ AC_DEFINE(LONG_64_BITS)], AC_MSG_RESULT(no)) ++]) ++ ++AC_DEFUN(AC_C_BIGENDIAN, ++[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian, ++[ac_cv_c_bigendian=unknown ++# See if sys/param.h defines the BYTE_ORDER macro. ++AC_TRY_COMPILE([#include ++#include ], [ ++#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN ++ bogus endian macros ++#endif], [# It does; now see whether it defined to BIG_ENDIAN or not. ++AC_TRY_COMPILE([#include ++#include ], [ ++#if BYTE_ORDER != BIG_ENDIAN ++ not big endian ++#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)]) ++if test $ac_cv_c_bigendian = unknown; then ++AC_TRY_RUN([main () { ++ /* Are we little or big endian? From Harbison&Steele. */ ++ union ++ { ++ long l; ++ char c[sizeof (long)]; ++ } u; ++ u.l = 1; ++ exit (u.c[sizeof (long) - 1] == 1); ++}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes) ++fi]) ++if test $ac_cv_c_bigendian = yes; then ++ AC_DEFINE(WORDS_BIGENDIAN) ++fi ++]) ++ ++dnl Do nothing if the compiler accepts the inline keyword. ++dnl Otherwise define inline to __inline__ or __inline if one of those work, ++dnl otherwise define inline to be empty. ++AC_DEFUN(AC_C_INLINE, ++[AC_CACHE_CHECK([for inline], ac_cv_c_inline, ++[ac_cv_c_inline=no ++for ac_kw in inline __inline__ __inline; do ++ AC_TRY_COMPILE(, [} $ac_kw foo() {], [ac_cv_c_inline=$ac_kw; break]) ++done ++]) ++case "$ac_cv_c_inline" in ++ inline | yes) ;; ++ no) AC_DEFINE(inline, ) ;; ++ *) AC_DEFINE_UNQUOTED(inline, $ac_cv_c_inline) ;; ++esac ++]) ++ ++AC_DEFUN(AC_C_CONST, ++[dnl This message is consistent in form with the other checking messages, ++dnl and with the result message. ++AC_CACHE_CHECK([for working const], ac_cv_c_const, ++[AC_TRY_COMPILE(, ++changequote(<<, >>)dnl ++<< ++/* Ultrix mips cc rejects this. */ ++typedef int charset[2]; const charset x; ++/* SunOS 4.1.1 cc rejects this. */ ++char const *const *ccp; ++char **p; ++/* NEC SVR4.0.2 mips cc rejects this. */ ++struct point {int x, y;}; ++static struct point const zero = {0,0}; ++/* AIX XL C 1.02.0.0 rejects this. ++ It does not let you subtract one const X* pointer from another in an arm ++ of an if-expression whose if-part is not a constant expression */ ++const char *g = "string"; ++ccp = &g + (g ? g-g : 0); ++/* HPUX 7.0 cc rejects these. */ ++++ccp; ++p = (char**) ccp; ++ccp = (char const *const *) p; ++{ /* SCO 3.2v4 cc rejects this. */ ++ char *t; ++ char const *s = 0 ? (char *) 0 : (char const *) 0; ++ ++ *t++ = 0; ++} ++{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ ++ int x[] = {25, 17}; ++ const int *foo = &x[0]; ++ ++foo; ++} ++{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ ++ typedef const int *iptr; ++ iptr p = 0; ++ ++p; ++} ++{ /* AIX XL C 1.02.0.0 rejects this saying ++ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ ++ struct s { int j; const int *ap[3]; }; ++ struct s *b; b->j = 5; ++} ++{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ ++ const int foo = 10; ++} ++>>, ++changequote([, ])dnl ++ac_cv_c_const=yes, ac_cv_c_const=no)]) ++if test $ac_cv_c_const = no; then ++ AC_DEFINE(const, ) ++fi ++]) ++ ++AC_DEFUN(AC_C_STRINGIZE, [ ++AC_REQUIRE([AC_PROG_CPP]) ++AC_MSG_CHECKING([for preprocessor stringizing operator]) ++AC_CACHE_VAL(ac_cv_c_stringize, ++AC_EGREP_CPP([#teststring],[ ++#define x(y) #y ++ ++char *s = x(teststring); ++], ac_cv_c_stringize=no, ac_cv_c_stringize=yes)) ++if test "${ac_cv_c_stringize}" = yes ++then ++ AC_DEFINE(HAVE_STRINGIZE) ++fi ++AC_MSG_RESULT([${ac_cv_c_stringize}]) ++])dnl ++ ++define(AC_ARG_ARRAY, ++[errprint(__file__:__line__: [$0] has been removed; don't do unportable things with arguments ++)m4exit(4)]) ++ ++dnl Check the object extension used by the compiler: typically .o or ++dnl .obj. If this is called, some other behaviour will change, ++dnl determined by ac_objext. ++AC_DEFUN(AC_OBJEXT, ++[AC_MSG_CHECKING([for object suffix]) ++AC_CACHE_VAL(ac_cv_objext, ++[rm -f conftest* ++echo 'int i = 1;' > conftest.$ac_ext ++if AC_TRY_EVAL(ac_compile); then ++ for ac_file in conftest.*; do ++ case $ac_file in ++ *.c) ;; ++ *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;; ++ esac ++ done ++else ++ AC_MSG_ERROR([installation or configuration problem; compiler does not work]) ++fi ++rm -f conftest*]) ++AC_MSG_RESULT($ac_cv_objext) ++OBJEXT=$ac_cv_objext ++ac_objext=$ac_cv_objext ++AC_SUBST(OBJEXT)]) ++ ++dnl Determine the linker flags (e.g. `-L' and `-l') for the Fortran 77 ++dnl intrinsic and run-time libraries that are required to successfully ++dnl link a Fortran 77 program or shared library. The output variable ++dnl FLIBS is set to these flags. ++dnl ++dnl This macro is intended to be used in those situations when it is ++dnl necessary to mix, e.g. C++ and Fortran 77, source code into a single ++dnl program or shared library. ++dnl ++dnl For example, if object files from a C++ and Fortran 77 compiler must ++dnl be linked together, then the C++ compiler/linker must be used for ++dnl linking (since special C++-ish things need to happen at link time ++dnl like calling global constructors, instantiating templates, enabling ++dnl exception support, etc.). ++dnl ++dnl However, the Fortran 77 intrinsic and run-time libraries must be ++dnl linked in as well, but the C++ compiler/linker doesn't know how to ++dnl add these Fortran 77 libraries. Hence, the macro ++dnl `AC_F77_LIBRARY_LDFLAGS' was created to determine these Fortran 77 ++dnl libraries. ++dnl ++dnl This macro was packaged in its current form by Matthew D. Langston ++dnl . However, nearly all of this macro ++dnl came from the `OCTAVE_FLIBS' macro in `octave-2.0.13/aclocal.m4', ++dnl and full credit should go to John W. Eaton for writing this ++dnl extremely useful macro. Thank you John. ++dnl ++dnl AC_F77_LIBRARY_LDFLAGS() ++AC_DEFUN(AC_F77_LIBRARY_LDFLAGS, ++[AC_MSG_CHECKING([for Fortran 77 libraries]) ++AC_REQUIRE([AC_PROG_F77]) ++AC_REQUIRE([AC_CANONICAL_HOST]) ++AC_CACHE_VAL(ac_cv_flibs, ++[changequote(, )dnl ++dnl Write a minimal program and compile it with -v. I don't know what ++dnl to do if your compiler doesn't have -v... ++echo " END" > conftest.f ++foutput=`${F77} -v -o conftest conftest.f 2>&1` ++dnl ++dnl The easiest thing to do for xlf output is to replace all the commas ++dnl with spaces. Try to only do that if the output is really from xlf, ++dnl since doing that causes problems on other systems. ++dnl ++xlf_p=`echo $foutput | grep xlfentry` ++if test -n "$xlf_p"; then ++ foutput=`echo $foutput | sed 's/,/ /g'` ++fi ++dnl ++ld_run_path=`echo $foutput | \ ++ sed -n -e 's/^.*LD_RUN_PATH *= *\([^ ]*\).*/\1/p'` ++dnl ++dnl We are only supposed to find this on Solaris systems... ++dnl Uh, the run path should be absolute, shouldn't it? ++dnl ++case "$ld_run_path" in ++ /*) ++ if test "$ac_cv_prog_gcc" = yes; then ++ ld_run_path="-Xlinker -R -Xlinker $ld_run_path" ++ else ++ ld_run_path="-R $ld_run_path" ++ fi ++ ;; ++ *) ++ ld_run_path= ++ ;; ++esac ++dnl ++flibs= ++lflags= ++dnl ++dnl If want_arg is set, we know we want the arg to be added to the list, ++dnl so we don't have to examine it. ++dnl ++want_arg= ++dnl ++for arg in $foutput; do ++ old_want_arg=$want_arg ++ want_arg= ++dnl ++dnl None of the options that take arguments expect the argument to ++dnl start with a -, so pretend we didn't see anything special. ++dnl ++ if test -n "$old_want_arg"; then ++ case "$arg" in ++ -*) ++ old_want_arg= ++ ;; ++ esac ++ fi ++ case "$old_want_arg" in ++ '') ++ case $arg in ++ /*.a) ++ exists=false ++ for f in $lflags; do ++ if test x$arg = x$f; then ++ exists=true ++ fi ++ done ++ if $exists; then ++ arg= ++ else ++ lflags="$lflags $arg" ++ fi ++ ;; ++ -bI:*) ++ exists=false ++ for f in $lflags; do ++ if test x$arg = x$f; then ++ exists=true ++ fi ++ done ++ if $exists; then ++ arg= ++ else ++ if test "$ac_cv_prog_gcc" = yes; then ++ lflags="$lflags -Xlinker $arg" ++ else ++ lflags="$lflags $arg" ++ fi ++ fi ++ ;; ++ -lang* | -lcrt0.o | -lc | -lgcc) ++ arg= ++ ;; ++ -[lLR]) ++ want_arg=$arg ++ arg= ++ ;; ++ -[lLR]*) ++ exists=false ++ for f in $lflags; do ++ if test x$arg = x$f; then ++ exists=true ++ fi ++ done ++ if $exists; then ++ arg= ++ else ++ case "$arg" in ++ -lkernel32) ++ case "$canonical_host_type" in ++ *-*-cygwin*) ++ arg= ++ ;; ++ *) ++ lflags="$lflags $arg" ++ ;; ++ esac ++ ;; ++ -lm) ++ ;; ++ *) ++ lflags="$lflags $arg" ++ ;; ++ esac ++ fi ++ ;; ++ -u) ++ want_arg=$arg ++ arg= ++ ;; ++ -Y) ++ want_arg=$arg ++ arg= ++ ;; ++ *) ++ arg= ++ ;; ++ esac ++ ;; ++ -[lLR]) ++ arg="$old_want_arg $arg" ++ ;; ++ -u) ++ arg="-u $arg" ++ ;; ++ -Y) ++dnl ++dnl Should probably try to ensure unique directory options here too. ++dnl This probably only applies to Solaris systems, and then will only ++dnl work with gcc... ++dnl ++ arg=`echo $arg | sed -e 's%^P,%%'` ++ SAVE_IFS=$IFS ++ IFS=: ++ list= ++ for elt in $arg; do ++ list="$list -L$elt" ++ done ++ IFS=$SAVE_IFS ++ arg="$list" ++ ;; ++ esac ++dnl ++ if test -n "$arg"; then ++ flibs="$flibs $arg" ++ fi ++done ++if test -n "$ld_run_path"; then ++ flibs_result="$ld_run_path $flibs" ++else ++ flibs_result="$flibs" ++fi ++changequote([, ])dnl ++ac_cv_flibs="$flibs_result"]) ++FLIBS="$ac_cv_flibs" ++AC_SUBST(FLIBS)dnl ++AC_MSG_RESULT($FLIBS) ++]) ++ ++ ++dnl ### Checks for operating system services ++ ++ ++AC_DEFUN(AC_SYS_INTERPRETER, ++[# Pull the hash mark out of the macro call to avoid m4 problems. ++ac_msg="whether #! works in shell scripts" ++AC_CACHE_CHECK($ac_msg, ac_cv_sys_interpreter, ++[echo '#! /bin/cat ++exit 69 ++' > conftest ++chmod u+x conftest ++(SHELL=/bin/sh; export SHELL; ./conftest >/dev/null) ++if test $? -ne 69; then ++ ac_cv_sys_interpreter=yes ++else ++ ac_cv_sys_interpreter=no ++fi ++rm -f conftest]) ++interpval="$ac_cv_sys_interpreter" ++]) ++ ++define(AC_HAVE_POUNDBANG, ++[errprint(__file__:__line__: [$0 has been replaced by AC_SYS_INTERPRETER, taking no arguments ++])m4exit(4)]) ++ ++AC_DEFUN(AC_SYS_LONG_FILE_NAMES, ++[AC_CACHE_CHECK(for long file names, ac_cv_sys_long_file_names, ++[ac_cv_sys_long_file_names=yes ++# Test for long file names in all the places we know might matter: ++# . the current directory, where building will happen ++# $prefix/lib where we will be installing things ++# $exec_prefix/lib likewise ++# eval it to expand exec_prefix. ++# $TMPDIR if set, where it might want to write temporary files ++# if $TMPDIR is not set: ++# /tmp where it might want to write temporary files ++# /var/tmp likewise ++# /usr/tmp likewise ++if test -n "$TMPDIR" && test -d "$TMPDIR" && test -w "$TMPDIR"; then ++ ac_tmpdirs="$TMPDIR" ++else ++ ac_tmpdirs='/tmp /var/tmp /usr/tmp' ++fi ++for ac_dir in . $ac_tmpdirs `eval echo $prefix/lib $exec_prefix/lib` ; do ++ test -d $ac_dir || continue ++ test -w $ac_dir || continue # It is less confusing to not echo anything here. ++ (echo 1 > $ac_dir/conftest9012345) 2>/dev/null ++ (echo 2 > $ac_dir/conftest9012346) 2>/dev/null ++ val=`cat $ac_dir/conftest9012345 2>/dev/null` ++ if test ! -f $ac_dir/conftest9012345 || test "$val" != 1; then ++ ac_cv_sys_long_file_names=no ++ rm -f $ac_dir/conftest9012345 $ac_dir/conftest9012346 2>/dev/null ++ break ++ fi ++ rm -f $ac_dir/conftest9012345 $ac_dir/conftest9012346 2>/dev/null ++done]) ++if test $ac_cv_sys_long_file_names = yes; then ++ AC_DEFINE(HAVE_LONG_FILE_NAMES) ++fi ++]) ++ ++AC_DEFUN(AC_SYS_RESTARTABLE_SYSCALLS, ++[AC_CACHE_CHECK(for restartable system calls, ac_cv_sys_restartable_syscalls, ++[AC_TRY_RUN( ++[/* Exit 0 (true) if wait returns something other than -1, ++ i.e. the pid of the child, which means that wait was restarted ++ after getting the signal. */ ++#include ++#include ++ucatch (isig) { } ++main () { ++ int i = fork (), status; ++ if (i == 0) { sleep (3); kill (getppid (), SIGINT); sleep (3); exit (0); } ++ signal (SIGINT, ucatch); ++ status = wait(&i); ++ if (status == -1) wait(&i); ++ exit (status == -1); ++} ++], ac_cv_sys_restartable_syscalls=yes, ac_cv_sys_restartable_syscalls=no)]) ++if test $ac_cv_sys_restartable_syscalls = yes; then ++ AC_DEFINE(HAVE_RESTARTABLE_SYSCALLS) ++fi ++]) ++ ++AC_DEFUN(AC_PATH_X, ++[AC_REQUIRE_CPP()dnl Set CPP; we run AC_PATH_X_DIRECT conditionally. ++# If we find X, set shell vars x_includes and x_libraries to the ++# paths, otherwise set no_x=yes. ++# Uses ac_ vars as temps to allow command line to override cache and checks. ++# --without-x overrides everything else, but does not touch the cache. ++AC_MSG_CHECKING(for X) ++ ++AC_ARG_WITH(x, [ --with-x use the X Window System]) ++# $have_x is `yes', `no', `disabled', or empty when we do not yet know. ++if test "x$with_x" = xno; then ++ # The user explicitly disabled X. ++ have_x=disabled ++else ++ if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then ++ # Both variables are already set. ++ have_x=yes ++ else ++AC_CACHE_VAL(ac_cv_have_x, ++[# One or both of the vars are not set, and there is no cached value. ++ac_x_includes=NO ac_x_libraries=NO ++AC_PATH_X_XMKMF ++AC_PATH_X_DIRECT ++if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then ++ # Didn't find X anywhere. Cache the known absence of X. ++ ac_cv_have_x="have_x=no" ++else ++ # Record where we found X for the cache. ++ ac_cv_have_x="have_x=yes \ ++ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" ++fi])dnl ++ fi ++ eval "$ac_cv_have_x" ++fi # $with_x != no ++ ++if test "$have_x" != yes; then ++ AC_MSG_RESULT($have_x) ++ no_x=yes ++else ++ # If each of the values was on the command line, it overrides each guess. ++ test "x$x_includes" = xNONE && x_includes=$ac_x_includes ++ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries ++ # Update the cache value to reflect the command line values. ++ ac_cv_have_x="have_x=yes \ ++ ac_x_includes=$x_includes ac_x_libraries=$x_libraries" ++ AC_MSG_RESULT([libraries $x_libraries, headers $x_includes]) ++fi ++]) ++ ++dnl Internal subroutine of AC_PATH_X. ++dnl Set ac_x_includes and/or ac_x_libraries. ++AC_DEFUN(AC_PATH_X_XMKMF, ++[rm -fr conftestdir ++if mkdir conftestdir; then ++ cd conftestdir ++ # Make sure to not put "make" in the Imakefile rules, since we grep it out. ++ cat > Imakefile <<'EOF' ++acfindx: ++ @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' ++EOF ++ if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then ++ # GNU make sometimes prints "make[1]: Entering...", which would confuse us. ++ eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` ++ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. ++ for ac_extension in a so sl; do ++ if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && ++ test -f $ac_im_libdir/libX11.$ac_extension; then ++ ac_im_usrlibdir=$ac_im_libdir; break ++ fi ++ done ++ # Screen out bogus values from the imake configuration. They are ++ # bogus both because they are the default anyway, and because ++ # using them would break gcc on systems where it needs fixed includes. ++ case "$ac_im_incroot" in ++ /usr/include) ;; ++ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; ++ esac ++ case "$ac_im_usrlibdir" in ++ /usr/lib | /lib) ;; ++ *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; ++ esac ++ fi ++ cd .. ++ rm -fr conftestdir ++fi ++]) ++ ++dnl Internal subroutine of AC_PATH_X. ++dnl Set ac_x_includes and/or ac_x_libraries. ++AC_DEFUN(AC_PATH_X_DIRECT, ++[if test "$ac_x_includes" = NO; then ++ # Guess where to find include files, by looking for this one X11 .h file. ++ test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h ++ ++ # First, try using that file with no special directory specified. ++AC_TRY_CPP([#include <$x_direct_test_include>], ++[# We can compile using X headers with no special include directory. ++ac_x_includes=], ++[# Look for the header file in a standard set of common directories. ++# Check X11 before X11Rn because it is often a symlink to the current release. ++ for ac_dir in \ ++ /usr/X11/include \ ++ /usr/X11R6/include \ ++ /usr/X11R5/include \ ++ /usr/X11R4/include \ ++ \ ++ /usr/include/X11 \ ++ /usr/include/X11R6 \ ++ /usr/include/X11R5 \ ++ /usr/include/X11R4 \ ++ \ ++ /usr/local/X11/include \ ++ /usr/local/X11R6/include \ ++ /usr/local/X11R5/include \ ++ /usr/local/X11R4/include \ ++ \ ++ /usr/local/include/X11 \ ++ /usr/local/include/X11R6 \ ++ /usr/local/include/X11R5 \ ++ /usr/local/include/X11R4 \ ++ \ ++ /usr/X386/include \ ++ /usr/x386/include \ ++ /usr/XFree86/include/X11 \ ++ \ ++ /usr/include \ ++ /usr/local/include \ ++ /usr/unsupported/include \ ++ /usr/athena/include \ ++ /usr/local/x11r5/include \ ++ /usr/lpp/Xamples/include \ ++ \ ++ /usr/openwin/include \ ++ /usr/openwin/share/include \ ++ ; \ ++ do ++ if test -r "$ac_dir/$x_direct_test_include"; then ++ ac_x_includes=$ac_dir ++ break ++ fi ++ done]) ++fi # $ac_x_includes = NO ++ ++if test "$ac_x_libraries" = NO; then ++ # Check for the libraries. ++ ++ test -z "$x_direct_test_library" && x_direct_test_library=Xt ++ test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc ++ ++ # See if we find them without any special options. ++ # Don't add to $LIBS permanently. ++ ac_save_LIBS="$LIBS" ++ LIBS="-l$x_direct_test_library $LIBS" ++AC_TRY_LINK(, [${x_direct_test_function}()], ++[LIBS="$ac_save_LIBS" ++# We can link X programs with no special library path. ++ac_x_libraries=], ++[LIBS="$ac_save_LIBS" ++# First see if replacing the include by lib works. ++# Check X11 before X11Rn because it is often a symlink to the current release. ++for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ ++ /usr/X11/lib \ ++ /usr/X11R6/lib \ ++ /usr/X11R5/lib \ ++ /usr/X11R4/lib \ ++ \ ++ /usr/lib/X11 \ ++ /usr/lib/X11R6 \ ++ /usr/lib/X11R5 \ ++ /usr/lib/X11R4 \ ++ \ ++ /usr/local/X11/lib \ ++ /usr/local/X11R6/lib \ ++ /usr/local/X11R5/lib \ ++ /usr/local/X11R4/lib \ ++ \ ++ /usr/local/lib/X11 \ ++ /usr/local/lib/X11R6 \ ++ /usr/local/lib/X11R5 \ ++ /usr/local/lib/X11R4 \ ++ \ ++ /usr/X386/lib \ ++ /usr/x386/lib \ ++ /usr/XFree86/lib/X11 \ ++ \ ++ /usr/lib \ ++ /usr/local/lib \ ++ /usr/unsupported/lib \ ++ /usr/athena/lib \ ++ /usr/local/x11r5/lib \ ++ /usr/lpp/Xamples/lib \ ++ /lib/usr/lib/X11 \ ++ \ ++ /usr/openwin/lib \ ++ /usr/openwin/share/lib \ ++ ; \ ++do ++dnl Don't even attempt the hair of trying to link an X program! ++ for ac_extension in a so sl; do ++ if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then ++ ac_x_libraries=$ac_dir ++ break 2 ++ fi ++ done ++done]) ++fi # $ac_x_libraries = NO ++]) ++ ++dnl Find additional X libraries, magic flags, etc. ++AC_DEFUN(AC_PATH_XTRA, ++[AC_REQUIRE([AC_PATH_X])dnl ++if test "$no_x" = yes; then ++ # Not all programs may use this symbol, but it does not hurt to define it. ++ AC_DEFINE(X_DISPLAY_MISSING) ++ X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= ++else ++ if test -n "$x_includes"; then ++ X_CFLAGS="$X_CFLAGS -I$x_includes" ++ fi ++ ++ # It would also be nice to do this for all -L options, not just this one. ++ if test -n "$x_libraries"; then ++ X_LIBS="$X_LIBS -L$x_libraries" ++dnl FIXME banish uname from this macro! ++ # For Solaris; some versions of Sun CC require a space after -R and ++ # others require no space. Words are not sufficient . . . . ++ case "`(uname -sr) 2>/dev/null`" in ++ "SunOS 5"*) ++ AC_MSG_CHECKING(whether -R must be followed by a space) ++ ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" ++ AC_TRY_LINK(, , ac_R_nospace=yes, ac_R_nospace=no) ++ if test $ac_R_nospace = yes; then ++ AC_MSG_RESULT(no) ++ X_LIBS="$X_LIBS -R$x_libraries" ++ else ++ LIBS="$ac_xsave_LIBS -R $x_libraries" ++ AC_TRY_LINK(, , ac_R_space=yes, ac_R_space=no) ++ if test $ac_R_space = yes; then ++ AC_MSG_RESULT(yes) ++ X_LIBS="$X_LIBS -R $x_libraries" ++ else ++ AC_MSG_RESULT(neither works) ++ fi ++ fi ++ LIBS="$ac_xsave_LIBS" ++ esac ++ fi ++ ++ # Check for system-dependent libraries X programs must link with. ++ # Do this before checking for the system-independent R6 libraries ++ # (-lICE), since we may need -lsocket or whatever for X linking. ++ ++ if test "$ISC" = yes; then ++ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" ++ else ++ # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X ++ # libraries were built with DECnet support. And karl@cs.umb.edu says ++ # the Alpha needs dnet_stub (dnet does not exist). ++ AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) ++ if test $ac_cv_lib_dnet_dnet_ntoa = no; then ++ AC_CHECK_LIB(dnet_stub, dnet_ntoa, ++ [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) ++ fi ++ ++ # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, ++ # to get the SysV transport functions. ++ # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4) ++ # needs -lnsl. ++ # The nsl library prevents programs from opening the X display ++ # on Irix 5.2, according to dickey@clark.net. ++ AC_CHECK_FUNC(gethostbyname) ++ if test $ac_cv_func_gethostbyname = no; then ++ AC_CHECK_LIB(nsl, gethostbyname, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") ++ fi ++ ++ # lieder@skyler.mavd.honeywell.com says without -lsocket, ++ # socket/setsockopt and other routines are undefined under SCO ODT ++ # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary ++ # on later versions), says simon@lia.di.epfl.ch: it contains ++ # gethostby* variants that don't use the nameserver (or something). ++ # -lsocket must be given before -lnsl if both are needed. ++ # We assume that if connect needs -lnsl, so does gethostbyname. ++ AC_CHECK_FUNC(connect) ++ if test $ac_cv_func_connect = no; then ++ AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , ++ $X_EXTRA_LIBS) ++ fi ++ ++ # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. ++ AC_CHECK_FUNC(remove) ++ if test $ac_cv_func_remove = no; then ++ AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") ++ fi ++ ++ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ++ AC_CHECK_FUNC(shmat) ++ if test $ac_cv_func_shmat = no; then ++ AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc") ++ fi ++ fi ++ ++ # Check for libraries that X11R6 Xt/Xaw programs need. ++ ac_save_LDFLAGS="$LDFLAGS" ++ test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" ++ # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to ++ # check for ICE first), but we must link in the order -lSM -lICE or ++ # we get undefined symbols. So assume we have SM if we have ICE. ++ # These have to be linked with before -lX11, unlike the other ++ # libraries we check for below, so use a different variable. ++ # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. ++ AC_CHECK_LIB(ICE, IceConnectionNumber, ++ [X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"], , $X_EXTRA_LIBS) ++ LDFLAGS="$ac_save_LDFLAGS" ++ ++fi ++AC_SUBST(X_CFLAGS)dnl ++AC_SUBST(X_PRE_LIBS)dnl ++AC_SUBST(X_LIBS)dnl ++AC_SUBST(X_EXTRA_LIBS)dnl ++]) ++ ++dnl The old Cygwin32 macro is deprecated. ++AC_DEFUN(AC_CYGWIN32, ++[AC_OBSOLETE([$0], [; instead use AC_CYGWIN])dnl ++AC_CYGWIN]) ++ ++dnl Check for Cygwin. This is a way to set the right value for ++dnl EXEEXT. ++AC_DEFUN(AC_CYGWIN, ++[AC_CACHE_CHECK(for Cygwin environment, ac_cv_cygwin, ++[AC_TRY_COMPILE(,[ ++#ifndef __CYGWIN__ ++#define __CYGWIN__ __CYGWIN32__ ++#endif ++return __CYGWIN__;], ++ac_cv_cygwin=yes, ac_cv_cygwin=no) ++rm -f conftest*]) ++CYGWIN= ++test "$ac_cv_cygwin" = yes && CYGWIN=yes]) ++ ++dnl Check for mingw32. This is another way to set the right value for ++dnl EXEEXT. ++AC_DEFUN(AC_MINGW32, ++[AC_CACHE_CHECK(for mingw32 environment, ac_cv_mingw32, ++[AC_TRY_COMPILE(,[return __MINGW32__;], ++ac_cv_mingw32=yes, ac_cv_mingw32=no) ++rm -f conftest*]) ++MINGW32= ++test "$ac_cv_mingw32" = yes && MINGW32=yes]) ++ ++dnl Check for the extension used for executables. This knows that we ++dnl add .exe for Cygwin or mingw32. Otherwise, it compiles a test ++dnl executable. If this is called, the executable extensions will be ++dnl automatically used by link commands run by the configure script. ++AC_DEFUN(AC_EXEEXT, ++[AC_REQUIRE([AC_CYGWIN]) ++AC_REQUIRE([AC_MINGW32]) ++AC_MSG_CHECKING([for executable suffix]) ++AC_CACHE_VAL(ac_cv_exeext, ++[if test "$CYGWIN" = yes || test "$MINGW32" = yes; then ++ ac_cv_exeext=.exe ++else ++ rm -f conftest* ++ echo 'int main () { return 0; }' > conftest.$ac_ext ++ ac_cv_exeext= ++ if AC_TRY_EVAL(ac_link); then ++ for file in conftest.*; do ++ case $file in ++ *.c | *.o | *.obj) ;; ++ *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; ++ esac ++ done ++ else ++ AC_MSG_ERROR([installation or configuration problem: compiler cannot create executables.]) ++ fi ++ rm -f conftest* ++ test x"${ac_cv_exeext}" = x && ac_cv_exeext=no ++fi]) ++EXEEXT="" ++test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext} ++AC_MSG_RESULT(${ac_cv_exeext}) ++dnl Setting ac_exeext will implicitly change the ac_link command. ++ac_exeext=$EXEEXT ++AC_SUBST(EXEEXT)]) ++ ++ ++dnl ### Checks for UNIX variants ++dnl These are kludges which should be replaced by a single POSIX check. ++dnl They aren't cached, to discourage their use. ++ ++ ++AC_DEFUN(AC_AIX, ++[AC_BEFORE([$0], [AC_TRY_COMPILE])dnl ++AC_BEFORE([$0], [AC_TRY_RUN])dnl ++AC_MSG_CHECKING(for AIX) ++AC_EGREP_CPP(yes, ++[#ifdef _AIX ++ yes ++#endif ++], [AC_MSG_RESULT(yes); AC_DEFINE(_ALL_SOURCE)], AC_MSG_RESULT(no)) ++]) ++ ++AC_DEFUN(AC_MINIX, ++[AC_BEFORE([$0], [AC_TRY_COMPILE])dnl ++AC_BEFORE([$0], [AC_TRY_RUN])dnl ++AC_CHECK_HEADER(minix/config.h, MINIX=yes, MINIX=) ++if test "$MINIX" = yes; then ++ AC_DEFINE(_POSIX_SOURCE) ++ AC_DEFINE(_POSIX_1_SOURCE, 2) ++ AC_DEFINE(_MINIX) ++fi ++]) ++ ++AC_DEFUN(AC_ISC_POSIX, ++[AC_REQUIRE([AC_PROG_CC])dnl ++AC_BEFORE([$0], [AC_TRY_COMPILE])dnl ++AC_BEFORE([$0], [AC_TRY_RUN])dnl ++AC_MSG_CHECKING(for POSIXized ISC) ++if test -d /etc/conf/kconfig.d && ++ grep _POSIX_VERSION [/usr/include/sys/unistd.h] >/dev/null 2>&1 ++then ++ AC_MSG_RESULT(yes) ++ ISC=yes # If later tests want to check for ISC. ++ AC_DEFINE(_POSIX_SOURCE) ++ if test "$GCC" = yes; then ++ CC="$CC -posix" ++ else ++ CC="$CC -Xp" ++ fi ++else ++ AC_MSG_RESULT(no) ++ ISC= ++fi ++]) ++ ++AC_DEFUN(AC_XENIX_DIR, ++[AC_OBSOLETE([$0], [; instead use AC_HEADER_DIRENT])dnl ++AC_REQUIRE([AC_DIR_HEADER])dnl ++AC_MSG_CHECKING(for Xenix) ++AC_EGREP_CPP(yes, ++[#if defined(M_XENIX) && !defined(M_UNIX) ++ yes ++#endif ++], [AC_MSG_RESULT(yes); XENIX=yes], [AC_MSG_RESULT(no); XENIX=]) ++if test "$XENIX" = yes; then ++ # Make sure -ldir precedes -lx. ++ test $ac_header_dirent = dirent.h && LIBS="-ldir $LIBS" ++ LIBS="$LIBS -lx" ++fi ++]) ++ ++AC_DEFUN(AC_DYNIX_SEQ, ++[AC_OBSOLETE([$0], [; instead use AC_FUNC_GETMNTENT])dnl ++AC_CHECK_LIB(seq, getmntent, LIBS="-lseq $LIBS") ++]) ++ ++AC_DEFUN(AC_IRIX_SUN, ++[AC_OBSOLETE([$0], [; instead use AC_FUNC_GETMNTENT or AC_CHECK_LIB(sun, getpwnam)])dnl ++AC_CHECK_LIB(sun, getmntent, LIBS="-lsun $LIBS") ++]) ++ ++AC_DEFUN(AC_SCO_INTL, ++[AC_OBSOLETE([$0], [; instead use AC_FUNC_STRFTIME])dnl ++AC_CHECK_LIB(intl, strftime, LIBS="-lintl $LIBS") ++]) +diff -up firefox-78.8.0/build/autoconf/autoconf.m4.D89554-autoconf1.diff firefox-78.8.0/build/autoconf/autoconf.m4 +--- firefox-78.8.0/build/autoconf/autoconf.m4.D89554-autoconf1.diff 2021-02-25 13:48:13.605993481 +0100 ++++ firefox-78.8.0/build/autoconf/autoconf.m4 2021-02-25 13:48:13.605993481 +0100 +@@ -0,0 +1,28 @@ ++dnl Driver that loads the Autoconf macro files. ++dnl Requires GNU m4. ++dnl This file is part of Autoconf. ++dnl Copyright (C) 1994 Free Software Foundation, Inc. ++dnl ++dnl This program is free software; you can redistribute it and/or modify ++dnl it under the terms of the GNU General Public License as published by ++dnl the Free Software Foundation; either version 2, or (at your option) ++dnl any later version. ++dnl ++dnl This program is distributed in the hope that it will be useful, ++dnl but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++dnl GNU General Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License ++dnl along with this program; if not, write to the Free Software ++dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ++dnl 02111-1307, USA. ++dnl ++dnl Written by David MacKenzie. ++dnl ++include(acgeneral.m4)dnl ++builtin(include, acspecific.m4)dnl ++builtin(include, acoldnames.m4)dnl ++dnl Do not sinclude acsite.m4 here, because it may not be installed ++dnl yet when Autoconf is frozen. ++dnl Do not sinclude ./aclocal.m4 here, to prevent it from being frozen. +diff -up firefox-78.8.0/build/autoconf/autoconf.sh.D89554-autoconf1.diff firefox-78.8.0/build/autoconf/autoconf.sh +--- firefox-78.8.0/build/autoconf/autoconf.sh.D89554-autoconf1.diff 2021-02-25 13:48:13.606993484 +0100 ++++ firefox-78.8.0/build/autoconf/autoconf.sh 2021-02-25 13:48:13.606993484 +0100 +@@ -0,0 +1,159 @@ ++#! @SHELL@ ++# autoconf -- create `configure' using m4 macros ++# Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2, or (at your option) ++# any later version. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++ ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++# If given no args, create `configure' from template file `configure.in'. ++# With one arg, create a configure script on standard output from ++# the given template file. ++ ++usage="\ ++Usage: autoconf [-h] [--help] [-m dir] [--macrodir=dir] ++ [-l dir] [--localdir=dir] [--version] [template-file]" ++ ++# NLS nuisances. ++# Only set these to C if already set. These must not be set unconditionally ++# because not all systems understand e.g. LANG=C (notably SCO). ++# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! ++# Non-C LC_CTYPE values break the ctype check. ++if test "${LANG+set}" = set; then LANG=C; export LANG; fi ++if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi ++if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi ++if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi ++ ++: ${AC_MACRODIR=@datadir@} ++: ${M4=@M4@} ++: ${AWK=@AWK@} ++case "${M4}" in ++/*) # Handle the case that m4 has moved since we were configured. ++ # It may have been found originally in a build directory. ++ test -f "${M4}" || M4=m4 ;; ++esac ++ ++: ${TMPDIR=/tmp} ++tmpout=${TMPDIR}/acout.$$ ++localdir= ++show_version=no ++ ++while test $# -gt 0 ; do ++ case "${1}" in ++ -h | --help | --h* ) ++ echo "${usage}" 1>&2; exit 0 ;; ++ --localdir=* | --l*=* ) ++ localdir="`echo \"${1}\" | sed -e 's/^[^=]*=//'`" ++ shift ;; ++ -l | --localdir | --l*) ++ shift ++ test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } ++ localdir="${1}" ++ shift ;; ++ --macrodir=* | --m*=* ) ++ AC_MACRODIR="`echo \"${1}\" | sed -e 's/^[^=]*=//'`" ++ shift ;; ++ -m | --macrodir | --m* ) ++ shift ++ test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } ++ AC_MACRODIR="${1}" ++ shift ;; ++ --version | --v* ) ++ show_version=yes; shift ;; ++ -- ) # Stop option processing ++ shift; break ;; ++ - ) # Use stdin as input. ++ break ;; ++ -* ) ++ echo "${usage}" 1>&2; exit 1 ;; ++ * ) ++ break ;; ++ esac ++done ++ ++if test $show_version = yes; then ++ version=`sed -n 's/define.AC_ACVERSION.[ ]*\([0-9.]*\).*/\1/p' \ ++ $AC_MACRODIR/acgeneral.m4` ++ echo "Autoconf version $version" ++ exit 0 ++fi ++ ++case $# in ++ 0) infile=configure.in ;; ++ 1) infile="$1" ;; ++ *) echo "$usage" >&2; exit 1 ;; ++esac ++ ++trap 'rm -f $tmpin $tmpout; exit 1' 1 2 15 ++ ++tmpin=${TMPDIR}/acin.$$ # Always set this, to avoid bogus errors from some rm's. ++if test z$infile = z-; then ++ infile=$tmpin ++ cat > $infile ++elif test ! -r "$infile"; then ++ echo "autoconf: ${infile}: No such file or directory" >&2 ++ exit 1 ++fi ++ ++if test -n "$localdir"; then ++ use_localdir="-I$localdir -DAC_LOCALDIR=$localdir" ++else ++ use_localdir= ++fi ++ ++# Use the frozen version of Autoconf if available. ++r= f= ++# Some non-GNU m4's don't reject the --help option, so give them /dev/null. ++case `$M4 --help < /dev/null 2>&1` in ++*reload-state*) test -r $AC_MACRODIR/autoconf.m4f && { r=--reload f=f; } ;; ++*traditional*) ;; ++*) echo Autoconf requires GNU m4 1.1 or later >&2; rm -f $tmpin; exit 1 ;; ++esac ++ ++$M4 -I$AC_MACRODIR $use_localdir $r autoconf.m4$f $infile > $tmpout || ++ { rm -f $tmpin $tmpout; exit 2; } ++ ++# You could add your own prefixes to pattern if you wanted to check for ++# them too, e.g. pattern='\(AC_\|ILT_\)', except that UNIX sed doesn't do ++# alternation. ++pattern="AC_" ++ ++status=0 ++if grep "^[^#]*${pattern}" $tmpout > /dev/null 2>&1; then ++ echo "autoconf: Undefined macros:" >&2 ++ sed -n "s/^[^#]*\\(${pattern}[_A-Za-z0-9]*\\).*/\\1/p" $tmpout | ++ while read macro; do ++ grep -n "^[^#]*$macro" $infile /dev/null ++ test $? -eq 1 && echo >&2 "***BUG in Autoconf--please report*** $macro" ++ done | sort -u >&2 ++ status=1 ++fi ++ ++if test $# -eq 0; then ++ exec 4> configure; chmod +x configure ++else ++ exec 4>&1 ++fi ++ ++# Put the real line numbers into configure to make config.log more helpful. ++$AWK ' ++/__oline__/ { printf "%d:", NR + 1 } ++ { print } ++' $tmpout | sed ' ++/__oline__/s/^\([0-9][0-9]*\):\(.*\)__oline__/\2\1/ ++' >&4 ++ ++rm -f $tmpout ++ ++exit $status +diff -up firefox-78.8.0/build/moz.configure/old.configure.D89554-autoconf1.diff firefox-78.8.0/build/moz.configure/old.configure +--- firefox-78.8.0/build/moz.configure/old.configure.D89554-autoconf1.diff 2021-02-17 08:48:52.000000000 +0100 ++++ firefox-78.8.0/build/moz.configure/old.configure 2021-02-25 13:50:02.595363534 +0100 +@@ -4,65 +4,7 @@ + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + +- +-option(env='AUTOCONF', nargs=1, help='Path to autoconf 2.13') +- +- +-@depends(mozconfig, 'AUTOCONF') +-@checking('for autoconf') +-@imports(_from='os.path', _import='exists') +-@imports('re') +-def autoconf(mozconfig, autoconf): +- mozconfig_autoconf = None +- if mozconfig['path']: +- make_extra = mozconfig['make_extra'] +- if make_extra: +- for assignment in make_extra: +- m = re.match('(?:export\s+)?AUTOCONF\s*:?=\s*(.+)$', +- assignment) +- if m: +- mozconfig_autoconf = m.group(1) +- # Check whether we've exported any known-broken variables. +- m = re.match('(?:export\s+)?(?:CC|CXX)\s*:?=\s*(?:.+)$', +- assignment) +- if m: +- die('Setting the value of CC or CXX with "mk_add_options" ' +- 'can cause the build to fail unexpectedly. Please ' +- 'change your mozconfig to instead use ' +- '"ac_add_options", e.g. ac_add_options ' +- 'CC=my-custom-cc".') +- +- autoconf = autoconf[0] if autoconf else None +- +- for ac in (mozconfig_autoconf, autoconf, 'autoconf-2.13', 'autoconf2.13', +- 'autoconf213'): +- if ac: +- autoconf = find_program(ac) +- if autoconf: +- break +- else: +- fink = find_program('fink') +- if fink: +- autoconf = os.path.normpath(os.path.join( +- fink, '..', '..', 'lib', 'autoconf2.13', 'bin', 'autoconf')) +- else: +- brew = find_program('brew') +- if brew: +- autoconf = os.path.normpath(os.path.join( +- brew, '..', '..', 'Cellar', 'autoconf213', '2.13', 'bin', +- 'autoconf213')) +- +- if not autoconf: +- die('Could not find autoconf 2.13') +- +- if not exists(autoconf): +- die('Could not find autoconf 2.13 at %s', autoconf) +- +- return autoconf +- +- +-set_config('AUTOCONF', autoconf) +- ++m4 = check_prog('M4', ('m4',)) + + @depends(mozconfig) + def prepare_mozconfig(mozconfig): +@@ -78,7 +20,7 @@ def prepare_mozconfig(mozconfig): + return items + + +-@depends('OLD_CONFIGURE', 'MOZILLABUILD', prepare_mozconfig, autoconf, check_build_environment, ++@depends('OLD_CONFIGURE', 'MOZILLABUILD', prepare_mozconfig, awk, m4, check_build_environment, + shell, old_configure_assignments, build_project) + @imports(_from='__builtin__', _import='open') + @imports(_from='__builtin__', _import='print') +@@ -96,7 +38,7 @@ def prepare_mozconfig(mozconfig): + @imports(_from='os', _import='rename') + @imports(_from='subprocess', _import='CalledProcessError') + @imports(_from='__builtin__', _import='OSError') +-def prepare_configure(old_configure, mozillabuild, mozconfig, autoconf, build_env, shell, ++def prepare_configure(old_configure, mozillabuild, mozconfig, awk, m4, build_env, shell, + old_configure_assignments, build_project): + # os.path.abspath in the sandbox will ensure forward slashes on Windows, + # which is actually necessary because this path actually ends up literally +@@ -125,13 +67,18 @@ def prepare_configure(old_configure, moz + refresh = False + + if refresh: ++ autoconf = os.path.join(build_env.topsrcdir, 'build', 'autoconf', 'autoconf.sh') + log.info('Refreshing %s with %s', old_configure, autoconf) ++ env = dict(environ) ++ env['M4'] = m4 ++ env['AWK'] = awk ++ env['AC_MACRODIR'] = os.path.join(build_env.topsrcdir, 'build', 'autoconf') + + try: + script = subprocess.check_output([ + shell, autoconf, + '--localdir=%s' % os.path.dirname(old_configure), +- old_configure + '.in']) ++ old_configure + '.in'], env=env) + except CalledProcessError as exc: + # Autoconf on win32 may break due to a bad $PATH. Let the user know + # their $PATH is suspect. +@@ -185,10 +132,6 @@ def prepare_configure(old_configure, moz + + inject('# end of mozconfig values') + +- # Autoconf is special, because it might be passed from +- # mozconfig['make_extra'], which we don't pass automatically above. +- inject('export AUTOCONF=%s' % quote(autoconf)) +- + for k, v in old_configure_assignments: + inject('%s=%s' % (k, quote(v))) + diff --git a/SOURCES/D94538-autoconf2.diff b/SOURCES/D94538-autoconf2.diff new file mode 100644 index 0000000..3e0481c --- /dev/null +++ b/SOURCES/D94538-autoconf2.diff @@ -0,0 +1,118 @@ +diff -up firefox-78.8.0/python/mozboot/mozboot/archlinux.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/archlinux.py +--- firefox-78.8.0/python/mozboot/mozboot/archlinux.py.D94538-autoconf2.diff 2021-02-25 13:53:04.963982705 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/archlinux.py 2021-02-25 13:53:25.713053151 +0100 +@@ -26,7 +26,6 @@ class ArchlinuxBootstrapper( + '''Archlinux experimental bootstrapper.''' + + SYSTEM_PACKAGES = [ +- 'autoconf2.13', + 'base-devel', + 'nodejs', + 'python2', +diff -up firefox-78.8.0/python/mozboot/mozboot/centosfedora.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/centosfedora.py +--- firefox-78.8.0/python/mozboot/mozboot/centosfedora.py.D94538-autoconf2.diff 2021-02-17 08:49:42.000000000 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/centosfedora.py 2021-02-25 13:53:04.963982705 +0100 +@@ -26,7 +26,6 @@ class CentOSFedoraBootstrapper( + # For CentOS 7, later versions of nodejs come from nodesource + # and include the npm package. + self.packages = [ +- 'autoconf213', + 'nodejs', + 'which', + ] +diff -up firefox-78.8.0/python/mozboot/mozboot/debian.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/debian.py +--- firefox-78.8.0/python/mozboot/mozboot/debian.py.D94538-autoconf2.diff 2021-02-25 13:53:04.963982705 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/debian.py 2021-02-25 13:53:42.874111415 +0100 +@@ -32,7 +32,6 @@ class DebianBootstrapper( + # These are common packages for all Debian-derived distros (such as + # Ubuntu). + COMMON_PACKAGES = [ +- 'autoconf2.13', + 'build-essential', + 'nodejs', + 'python-setuptools', +diff -up firefox-78.8.0/python/mozboot/mozboot/freebsd.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/freebsd.py +--- firefox-78.8.0/python/mozboot/mozboot/freebsd.py.D94538-autoconf2.diff 2021-02-17 08:49:42.000000000 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/freebsd.py 2021-02-25 13:53:04.963982705 +0100 +@@ -15,7 +15,6 @@ class FreeBSDBootstrapper(BaseBootstrapp + self.flavor = flavor.lower() + + self.packages = [ +- 'autoconf213', + 'gmake', + 'gtar', + 'pkgconf', +diff -up firefox-78.8.0/python/mozboot/mozboot/gentoo.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/gentoo.py +--- firefox-78.8.0/python/mozboot/mozboot/gentoo.py.D94538-autoconf2.diff 2021-02-17 08:49:38.000000000 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/gentoo.py 2021-02-25 13:53:04.963982705 +0100 +@@ -36,7 +36,6 @@ class GentooBootstrapper( + def ensure_system_packages(self): + self.run_as_root(['emerge', '--noreplace', '--quiet', + 'app-arch/zip', +- 'sys-devel/autoconf:2.1' + ]) + + def ensure_browser_packages(self, artifact_mode=False): +diff -up firefox-78.8.0/python/mozboot/mozboot/openbsd.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/openbsd.py +--- firefox-78.8.0/python/mozboot/mozboot/openbsd.py.D94538-autoconf2.diff 2021-02-17 08:49:15.000000000 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/openbsd.py 2021-02-25 13:53:04.964982709 +0100 +@@ -12,7 +12,6 @@ class OpenBSDBootstrapper(BaseBootstrapp + BaseBootstrapper.__init__(self, **kwargs) + + self.packages = [ +- 'autoconf-2.13', + 'gmake', + 'gtar', + 'rust', +diff -up firefox-78.8.0/python/mozboot/mozboot/opensuse.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/opensuse.py +--- firefox-78.8.0/python/mozboot/mozboot/opensuse.py.D94538-autoconf2.diff 2021-02-17 08:49:42.000000000 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/opensuse.py 2021-02-25 13:53:04.964982709 +0100 +@@ -13,7 +13,6 @@ class OpenSUSEBootstrapper( + '''openSUSE experimental bootstrapper.''' + + SYSTEM_PACKAGES = [ +- 'autoconf213', + 'nodejs', + 'npm', + 'which', +diff -up firefox-78.8.0/python/mozboot/mozboot/osx.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/osx.py +--- firefox-78.8.0/python/mozboot/mozboot/osx.py.D94538-autoconf2.diff 2021-02-25 13:53:04.964982709 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/osx.py 2021-02-25 13:54:07.162193882 +0100 +@@ -353,7 +353,6 @@ class OSXBootstrapper(BaseBootstrapper): + # least on 10.8) and because the build system wants a version + # newer than what Apple ships. + packages = [ +- 'autoconf@2.13', + 'git', + 'gnu-tar', + 'node', +@@ -428,7 +427,6 @@ class OSXBootstrapper(BaseBootstrapper): + 'python27', + 'python36', + 'py27-gnureadline', +- 'autoconf213', + 'gnutar', + 'watchman', + 'nodejs8' +diff -up firefox-78.8.0/python/mozboot/mozboot/solus.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/solus.py +--- firefox-78.8.0/python/mozboot/mozboot/solus.py.D94538-autoconf2.diff 2021-02-25 13:53:04.964982709 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/solus.py 2021-02-25 13:53:32.090074802 +0100 +@@ -23,7 +23,6 @@ class SolusBootstrapper( + '''Solus experimental bootstrapper.''' + + SYSTEM_PACKAGES = [ +- 'autoconf213', + 'nodejs', + 'python', + 'python3', +diff -up firefox-78.8.0/python/mozboot/mozboot/windows.py.D94538-autoconf2.diff firefox-78.8.0/python/mozboot/mozboot/windows.py +--- firefox-78.8.0/python/mozboot/mozboot/windows.py.D94538-autoconf2.diff 2021-02-17 08:49:34.000000000 +0100 ++++ firefox-78.8.0/python/mozboot/mozboot/windows.py 2021-02-25 13:53:04.978982756 +0100 +@@ -48,7 +48,6 @@ class WindowsBootstrapper(BaseBootstrapp + 'patch', + 'patchutils', + 'diffutils', +- 'autoconf2.13', + 'tar', + 'zip', + 'unzip', diff --git a/SOURCES/build-icu-make.patch b/SOURCES/build-icu-make.patch new file mode 100644 index 0000000..6a04091 --- /dev/null +++ b/SOURCES/build-icu-make.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.8.0/intl/icu_sources_data.py.icu-makefile firefox-68.8.0/intl/icu_sources_data.py +--- firefox-68.8.0/intl/icu_sources_data.py.icu-makefile 2020-05-11 17:00:03.642605718 +0200 ++++ firefox-68.8.0/intl/icu_sources_data.py 2020-05-11 17:00:37.774642749 +0200 +@@ -246,8 +246,7 @@ def update_data_file(topsrcdir): + if not try_run( + 'icu-make', + ['make', +- '--jobs=%d' % multiprocessing.cpu_count(), +- '--output-sync'], ++ '--jobs=1'], + cwd=objdir): + return False + print('Copying ICU data file...') diff --git a/SOURCES/build-mozconfig-fix.patch b/SOURCES/build-mozconfig-fix.patch new file mode 100644 index 0000000..91dffb1 --- /dev/null +++ b/SOURCES/build-mozconfig-fix.patch @@ -0,0 +1,12 @@ +diff -up mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py.mozconfig-fix mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py +--- mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py.mozconfig-fix 2018-03-13 17:22:19.018466884 +0100 ++++ mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py 2018-03-13 17:23:57.379559640 +0100 +@@ -446,7 +446,7 @@ class MozconfigLoader(object): + value = value[1:] + + # Lines with a quote not ending in a quote are multi-line. +- if has_quote and not value.endswith("'"): ++ if has_quote and not value.endswith(("'", ";")): + in_variable = name + current.append(value) + continue diff --git a/SOURCES/build-nss-version.patch b/SOURCES/build-nss-version.patch new file mode 100644 index 0000000..7847090 --- /dev/null +++ b/SOURCES/build-nss-version.patch @@ -0,0 +1,12 @@ +diff -up firefox-68.3.0/old-configure.in.nss-version firefox-68.3.0/old-configure.in +--- firefox-68.3.0/old-configure.in.nss-version 2019-11-27 19:48:01.045677621 +0100 ++++ firefox-68.3.0/old-configure.in 2019-11-27 19:59:52.856894047 +0100 +@@ -1537,7 +1537,7 @@ MOZ_ARG_WITH_BOOL(system-nss, + _USE_SYSTEM_NSS=1 ) + + if test -n "$_USE_SYSTEM_NSS"; then +- AM_PATH_NSS(3.44.4, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])]) ++ AM_PATH_NSS(3.44.0, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])]) + fi + + NSS_CFLAGS="$NSS_CFLAGS -I${DIST}/include/nss" diff --git a/SOURCES/build-ppc64le-inline.patch b/SOURCES/build-ppc64le-inline.patch new file mode 100644 index 0000000..de0f6d9 --- /dev/null +++ b/SOURCES/build-ppc64le-inline.patch @@ -0,0 +1,27 @@ +diff -up firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp.ppc64le-inline firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp +--- firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp.ppc64le-inline 2019-08-26 18:52:28.000000000 +0200 ++++ firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp 2019-08-29 08:49:57.695687874 +0200 +@@ -1092,7 +1092,11 @@ class MOZ_STACK_CLASS CallMethodHelper f + MOZ_ALWAYS_INLINE bool GetOutParamSource(uint8_t paramIndex, + MutableHandleValue srcp) const; + ++#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN) ++ bool GatherAndConvertResults(); ++#else + MOZ_ALWAYS_INLINE bool GatherAndConvertResults(); ++#endif + + MOZ_ALWAYS_INLINE bool QueryInterfaceFastPath(); + +@@ -1139,7 +1143,11 @@ class MOZ_STACK_CLASS CallMethodHelper f + + ~CallMethodHelper(); + ++#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN) ++ bool Call(); ++#else + MOZ_ALWAYS_INLINE bool Call(); ++#endif + + // Trace implementation so we can put our CallMethodHelper in a Rooted. + void trace(JSTracer* aTrc); diff --git a/SOURCES/distribution.ini b/SOURCES/distribution.ini new file mode 100644 index 0000000..8bf461e --- /dev/null +++ b/SOURCES/distribution.ini @@ -0,0 +1,9 @@ +[Global] +id=redhat +version=1.0 +about=Mozilla Firefox for Red Hat Enterprise Linux + +[Preferences] +app.distributor=redhat +app.distributor.channel=redhat +app.partner.fedora=redhat diff --git a/SOURCES/firefox-debugedits-error.patch b/SOURCES/firefox-debugedits-error.patch new file mode 100644 index 0000000..a4b005f --- /dev/null +++ b/SOURCES/firefox-debugedits-error.patch @@ -0,0 +1,50 @@ +diff -up firefox-68.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old firefox-68.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium +diff -up firefox-68.0/media/webrtc/trunk/Makefile.old firefox-68.0/media/webrtc/trunk/Makefile +diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc.old firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc +--- firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc.old 2019-06-12 08:17:02.673268442 +0200 ++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc 2019-06-12 08:17:13.582328073 +0200 +@@ -21,7 +21,7 @@ + * be found in the AUTHORS file in the root of the source tree. + */ + +-#include "modules/audio_processing//utility/ooura_fft.h" ++#include "modules/audio_processing/utility/ooura_fft.h" + + #include + +diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc.old firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc +--- firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc.old 2019-06-12 08:17:36.671454285 +0200 ++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc 2019-06-12 08:17:46.989510679 +0200 +@@ -8,7 +8,7 @@ + * be found in the AUTHORS file in the root of the source tree. + */ + +-#include "modules/audio_processing//utility/ooura_fft.h" ++#include "modules/audio_processing/utility/ooura_fft.h" + + #include + +diff -up firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c.old firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c +--- firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c.old 2019-06-12 08:16:15.673011534 +0200 ++++ firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c 2019-06-12 08:16:22.602049410 +0200 +@@ -17,7 +17,7 @@ + #include "aom_dsp/blend.h" + #include "aom/aom_integer.h" + #include "aom_dsp/x86/synonyms.h" +-#include "aom_dsp/x86//masked_sad_intrin_ssse3.h" ++#include "aom_dsp/x86/masked_sad_intrin_ssse3.h" + + static INLINE unsigned int masked_sad32xh_avx2( + const uint8_t *src_ptr, int src_stride, const uint8_t *a_ptr, int a_stride, +diff -up firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c.old firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c +--- firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c.old 2019-06-12 08:16:35.404119384 +0200 ++++ firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c 2019-06-12 08:16:43.415163174 +0200 +@@ -19,7 +19,7 @@ + #include "aom/aom_integer.h" + #include "aom_dsp/x86/synonyms.h" + +-#include "aom_dsp/x86//masked_sad_intrin_ssse3.h" ++#include "aom_dsp/x86/masked_sad_intrin_ssse3.h" + + // For width a multiple of 16 + static INLINE unsigned int masked_sad_ssse3(const uint8_t *src_ptr, diff --git a/SOURCES/firefox-enable-addons.patch b/SOURCES/firefox-enable-addons.patch new file mode 100644 index 0000000..15d0707 --- /dev/null +++ b/SOURCES/firefox-enable-addons.patch @@ -0,0 +1,13 @@ +diff -up firefox-55.0/browser/app/profile/firefox.js.addons firefox-55.0/browser/app/profile/firefox.js +--- firefox-55.0/browser/app/profile/firefox.js.addons 2017-08-02 10:58:30.566363833 +0200 ++++ firefox-55.0/browser/app/profile/firefox.js 2017-08-02 10:59:15.377216959 +0200 +@@ -65,7 +65,8 @@ pref("extensions.systemAddon.update.url" + + // Disable add-ons that are not installed by the user in all scopes by default. + // See the SCOPE constants in AddonManager.jsm for values to use here. +-pref("extensions.autoDisableScopes", 15); ++pref("extensions.autoDisableScopes", 0); ++pref("extensions.showMismatchUI", false); + // Scopes to scan for changes at startup. + pref("extensions.startupScanScopes", 0); + diff --git a/SOURCES/firefox-glibc-dynstack.patch b/SOURCES/firefox-glibc-dynstack.patch new file mode 100644 index 0000000..46bec9b --- /dev/null +++ b/SOURCES/firefox-glibc-dynstack.patch @@ -0,0 +1,62 @@ +diff -up firefox-78.12.0/js/xpconnect/src/XPCJSContext.cpp.firefox-glibc-dynstack firefox-78.12.0/js/xpconnect/src/XPCJSContext.cpp +--- firefox-78.12.0/js/xpconnect/src/XPCJSContext.cpp.firefox-glibc-dynstack 2021-07-06 21:50:42.000000000 +0200 ++++ firefox-78.12.0/js/xpconnect/src/XPCJSContext.cpp 2021-08-02 10:26:47.996760110 +0200 +@@ -81,14 +81,6 @@ using namespace xpc; + using namespace JS; + using mozilla::dom::AutoEntryScript; + +-// The watchdog thread loop is pretty trivial, and should not require much stack +-// space to do its job. So only give it 32KiB or the platform minimum. +-#if !defined(PTHREAD_STACK_MIN) +-# define PTHREAD_STACK_MIN 0 +-#endif +-static constexpr size_t kWatchdogStackSize = +- PTHREAD_STACK_MIN < 32 * 1024 ? 32 * 1024 : PTHREAD_STACK_MIN; +- + static void WatchdogMain(void* arg); + class Watchdog; + class WatchdogManager; +@@ -161,7 +153,7 @@ class Watchdog { + // watchdog, we need to join it on shutdown. + mThread = PR_CreateThread(PR_USER_THREAD, WatchdogMain, this, + PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, +- PR_JOINABLE_THREAD, kWatchdogStackSize); ++ PR_JOINABLE_THREAD, 0); + if (!mThread) { + MOZ_CRASH("PR_CreateThread failed!"); + } +diff -up firefox-78.12.0/security/sandbox/linux/launch/SandboxLaunch.cpp.firefox-glibc-dynstack firefox-78.12.0/security/sandbox/linux/launch/SandboxLaunch.cpp +--- firefox-78.12.0/security/sandbox/linux/launch/SandboxLaunch.cpp.firefox-glibc-dynstack 2021-07-06 21:50:46.000000000 +0200 ++++ firefox-78.12.0/security/sandbox/linux/launch/SandboxLaunch.cpp 2021-08-02 10:28:48.832946590 +0200 +@@ -489,7 +489,8 @@ static int CloneCallee(void* aPtr) { + // we don't currently support sandboxing under valgrind. + MOZ_NEVER_INLINE MOZ_ASAN_BLACKLIST static pid_t DoClone(int aFlags, + jmp_buf* aCtx) { +- uint8_t miniStack[PTHREAD_STACK_MIN]; ++ static constexpr size_t kStackAlignment = 16; ++ uint8_t miniStack[4096] __attribute__((aligned(kStackAlignment))); + #ifdef __hppa__ + void* stackPtr = miniStack; + #else +@@ -510,13 +511,19 @@ static pid_t ForkWithFlags(int aFlags) { + CLONE_CHILD_CLEARTID; + MOZ_RELEASE_ASSERT((aFlags & kBadFlags) == 0); + ++ // Block signals due to small stack in DoClone. ++ sigset_t oldSigs; ++ BlockAllSignals(&oldSigs); ++ ++ int ret = 0; + jmp_buf ctx; + if (setjmp(ctx) == 0) { + // In the parent and just called setjmp: +- return DoClone(aFlags | SIGCHLD, &ctx); ++ ret = DoClone(aFlags | SIGCHLD, &ctx); + } ++ RestoreSignals(&oldSigs); + // In the child and have longjmp'ed: +- return 0; ++ return ret; + } + + static bool WriteStringToFile(const char* aPath, const char* aStr, diff --git a/SOURCES/firefox-mozconfig b/SOURCES/firefox-mozconfig new file mode 100644 index 0000000..cc9fda8 --- /dev/null +++ b/SOURCES/firefox-mozconfig @@ -0,0 +1,27 @@ +. $topsrcdir/browser/config/mozconfig + +ac_add_options --enable-default-toolkit=cairo-gtk3 + +ac_add_options --prefix="$PREFIX" +ac_add_options --libdir="$LIBDIR" +ac_add_options --with-system-zlib +ac_add_options --disable-strip +ac_add_options --disable-tests +#ac_add_options --enable-libnotify +ac_add_options --enable-necko-wifi +ac_add_options --disable-updater +ac_add_options --enable-chrome-format=omni +ac_add_options --enable-pulseaudio +ac_add_options --with-system-icu +ac_add_options --with-mozilla-api-keyfile=../mozilla-api-key +ac_add_options --with-google-location-service-api-keyfile=../google-api-key +ac_add_options --with-google-safebrowsing-api-keyfile=../google-api-key +ac_add_options --disable-av1 +ac_add_options --allow-addon-sideload + +export BUILD_OFFICIAL=1 +export MOZILLA_OFFICIAL=1 +export MOZ_TELEMETRY_REPORTING=1 +mk_add_options BUILD_OFFICIAL=1 +mk_add_options MOZILLA_OFFICIAL=1 +mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir diff --git a/SOURCES/firefox-nss-addon-hack.patch b/SOURCES/firefox-nss-addon-hack.patch new file mode 100644 index 0000000..0322707 --- /dev/null +++ b/SOURCES/firefox-nss-addon-hack.patch @@ -0,0 +1,19 @@ +diff -up firefox-84.0.2/security/certverifier/NSSCertDBTrustDomain.cpp.nss-hack firefox-84.0.2/security/certverifier/NSSCertDBTrustDomain.cpp +--- firefox-84.0.2/security/certverifier/NSSCertDBTrustDomain.cpp.nss-hack 2021-01-11 12:12:02.585514543 +0100 ++++ firefox-84.0.2/security/certverifier/NSSCertDBTrustDomain.cpp 2021-01-11 12:47:50.345984582 +0100 +@@ -1619,6 +1619,15 @@ SECStatus InitializeNSS(const nsACString + return srv; + } + ++ /* Sets the NSS_USE_ALG_IN_ANY_SIGNATURE bit. ++ * does not change NSS_USE_ALG_IN_CERT_SIGNATURE, ++ * so policy will still disable use of sha1 in ++ * certificate related signature processing. */ ++ srv = NSS_SetAlgorithmPolicy(SEC_OID_SHA1, NSS_USE_ALG_IN_ANY_SIGNATURE, 0); ++ if (srv != SECSuccess) { ++ NS_WARNING("Unable to use SHA1 for Add-ons, expect broken/disabled Add-ons. See https://bugzilla.redhat.com/show_bug.cgi?id=1908018 for details."); ++ } ++ + if (nssDbConfig == NSSDBConfig::ReadWrite) { + UniquePK11SlotInfo slot(PK11_GetInternalKeySlot()); + if (!slot) { diff --git a/SOURCES/firefox-pipewire-0-3.patch b/SOURCES/firefox-pipewire-0-3.patch new file mode 100644 index 0000000..0844209 --- /dev/null +++ b/SOURCES/firefox-pipewire-0-3.patch @@ -0,0 +1,846 @@ +diff --git a/config/system-headers.mozbuild b/config/system-headers.mozbuild +index 2081d0c683a4..641133bf1ea4 100644 +--- a/config/system-headers.mozbuild ++++ b/config/system-headers.mozbuild +@@ -314,6 +314,7 @@ system_headers = [ + 'Gestalt.h', + 'getopt.h', + 'gio/gio.h', ++ 'gio/gunixfdlist.h', + 'glibconfig.h', + 'glib.h', + 'glib-object.h', +@@ -607,6 +608,7 @@ system_headers = [ + 'Pgenerr.h', + 'PGenErr.h', + 'Ph.h', ++ 'pipewire/pipewire.h', + 'pixman.h', + 'pk11func.h', + 'pk11pqg.h', +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn b/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn +index ba885217b3ba..201d3b755221 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn +@@ -158,7 +158,7 @@ if (rtc_include_tests) { + if (is_linux) { + if (rtc_use_pipewire) { + pkg_config("pipewire") { +- packages = [ "libpipewire-0.2" ] ++ packages = [ "libpipewire-0.3" ] + + defines = [ "WEBRTC_USE_PIPEWIRE" ] + } +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build +index 90b40431c7e4..d844aa79d591 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build +@@ -194,6 +194,30 @@ if CONFIG["OS_TARGET"] == "Linux": + "/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc" + ] + ++# PipeWire specific files ++if CONFIG["OS_TARGET"] == "Linux": ++ ++ DEFINES["WEBRTC_USE_PIPEWIRE"] = "1" ++ ++ OS_LIBS += [ ++ "rt", ++ "pipewire-0.3", ++ "glib-2.0", ++ "gio-2.0", ++ "gobject-2.0" ++ ] ++ ++ CXXFLAGS += CONFIG['TK_CFLAGS'] ++ CXXFLAGS += [ "-I/usr/include/pipewire-0.3" ] ++ CXXFLAGS += [ "-I/usr/include/spa-0.2" ] ++ ++ UNIFIED_SOURCES += [ ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc", ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc", ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc" ++ ] ++ ++ + if CONFIG["OS_TARGET"] == "NetBSD": + + DEFINES["USE_X11"] = "1" +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h +index 1eb8ead26efa..316468eed1fc 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h +@@ -141,7 +141,7 @@ class DesktopCaptureOptions { + bool disable_effects_ = true; + bool detect_updated_region_ = false; + #if defined(WEBRTC_USE_PIPEWIRE) +- bool allow_pipewire_ = false; ++ bool allow_pipewire_ = true; + #endif + }; + +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +index 379341c833de..76349f1fbd4d 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +@@ -15,8 +15,11 @@ + + #include + #include +-#include +-#include ++ ++#include ++#include ++#include ++#include + + #include + #include +@@ -36,31 +39,36 @@ const char kSessionInterfaceName[] = "org.freedesktop.portal.Session"; + const char kRequestInterfaceName[] = "org.freedesktop.portal.Request"; + const char kScreenCastInterfaceName[] = "org.freedesktop.portal.ScreenCast"; + +-// static +-void BaseCapturerPipeWire::OnStateChanged(void* data, +- pw_remote_state old_state, +- pw_remote_state state, +- const char* error_message) { +- BaseCapturerPipeWire* that = static_cast(data); +- RTC_DCHECK(that); + +- switch (state) { +- case PW_REMOTE_STATE_ERROR: +- RTC_LOG(LS_ERROR) << "PipeWire remote state error: " << error_message; +- break; +- case PW_REMOTE_STATE_CONNECTED: +- RTC_LOG(LS_INFO) << "PipeWire remote state: connected."; +- that->CreateReceivingStream(); +- break; +- case PW_REMOTE_STATE_CONNECTING: +- RTC_LOG(LS_INFO) << "PipeWire remote state: connecting."; ++// static ++void BaseCapturerPipeWire::SyncDmaBuf(int fd, uint64_t start_or_end) { ++ struct dma_buf_sync sync = { 0 }; ++ ++ sync.flags = start_or_end | DMA_BUF_SYNC_READ; ++ ++ while(true) { ++ int ret; ++ ret = ioctl (fd, DMA_BUF_IOCTL_SYNC, &sync); ++ if (ret == -1 && errno == EINTR) { ++ continue; ++ } else if (ret == -1) { ++ RTC_LOG(LS_ERROR) << "Failed to synchronize DMA buffer: " << g_strerror(errno); + break; +- case PW_REMOTE_STATE_UNCONNECTED: +- RTC_LOG(LS_INFO) << "PipeWire remote state: unconnected."; ++ } else { + break; ++ } + } + } + ++// static ++void BaseCapturerPipeWire::OnCoreError(void *data, ++ uint32_t id, ++ int seq, ++ int res, ++ const char *message) { ++ RTC_LOG(LS_ERROR) << "core error: " << message; ++} ++ + // static + void BaseCapturerPipeWire::OnStreamStateChanged(void* data, + pw_stream_state old_state, +@@ -73,76 +81,54 @@ void BaseCapturerPipeWire::OnStreamStateChanged(void* data, + case PW_STREAM_STATE_ERROR: + RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message; + break; +- case PW_STREAM_STATE_CONFIGURE: +- pw_stream_set_active(that->pw_stream_, true); +- break; +- case PW_STREAM_STATE_UNCONNECTED: +- case PW_STREAM_STATE_CONNECTING: +- case PW_STREAM_STATE_READY: + case PW_STREAM_STATE_PAUSED: + case PW_STREAM_STATE_STREAMING: ++ case PW_STREAM_STATE_UNCONNECTED: ++ case PW_STREAM_STATE_CONNECTING: + break; + } + } + + // static +-void BaseCapturerPipeWire::OnStreamFormatChanged(void* data, +- const struct spa_pod* format) { ++void BaseCapturerPipeWire::OnStreamParamChanged(void *data, uint32_t id, ++ const struct spa_pod *format) { + BaseCapturerPipeWire* that = static_cast(data); + RTC_DCHECK(that); + +- RTC_LOG(LS_INFO) << "PipeWire stream format changed."; ++ RTC_LOG(LS_INFO) << "PipeWire stream param changed."; + +- if (!format) { +- pw_stream_finish_format(that->pw_stream_, /*res=*/0, /*params=*/nullptr, +- /*n_params=*/0); ++ if (!format || id != SPA_PARAM_Format) { + return; + } + +- that->spa_video_format_ = new spa_video_info_raw(); +- spa_format_video_raw_parse(format, that->spa_video_format_, +- &that->pw_type_->format_video); ++ spa_format_video_raw_parse(format, &that->spa_video_format_); + +- auto width = that->spa_video_format_->size.width; +- auto height = that->spa_video_format_->size.height; ++ auto width = that->spa_video_format_.size.width; ++ auto height = that->spa_video_format_.size.height; + auto stride = SPA_ROUND_UP_N(width * kBytesPerPixel, 4); + auto size = height * stride; + ++ that->desktop_size_ = DesktopSize(width, height); ++ + uint8_t buffer[1024] = {}; + auto builder = spa_pod_builder{buffer, sizeof(buffer)}; + + // Setup buffers and meta header for new format. +- const struct spa_pod* params[2]; +- params[0] = reinterpret_cast(spa_pod_builder_object( +- &builder, +- // id to enumerate buffer requirements +- that->pw_core_type_->param.idBuffers, +- that->pw_core_type_->param_buffers.Buffers, +- // Size: specified as integer (i) and set to specified size +- ":", that->pw_core_type_->param_buffers.size, "i", size, +- // Stride: specified as integer (i) and set to specified stride +- ":", that->pw_core_type_->param_buffers.stride, "i", stride, +- // Buffers: specifies how many buffers we want to deal with, set as +- // integer (i) where preferred number is 8, then allowed number is defined +- // as range (r) from min and max values and it is undecided (u) to allow +- // negotiation +- ":", that->pw_core_type_->param_buffers.buffers, "iru", 8, +- SPA_POD_PROP_MIN_MAX(1, 32), +- // Align: memory alignment of the buffer, set as integer (i) to specified +- // value +- ":", that->pw_core_type_->param_buffers.align, "i", 16)); +- params[1] = reinterpret_cast(spa_pod_builder_object( +- &builder, +- // id to enumerate supported metadata +- that->pw_core_type_->param.idMeta, that->pw_core_type_->param_meta.Meta, +- // Type: specified as id or enum (I) +- ":", that->pw_core_type_->param_meta.type, "I", +- that->pw_core_type_->meta.Header, +- // Size: size of the metadata, specified as integer (i) +- ":", that->pw_core_type_->param_meta.size, "i", +- sizeof(struct spa_meta_header))); +- +- pw_stream_finish_format(that->pw_stream_, /*res=*/0, params, /*n_params=*/2); ++ const struct spa_pod* params[3]; ++ params[0] = reinterpret_cast(spa_pod_builder_add_object(&builder, ++ SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers, ++ SPA_PARAM_BUFFERS_size, SPA_POD_Int(size), ++ SPA_PARAM_BUFFERS_stride, SPA_POD_Int(stride), ++ SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 1, 32))); ++ params[1] = reinterpret_cast(spa_pod_builder_add_object(&builder, ++ SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, ++ SPA_PARAM_META_type, SPA_POD_Id(SPA_META_Header), ++ SPA_PARAM_META_size, SPA_POD_Int(sizeof(struct spa_meta_header)))); ++ params[2] = reinterpret_cast(spa_pod_builder_add_object(&builder, ++ SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, ++ SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop), ++ SPA_PARAM_META_size, SPA_POD_Int (sizeof(struct spa_meta_region)))); ++ pw_stream_update_params(that->pw_stream_, params, 3); + } + + // static +@@ -150,15 +136,25 @@ void BaseCapturerPipeWire::OnStreamProcess(void* data) { + BaseCapturerPipeWire* that = static_cast(data); + RTC_DCHECK(that); + +- pw_buffer* buf = nullptr; ++ struct pw_buffer *next_buffer; ++ struct pw_buffer *buffer = nullptr; ++ ++ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); ++ while (next_buffer) { ++ buffer = next_buffer; ++ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); + +- if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) { ++ if (next_buffer) ++ pw_stream_queue_buffer (that->pw_stream_, buffer); ++ } ++ ++ if (!buffer) { + return; + } + +- that->HandleBuffer(buf); ++ that->HandleBuffer(buffer); + +- pw_stream_queue_buffer(that->pw_stream_, buf); ++ pw_stream_queue_buffer(that->pw_stream_, buffer); + } + + BaseCapturerPipeWire::BaseCapturerPipeWire(CaptureSourceType source_type) +@@ -169,38 +165,22 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() { + pw_thread_loop_stop(pw_main_loop_); + } + +- if (pw_type_) { +- delete pw_type_; +- } +- +- if (spa_video_format_) { +- delete spa_video_format_; +- } +- + if (pw_stream_) { + pw_stream_destroy(pw_stream_); + } + +- if (pw_remote_) { +- pw_remote_destroy(pw_remote_); ++ if (pw_core_) { ++ pw_core_disconnect(pw_core_); + } + +- if (pw_core_) { +- pw_core_destroy(pw_core_); ++ if (pw_context_) { ++ pw_context_destroy(pw_context_); + } + + if (pw_main_loop_) { + pw_thread_loop_destroy(pw_main_loop_); + } + +- if (pw_loop_) { +- pw_loop_destroy(pw_loop_); +- } +- +- if (current_frame_) { +- free(current_frame_); +- } +- + if (start_request_signal_id_) { + g_dbus_connection_signal_unsubscribe(connection_, start_request_signal_id_); + } +@@ -250,27 +230,35 @@ void BaseCapturerPipeWire::InitPortal() { + void BaseCapturerPipeWire::InitPipeWire() { + pw_init(/*argc=*/nullptr, /*argc=*/nullptr); + +- pw_loop_ = pw_loop_new(/*properties=*/nullptr); +- pw_main_loop_ = pw_thread_loop_new(pw_loop_, "pipewire-main-loop"); +- +- pw_core_ = pw_core_new(pw_loop_, /*properties=*/nullptr); +- pw_core_type_ = pw_core_get_type(pw_core_); +- pw_remote_ = pw_remote_new(pw_core_, nullptr, /*user_data_size=*/0); ++ pw_main_loop_ = pw_thread_loop_new("pipewire-main-loop", nullptr); ++ pw_context_ = pw_context_new(pw_thread_loop_get_loop(pw_main_loop_), nullptr, 0); ++ if (!pw_context_) { ++ RTC_LOG(LS_ERROR) << "Failed to create PipeWire context"; ++ return; ++ } + +- InitPipeWireTypes(); ++ pw_core_ = pw_context_connect(pw_context_, nullptr, 0); ++ if (!pw_core_) { ++ RTC_LOG(LS_ERROR) << "Failed to connect PipeWire context"; ++ return; ++ } + + // Initialize event handlers, remote end and stream-related. +- pw_remote_events_.version = PW_VERSION_REMOTE_EVENTS; +- pw_remote_events_.state_changed = &OnStateChanged; ++ pw_core_events_.version = PW_VERSION_CORE_EVENTS; ++ pw_core_events_.error = &OnCoreError; + + pw_stream_events_.version = PW_VERSION_STREAM_EVENTS; + pw_stream_events_.state_changed = &OnStreamStateChanged; +- pw_stream_events_.format_changed = &OnStreamFormatChanged; ++ pw_stream_events_.param_changed = &OnStreamParamChanged; + pw_stream_events_.process = &OnStreamProcess; + +- pw_remote_add_listener(pw_remote_, &spa_remote_listener_, &pw_remote_events_, +- this); +- pw_remote_connect_fd(pw_remote_, pw_fd_); ++ pw_core_add_listener(pw_core_, &spa_core_listener_, &pw_core_events_, this); ++ ++ pw_stream_ = CreateReceivingStream(); ++ if (!pw_stream_) { ++ RTC_LOG(LS_ERROR) << "Failed to create PipeWire stream"; ++ return; ++ } + + if (pw_thread_loop_start(pw_main_loop_) < 0) { + RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop"; +@@ -278,81 +266,132 @@ void BaseCapturerPipeWire::InitPipeWire() { + } + } + +-void BaseCapturerPipeWire::InitPipeWireTypes() { +- spa_type_map* map = pw_core_type_->map; +- pw_type_ = new PipeWireType(); +- +- spa_type_media_type_map(map, &pw_type_->media_type); +- spa_type_media_subtype_map(map, &pw_type_->media_subtype); +- spa_type_format_video_map(map, &pw_type_->format_video); +- spa_type_video_format_map(map, &pw_type_->video_format); +-} +- +-void BaseCapturerPipeWire::CreateReceivingStream() { ++pw_stream* BaseCapturerPipeWire::CreateReceivingStream() { + spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1}; +- spa_rectangle pwScreenBounds = +- spa_rectangle{static_cast(desktop_size_.width()), +- static_cast(desktop_size_.height())}; ++ spa_rectangle pwMaxScreenBounds = spa_rectangle{INT32_MAX, INT32_MAX}; + +- spa_fraction pwFrameRateMin = spa_fraction{0, 1}; +- spa_fraction pwFrameRateMax = spa_fraction{60, 1}; ++ auto stream = pw_stream_new(pw_core_, "webrtc-pipewire-stream", nullptr); + +- pw_properties* reuseProps = pw_properties_new("pipewire.client.reuse", "1", +- /*end of varargs*/ nullptr); +- pw_stream_ = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps); ++ if (!stream) { ++ RTC_LOG(LS_ERROR) << "Could not create receiving stream."; ++ return nullptr; ++ } + + uint8_t buffer[1024] = {}; +- const spa_pod* params[1]; +- spa_pod_builder builder = spa_pod_builder{buffer, sizeof(buffer)}; +- params[0] = reinterpret_cast(spa_pod_builder_object( +- &builder, +- // id to enumerate formats +- pw_core_type_->param.idEnumFormat, pw_core_type_->spa_format, "I", +- pw_type_->media_type.video, "I", pw_type_->media_subtype.raw, +- // Video format: specified as id or enum (I), preferred format is BGRx, +- // then allowed formats are enumerated (e) and the format is undecided (u) +- // to allow negotiation +- ":", pw_type_->format_video.format, "Ieu", pw_type_->video_format.BGRx, +- SPA_POD_PROP_ENUM(2, pw_type_->video_format.RGBx, +- pw_type_->video_format.BGRx), +- // Video size: specified as rectangle (R), preferred size is specified as +- // first parameter, then allowed size is defined as range (r) from min and +- // max values and the format is undecided (u) to allow negotiation +- ":", pw_type_->format_video.size, "Rru", &pwScreenBounds, 2, +- &pwMinScreenBounds, &pwScreenBounds, +- // Frame rate: specified as fraction (F) and set to minimum frame rate +- // value +- ":", pw_type_->format_video.framerate, "F", &pwFrameRateMin, +- // Max frame rate: specified as fraction (F), preferred frame rate is set +- // to maximum value, then allowed frame rate is defined as range (r) from +- // min and max values and it is undecided (u) to allow negotiation +- ":", pw_type_->format_video.max_framerate, "Fru", &pwFrameRateMax, 2, +- &pwFrameRateMin, &pwFrameRateMax)); +- +- pw_stream_add_listener(pw_stream_, &spa_stream_listener_, &pw_stream_events_, +- this); ++ const spa_pod* params[2]; ++ spa_pod_builder builder = SPA_POD_BUILDER_INIT(buffer, sizeof (buffer)); ++ ++ params[0] = reinterpret_cast(spa_pod_builder_add_object(&builder, ++ SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, ++ SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_video), ++ SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), ++ SPA_FORMAT_VIDEO_format, SPA_POD_CHOICE_ENUM_Id(5, SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_RGBx, SPA_VIDEO_FORMAT_RGBA, ++ SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_BGRA), ++ SPA_FORMAT_VIDEO_size, SPA_POD_CHOICE_RANGE_Rectangle(&pwMinScreenBounds, ++ &pwMinScreenBounds, ++ &pwMaxScreenBounds), ++ 0)); ++ pw_stream_add_listener(stream, &spa_stream_listener_, &pw_stream_events_, this); ++ + pw_stream_flags flags = static_cast( +- PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE | +- PW_STREAM_FLAG_MAP_BUFFERS); +- if (pw_stream_connect(pw_stream_, PW_DIRECTION_INPUT, /*port_path=*/nullptr, +- flags, params, +- /*n_params=*/1) != 0) { ++ PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE); ++ ++ if (pw_stream_connect(stream, PW_DIRECTION_INPUT, pw_stream_node_id_, PW_STREAM_FLAG_AUTOCONNECT, params, 1) != 0) { + RTC_LOG(LS_ERROR) << "Could not connect receiving stream."; + portal_init_failed_ = true; +- return; + } ++ ++ return stream; + } + + void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) { ++ struct spa_meta_region* video_crop; + spa_buffer* spaBuffer = buffer->buffer; +- void* src = nullptr; ++ uint8_t *map = nullptr; ++ uint8_t* src = nullptr; ++ uint8_t* dst = nullptr; ++ ++ if (spaBuffer->datas[0].chunk->size == 0) { ++ map = nullptr; ++ src = nullptr; ++ } else if (spaBuffer->datas[0].type == SPA_DATA_MemFd) { ++ map = static_cast(mmap( ++ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset, ++ PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0)); ++ ++ if (map == MAP_FAILED) { ++ RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno); ++ return; ++ } ++ ++ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t); ++ } else if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { ++ int fd; ++ fd = spaBuffer->datas[0].fd; + +- if (!(src = spaBuffer->datas[0].data)) { ++ map = static_cast(mmap( ++ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset, ++ PROT_READ, MAP_PRIVATE, fd, 0)); ++ ++ if (map == MAP_FAILED) { ++ RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno); ++ return; ++ } ++ ++ SyncDmaBuf(fd, DMA_BUF_SYNC_START); ++ ++ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t); ++ } else if (spaBuffer->datas[0].type == SPA_DATA_MemPtr) { ++ map = nullptr; ++ src = static_cast(spaBuffer->datas[0].data); ++ } else { + return; + } + +- uint32_t maxSize = spaBuffer->datas[0].maxsize; +- int32_t srcStride = spaBuffer->datas[0].chunk->stride; ++ if (!src) { ++ return; ++ } ++ ++ DesktopSize prev_crop_size = DesktopSize(0, 0); ++ if (video_crop_size_initialized_) { ++ prev_crop_size = video_crop_size_; ++ } ++ ++ if ((video_crop = static_cast( ++ spa_buffer_find_meta_data(spaBuffer, SPA_META_VideoCrop, sizeof(*video_crop))))) { ++ RTC_DCHECK(video_crop->region.size.width <= desktop_size_.width() && ++ video_crop->region.size.height <= desktop_size_.height()); ++ if ((video_crop->region.size.width != desktop_size_.width() || ++ video_crop->region.size.height != desktop_size_.height()) && video_crop->region.size.width && video_crop->region.size.height) { ++ video_crop_size_ = DesktopSize(video_crop->region.size.width, video_crop->region.size.height); ++ video_crop_size_initialized_ = true; ++ } else { ++ video_crop_size_initialized_ = false; ++ } ++ } else { ++ video_crop_size_initialized_ = false; ++ } ++ ++ size_t frame_size; ++ if (video_crop_size_initialized_) { ++ frame_size = ++ video_crop_size_.width() * video_crop_size_.height() * kBytesPerPixel; ++ } else { ++ frame_size = ++ desktop_size_.width() * desktop_size_.height() * kBytesPerPixel; ++ } ++ ++ if (!current_frame_ || ++ (video_crop_size_initialized_ && !video_crop_size_.equals(prev_crop_size))) { ++ current_frame_ = std::make_unique(frame_size); ++ } ++ RTC_DCHECK(current_frame_ != nullptr); ++ ++ const int32_t dstStride = video_crop_size_initialized_ ++ ? video_crop_size_.width() * kBytesPerPixel ++ : desktop_size_.width() * kBytesPerPixel; ++ const int32_t srcStride = spaBuffer->datas[0].chunk->stride; ++ + if (srcStride != (desktop_size_.width() * kBytesPerPixel)) { + RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: " + << srcStride +@@ -361,21 +400,40 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) { + return; + } + +- if (!current_frame_) { +- current_frame_ = static_cast(malloc(maxSize)); ++ dst = current_frame_.get(); ++ ++ // Adjust source content based on crop video position ++ if (video_crop_size_initialized_ && ++ (video_crop->region.position.y + video_crop_size_.height() <= desktop_size_.height())) { ++ for (int i = 0; i < video_crop->region.position.y; ++i) { ++ src += srcStride; ++ } ++ } ++ const int xOffset = ++ video_crop_size_initialized_ && (video_crop->region.position.x + video_crop_size_.width() <= ++ desktop_size_.width()) ++ ? video_crop->region.position.x * kBytesPerPixel ++ : 0; ++ const int height = video_crop_size_initialized_ ? video_crop_size_.height() : desktop_size_.height(); ++ for (int i = 0; i < height; ++i) { ++ // Adjust source content based on crop video position if needed ++ src += xOffset; ++ std::memcpy(dst, src, dstStride); ++ // If both sides decided to go with the RGBx format we need to convert it to ++ // BGRx to match color format expected by WebRTC. ++ if (spa_video_format_.format == SPA_VIDEO_FORMAT_RGBx || ++ spa_video_format_.format == SPA_VIDEO_FORMAT_RGBA) { ++ ConvertRGBxToBGRx(dst, dstStride); ++ } ++ src += srcStride - xOffset; ++ dst += dstStride; + } +- RTC_DCHECK(current_frame_ != nullptr); + +- // If both sides decided to go with the RGBx format we need to convert it to +- // BGRx to match color format expected by WebRTC. +- if (spa_video_format_->format == pw_type_->video_format.RGBx) { +- uint8_t* tempFrame = static_cast(malloc(maxSize)); +- std::memcpy(tempFrame, src, maxSize); +- ConvertRGBxToBGRx(tempFrame, maxSize); +- std::memcpy(current_frame_, tempFrame, maxSize); +- free(tempFrame); +- } else { +- std::memcpy(current_frame_, src, maxSize); ++ if (map) { ++ if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { ++ SyncDmaBuf(spaBuffer->datas[0].fd, DMA_BUF_SYNC_END); ++ } ++ munmap(map, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset); + } + } + +@@ -725,10 +783,7 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal( + g_variant_get(variant, "(u@a{sv})", &stream_id, &options); + RTC_DCHECK(options != nullptr); + +- g_variant_lookup(options, "size", "(ii)", &width, &height); +- +- that->desktop_size_.set(width, height); +- ++ that->pw_stream_node_id_ = stream_id; + g_variant_unref(options); + g_variant_unref(variant); + } +@@ -813,10 +868,15 @@ void BaseCapturerPipeWire::CaptureFrame() { + return; + } + +- std::unique_ptr result(new BasicDesktopFrame(desktop_size_)); ++ DesktopSize frame_size = desktop_size_; ++ if (video_crop_size_initialized_) { ++ frame_size = video_crop_size_; ++ } ++ ++ std::unique_ptr result(new BasicDesktopFrame(frame_size)); + result->CopyPixelsFrom( +- current_frame_, (desktop_size_.width() * kBytesPerPixel), +- DesktopRect::MakeWH(desktop_size_.width(), desktop_size_.height())); ++ current_frame_.get(), (frame_size.width() * kBytesPerPixel), ++ DesktopRect::MakeWH(frame_size.width(), frame_size.height())); + if (!result) { + callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr); + return; +@@ -837,4 +897,22 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) { + return true; + } + ++// static ++std::unique_ptr ++BaseCapturerPipeWire::CreateRawScreenCapturer( ++ const DesktopCaptureOptions& options) { ++ std::unique_ptr capturer = ++ std::make_unique(BaseCapturerPipeWire::CaptureSourceType::kAny); ++ return std::move(capturer);} ++ ++// static ++std::unique_ptr ++BaseCapturerPipeWire::CreateRawWindowCapturer( ++ const DesktopCaptureOptions& options) { ++ ++ std::unique_ptr capturer = ++ std::make_unique(BaseCapturerPipeWire::CaptureSourceType::kAny); ++ return std::move(capturer); ++} ++ + } // namespace webrtc +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +index 56b101acbaa6..de54157d1a2a 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +@@ -22,17 +22,13 @@ + + namespace webrtc { + +-class PipeWireType { +- public: +- spa_type_media_type media_type; +- spa_type_media_subtype media_subtype; +- spa_type_format_video format_video; +- spa_type_video_format video_format; +-}; +- + class BaseCapturerPipeWire : public DesktopCapturer { + public: +- enum CaptureSourceType { Screen = 1, Window }; ++ enum CaptureSourceType : uint32_t { ++ kScreen = 0b01, ++ kWindow = 0b10, ++ kAny = 0b11 ++ }; + + explicit BaseCapturerPipeWire(CaptureSourceType source_type); + ~BaseCapturerPipeWire() override; +@@ -43,28 +39,32 @@ class BaseCapturerPipeWire : public DesktopCapturer { + bool GetSourceList(SourceList* sources) override; + bool SelectSource(SourceId id) override; + ++ static std::unique_ptr CreateRawScreenCapturer( ++ const DesktopCaptureOptions& options); ++ ++ static std::unique_ptr CreateRawWindowCapturer( ++ const DesktopCaptureOptions& options); ++ + private: + // PipeWire types --> ++ pw_context* pw_context_ = nullptr; + pw_core* pw_core_ = nullptr; +- pw_type* pw_core_type_ = nullptr; + pw_stream* pw_stream_ = nullptr; +- pw_remote* pw_remote_ = nullptr; +- pw_loop* pw_loop_ = nullptr; + pw_thread_loop* pw_main_loop_ = nullptr; +- PipeWireType* pw_type_ = nullptr; + ++ spa_hook spa_core_listener_ = {}; + spa_hook spa_stream_listener_ = {}; +- spa_hook spa_remote_listener_ = {}; + ++ pw_core_events pw_core_events_ = {}; + pw_stream_events pw_stream_events_ = {}; +- pw_remote_events pw_remote_events_ = {}; + +- spa_video_info_raw* spa_video_format_ = nullptr; ++ struct spa_video_info_raw spa_video_format_; + ++ guint32 pw_stream_node_id_ = 0; + gint32 pw_fd_ = -1; + + CaptureSourceType capture_source_type_ = +- BaseCapturerPipeWire::CaptureSourceType::Screen; ++ BaseCapturerPipeWire::CaptureSourceType::kAny; + + // <-- end of PipeWire types + +@@ -78,33 +78,37 @@ class BaseCapturerPipeWire : public DesktopCapturer { + guint sources_request_signal_id_ = 0; + guint start_request_signal_id_ = 0; + ++ bool video_crop_size_initialized_ = false; ++ DesktopSize video_crop_size_;; + DesktopSize desktop_size_ = {}; + DesktopCaptureOptions options_ = {}; + +- uint8_t* current_frame_ = nullptr; ++ std::unique_ptr current_frame_; + Callback* callback_ = nullptr; + + bool portal_init_failed_ = false; + + void InitPortal(); + void InitPipeWire(); +- void InitPipeWireTypes(); + +- void CreateReceivingStream(); ++ pw_stream* CreateReceivingStream(); + void HandleBuffer(pw_buffer* buffer); + + void ConvertRGBxToBGRx(uint8_t* frame, uint32_t size); + +- static void OnStateChanged(void* data, +- pw_remote_state old_state, +- pw_remote_state state, +- const char* error); ++ static void SyncDmaBuf(int fd, uint64_t start_or_end); ++ static void OnCoreError(void *data, ++ uint32_t id, ++ int seq, ++ int res, ++ const char *message); ++ static void OnStreamParamChanged(void *data, ++ uint32_t id, ++ const struct spa_pod *format); + static void OnStreamStateChanged(void* data, + pw_stream_state old_state, + pw_stream_state state, + const char* error_message); +- +- static void OnStreamFormatChanged(void* data, const struct spa_pod* format); + static void OnStreamProcess(void* data); + static void OnNewBuffer(void* data, uint32_t id); + +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc +index 26956fc67dc8..3813d697bb38 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc +@@ -15,7 +15,7 @@ + namespace webrtc { + + ScreenCapturerPipeWire::ScreenCapturerPipeWire() +- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Screen) {} ++ : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kScreen) {} + ScreenCapturerPipeWire::~ScreenCapturerPipeWire() {} + + // static +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc +index 35436475cb4d..c43a1f1a0c4e 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc +@@ -15,7 +15,7 @@ + namespace webrtc { + + WindowCapturerPipeWire::WindowCapturerPipeWire() +- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Window) {} ++ : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kWindow) {} + WindowCapturerPipeWire::~WindowCapturerPipeWire() {} + + // static +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc +index cf8a9dd0e0db..d27fab8d28d9 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc +@@ -26,7 +26,7 @@ std::unique_ptr DesktopCapturer::CreateRawScreenCapturer( + const DesktopCaptureOptions& options) { + #if defined(WEBRTC_USE_PIPEWIRE) + if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { +- return ScreenCapturerPipeWire::CreateRawScreenCapturer(options); ++ return BaseCapturerPipeWire::CreateRawScreenCapturer(options); + } + #endif // defined(WEBRTC_USE_PIPEWIRE) + +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc +index 82359e50c2db..bb9724cf7cc2 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc +@@ -26,7 +26,7 @@ std::unique_ptr DesktopCapturer::CreateRawWindowCapturer( + const DesktopCaptureOptions& options) { + #if defined(WEBRTC_USE_PIPEWIRE) + if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { +- return WindowCapturerPipeWire::CreateRawWindowCapturer(options); ++ return BaseCapturerPipeWire::CreateRawWindowCapturer(options); + } + #endif // defined(WEBRTC_USE_PIPEWIRE) + diff --git a/SOURCES/firefox-pipewire.patch b/SOURCES/firefox-pipewire.patch new file mode 100644 index 0000000..7233a73 --- /dev/null +++ b/SOURCES/firefox-pipewire.patch @@ -0,0 +1,63 @@ +diff -up firefox-68.0/config/system-headers.mozbuild.firefox-pipewire firefox-68.0/config/system-headers.mozbuild +--- firefox-68.0/config/system-headers.mozbuild.firefox-pipewire 2019-07-01 22:30:26.000000000 +0200 ++++ firefox-68.0/config/system-headers.mozbuild 2019-07-08 15:26:15.397161627 +0200 +@@ -314,6 +314,7 @@ system_headers = [ + 'Gestalt.h', + 'getopt.h', + 'gio/gio.h', ++ 'gio/gunixfdlist.h', + 'glibconfig.h', + 'glib.h', + 'glib-object.h', +@@ -607,6 +608,7 @@ system_headers = [ + 'Pgenerr.h', + 'PGenErr.h', + 'Ph.h', ++ 'pipewire/pipewire.h', + 'pixman.h', + 'pk11func.h', + 'pk11pqg.h', +diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build.firefox-pipewire firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build +--- firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build.firefox-pipewire 2019-07-01 22:30:33.000000000 +0200 ++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build 2019-07-08 15:26:15.397161627 +0200 +@@ -194,6 +194,28 @@ if CONFIG["OS_TARGET"] == "Linux": + "/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc" + ] + ++# PipeWire specific files ++if CONFIG["OS_TARGET"] == "Linux": ++ ++ DEFINES["WEBRTC_USE_PIPEWIRE"] = "1" ++ ++ OS_LIBS += [ ++ "rt", ++ "pipewire-0.2", ++ "glib-2.0", ++ "gio-2.0", ++ "gobject-2.0" ++ ] ++ ++ CXXFLAGS += CONFIG['TK_CFLAGS'] ++ ++ UNIFIED_SOURCES += [ ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc", ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc", ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc" ++ ] ++ ++ + if CONFIG["OS_TARGET"] == "NetBSD": + + DEFINES["USE_X11"] = "1" +diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h.firefox-pipewire firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h +--- firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h.firefox-pipewire 2019-07-08 16:42:13.936254926 +0200 ++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h 2019-07-08 16:42:17.509264974 +0200 +@@ -141,7 +141,7 @@ class DesktopCaptureOptions { + bool disable_effects_ = true; + bool detect_updated_region_ = false; + #if defined(WEBRTC_USE_PIPEWIRE) +- bool allow_pipewire_ = false; ++ bool allow_pipewire_ = true; + #endif + }; + diff --git a/SOURCES/firefox-redhat-default-prefs.js b/SOURCES/firefox-redhat-default-prefs.js new file mode 100644 index 0000000..9ead3a2 --- /dev/null +++ b/SOURCES/firefox-redhat-default-prefs.js @@ -0,0 +1,35 @@ +pref("app.update.auto", false); +pref("app.update.enabled", false); +pref("app.update.autoInstallEnabled", false); +pref("general.smoothScroll", true); +pref("intl.locale.matchOS", true); +pref("toolkit.storage.synchronous", 0); +pref("toolkit.networkmanager.disable", false); +pref("offline.autoDetect", true); +pref("browser.backspace_action", 2); +pref("browser.display.use_system_colors", true); +pref("browser.download.folderList", 1); +pref("browser.link.open_external", 3); +pref("browser.shell.checkDefaultBrowser", false); +pref("network.manage-offline-status", true); +pref("extensions.shownSelectionUI", true); +pref("ui.SpellCheckerUnderlineStyle", 1); +pref("startup.homepage_override_url", "http://www.redhat.com"); +pref("startup.homepage_welcome_url", "http://www.redhat.com"); +pref("browser.startup.homepage", "data:text/plain,browser.startup.homepage=file:///%PREFIX%/share/doc/HTML/index.html"); +pref("geo.wifi.uri", "https://location.services.mozilla.com/v1/geolocate?key=%MOZILLA_API_KEY%"); +pref("media.gmp-gmpopenh264.provider.enabled",false); +pref("media.gmp-gmpopenh264.autoupdate",false); +pref("media.gmp-gmpopenh264.enabled",false); +pref("media.gmp-gmpopenh264.enabled",false); +pref("plugins.notifyMissingFlash", false); +/* See https://bugzilla.redhat.com/show_bug.cgi?id=1226489 */ +pref("browser.display.use_system_colors", false); +pref("layers.use-image-offscreen-surfaces", false); +/* Allow sending credetials to all https:// sites */ +pref("network.negotiate-auth.trusted-uris", "https://"); +pref("security.use_sqldb", false); +/* Use OS settings for UI language */ +pref("intl.locale.requested", ""); +/* See https://bugzilla.redhat.com/show_bug.cgi?id=1672424 */ +pref("storage.nfs_filesystem", true); \ No newline at end of file diff --git a/SOURCES/firefox-rhel6-hugepage.patch b/SOURCES/firefox-rhel6-hugepage.patch new file mode 100644 index 0000000..4855721 --- /dev/null +++ b/SOURCES/firefox-rhel6-hugepage.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.1.0/xpcom/threads/nsThread.cpp.old firefox-68.1.0/xpcom/threads/nsThread.cpp +--- firefox-68.1.0/xpcom/threads/nsThread.cpp.old 2019-09-20 12:17:35.481661390 +0200 ++++ firefox-68.1.0/xpcom/threads/nsThread.cpp 2019-09-20 12:19:14.269180516 +0200 +@@ -556,7 +556,8 @@ void nsThread::InitCommon() { + // kernel report them as separate regions, even when they are adjacent to + // heap memory. This allows us to accurately track the actual memory + // consumption of our allocated stacks. +- madvise(mStackBase, stackSize, MADV_NOHUGEPAGE); ++ // not supported on RHEL6 ++ // madvise(mStackBase, stackSize, MADV_NOHUGEPAGE); + + pthread_attr_destroy(&attr); + #elif defined(XP_WIN) diff --git a/SOURCES/firefox-rhel6-nss-tls1.3.patch b/SOURCES/firefox-rhel6-nss-tls1.3.patch new file mode 100644 index 0000000..2b6e8f7 --- /dev/null +++ b/SOURCES/firefox-rhel6-nss-tls1.3.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp.old firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp +--- firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp.old 2019-10-24 14:20:21.227037984 +0200 ++++ firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp 2019-10-24 14:45:52.769506967 +0200 +@@ -996,6 +996,9 @@ void nsNSSComponent::FillTLSVersionRange + return; + } + ++ // Enable TLS 1.3 as our NSS supports it. ++ supported.max = 0x304; ++ + // Clip the defaults by what NSS actually supports to enable + // working with a system NSS with different ranges. + rangeOut.min = std::max(rangeOut.min, supported.min); diff --git a/SOURCES/firefox-symbolic.svg b/SOURCES/firefox-symbolic.svg new file mode 100644 index 0000000..7a2c73e --- /dev/null +++ b/SOURCES/firefox-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + diff --git a/SOURCES/firefox.1 b/SOURCES/firefox.1 new file mode 100644 index 0000000..4311322 --- /dev/null +++ b/SOURCES/firefox.1 @@ -0,0 +1,141 @@ +.TH FIREFOX 1 "November 30, 2017" firefox "Linux User's Manual" +.SH NAME +firefox \- a Web browser for X11 derived from the Mozilla browser + +.SH SYNOPSIS +.B firefox +[\fIOPTIONS\fR ...] [\fIURL\fR] + +.B firefox-bin +[\fIOPTIONS\fR] [\fIURL\fR] + +.SH DESCRIPTION +\fBMozilla Firefox\fR is an open-source web browser, designed for +standards compliance, performance and portability. + +.SH USAGE +\fBfirefox\fR is a simple shell script that will set up the +environment for the actual executable, \fBfirefox-bin\fR. + +.SH OPTIONS +A summary of the options supported by \fBfirefox\fR is included below. + +.SS "X11 options" +.TP +.BI \-\-display= DISPLAY +X display to use +.TP +.B \--sync +Make X calls synchronous +.TP +.B \-\-g-fatal-warnings +Make all warnings fatal + +.SS "Firefox options" +.TP +.B \-h, \-help +Show summary of options. +.TP +.B \-v, \-version +Print Firefox version. +.TP +\fB\-P\fR \fIprofile\fR +Start with \fIprofile\fR. +.TP +\fB\-\-profile\fR \fIpath\fR +Start with profile at \fIpath\fR. +.TP +\fB\-\-migration\fR +Start with migration wizard. +.TP +.B \-\-ProfileManager +Start with ProfileManager. +.TP +\fB\-\-no\-remote\fR +Do not accept or send remote commands; implies \fB--new-instance\fR. +.TP +\fB\-\-new\-instance\fR +Open new instance, not a new window in running instance. +.TP +\fB\-\-UILocale\fR \fIlocale\fR +Start with \fIlocale\fR resources as UI Locale. +.TP +\fB\-\-save\-mode\fR +Disables extensions and themes for this session. +.TP +\fB\-\-headless\fR +Run without a GUI. +.TP +\fB\-\-marionette\fR +Enable remote control server. +.TP +\fB\-\-browser\fR +Open a browser window. +.TP +\fB\-\-new-window\fR \fIurl\fR +Open \fIurl\fR in a new window. +.TP +\fB\-\-new-tab\fR \fIurl\fR +Open \fIurl\fR in a new tab. +.TP +\fB\-\-private-window\fR \fIurl\fR +Open \fIurl\fR in a new private window. +.TP +\fB\-\-preferences\fR +Open Preferences dialog. +.TP +\fB\-\-screenshot\fR [\fIpath\fR] +Save screenshot to \fIpath\fR or in working directory. +.TP +\fB\-\-window-size\fR \fIwidth\fR[,\fIheight\fR] +Width and optionally height of screenshot. +.TP +\fB\-\-search\fR \fIterm\fR +Search \fIterm\fR with your default search engine. +.TP + + +\fB\-\-jsconsole\fR +Open the Browser Console. +.TP +\fB\-\-jsdebugger\fR +Open the Browser Toolbox. +.TP +\fB\-\-wait-for-jsdebugger\fR +Spin event loop until JS debugger connects. Enables debugging (some) application startup code paths. Only has an effect when \fI--jsdebugger\fR is also supplied. +.TP +\fB\-\-devtools\fR +Open DevTools on initial load. +.TP +\fB\-\-start-debugger-server\fR [ws:][\fIport\fR|\fIpath\fR] +Start the debugger server on a TCP port or Unix domain socket path. Defaults to TCP port 6000. Use WebSocket protocol if ws: prefix is specified. +.TP +\fB\-\-recording\fR \fIfile\fR +Record drawing for a given URL. +.TP +\fB\-\-recording-output\fR \fIfile\fR +Specify destination file for a drawing recording. +.TP +\fB\-\-setDefaultBrowser\fR +Set this app as the default browser. + +.SH FILES +\fI/usr/bin/firefox\fR - shell script wrapping +\fBfirefox\fR +.br +\fI/usr/lib64/firefox/firefox-bin\fR - \fBfirefox\fR +executable + +.SH VERSION +57.0 + +.SH BUGS +To report a bug, please visit \fIhttp://bugzilla.mozilla.org/\fR + +.SH AUTHORS +.TP +.B The Mozilla Organization +.I http://www.mozilla.org/about.html +.TP +.B Tobias Girstmair +.I https://gir.st/ diff --git a/SOURCES/firefox.desktop b/SOURCES/firefox.desktop new file mode 100644 index 0000000..77d8a6e --- /dev/null +++ b/SOURCES/firefox.desktop @@ -0,0 +1,272 @@ +[Desktop Entry] +Version=1.0 +Name=Firefox +GenericName=Web Browser +GenericName[ca]=Navegador web +GenericName[cs]=Webový prohlížeč +GenericName[es]=Navegador web +GenericName[fa]=مرورگر اینترنتی +GenericName[fi]=WWW-selain +GenericName[fr]=Navigateur Web +GenericName[hu]=Webböngésző +GenericName[it]=Browser Web +GenericName[ja]=ウェブ・ブラウザ +GenericName[ko]=웹 브라우저 +GenericName[nb]=Nettleser +GenericName[nl]=Webbrowser +GenericName[nn]=Nettlesar +GenericName[no]=Nettleser +GenericName[pl]=Przeglądarka WWW +GenericName[pt]=Navegador Web +GenericName[pt_BR]=Navegador Web +GenericName[sk]=Internetový prehliadač +GenericName[sv]=Webbläsare +Comment=Browse the Web +Comment[ca]=Navegueu per el web +Comment[cs]=Prohlížení stránek World Wide Webu +Comment[de]=Im Internet surfen +Comment[es]=Navegue por la web +Comment[fa]=صفحات شبکه جهانی اینترنت را مرور نمایید +Comment[fi]=Selaa Internetin WWW-sivuja +Comment[fr]=Navigue sur Internet +Comment[hu]=A világháló böngészése +Comment[it]=Esplora il web +Comment[ja]=ウェブを閲覧します +Comment[ko]=웹을 돌아 다닙니다 +Comment[nb]=Surf på nettet +Comment[nl]=Verken het internet +Comment[nn]=Surf på nettet +Comment[no]=Surf på nettet +Comment[pl]=Przeglądanie stron WWW +Comment[pt]=Navegue na Internet +Comment[pt_BR]=Navegue na Internet +Comment[sk]=Prehliadanie internetu +Comment[sv]=Surfa på webben +Exec=firefox %u +Icon=firefox +Terminal=false +Type=Application +MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https; +StartupNotify=true +Categories=Network;WebBrowser; +Keywords=web;browser;internet; +Actions=new-window;new-private-window; + +[Desktop Action new-window] +Name=Open a New Window +Name[ach]=Dirica manyen +Name[af]=Nuwe venster +Name[an]=Nueva finestra +Name[ar]=نافذة جديدة +Name[as]=নতুন উইন্ডো +Name[ast]=Ventana nueva +Name[az]=Yeni Pəncərə +Name[be]=Новае акно +Name[bg]=Нов прозорец +Name[bn-BD]=নতুন উইন্ডো (N) +Name[bn-IN]=নতুন উইন্ডো +Name[br]=Prenestr nevez +Name[brx]=गोदान उइन्ड'(N) +Name[bs]=Novi prozor +Name[ca]=Finestra nova +Name[cak]=K'ak'a' tzuwäch +Name[cs]=Nové okno +Name[cy]=Ffenestr Newydd +Name[da]=Nyt vindue +Name[de]=Neues Fenster +Name[dsb]=Nowe wokno +Name[el]=Νέο παράθυρο +Name[en-GB]=New Window +Name[en-US]=New Window +Name[en-ZA]=New Window +Name[eo]=Nova fenestro +Name[es-AR]=Nueva ventana +Name[es-CL]=Nueva ventana +Name[es-ES]=Nueva ventana +Name[es-MX]=Nueva ventana +Name[et]=Uus aken +Name[eu]=Leiho berria +Name[fa]=پنجره جدید‌ +Name[ff]=Henorde Hesere +Name[fi]=Uusi ikkuna +Name[fr]=Nouvelle fenêtre +Name[fy-NL]=Nij finster +Name[ga-IE]=Fuinneog Nua +Name[gd]=Uinneag ùr +Name[gl]=Nova xanela +Name[gn]=Ovetã pyahu +Name[gu-IN]=નવી વિન્ડો +Name[he]=חלון חדש +Name[hi-IN]=नया विंडो +Name[hr]=Novi prozor +Name[hsb]=Nowe wokno +Name[hu]=Új ablak +Name[hy-AM]=Նոր Պատուհան +Name[id]=Jendela Baru +Name[is]=Nýr gluggi +Name[it]=Nuova finestra +Name[ja]=新しいウィンドウ +Name[ja-JP-mac]=新規ウインドウ +Name[ka]=ახალი ფანჯარა +Name[kk]=Жаңа терезе +Name[km]=បង្អួច​​​ថ្មី +Name[kn]=ಹೊಸ ಕಿಟಕಿ +Name[ko]=새 창 +Name[kok]=नवें जनेल +Name[ks]=نئئ وِنڈو +Name[lij]=Neuvo barcon +Name[lo]=ຫນ້າຕ່າງໃຫມ່ +Name[lt]=Naujas langas +Name[ltg]=Jauns lūgs +Name[lv]=Jauns logs +Name[mai]=नव विंडो +Name[mk]=Нов прозорец +Name[ml]=പുതിയ ജാലകം +Name[mr]=नवीन पटल +Name[ms]=Tetingkap Baru +Name[my]=ဝင်းဒိုးအသစ် +Name[nb-NO]=Nytt vindu +Name[ne-NP]=नयाँ सञ्झ्याल +Name[nl]=Nieuw venster +Name[nn-NO]=Nytt vindauge +Name[or]=ନୂତନ ୱିଣ୍ଡୋ +Name[pa-IN]=ਨਵੀਂ ਵਿੰਡੋ +Name[pl]=Nowe okno +Name[pt-BR]=Nova janela +Name[pt-PT]=Nova janela +Name[rm]=Nova fanestra +Name[ro]=Fereastră nouă +Name[ru]=Новое окно +Name[sat]=नावा विंडो (N) +Name[si]=නව කවුළුවක් +Name[sk]=Nové okno +Name[sl]=Novo okno +Name[son]=Zanfun taaga +Name[sq]=Dritare e Re +Name[sr]=Нови прозор +Name[sv-SE]=Nytt fönster +Name[ta]=புதிய சாளரம் +Name[te]=కొత్త విండో +Name[th]=หน้าต่างใหม่ +Name[tr]=Yeni pencere +Name[tsz]=Eraatarakua jimpani +Name[uk]=Нове вікно +Name[ur]=نیا دریچہ +Name[uz]=Yangi oyna +Name[vi]=Cửa sổ mới +Name[wo]=Palanteer bu bees +Name[xh]=Ifestile entsha +Name[zh-CN]=新建窗口 +Name[zh-TW]=開新視窗 + + +Exec=firefox %u + +[Desktop Action new-private-window] +Name=Open a New Private Window +Name[ach]=Dirica manyen me mung +Name[af]=Nuwe privaatvenster +Name[an]=Nueva finestra privada +Name[ar]=نافذة خاصة جديدة +Name[as]=নতুন ব্যক্তিগত উইন্ডো +Name[ast]=Ventana privada nueva +Name[az]=Yeni Məxfi Pəncərə +Name[be]=Новае акно адасаблення +Name[bg]=Нов прозорец за поверително сърфиране +Name[bn-BD]=নতুন ব্যক্তিগত উইন্ডো +Name[bn-IN]=নতুন ব্যক্তিগত উইন্ডো +Name[br]=Prenestr merdeiñ prevez nevez +Name[brx]=गोदान प्राइभेट उइन्ड' +Name[bs]=Novi privatni prozor +Name[ca]=Finestra privada nova +Name[cak]=K'ak'a' ichinan tzuwäch +Name[cs]=Nové anonymní okno +Name[cy]=Ffenestr Breifat Newydd +Name[da]=Nyt privat vindue +Name[de]=Neues privates Fenster +Name[dsb]=Nowe priwatne wokno +Name[el]=Νέο παράθυρο ιδιωτικής περιήγησης +Name[en-GB]=New Private Window +Name[en-US]=New Private Window +Name[en-ZA]=New Private Window +Name[eo]=Nova privata fenestro +Name[es-AR]=Nueva ventana privada +Name[es-CL]=Nueva ventana privada +Name[es-ES]=Nueva ventana privada +Name[es-MX]=Nueva ventana privada +Name[et]=Uus privaatne aken +Name[eu]=Leiho pribatu berria +Name[fa]=پنجره ناشناس جدید +Name[ff]=Henorde Suturo Hesere +Name[fi]=Uusi yksityinen ikkuna +Name[fr]=Nouvelle fenêtre de navigation privée +Name[fy-NL]=Nij priveefinster +Name[ga-IE]=Fuinneog Nua Phríobháideach +Name[gd]=Uinneag phrìobhaideach ùr +Name[gl]=Nova xanela privada +Name[gn]=Ovetã ñemi pyahu +Name[gu-IN]=નવી ખાનગી વિન્ડો +Name[he]=חלון פרטי חדש +Name[hi-IN]=नयी निजी विंडो +Name[hr]=Novi privatni prozor +Name[hsb]=Nowe priwatne wokno +Name[hu]=Új privát ablak +Name[hy-AM]=Սկսել Գաղտնի դիտարկում +Name[id]=Jendela Mode Pribadi Baru +Name[is]=Nýr huliðsgluggi +Name[it]=Nuova finestra anonima +Name[ja]=新しいプライベートウィンドウ +Name[ja-JP-mac]=新規プライベートウインドウ +Name[ka]=ახალი პირადი ფანჯარა +Name[kk]=Жаңа жекелік терезе +Name[km]=បង្អួច​ឯកជន​ថ្មី +Name[kn]=ಹೊಸ ಖಾಸಗಿ ಕಿಟಕಿ +Name[ko]=새 사생활 보호 모드 +Name[kok]=नवो खाजगी विंडो +Name[ks]=نْو پرایوٹ وینڈو& +Name[lij]=Neuvo barcon privou +Name[lo]=ເປີດຫນ້າຕ່າງສວນຕົວຂື້ນມາໃຫມ່ +Name[lt]=Naujas privataus naršymo langas +Name[ltg]=Jauns privatais lūgs +Name[lv]=Jauns privātais logs +Name[mai]=नया निज विंडो (W) +Name[mk]=Нов приватен прозорец +Name[ml]=പുതിയ സ്വകാര്യ ജാലകം +Name[mr]=नवीन वैयक्तिक पटल +Name[ms]=Tetingkap Persendirian Baharu +Name[my]=New Private Window +Name[nb-NO]=Nytt privat vindu +Name[ne-NP]=नयाँ निजी सञ्झ्याल +Name[nl]=Nieuw privévenster +Name[nn-NO]=Nytt privat vindauge +Name[or]=ନୂତନ ବ୍ୟକ୍ତିଗତ ୱିଣ୍ଡୋ +Name[pa-IN]=ਨਵੀਂ ਪ੍ਰਾਈਵੇਟ ਵਿੰਡੋ +Name[pl]=Nowe okno prywatne +Name[pt-BR]=Nova janela privativa +Name[pt-PT]=Nova janela privada +Name[rm]=Nova fanestra privata +Name[ro]=Fereastră privată nouă +Name[ru]=Новое приватное окно +Name[sat]=नावा निजेराक् विंडो (W ) +Name[si]=නව පුද්ගලික කවුළුව (W) +Name[sk]=Nové okno v režime Súkromné prehliadanie +Name[sl]=Novo zasebno okno +Name[son]=Sutura zanfun taaga +Name[sq]=Dritare e Re Private +Name[sr]=Нови приватан прозор +Name[sv-SE]=Nytt privat fönster +Name[ta]=புதிய தனிப்பட்ட சாளரம் +Name[te]=కొత్త ఆంతరంగిక విండో +Name[th]=หน้าต่างส่วนตัวใหม่ +Name[tr]=Yeni gizli pencere +Name[tsz]=Juchiiti eraatarakua jimpani +Name[uk]=Приватне вікно +Name[ur]=نیا نجی دریچہ +Name[uz]=Yangi maxfiy oyna +Name[vi]=Cửa sổ riêng tư mới +Name[wo]=Panlanteeru biir bu bees +Name[xh]=Ifestile yangasese entsha +Name[zh-CN]=新建隐私浏览窗口 +Name[zh-TW]=新增隱私視窗 +Exec=firefox --private-window %u + diff --git a/SOURCES/firefox.sh.in b/SOURCES/firefox.sh.in new file mode 100644 index 0000000..090fa1c --- /dev/null +++ b/SOURCES/firefox.sh.in @@ -0,0 +1,271 @@ +#!/bin/bash +# +# The contents of this file are subject to the Netscape Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/NPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): +# + +## +## Usage: +## +## $ firefox +## +## This script is meant to run a mozilla program from the mozilla +## rpm installation. +## +## The script will setup all the environment voodoo needed to make +## mozilla work. + +cmdname=`basename $0` + +## +## Variables +## +MOZ_ARCH=$(uname -m) +case $MOZ_ARCH in + x86_64 | s390x | sparc64) + MOZ_LIB_DIR="%PREFIX%/lib64" + SECONDARY_LIB_DIR="%PREFIX%/lib" + ;; + * ) + MOZ_LIB_DIR="%PREFIX%/lib" + SECONDARY_LIB_DIR="%PREFIX%/lib64" + ;; +esac + +MOZ_FIREFOX_FILE="firefox" + +if [ ! -r $MOZ_LIB_DIR/firefox/$MOZ_FIREFOX_FILE ]; then + if [ ! -r $SECONDARY_LIB_DIR/firefox/$MOZ_FIREFOX_FILE ]; then + echo "Error: $MOZ_LIB_DIR/firefox/$MOZ_FIREFOX_FILE not found" + if [ -d $SECONDARY_LIB_DIR ]; then + echo " $SECONDARY_LIB_DIR/firefox/$MOZ_FIREFOX_FILE not found" + fi + exit 1 + fi + MOZ_LIB_DIR="$SECONDARY_LIB_DIR" +fi +MOZ_DIST_BIN="$MOZ_LIB_DIR/firefox" +MOZ_LANGPACKS_DIR="$MOZ_DIST_BIN/langpacks" +MOZ_EXTENSIONS_PROFILE_DIR="$HOME/.mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}" +MOZ_PROGRAM="$MOZ_DIST_BIN/$MOZ_FIREFOX_FILE" +MOZ_LAUNCHER="$MOZ_DIST_BIN/run-mozilla.sh" + +## +## Set MOZ_GRE_CONF +## +MOZ_GRE_CONF=/etc/gre.d/gre.conf +if [ "$MOZ_LIB_DIR" == "/usr/lib64" ]; then + MOZ_GRE_CONF=/etc/gre.d/gre64.conf +fi +export MOZ_GRE_CONF + +## +## Set MOZILLA_FIVE_HOME +## +MOZILLA_FIVE_HOME="$MOZ_DIST_BIN" + +export MOZILLA_FIVE_HOME + +## +## Make sure that we set the plugin path +## +MOZ_PLUGIN_DIR="plugins" + +if [ "$MOZ_PLUGIN_PATH" ] +then + MOZ_PLUGIN_PATH=$MOZ_PLUGIN_PATH:$MOZ_LIB_DIR/mozilla/$MOZ_PLUGIN_DIR:$MOZ_DIST_BIN/$MOZ_PLUGIN_DIR +else + MOZ_PLUGIN_PATH=$MOZ_LIB_DIR/mozilla/$MOZ_PLUGIN_DIR:$MOZ_DIST_BIN/$MOZ_PLUGIN_DIR +fi +export MOZ_PLUGIN_PATH + +## +## Set MOZ_APP_LAUNCHER for gnome-session +## +export MOZ_APP_LAUNCHER="%PREFIX%/bin/firefox" + +## +## Set FONTCONFIG_PATH for Xft/fontconfig +## +FONTCONFIG_PATH="/etc/fonts:${MOZILLA_FIVE_HOME}/res/Xft" +export FONTCONFIG_PATH + +## +## In order to better support certain scripts (such as Indic and some CJK +## scripts), Fedora builds its Firefox, with permission from the Mozilla +## Corporation, with the Pango system as its text renderer. This change +## may negatively impact performance on some pages. To disable the use of +## Pango, set MOZ_DISABLE_PANGO=1 in your environment before launching +## Firefox. +## +# +# MOZ_DISABLE_PANGO=1 +# export MOZ_DISABLE_PANGO +# + +## +## Disable the GNOME crash dialog, Moz has it's own +## +GNOME_DISABLE_CRASH_DIALOG=1 +export GNOME_DISABLE_CRASH_DIALOG + +## +## Disable the SLICE allocator (rhbz#1014858) +## +export G_SLICE=always-malloc + +## +## Enable Xinput2 (mozbz#1207973) +## +export MOZ_USE_XINPUT2=1 + +# OK, here's where all the real work gets done + + +## +## To disable the use of Firefox localization, set MOZ_DISABLE_LANGPACKS=1 +## in your environment before launching Firefox. +## +# +# MOZ_DISABLE_LANGPACKS=1 +# export MOZ_DISABLE_LANGPACKS +# + +## +## Automatically installed langpacks are tracked by .fedora-langpack-install +## config file. +## +FEDORA_LANGPACK_CONFIG="$MOZ_EXTENSIONS_PROFILE_DIR/.fedora-langpack-install" + +MOZILLA_DOWN=0 +if ! [ $MOZ_DISABLE_LANGPACKS ] || [ $MOZ_DISABLE_LANGPACKS -eq 0 ]; then + if [ -x $MOZ_DIST_BIN/$MOZ_FIREFOX_FILE ]; then + # Is firefox running? + pidof firefox > /dev/null 2>&1 + MOZILLA_DOWN=$? + fi +fi + +# Modify language pack configuration only when firefox is not running +# and language packs are not disabled +if [ $MOZILLA_DOWN -ne 0 ]; then + + # Clear already installed langpacks + mkdir -p $MOZ_EXTENSIONS_PROFILE_DIR + if [ -f $FEDORA_LANGPACK_CONFIG ]; then + rm `cat $FEDORA_LANGPACK_CONFIG` > /dev/null 2>&1 + rm $FEDORA_LANGPACK_CONFIG > /dev/null 2>&1 + # remove all empty langpacks dirs while they block installation of langpacks + rmdir $MOZ_EXTENSIONS_PROFILE_DIR/langpack* > /dev/null 2>&1 + fi + + # Get locale from system + CURRENT_LOCALE=$LC_ALL + CURRENT_LOCALE=${CURRENT_LOCALE:-$LC_MESSAGES} + CURRENT_LOCALE=${CURRENT_LOCALE:-$LANG} + + # Try with a local variant first, then without a local variant + SHORTMOZLOCALE=`echo $CURRENT_LOCALE | sed "s|_\([^.]*\).*||g"` + MOZLOCALE=`echo $CURRENT_LOCALE | sed "s|_\([^.]*\).*|-\1|g"` + + function create_langpack_link() { + local language=$* + local langpack=langpack-${language}@firefox.mozilla.org.xpi + if [ -f $MOZ_LANGPACKS_DIR/$langpack ]; then + rm -rf $MOZ_EXTENSIONS_PROFILE_DIR/$langpack + # If the target file is a symlink (the fallback langpack), + # install the original file instead of the fallback one + if [ -h $MOZ_LANGPACKS_DIR/$langpack ]; then + langpack=`readlink $MOZ_LANGPACKS_DIR/$langpack` + fi + ln -s $MOZ_LANGPACKS_DIR/$langpack \ + $MOZ_EXTENSIONS_PROFILE_DIR/$langpack + echo $MOZ_EXTENSIONS_PROFILE_DIR/$langpack > $FEDORA_LANGPACK_CONFIG + return 0 + fi + return 1 + } + + create_langpack_link $MOZLOCALE || create_langpack_link $SHORTMOZLOCALE || true +fi + +# BEAST fix (rhbz#1005611) +NSS_SSL_CBC_RANDOM_IV=${NSS_SSL_CBC_RANDOM_IV-1} +export NSS_SSL_CBC_RANDOM_IV + +# Prepare command line arguments +script_args="" +pass_arg_count=0 +while [ $# -gt $pass_arg_count ] +do + case "$1" in + -g | --debug) + script_args="$script_args -g" + debugging=1 + shift + ;; + -d | --debugger) + if [ $# -gt 1 ]; then + script_args="$script_args -d $2" + shift 2 + else + shift + fi + ;; + *) + # Move the unrecognized argument to the end of the list. + arg="$1" + shift + set -- "$@" "$arg" + pass_arg_count=`expr $pass_arg_count + 1` + ;; + esac +done + +# Linux version specific environment variables +%RHEL_ENV_VARS% + +# Don't throw "old profile" dialog box. +export MOZ_ALLOW_DOWNGRADE=1 + +# Make sure at-spi-bus is running +if ! dbus-send --session \ + --dest=org.freedesktop.DBus \ + --type=method_call \ + --print-reply \ + /org/freedesktop/DBus \ + org.freedesktop.DBus.ListNames \ + | grep org.a11y.Bus > /dev/null; then + if [ -f "$MOZ_LIB_DIR/firefox/bundled/libexec/at-spi-bus-launcher" ]; then + echo "Starting a11y dbus service..." + $MOZ_LIB_DIR/firefox/bundled/libexec/at-spi-bus-launcher & + else + echo "Running without a11y support!" + fi +fi + +# Run the browser +debugging=0 +if [ $debugging = 1 ] +then + echo $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@" +fi + + +exec $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@" diff --git a/SOURCES/google-api-key b/SOURCES/google-api-key new file mode 100644 index 0000000..b95d189 --- /dev/null +++ b/SOURCES/google-api-key @@ -0,0 +1 @@ +AIzaSyBPGXa4AYD4FC3HJK7LnIKxm4fDusVuuco diff --git a/SOURCES/gtk3-private-3.22.26-1-files.inc b/SOURCES/gtk3-private-3.22.26-1-files.inc new file mode 100644 index 0000000..8e1e31a --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-files.inc @@ -0,0 +1,54 @@ +%dir %{gtk3_install_path}/bin +%{gtk3_install_path}/bin/gdk-pixbuf-query-loaders-%{__isa_bits} +%{gtk3_install_path}/bin/gdk-pixbuf-thumbnailer +%{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} +%{gtk3_install_path}/bin/glib-compile-schemas +%{gtk3_install_path}/bin/gtk-query-immodules-3.0-%{__isa_bits} +%{gtk3_install_path}/bin/gtk-update-icon-cache +%{gtk3_install_path}/bin/fc-cache + +%{gtk3_install_path}/etc + +%dir %{gtk3_install_path}/%{_lib} +%{gtk3_install_path}/%{_lib}/libatk-1.0.so.* +%{gtk3_install_path}/%{_lib}/libatk-bridge-2.0.so.* +%{gtk3_install_path}/%{_lib}/libatspi.so.* +%{gtk3_install_path}/%{_lib}/libcairo.so.* +%{gtk3_install_path}/%{_lib}/libcairo-gobject.so.* +%{gtk3_install_path}/%{_lib}/libfontconfig.so.* +%{gtk3_install_path}/%{_lib}/libfreetype.so.* +%{gtk3_install_path}/%{_lib}/libgdk-3.so.* +%{gtk3_install_path}/%{_lib}/libgdk_pixbuf-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgio-2.0.so.* +%{gtk3_install_path}/%{_lib}/libglib-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgmodule-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgobject-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgthread-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgtk-3.so.* +%{gtk3_install_path}/%{_lib}/libharfbuzz.so.* +%{gtk3_install_path}/%{_lib}/libpango-1.0.so.* +%{gtk3_install_path}/%{_lib}/libpangocairo-1.0.so.* +%{gtk3_install_path}/%{_lib}/libpangoft2-1.0.so.* +%{gtk3_install_path}/%{_lib}/libpcre.so.* +%{gtk3_install_path}/%{_lib}/librsvg-2.so.* +%dir %{gtk3_install_path}/%{_lib}/cairo +%{gtk3_install_path}/%{_lib}/cairo/cairo-fdr.so.* +%{gtk3_install_path}/%{_lib}/cairo/cairo-sphinx.so.* +%{gtk3_install_path}/%{_lib}/cairo/libcairo-trace.so.* +%{gtk3_install_path}/%{_lib}/gdk-pixbuf-2.0 +%ghost %attr(644, root, root) %{gtk3_install_path}/%{_lib}/gdk-pixbuf-2.0/2.10.0/loaders.cache +%{gtk3_install_path}/%{_lib}/gio +%ghost %attr(644, root, root) %{gtk3_install_path}/%{_lib}/gio/modules/giomodule.cache +%{gtk3_install_path}/%{_lib}/gtk-3.0 +%ghost %attr(644, root, root) %{gtk3_install_path}/%{_lib}/gtk-3.0/3.0.0/immodules.cache + +%{gtk3_install_path}/libexec + +%{gtk3_install_path}/share +%ghost %attr(644, root, root) %{gtk3_install_path}/share/icons/Adwaita/icon-theme.cache +%ghost %attr(644, root, root) %{gtk3_install_path}/share/icons/hicolor/icon-theme.cache +%ghost %attr(644, root, root) %{gtk3_install_path}/share/glib-2.0/schemas/gschemas.compiled + +%{gtk3_install_path}/var +%dir %{gtk3_install_path}/var/cache/fontconfig + diff --git a/SOURCES/gtk3-private-3.22.26-1-post.inc b/SOURCES/gtk3-private-3.22.26-1-post.inc new file mode 100644 index 0000000..04acf06 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-post.inc @@ -0,0 +1,23 @@ +# adwaita-icon-theme +touch --no-create %{gtk3_install_path}/share/icons/Adwaita &>/dev/null || : +touch --no-create %{gtk3_install_path}/share/icons/hicolor &>/dev/null || : +%{gtk3_install_path}/bin/gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache || : + +# glib2 +%{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} %{gtk3_install_path}/%{_lib}/gio/modules + +# gtk3 +%{gtk3_install_path}/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache +%{gtk3_install_path}/bin/glib-compile-schemas %{gtk3_install_path}/share/glib-2.0/schemas &> /dev/null || : + +# fontconfig +umask 0022 + +# Force regeneration of all fontconfig cache files +# The check for existance is needed on dual-arch installs (the second +# copy of fontconfig might install the binary instead of the first) +# The HOME setting is to avoid problems if HOME hasn't been reset +# FIXME hardcoded version ! +if [ -x %{gtk3_install_path}/bin/fc-cache ] && %{gtk3_install_path}/bin/fc-cache --version 2>&1 | grep -q 2.10.95 ; then + HOME=/root %{gtk3_install_path}/bin/fc-cache -f +fi diff --git a/SOURCES/gtk3-private-3.22.26-1-posttrans.inc b/SOURCES/gtk3-private-3.22.26-1-posttrans.inc new file mode 100644 index 0000000..8c5f2d7 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-posttrans.inc @@ -0,0 +1,3 @@ +%{gtk3_install_path}/gtk-update-icon-cache %{gtk3_install_path}/share/icons/hicolor &>/dev/null || : +# adwaita +%{gtk3_install_path}/gtk-update-icon-cache %{gtk3_install_path}/share/icons/Adwaita &>/dev/null || : diff --git a/SOURCES/gtk3-private-3.22.26-1-postun.inc b/SOURCES/gtk3-private-3.22.26-1-postun.inc new file mode 100644 index 0000000..3b5df73 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-postun.inc @@ -0,0 +1,27 @@ +# adwaita +if [ $1 -eq 0 ] ; then + touch --no-create %{gtk3_install_path}/share/icons/Adwaita &>/dev/null + touch --no-create %{gtk3_install_path}/share/icons/hicolor &>/dev/null + %{gtk3_install_path}/bin/gtk-update-icon-cache %{gtk3_install_path}/share/icons/Adwaita &>/dev/null || : + %{gtk3_install_path}/bin/gtk-update-icon-cache %{gtk3_install_path}/share/icons/hicolor &>/dev/null || : +fi + +# gdk-pixbuf2 +if [ $1 -gt 0 ]; then + %{gtk3_install_path}/bin/gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache || : +fi + +# glib2 +[ ! -x %{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} ] || \ +%{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} %{gtk3_install_path}/%{_lib}/gio/modules + +# gtk3 +if [ $1 -gt 0 ]; then + %{gtk3_install_path}/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache +fi + +if [ $1 -eq 0 ] ; then + rm -rf %{gtk3_install_path}/var/cache/fontconfig/* &>/dev/null || : +fi + +%{gtk3_install_path}/bin/glib-compile-schemas %{gtk3_install_path}/share/glib-2.0/schemas &> /dev/null || : diff --git a/SOURCES/gtk3-private-3.22.26-1-requires-provides-filter.inc b/SOURCES/gtk3-private-3.22.26-1-requires-provides-filter.inc new file mode 100644 index 0000000..f5fa495 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-requires-provides-filter.inc @@ -0,0 +1,26 @@ +%filter_provides_in %{gtk3_install_path}/%{_lib} +%filter_requires_in %{gtk3_install_path}/%{_lib} + +%filter_from_requires /libgdk-3.*/d +%filter_from_requires /libatk-1.0.so.*/d +%filter_from_requires /libatk-bridge-2.0.so.*/d +%filter_from_requires /libatspi.so.*/d +%filter_from_requires /libcairo.so.*/d +%filter_from_requires /libcairo-gobject.so.*/d +%filter_from_requires /libfontconfig.so.*/d +%filter_from_requires /libfreetype.so.*/d +%filter_from_requires /libgdk-3.so.*/d +%filter_from_requires /libgdk_pixbuf-2.0.so.*/d +%filter_from_requires /libgio-2.0.so.*/d +%filter_from_requires /libglib-2.0.so.*/d +%filter_from_requires /libgmodule-2.0.so.*/d +%filter_from_requires /libgobject-2.0.so.*/d +%filter_from_requires /libgthread-2.0.so.*/d +%filter_from_requires /libgtk-3.so.*/d +%filter_from_requires /libharfbuzz.so.*/d +%filter_from_requires /libpango-1.0.so.*/d +%filter_from_requires /libpangocairo-1.0.so.*/d +%filter_from_requires /libpangoft2-1.0.so.*/d +%filter_from_requires /libpcre.so.*/d + +# Don't forget to call %%filter_setup from the consumer! diff --git a/SOURCES/gtk3-private-3.22.26-1-setup-flags-env.inc b/SOURCES/gtk3-private-3.22.26-1-setup-flags-env.inc new file mode 100644 index 0000000..eb54164 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-setup-flags-env.inc @@ -0,0 +1,34 @@ +%if "%{name}" == "gtk3-private" + function prepend_buildroot_include_path_to_compiler_flags() { + export CFLAGS="-I%{_buildrootdir}%{gtk3_install_path}/$@ $CFLAGS" \ + export CXXFLAGS="-I%{_buildrootdir}%{gtk3_install_path}/$@ $CXXFLAGS" + } + + prepend_buildroot_include_path_to_compiler_flags include + prepend_buildroot_include_path_to_compiler_flags include/glib-2.0 + prepend_buildroot_include_path_to_compiler_flags include/glib-2.0 + prepend_buildroot_include_path_to_compiler_flags include/gio-unix-2.0 + prepend_buildroot_include_path_to_compiler_flags %{_lib}/glib-2.0/include + prepend_buildroot_include_path_to_compiler_flags include/freetype2 + prepend_buildroot_include_path_to_compiler_flags include/fontconfig + prepend_buildroot_include_path_to_compiler_flags include/harfbuzz + prepend_buildroot_include_path_to_compiler_flags include/gdk-pixbuf-2.0 + prepend_buildroot_include_path_to_compiler_flags include/atk-1.0 + prepend_buildroot_include_path_to_compiler_flags include/at-spi-2.0 + prepend_buildroot_include_path_to_compiler_flags include/at-spi2-atk/2.0 + prepend_buildroot_include_path_to_compiler_flags include/cairo + prepend_buildroot_include_path_to_compiler_flags include/pango-1.0 + prepend_buildroot_include_path_to_compiler_flags include/librsvg-2.0 + prepend_buildroot_include_path_to_compiler_flags include/cairo + prepend_buildroot_include_path_to_compiler_flags include/gtk-3.0 + prepend_buildroot_include_path_to_compiler_flags include/gtk-3.0/unix-print + prepend_buildroot_include_path_to_compiler_flags include/librsvg-2.0 +%else + sed -i 's@%{gtk3_install_path}@%{_buildrootdir}%{gtk3_install_path}@g' %{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig/*.pc +%endif + +export LDFLAGS="-L%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS" +export LDFLAGS="-Wl,-rpath,%{gtk3_install_path}/%{_lib} $LDFLAGS" +export LDFLAGS="-Wl,-rpath-link,%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS" + +export PKG_CONFIG_PATH=%{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig diff --git a/SOURCES/mozilla-1170092.patch b/SOURCES/mozilla-1170092.patch new file mode 100644 index 0000000..2a7169b --- /dev/null +++ b/SOURCES/mozilla-1170092.patch @@ -0,0 +1,99 @@ +diff -up firefox-78.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 firefox-78.0/extensions/pref/autoconfig/src/nsReadConfig.cpp +--- firefox-78.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 2020-06-17 04:18:58.000000000 +0200 ++++ firefox-78.0/extensions/pref/autoconfig/src/nsReadConfig.cpp 2020-06-25 13:45:28.816999491 +0200 +@@ -244,8 +244,20 @@ nsresult nsReadConfig::openAndEvaluateJS + if (NS_FAILED(rv)) return rv; + + rv = NS_NewLocalFileInputStream(getter_AddRefs(inStr), jsFile); +- if (NS_FAILED(rv)) return rv; ++ if (NS_FAILED(rv)) { ++ // Look for cfg file in /etc//pref ++ rv = NS_GetSpecialDirectory(NS_APP_PREFS_SYSTEM_CONFIG_DIR, ++ getter_AddRefs(jsFile)); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = jsFile->AppendNative(NS_LITERAL_CSTRING("pref")); ++ NS_ENSURE_SUCCESS(rv, rv); ++ rv = jsFile->AppendNative(nsDependentCString(aFileName)); ++ NS_ENSURE_SUCCESS(rv, rv); + ++ rv = NS_NewLocalFileInputStream(getter_AddRefs(inStr), jsFile); ++ NS_ENSURE_SUCCESS(rv, rv); ++ } + } else { + nsAutoCString location("resource://gre/defaults/autoconfig/"); + location += aFileName; +diff -up firefox-78.0/modules/libpref/Preferences.cpp.1170092 firefox-78.0/modules/libpref/Preferences.cpp +--- firefox-78.0/modules/libpref/Preferences.cpp.1170092 2020-06-25 13:45:28.818999498 +0200 ++++ firefox-78.0/modules/libpref/Preferences.cpp 2020-06-25 13:48:45.996708102 +0200 +@@ -4499,6 +4499,8 @@ nsresult Preferences::InitInitialObjects + // + // Thus, in the omni.jar case, we always load app-specific default + // preferences from omni.jar, whether or not `$app == $gre`. ++ // At very end load configuration from system config location: ++ // - /etc/firefox/pref/*.js + + nsresult rv = NS_ERROR_FAILURE; + UniquePtr find; +diff -up firefox-78.0/toolkit/xre/nsXREDirProvider.cpp.1170092 firefox-78.0/toolkit/xre/nsXREDirProvider.cpp +--- firefox-78.0/toolkit/xre/nsXREDirProvider.cpp.1170092 2020-06-17 04:20:11.000000000 +0200 ++++ firefox-78.0/toolkit/xre/nsXREDirProvider.cpp 2020-06-25 13:48:28.613645633 +0200 +@@ -60,6 +60,7 @@ + #endif + #ifdef XP_UNIX + # include ++# include "nsIXULAppInfo.h" + #endif + #ifdef XP_IOS + # include "UIKitDirProvider.h" +@@ -533,6 +534,21 @@ nsXREDirProvider::GetFile(const char* aP + } + } + } ++ ++#if defined(XP_UNIX) ++ if (!strcmp(aProperty, NS_APP_PREFS_SYSTEM_CONFIG_DIR)) { ++ nsCString sysConfigDir = NS_LITERAL_CSTRING("/etc/"); ++ nsCOMPtr appInfo = do_GetService("@mozilla.org/xre/app-info;1"); ++ if (!appInfo) ++ return NS_ERROR_NOT_AVAILABLE; ++ nsCString appName; ++ appInfo->GetName(appName); ++ ToLowerCase(appName); ++ sysConfigDir.Append(appName); ++ return NS_NewNativeLocalFile(sysConfigDir, false, aFile); ++ } ++#endif ++ + if (NS_FAILED(rv) || !file) return NS_ERROR_FAILURE; + + if (ensureFilePermissions) { +@@ -845,6 +861,17 @@ nsresult nsXREDirProvider::GetFilesInter + + LoadDirIntoArray(mXULAppDir, kAppendPrefDir, directories); + ++ // Add /etc//pref/ directory if it exists ++ nsCOMPtr systemPrefDir; ++ rv = NS_GetSpecialDirectory(NS_APP_PREFS_SYSTEM_CONFIG_DIR, ++ getter_AddRefs(systemPrefDir)); ++ if (NS_SUCCEEDED(rv)) { ++ rv = systemPrefDir->AppendNative(NS_LITERAL_CSTRING("pref")); ++ if (NS_SUCCEEDED(rv)) { ++ directories.AppendObject(systemPrefDir); ++ } ++ } ++ + rv = NS_NewArrayEnumerator(aResult, directories, NS_GET_IID(nsIFile)); + } else if (!strcmp(aProperty, NS_APP_CHROME_DIR_LIST)) { + // NS_APP_CHROME_DIR_LIST is only used to get default (native) icons +diff -up firefox-78.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092 firefox-78.0/xpcom/io/nsAppDirectoryServiceDefs.h +--- firefox-78.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092 2020-06-17 04:20:17.000000000 +0200 ++++ firefox-78.0/xpcom/io/nsAppDirectoryServiceDefs.h 2020-06-25 13:45:28.819999502 +0200 +@@ -60,6 +60,7 @@ + #define NS_APP_PREFS_DEFAULTS_DIR_LIST "PrefDL" + #define NS_APP_PREFS_OVERRIDE_DIR \ + "PrefDOverride" // Directory for per-profile defaults ++#define NS_APP_PREFS_SYSTEM_CONFIG_DIR "PrefSysConf" // Directory with system-wide configuration + + #define NS_APP_USER_PROFILE_50_DIR "ProfD" + #define NS_APP_USER_PROFILE_LOCAL_50_DIR "ProfLD" diff --git a/SOURCES/mozilla-1196777.patch b/SOURCES/mozilla-1196777.patch new file mode 100644 index 0000000..7fa1595 --- /dev/null +++ b/SOURCES/mozilla-1196777.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.0/widget/gtk/nsWindow.cpp.1196777 firefox-68.0/widget/gtk/nsWindow.cpp +--- firefox-68.0/widget/gtk/nsWindow.cpp.1196777 2019-05-21 11:29:55.833376744 +0200 ++++ firefox-68.0/widget/gtk/nsWindow.cpp 2019-05-21 12:15:35.446089316 +0200 +@@ -156,7 +156,8 @@ const gint kEvents = + #if GTK_CHECK_VERSION(3, 4, 0) + GDK_SMOOTH_SCROLL_MASK | GDK_TOUCH_MASK | + #endif +- GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK; ++ GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK | ++ GDK_FOCUS_CHANGE_MASK; + + #if !GTK_CHECK_VERSION(3, 22, 0) + typedef enum { diff --git a/SOURCES/mozilla-1703636-slot-fail-workaround.patch b/SOURCES/mozilla-1703636-slot-fail-workaround.patch new file mode 100644 index 0000000..079a15b --- /dev/null +++ b/SOURCES/mozilla-1703636-slot-fail-workaround.patch @@ -0,0 +1,12 @@ +diff -up firefox-78.9.0/security/certverifier/NSSCertDBTrustDomain.cpp.slot-fail firefox-78.9.0/security/certverifier/NSSCertDBTrustDomain.cpp +--- firefox-78.9.0/security/certverifier/NSSCertDBTrustDomain.cpp.slot-fail 2021-04-08 08:02:13.879018493 +0200 ++++ firefox-78.9.0/security/certverifier/NSSCertDBTrustDomain.cpp 2021-04-08 08:05:56.713623197 +0200 +@@ -118,7 +118,7 @@ static Result FindRootsWithSubject(Uniqu + CERTCertificateList* rawResults = nullptr; + if (PK11_FindRawCertsWithSubject(rootsModule->slots[slotIndex], &subject, + &rawResults) != SECSuccess) { +- return Result::FATAL_ERROR_LIBRARY_FAILURE; ++ continue; + } + // rawResults == nullptr means we didn't find any matching certificates + if (!rawResults) { diff --git a/SOURCES/mozilla-api-key b/SOURCES/mozilla-api-key new file mode 100644 index 0000000..81877bc --- /dev/null +++ b/SOURCES/mozilla-api-key @@ -0,0 +1 @@ +9008bb7e-1e22-4038-94fe-047dd48ccc0b diff --git a/SOURCES/mozilla-bmo1005535.patch b/SOURCES/mozilla-bmo1005535.patch new file mode 100644 index 0000000..cab0134 --- /dev/null +++ b/SOURCES/mozilla-bmo1005535.patch @@ -0,0 +1,12 @@ +diff -up firefox-78.0/gfx/skia/skia/src/gpu/GrColor.h.mozilla.bmo1005535 firefox-78.0/gfx/skia/skia/src/gpu/GrColor.h +--- firefox-78.0/gfx/skia/skia/src/gpu/GrColor.h.mozilla.bmo1005535 2020-06-25 16:16:34.459083304 +0200 ++++ firefox-78.0/gfx/skia/skia/src/gpu/GrColor.h 2020-06-25 16:17:00.968174743 +0200 +@@ -64,7 +64,7 @@ static inline GrColor GrColorPackRGBA(un + * Since premultiplied means that alpha >= color, we construct a color with + * each component==255 and alpha == 0 to be "illegal" + */ +-#define GrColor_ILLEGAL (~(0xFF << GrColor_SHIFT_A)) ++#define GrColor_ILLEGAL ((uint32_t)(~(0xFF << GrColor_SHIFT_A))) + + /** Normalizes and coverts an uint8_t to a float. [0, 255] -> [0.0, 1.0] */ + static inline float GrNormalizeByteToFloat(uint8_t value) { diff --git a/SOURCES/mozilla-bmo1504834-part1.patch b/SOURCES/mozilla-bmo1504834-part1.patch new file mode 100644 index 0000000..01da145 --- /dev/null +++ b/SOURCES/mozilla-bmo1504834-part1.patch @@ -0,0 +1,77 @@ +diff -up firefox-78.0/gfx/2d/DrawTargetSkia.cpp.mozilla-bmo1504834-part1 firefox-78.0/gfx/2d/DrawTargetSkia.cpp +--- firefox-78.0/gfx/2d/DrawTargetSkia.cpp.mozilla-bmo1504834-part1 2020-06-17 04:18:58.000000000 +0200 ++++ firefox-78.0/gfx/2d/DrawTargetSkia.cpp 2020-06-25 16:52:29.824532769 +0200 +@@ -135,8 +135,7 @@ static IntRect CalculateSurfaceBounds(co + return surfaceBounds.Intersect(bounds); + } + +-static const int kARGBAlphaOffset = +- SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0; ++static const int kARGBAlphaOffset = 0; // Skia is always BGRA SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0; + + static bool VerifyRGBXFormat(uint8_t* aData, const IntSize& aSize, + const int32_t aStride, SurfaceFormat aFormat) { +diff -up firefox-78.0/gfx/2d/Types.h.mozilla-bmo1504834-part1 firefox-78.0/gfx/2d/Types.h +--- firefox-78.0/gfx/2d/Types.h.mozilla-bmo1504834-part1 2020-06-25 16:52:29.826532776 +0200 ++++ firefox-78.0/gfx/2d/Types.h 2020-06-25 16:55:02.942063616 +0200 +@@ -90,15 +90,8 @@ enum class SurfaceFormat : int8_t { + // The following values are endian-independent synonyms. The _UINT32 suffix + // indicates that the name reflects the layout when viewed as a uint32_t + // value. +-#if MOZ_LITTLE_ENDIAN() + A8R8G8B8_UINT32 = B8G8R8A8, // 0xAARRGGBB + X8R8G8B8_UINT32 = B8G8R8X8, // 0x00RRGGBB +-#elif MOZ_BIG_ENDIAN() +- A8R8G8B8_UINT32 = A8R8G8B8, // 0xAARRGGBB +- X8R8G8B8_UINT32 = X8R8G8B8, // 0x00RRGGBB +-#else +-# error "bad endianness" +-#endif + + // The following values are OS and endian-independent synonyms. + // +diff -up firefox-78.0/gfx/skia/skia/third_party/skcms/skcms.cc.mozilla-bmo1504834-part1 firefox-78.0/gfx/skia/skia/third_party/skcms/skcms.cc +--- firefox-78.0/gfx/skia/skia/third_party/skcms/skcms.cc.mozilla-bmo1504834-part1 2020-06-17 04:18:58.000000000 +0200 ++++ firefox-78.0/gfx/skia/skia/third_party/skcms/skcms.cc 2020-06-25 16:54:02.993855444 +0200 +@@ -30,6 +30,8 @@ + #include + #include + #endif ++#else ++ #define SKCMS_PORTABLE + #endif + + // sizeof(x) will return size_t, which is 32-bit on some machines and 64-bit on others. +@@ -280,20 +282,28 @@ enum { + static uint16_t read_big_u16(const uint8_t* ptr) { + uint16_t be; + memcpy(&be, ptr, sizeof(be)); +-#if defined(_MSC_VER) +- return _byteswap_ushort(be); ++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ++ return be; + #else ++ #if defined(_MSC_VER) ++ return _byteswap_ushort(be); ++ #else + return __builtin_bswap16(be); ++ #endif + #endif + } + + static uint32_t read_big_u32(const uint8_t* ptr) { + uint32_t be; + memcpy(&be, ptr, sizeof(be)); +-#if defined(_MSC_VER) +- return _byteswap_ulong(be); ++#if __BYTE_ORDER == __ORDER_BIG_ENDIAN__ ++ return be; + #else ++ #if defined(_MSC_VER) ++ return _byteswap_ulong(be); ++ #else + return __builtin_bswap32(be); ++ #endif + #endif + } + diff --git a/SOURCES/mozilla-bmo1504834-part2.patch b/SOURCES/mozilla-bmo1504834-part2.patch new file mode 100644 index 0000000..e6e6aa5 --- /dev/null +++ b/SOURCES/mozilla-bmo1504834-part2.patch @@ -0,0 +1,88 @@ +# HG changeset patch +# Parent 36563351309ddbc6c29559ba50a41d005f925abb +Skia does not support big endian. The places to fix are too numerous and upstream (skia, not Mozilla) +has no interest in maintaining big endian. +So here we try to swizzle the input for skia, so that skia always works on LE, and when it comes +out again, we transform back to BE. + +diff -r 36563351309d gfx/2d/ConvolutionFilter.cpp +--- a/gfx/2d/ConvolutionFilter.cpp Mon Sep 09 17:59:28 2019 +0200 ++++ b/gfx/2d/ConvolutionFilter.cpp Tue Sep 10 08:25:13 2019 +0200 +@@ -35,9 +35,38 @@ + return true; + } + ++static void ByteSwapArray(uint8_t *u8Array, int32_t size) { ++ uint32_t *array = reinterpret_cast(u8Array); ++ for (int pxl = 0; pxl < size; ++pxl) { ++ // Use an endian swap to move the bytes, i.e. BGRA -> ARGB. ++ uint32_t rgba = array[pxl]; ++ array[pxl] = NativeEndian::swapToLittleEndian(rgba); ++ } ++} ++ + void ConvolutionFilter::ConvolveHorizontally(const uint8_t* aSrc, uint8_t* aDst, + bool aHasAlpha) { ++#if MOZ_BIG_ENDIAN ++ int outputSize = mFilter->numValues(); ++ ++ // Input size isn't handed in, so we have to calculate it quickly ++ int inputSize = 0; ++ for (int xx = 0; xx < outputSize; ++xx) { ++ // Get the filter that determines the current output pixel. ++ int filterOffset, filterLength; ++ mFilter->FilterForValue(xx, &filterOffset, &filterLength); ++ inputSize = std::max(inputSize, filterOffset + filterLength); ++ } ++ ++ ByteSwapArray((uint8_t*)aSrc, inputSize); ++#endif ++ + SkOpts::convolve_horizontally(aSrc, *mFilter, aDst, aHasAlpha); ++ ++#if MOZ_BIG_ENDIAN ++ ByteSwapArray((uint8_t*)aSrc, inputSize); ++ ByteSwapArray(aDst, outputSize); ++#endif + } + + void ConvolutionFilter::ConvolveVertically(uint8_t* const* aSrc, uint8_t* aDst, +@@ -49,8 +78,26 @@ + int32_t filterLength; + auto filterValues = + mFilter->FilterForValue(aRowIndex, &filterOffset, &filterLength); ++ ++#if MOZ_BIG_ENDIAN ++ for (int filterY = 0; filterY < filterLength; filterY++) { ++ // Skia only knows LE, so we have to swizzle the input ++ ByteSwapArray(aSrc[filterY], aRowSize); ++ } ++#endif ++ + SkOpts::convolve_vertically(filterValues, filterLength, aSrc, aRowSize, aDst, + aHasAlpha); ++ ++#if MOZ_BIG_ENDIAN ++ // After skia is finished, we swizzle back to BE, in case ++ // the input is used again somewhere else ++ for (int filterY = 0; filterY < filterLength; filterY++) { ++ ByteSwapArray(aSrc[filterY], aRowSize); ++ } ++ // The destination array as well ++ ByteSwapArray(aDst, aRowSize); ++#endif + } + + /* ConvolutionFilter::ComputeResizeFactor is derived from Skia's +diff -r 36563351309d gfx/skia/skia/include/core/SkPreConfig.h +--- a/gfx/skia/skia/include/core/SkPreConfig.h Mon Sep 09 17:59:28 2019 +0200 ++++ b/gfx/skia/skia/include/core/SkPreConfig.h Tue Sep 10 08:25:13 2019 +0200 +@@ -73,7 +73,7 @@ + defined(__ppc__) || defined(__hppa) || \ + defined(__PPC__) || defined(__PPC64__) || \ + defined(_MIPSEB) || defined(__ARMEB__) || \ +- defined(__s390__) || \ ++ defined(__s390__) || defined(__s390x__) || \ + (defined(__sh__) && defined(__BIG_ENDIAN__)) || \ + (defined(__ia64) && defined(__BIG_ENDIAN__)) + #define SK_CPU_BENDIAN diff --git a/SOURCES/mozilla-bmo1504834-part3.patch b/SOURCES/mozilla-bmo1504834-part3.patch new file mode 100644 index 0000000..1a498f8 --- /dev/null +++ b/SOURCES/mozilla-bmo1504834-part3.patch @@ -0,0 +1,44 @@ +# HG changeset patch +# Parent aecb4600e5da17443b224c79eee178c1d8e155e3 +For FF68, AntiAliasing of XULTexts seem to be broken on big endian (s390x). Text and icons of the sandwich-menu to the +right of the address bar, as well as plugin-windows appears transparant, which usually means unreadable (white on white). + +diff -r aecb4600e5da gfx/skia/skia/include/private/SkNx.h +--- a/gfx/skia/skia/include/private/SkNx.h Tue Aug 20 09:46:55 2019 +0200 ++++ b/gfx/skia/skia/include/private/SkNx.h Mon Sep 09 10:04:06 2019 +0200 +@@ -238,7 +238,18 @@ + AI SkNx operator*(const SkNx& y) const { return fVal * y.fVal; } + AI SkNx operator/(const SkNx& y) const { return fVal / y.fVal; } + ++ // On Big endian the commented out variant doesn't work, ++ // and honestly, I have no idea why it exists in the first place. ++ // The reason its broken is, I think, that it defaults to the double-variant of ToBits() ++ // which gets a 64-bit integer, and FromBits returns 32-bit, ++ // cutting off the wrong half again. ++ // Overall, I see no reason to have ToBits and FromBits at all (even for floats/doubles). ++ // Still we are only "fixing" this for big endian and leave little endian alone (never touch a running system) ++#ifdef SK_CPU_BENDIAN ++ AI SkNx operator&(const SkNx& y) const { return fVal & y.fVal; } ++#else + AI SkNx operator&(const SkNx& y) const { return FromBits(ToBits(fVal) & ToBits(y.fVal)); } ++#endif + AI SkNx operator|(const SkNx& y) const { return FromBits(ToBits(fVal) | ToBits(y.fVal)); } + AI SkNx operator^(const SkNx& y) const { return FromBits(ToBits(fVal) ^ ToBits(y.fVal)); } + +diff -r aecb4600e5da gfx/skia/skia/src/opts/SkBlitMask_opts.h +--- a/gfx/skia/skia/src/opts/SkBlitMask_opts.h Tue Aug 20 09:46:55 2019 +0200 ++++ b/gfx/skia/skia/src/opts/SkBlitMask_opts.h Mon Sep 09 10:04:06 2019 +0200 +@@ -203,7 +203,13 @@ + // ~~~> + // a = 1*aa + d(1-1*aa) = aa + d(1-aa) + // c = 0*aa + d(1-1*aa) = d(1-aa) ++ ++ // For big endian we have to swap the alpha-mask from 0,0,0,255 to 255,0,0,0 ++#ifdef SK_CPU_BENDIAN ++ return Sk4px(Sk16b(aa) & Sk16b(255,0,0,0, 255,0,0,0, 255,0,0,0, 255,0,0,0)) ++#else + return Sk4px(Sk16b(aa) & Sk16b(0,0,0,255, 0,0,0,255, 0,0,0,255, 0,0,0,255)) ++#endif + + d.approxMulDiv255(aa.inv()); + }; + while (h --> 0) { diff --git a/SOURCES/mozilla-bmo1504834-part4.patch b/SOURCES/mozilla-bmo1504834-part4.patch new file mode 100644 index 0000000..9d2ffc4 --- /dev/null +++ b/SOURCES/mozilla-bmo1504834-part4.patch @@ -0,0 +1,30 @@ +# HG changeset patch +# Parent 46ea866ca3acb8bb5e1709ceb799b9c94f591dec +Problem description: Tab-titles that are too long to fit into a tab get faded out. + On big endian this is broken and instead of fading out, the + tab gets white and the font transparent, leading to an unreadable + tab-title +Solution: This is not a real solution, but a hack. The real solution would have been + to byte-swap the correct buffer, but I could not find it. + So the next best thing is to deactivate the fading-effect. Now all tab-titles + are readable, albeit not as pretty to look at as they could be. +Side-effects: I have not yet found an unwanted side-effect. + +diff -r 46ea866ca3ac -r 6ef20eee3f8f gfx/2d/DrawTargetSkia.cpp +--- a/gfx/2d/DrawTargetSkia.cpp Tue Oct 22 12:27:22 2019 +0200 ++++ b/gfx/2d/DrawTargetSkia.cpp Thu Oct 31 09:11:56 2019 +0100 +@@ -1861,6 +1861,14 @@ + SkCanvas::kPreserveLCDText_SaveLayerFlag | + (aCopyBackground ? SkCanvas::kInitWithPrevious_SaveLayerFlag : 0)); + ++#if MOZ_BIG_ENDIAN ++ // Pushing a layer where an aMask is defined produces wrong output. ++ // We _should_ endian swap the data, but I couldn't find a workable way to do so ++ // Therefore I deactivate those layers in the meantime. ++ // The result is: Tab-titles that are longer than the available space should be faded out. ++ // The fading doesn't work, so we deactivate the fading-effect here. ++ if (!aMask) ++#endif + mCanvas->saveLayer(saveRec); + + SetPermitSubpixelAA(aOpaque); diff --git a/SOURCES/mozilla-bmo1554971.patch b/SOURCES/mozilla-bmo1554971.patch new file mode 100644 index 0000000..ab25c2d --- /dev/null +++ b/SOURCES/mozilla-bmo1554971.patch @@ -0,0 +1,22 @@ +# HG changeset patch +# Parent a25cebecb02d5460b8ad757fe9cb4a9c8d1d7658 +Eliminate startup error message: +JavaScript error: , line 0: Error: Type error for platformInfo value (Error processing arch: Invalid enumeration value "s390x") for runtime.getPlatformInfo. + +Reported here: https://bugzilla.mozilla.org/show_bug.cgi?id=1554971 + +Uncertain if this is causing real problems or not. Also uncertain if the fix actually fixes anything. +No response from upstream yet. + +diff -r a25cebecb02d -r 378b81b00e73 toolkit/components/extensions/schemas/runtime.json +--- a/toolkit/components/extensions/schemas/runtime.json Fri Jul 05 12:42:44 2019 +0200 ++++ b/toolkit/components/extensions/schemas/runtime.json Fri Jul 19 13:19:30 2019 +0200 +@@ -64,7 +64,7 @@ + { + "id": "PlatformArch", + "type": "string", +- "enum": ["arm", "x86-32", "x86-64"], ++ "enum": ["arm", "x86-32", "x86-64", "s390x", "aarch64", "ppc64le"], + "allowedContexts": ["content", "devtools"], + "description": "The machine's processor architecture." + }, diff --git a/SOURCES/mozilla-bmo1602730.patch b/SOURCES/mozilla-bmo1602730.patch new file mode 100644 index 0000000..c11f958 --- /dev/null +++ b/SOURCES/mozilla-bmo1602730.patch @@ -0,0 +1,28 @@ +diff -r 6ef20eee3f8f gfx/layers/basic/BasicCompositor.cpp +--- a/gfx/layers/basic/BasicCompositor.cpp Thu Oct 31 09:11:56 2019 +0100 ++++ b/gfx/layers/basic/BasicCompositor.cpp Wed Dec 11 16:16:09 2019 +0100 +@@ -693,9 +693,13 @@ + + RefPtr sourceMask; + Matrix maskTransform; ++ // Setting an alpha-mask here breaks the URL-bar on big endian (s390x) ++ // if the typed URL is too long for the textbox (automatic scrolling needed) ++#if MOZ_LITTLE_ENDIAN + if (aTransform.Is2D()) { + SetupMask(aEffectChain, dest, offset, sourceMask, maskTransform); + } ++#endif + + CompositionOp blendMode = CompositionOp::OP_OVER; + if (Effect* effect = +diff -r 6ef20eee3f8f gfx/layers/composite/CompositableHost.cpp +--- a/gfx/layers/composite/CompositableHost.cpp Thu Oct 31 09:11:56 2019 +0100 ++++ b/gfx/layers/composite/CompositableHost.cpp Wed Dec 11 16:16:09 2019 +0100 +@@ -91,6 +91,7 @@ + } + MOZ_ASSERT(source); + ++ // Alternatively: Comment out these lines where the alpha-mask is set + RefPtr effect = + new EffectMask(source, source->GetSize(), aTransform); + aEffects.mSecondaryEffects[EffectTypes::MASK] = effect; diff --git a/SOURCES/mozilla-bmo1626236.patch b/SOURCES/mozilla-bmo1626236.patch new file mode 100644 index 0000000..32e3742 --- /dev/null +++ b/SOURCES/mozilla-bmo1626236.patch @@ -0,0 +1,86 @@ +# HG changeset patch +# User msirringhaus@suse.de +# Date 1582805876 -3600 +# Thu Feb 27 13:17:56 2020 +0100 +# Node ID cc3d09abea31068e57f1ab918782f9f86fc6a158 +# Parent 9cd90914846f667f18babc491a74c164ae5d6e9f +imported patch decoder_workaround.patch + +diff -r 9cd90914846f image/decoders/nsGIFDecoder2.cpp +--- a/image/decoders/nsGIFDecoder2.cpp Thu Feb 27 12:57:14 2020 +0100 ++++ b/image/decoders/nsGIFDecoder2.cpp Fri Mar 27 13:06:18 2020 +0100 +@@ -422,6 +422,9 @@ + MOZ_ASSERT(mSwizzleFn); + uint8_t* data = reinterpret_cast(aColormap); + mSwizzleFn(data, data, aColors); ++#if MOZ_BIG_ENDIAN() ++ SwizzleRow(SurfaceFormat::A8R8G8B8, SurfaceFormat::B8G8R8A8)(data, data, aColors); ++#endif + } + + LexerResult nsGIFDecoder2::DoDecode(SourceBufferIterator& aIterator, +diff -r 9cd90914846f image/decoders/nsJPEGDecoder.cpp +--- a/image/decoders/nsJPEGDecoder.cpp Thu Feb 27 12:57:14 2020 +0100 ++++ b/image/decoders/nsJPEGDecoder.cpp Fri Mar 27 13:06:18 2020 +0100 +@@ -263,6 +263,9 @@ + case JCS_YCbCr: + // By default, we will output directly to BGRA. If we need to apply + // special color transforms, this may change. ++#if MOZ_BIG_ENDIAN() ++ mInfo.out_color_space = MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB; ++#else + switch (SurfaceFormat::OS_RGBX) { + case SurfaceFormat::B8G8R8X8: + mInfo.out_color_space = JCS_EXT_BGRX; +@@ -277,6 +280,7 @@ + mState = JPEG_ERROR; + return Transition::TerminateFailure(); + } ++#endif + break; + case JCS_CMYK: + case JCS_YCCK: +diff -r 9cd90914846f image/decoders/nsPNGDecoder.cpp +--- a/image/decoders/nsPNGDecoder.cpp Thu Feb 27 12:57:14 2020 +0100 ++++ b/image/decoders/nsPNGDecoder.cpp Fri Mar 27 13:06:18 2020 +0100 +@@ -361,7 +361,7 @@ + IResumable* aOnResume) { + MOZ_ASSERT(!HasError(), "Shouldn't call DoDecode after error!"); + +- return mLexer.Lex(aIterator, aOnResume, ++ LexerResult res = mLexer.Lex(aIterator, aOnResume, + [=](State aState, const char* aData, size_t aLength) { + switch (aState) { + case State::PNG_DATA: +@@ -371,6 +371,14 @@ + } + MOZ_CRASH("Unknown State"); + }); ++ ++#if MOZ_BIG_ENDIAN() ++ if(res.is() && res.as() == TerminalState::SUCCESS) { ++ NativeEndian::swapToLittleEndianInPlace((uint32_t*)(mImageData), mImageDataLength / 4); ++ } ++#endif ++ ++ return res; + } + + LexerTransition nsPNGDecoder::ReadPNGData( +diff -r 9cd90914846f image/decoders/nsWebPDecoder.cpp +--- a/image/decoders/nsWebPDecoder.cpp Thu Feb 27 12:57:14 2020 +0100 ++++ b/image/decoders/nsWebPDecoder.cpp Fri Mar 27 13:06:18 2020 +0100 +@@ -237,7 +237,12 @@ + // WebP doesn't guarantee that the alpha generated matches the hint in the + // header, so we always need to claim the input is BGRA. If the output is + // BGRX, swizzling will mask off the alpha channel. ++#if MOZ_BIG_ENDIAN() ++ mBuffer.colorspace = MODE_ARGB; ++ SurfaceFormat inFormat = mFormat; ++#else + SurfaceFormat inFormat = SurfaceFormat::OS_RGBA; ++#endif + + SurfacePipeFlags pipeFlags = SurfacePipeFlags(); + if (mFormat == SurfaceFormat::OS_RGBA && + diff --git a/SOURCES/mozilla-bmo849632.patch b/SOURCES/mozilla-bmo849632.patch new file mode 100644 index 0000000..177fdc3 --- /dev/null +++ b/SOURCES/mozilla-bmo849632.patch @@ -0,0 +1,23 @@ +Problem: webGL sites are displayed in the wrong color (usually blue-ish) +Solution: Problem is with skia once again. Output of webgl seems endian-correct, but skia only + knows how to deal with little endian. + So we swizzle the output of webgl after reading it from readpixels() +Note: This does not fix all webGL sites, but is a step in the right direction +diff -r 6b017d3e9733 gfx/gl/GLContext.h +--- a/gfx/gl/GLContext.h Mon Sep 09 10:04:05 2019 +0200 ++++ b/gfx/gl/GLContext.h Wed Nov 13 17:13:04 2019 +0100 +@@ -1551,6 +1551,13 @@ + BEFORE_GL_CALL; + mSymbols.fReadPixels(x, y, width, height, format, type, pixels); + OnSyncCall(); ++#if MOZ_BIG_ENDIAN ++ uint8_t* itr = (uint8_t*)pixels; ++ for (GLsizei i = 0; i < width * height; i++) { ++ NativeEndian::swapToLittleEndianInPlace((uint32_t*)itr, 1); ++ itr += 4; ++ } ++#endif + AFTER_GL_CALL; + mHeavyGLCallsSinceLastFlush = true; + } + diff --git a/SOURCES/mozilla-bmo998749.patch b/SOURCES/mozilla-bmo998749.patch new file mode 100644 index 0000000..4ddde4c --- /dev/null +++ b/SOURCES/mozilla-bmo998749.patch @@ -0,0 +1,30 @@ +# HG changeset patch +# User msirringhaus@suse.de +# Date 1583738770 -3600 +# Mon Mar 09 08:26:10 2020 +0100 +# Node ID 34676feac1a542e409e22acf5b98735f8313b1ce +# Parent 506857dace0a08d1c9685e3ac264646590b3e27f +[mq]: mozilla-bmo998749.patch + +diff -r 506857dace0a -r 34676feac1a5 gfx/2d/FilterProcessing.h +--- a/gfx/2d/FilterProcessing.h Fri Feb 28 12:31:51 2020 +0100 ++++ b/gfx/2d/FilterProcessing.h Mon Mar 09 08:26:10 2020 +0100 +@@ -13,10 +13,17 @@ + namespace mozilla { + namespace gfx { + ++#if MOZ_BIG_ENDIAN() ++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_B = 3; ++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_G = 2; ++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_R = 1; ++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_A = 0; ++#else + const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_B = 0; + const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_G = 1; + const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_R = 2; + const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_A = 3; ++#endif + + class FilterProcessing { + public: + diff --git a/SOURCES/mozilla-s390-context.patch b/SOURCES/mozilla-s390-context.patch new file mode 100644 index 0000000..55bd7a8 --- /dev/null +++ b/SOURCES/mozilla-s390-context.patch @@ -0,0 +1,36 @@ +# HG changeset patch +# User msirringhaus@suse.de +# Date 1558452408 -7200 +# Tue May 21 17:26:48 2019 +0200 +# Node ID 602e92722e765a3c238d3b96b26c0c8063b5eeb4 +# Parent a3cc550d25e3a04d906f516928cbcbe50efd585e +[mq]: mozilla-s390-context.patch + +diff -r a3cc550d25e3 -r 602e92722e76 js/src/wasm/WasmSignalHandlers.cpp +--- a/js/src/wasm/WasmSignalHandlers.cpp Tue May 21 17:22:06 2019 +0200 ++++ b/js/src/wasm/WasmSignalHandlers.cpp Tue May 21 17:26:48 2019 +0200 +@@ -154,6 +154,10 @@ + # define R01_sig(p) ((p)->uc_mcontext.gp_regs[1]) + # define R32_sig(p) ((p)->uc_mcontext.gp_regs[32]) + # endif ++# if defined(__linux__) && defined(__s390x__) ++# define GR_sig(p,x) ((p)->uc_mcontext.gregs[x]) ++# define PSWa_sig(p) ((p)->uc_mcontext.psw.addr) ++# endif + #elif defined(__NetBSD__) + # define EIP_sig(p) ((p)->uc_mcontext.__gregs[_REG_EIP]) + # define EBP_sig(p) ((p)->uc_mcontext.__gregs[_REG_EBP]) +@@ -385,8 +389,13 @@ + # define PC_sig(p) R32_sig(p) + # define SP_sig(p) R01_sig(p) + # define FP_sig(p) R01_sig(p) ++#elif defined(__s390x__) ++# define PC_sig(p) PSWa_sig(p) ++# define SP_sig(p) GR_sig(p, 15) ++# define FP_sig(p) GR_sig(p, 11) + #endif + ++ + static void SetContextPC(CONTEXT* context, uint8_t* pc) { + #ifdef PC_sig + *reinterpret_cast(&PC_sig(context)) = pc; diff --git a/SOURCES/mozilla-s390x-skia-gradient.patch b/SOURCES/mozilla-s390x-skia-gradient.patch new file mode 100644 index 0000000..8c0e3bd --- /dev/null +++ b/SOURCES/mozilla-s390x-skia-gradient.patch @@ -0,0 +1,52 @@ +# HG changeset patch +# Parent acf59ea86dd1d878b43920832093f082dcfc61c0 + +diff -r acf59ea86dd1 gfx/skia/skia/src/shaders/gradients/Sk4fLinearGradient.cpp +--- a/gfx/skia/skia/src/shaders/gradients/Sk4fLinearGradient.cpp Mon Mar 09 08:26:10 2020 +0100 ++++ b/gfx/skia/skia/src/shaders/gradients/Sk4fLinearGradient.cpp Fri Mar 27 13:30:28 2020 +0100 +@@ -7,7 +7,7 @@ + + #include "include/core/SkPaint.h" + #include "src/shaders/gradients/Sk4fLinearGradient.h" +- ++#include "src/core/SkEndian.h" + #include + #include + +@@ -28,6 +28,9 @@ + + while (n >= 4) { + DstTraits::store4x(c0, c1, c2, c3, dst, bias0, bias1); ++#ifdef SK_CPU_BENDIAN ++ SkEndianSwap32s(dst, 4); ++#endif + dst += 4; + + c0 = c0 + dc4; +@@ -37,12 +40,23 @@ + n -= 4; + } + if (n & 2) { +- DstTraits::store(c0, dst++, bias0); +- DstTraits::store(c1, dst++, bias1); ++ DstTraits::store(c0, dst, bias0); ++#ifdef SK_CPU_BENDIAN ++ *dst = SkEndianSwap32(*dst); ++#endif ++ ++dst; ++ DstTraits::store(c1, dst, bias1); ++#ifdef SK_CPU_BENDIAN ++ *dst = SkEndianSwap32(*dst); ++#endif ++ ++dst; + c0 = c0 + dc2; + } + if (n & 1) { + DstTraits::store(c0, dst, bias0); ++#ifdef SK_CPU_BENDIAN ++ *dst = SkEndianSwap32(*dst); ++#endif + } + } + + diff --git a/SOURCES/node-stdout-nonblocking-wrapper b/SOURCES/node-stdout-nonblocking-wrapper new file mode 100755 index 0000000..e36d134 --- /dev/null +++ b/SOURCES/node-stdout-nonblocking-wrapper @@ -0,0 +1,3 @@ +#!/bin/sh +#exec /usr/bin/node "$@" 2>&1 | cat - +exec $MOZ_NODEJS "$@" 2>&1 | cat - diff --git a/SOURCES/nss-setup-flags-env.inc b/SOURCES/nss-setup-flags-env.inc new file mode 100644 index 0000000..c3624b1 --- /dev/null +++ b/SOURCES/nss-setup-flags-env.inc @@ -0,0 +1,7 @@ +sed -i 's@%{gtk3_install_path}@%{_buildrootdir}%{gtk3_install_path}@g' %{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig/nss*.pc + +export LDFLAGS="-L%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS" +export LDFLAGS="-Wl,-rpath,%{gtk3_install_path}/%{_lib} $LDFLAGS" +export LDFLAGS="-Wl,-rpath-link,%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS" +export PKG_CONFIG_PATH=%{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig +export PATH="{_buildrootdir}%{gtk3_install_path}/bin:$PATH" diff --git a/SOURCES/process-official-tarball b/SOURCES/process-official-tarball new file mode 100755 index 0000000..449e7bb --- /dev/null +++ b/SOURCES/process-official-tarball @@ -0,0 +1,23 @@ +#!/bin/sh + +rm -rf ./process-tarball-dir +mkdir ./process-tarball-dir +tar -xJf $1 --directory process-tarball-dir + +rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfa/0030-isvalid.html +rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfa/0008-isvalid.html +rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfalite/0030-isvalid.html +rm -vf ./process-tarball-dir/*/testing/web-platform/tests/css/css-ui/support/cursors/woolly-64.svg +rm -vf ./process-tarball-dir/*/testing/web-platform/tests/css/css-ui/support/cursors/woolly.svg +rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfa/0230-novalid.html +rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfa/0231-isvalid.html +rm -vf ./process-tarball-dir/*/layout/inspector/tests/chrome/test_fontVariationsAPI.css + +processed_tarball=${1/source/processed-source} + +cd ./process-tarball-dir +tar -cf - ./* | xz -9 -T 0 -f > $processed_tarball +mv $processed_tarball .. +cd .. + +rm -rf ./process-tarball-dir diff --git a/SOURCES/python-2.7-gcc8-fix.patch b/SOURCES/python-2.7-gcc8-fix.patch new file mode 100644 index 0000000..d4da520 --- /dev/null +++ b/SOURCES/python-2.7-gcc8-fix.patch @@ -0,0 +1,57 @@ +commit 0b91f8a668201fc58fa732b8acc496caedfdbae0 +Author: Florian Weimer +Date: Sun Apr 29 12:18:33 2018 -0700 + + Indicate that _PyGC_Head is only 8-byte aligned. (closes bpo-33374) + + By spec, the "long double" in _PyGC_Head requires the union to always be 16-byte + aligned. However, obmalloc only yields 8-byte alignment. Compilers including GCC + 8 are starting to use alignment information to do store-merging. So, the "long + double" needs to be changed to a simple "double" as was long ago done in Python + 3 by e348c8d154cf6342c79d627ebfe89dfe9de23817. For 2.7, we need to add some + dummy padding to make sure _PyGC_Head stays the same size. + +diff --git a/Include/objimpl.h b/Include/objimpl.h +index 5f28683329..cbf6bc3f87 100644 +--- Python-2.7.13/Include/objimpl.h ++++ Python-2.7.13/Include/objimpl.h +@@ -248,6 +248,20 @@ PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t); + /* for source compatibility with 2.2 */ + #define _PyObject_GC_Del PyObject_GC_Del + ++/* ++ * Former over-aligned definition of PyGC_Head, used to compute the size of the ++ * padding for the new version below. ++ */ ++union _gc_head; ++union _gc_head_old { ++ struct { ++ union _gc_head_old *gc_next; ++ union _gc_head_old *gc_prev; ++ Py_ssize_t gc_refs; ++ } gc; ++ long double dummy; ++}; ++ + /* GC information is stored BEFORE the object structure. */ + typedef union _gc_head { + struct { +@@ -255,7 +269,8 @@ typedef union _gc_head { + union _gc_head *gc_prev; + Py_ssize_t gc_refs; + } gc; +- long double dummy; /* force worst-case alignment */ ++ double dummy; /* Force at least 8-byte alignment. */ ++ char dummy_padding[sizeof(union _gc_head_old)]; + } PyGC_Head; + + extern PyGC_Head *_PyGC_generation0; +diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-04-29-12-07-00.bpo-33374.-xegL6.rst b/Misc/NEWS.d/next/Core and Builtins/2018-04-29-12-07-00.bpo-33374.-xegL6.rst +new file mode 100644 +index 0000000000..9ec1a605c8 +--- /dev/null ++++ Python-2.7.13/Misc/NEWS.d/next/Core and Builtins/2018-04-29-12-07-00.bpo-33374.-xegL6.rst +@@ -0,0 +1,3 @@ ++Tweak the definition of PyGC_Head, so compilers do not believe it is always ++16-byte aligned on x86. This prevents crashes with more aggressive ++optimizations present in GCC 8. diff --git a/SOURCES/python-2.7.patch b/SOURCES/python-2.7.patch new file mode 100644 index 0000000..cad1c67 --- /dev/null +++ b/SOURCES/python-2.7.patch @@ -0,0 +1,17 @@ +diff -up Python-2.7.13/configure.build Python-2.7.13/configure +--- Python-2.7.13/configure.build 2019-06-04 13:32:12.772134075 +0200 ++++ Python-2.7.13/configure 2019-06-04 13:32:26.140144601 +0200 +@@ -6018,11 +6018,11 @@ then + # debug builds. + OPT="-g -O0 -Wall $STRICT_PROTO" + else +- OPT="-g $WRAP -O3 -Wall $STRICT_PROTO" ++ OPT="-g $WRAP -O2 -Wall $STRICT_PROTO" + fi + ;; + *) +- OPT="-O3 -Wall $STRICT_PROTO" ++ OPT="-O2 -Wall $STRICT_PROTO" + ;; + esac + case $ac_sys_system in diff --git a/SOURCES/python-encode.patch b/SOURCES/python-encode.patch new file mode 100644 index 0000000..2f3bad9 --- /dev/null +++ b/SOURCES/python-encode.patch @@ -0,0 +1,12 @@ +diff -up firefox-68.0/python/mozbuild/mozbuild/controller/building.py.old firefox-68.0/python/mozbuild/mozbuild/controller/building.py +--- firefox-68.0/python/mozbuild/mozbuild/controller/building.py.old 2019-05-29 10:46:55.403262995 +0200 ++++ firefox-68.0/python/mozbuild/mozbuild/controller/building.py 2019-05-29 10:47:42.691176970 +0200 +@@ -571,7 +571,7 @@ class TerminalLoggingHandler(logging.Han + if self.footer: + self.footer.clear() + +- self.fh.write(msg) ++ self.fh.write(msg.encode("utf-8")) + self.fh.write('\n') + + if self.footer: diff --git a/SOURCES/python-missing-utimensat.patch b/SOURCES/python-missing-utimensat.patch new file mode 100644 index 0000000..d19ecab --- /dev/null +++ b/SOURCES/python-missing-utimensat.patch @@ -0,0 +1,12 @@ +diff -up python3/Python-3.6.8/configure.old python3/Python-3.6.8/configure +--- Python-3.6.8/configure.old 2019-10-01 12:56:35.074551835 +0200 ++++ Python-3.6.8/configure 2019-10-01 12:56:44.240517798 +0200 +@@ -11438,7 +11438,7 @@ for ac_func in alarm accept4 setitimer g + sigaction sigaltstack siginterrupt sigpending sigrelse \ + sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \ + sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ +- truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ ++ truncate uname unlinkat unsetenv utimes waitid waitpid wait3 wait4 \ + wcscoll wcsftime wcsxfrm wmemcmp writev _getpty + do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` diff --git a/SOURCES/rhbz-1173156.patch b/SOURCES/rhbz-1173156.patch new file mode 100644 index 0000000..c35d901 --- /dev/null +++ b/SOURCES/rhbz-1173156.patch @@ -0,0 +1,12 @@ +diff -up firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp.rhbz-1173156 firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp +--- firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp.rhbz-1173156 2019-01-22 10:36:09.284069020 +0100 ++++ firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp 2019-01-22 10:37:12.669757744 +0100 +@@ -161,7 +161,7 @@ nsresult nsAuthSambaNTLM::SpawnNTLMAuthH + const char* username = PR_GetEnv("USER"); + if (!username) return NS_ERROR_FAILURE; + +- const char* const args[] = {"ntlm_auth", ++ const char* const args[] = {"/usr/bin/ntlm_auth", + "--helper-protocol", + "ntlmssp-client-1", + "--use-cached-creds", diff --git a/SOURCES/rhbz-1821418.patch b/SOURCES/rhbz-1821418.patch new file mode 100644 index 0000000..8b02dfb --- /dev/null +++ b/SOURCES/rhbz-1821418.patch @@ -0,0 +1,36 @@ +diff -up firefox-78.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418 firefox-78.0/xpcom/base/AvailableMemoryTracker.cpp +--- firefox-78.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418 2020-06-17 04:20:44.000000000 +0200 ++++ firefox-78.0/xpcom/base/AvailableMemoryTracker.cpp 2020-06-25 14:50:46.369798294 +0200 +@@ -157,8 +157,12 @@ bool nsAvailableMemoryWatcher::IsVirtual + + /* static */ + bool nsAvailableMemoryWatcher::IsCommitSpaceLow(const MEMORYSTATUSEX& aStat) { +- if ((kLowCommitSpaceThreshold != 0) && +- (aStat.ullAvailPageFile < kLowCommitSpaceThreshold)) { ++ const char* threshold = getenv("MOZ_GC_THRESHOLD"); ++ if (threshold) { ++ kLowCommitSpaceThreshold = atoi(threshold); ++ } ++ ++ if ((kLowCommitSpaceThreshold == 0) || (aStat.ullAvailPageFile < kLowCommitSpaceThreshold)) { + sNumLowCommitSpaceEvents++; + CrashReporter::AnnotateCrashReport( + CrashReporter::Annotation::LowCommitSpaceEvents, +@@ -210,12 +214,15 @@ void nsAvailableMemoryWatcher::AdjustPol + // polling interval accordingly. + NS_IMETHODIMP + nsAvailableMemoryWatcher::Notify(nsITimer* aTimer) { ++ const char* threshold = getenv("MOZ_GC_THRESHOLD"); ++ bool forceLowMem = (threshold && atoi(threshold) == 0); ++ + MEMORYSTATUSEX stat; + stat.dwLength = sizeof(stat); + bool success = GlobalMemoryStatusEx(&stat); + +- if (success) { +- bool lowMemory = IsVirtualMemoryLow(stat) || IsCommitSpaceLow(stat); ++ if (success || forceLowMemory) { ++ bool lowMemory = IsVirtualMemoryLow(stat) || IsCommitSpaceLow(stat || forceLowMem); + + if (lowMemory) { + SendMemoryPressureEvent(); diff --git a/SPECS/firefox.spec b/SPECS/firefox.spec new file mode 100644 index 0000000..0569e4c --- /dev/null +++ b/SPECS/firefox.spec @@ -0,0 +1,1988 @@ +# Set for local builds only +%global disable_toolsets 0 + +%global build_with_clang 0 +%ifarch i686 +# no debug package for the i686 because oom on i686 with debuginfos +%global debug_package %{nil} +%endif + +%{lua: +function dist_to_rhel_minor(str, start) + match = string.match(str, ".module%+el8.%d+") + if match then + return string.sub(match, 13) + end + match = string.match(str, ".el8_%d+") + if match then + return string.sub(match, 6) + end + match = string.match(str, ".el8") + if match then + return 5 + end + match = string.match(str, ".el9") + if match then + return 4 + end + return -1 +end} + +%global rhel_minor_version %{lua:print(dist_to_rhel_minor(rpm.expand("%dist")))} + +%global system_nss 1 +%global bundle_nss 0 + +%if 0%{?rhel} >= 8 + %if %{rhel_minor_version} < 2 +%global bundle_nss 1 + %endif +%endif + +%define use_bundled_ffi 0 + +%define use_bundled_python_2 1 +%define use_bundled_python_3 1 + +%if 0%{?rhel} >= 8 +%define use_bundled_python_2 1 +%define use_bundled_python_3 0 +%endif + +%if 0%{?rhel} == 7 +%define use_bundled_python_2 0 +%define use_bundled_python_3 0 +%endif + +%if 0%{?flatpak:1} +%define use_bundled_python_2 1 +%endif + +# we need python2 because of icu data gen +%define use_bundled_python_2 0 + +%define bundle_gnome_extension 0 + +# Don't use system hunspell for now +%global system_hunspell 0 +%global system_sqlite 0 +%if 0%{?rhel} >= 8 +%global use_llvmts 0 +%else +%global use_llvmts 1 +%endif + +%global system_ffi 1 +%if 0%{?rhel} < 8 +%global use_dts 1 +%endif + +%global use_rustts 1 +%global dts_version 8 +%global rust_version 1.41 +%global rust_toolset_version 1.41 +%global llvm_version 7.0 +%if 0%{?rhel} >= 8 +%global llvm_version 6.0 +%endif + +%if 0%{?disable_toolsets} +%global use_rustts 0 +%global use_dts 0 +%global use_llvmts 0 +%endif + +# Use system cairo? +%global system_cairo 0 + +# Use system libvpx? +%global system_libvpx 0 + +# Use system libicu? +%global system_libicu 0 + +# Big endian platforms +%ifarch ppc64 s390x +# Javascript Intl API is not supported on big endian platforms right now: +# https://bugzilla.mozilla.org/show_bug.cgi?id=1322212 +%global big_endian 1 +%endif + +# Hardened build? +%global hardened_build 1 + +%global system_jpeg 1 + +%ifarch %{ix86} x86_64 +%global run_tests 0 +%else +%global run_tests 0 +%endif + +# Build as a debug package? +%global debug_build 0 + +#%%global default_bookmarks_file %%{_datadir}/bookmarks/default-bookmarks.html +# need to use full path because of flatpak where datadir is /app/share +%global default_bookmarks_file /usr/share/bookmarks/default-bookmarks.html +%global firefox_app_id \{ec8030f7-c20a-464f-9b0e-13a3a9e97384\} +# Minimal required versions +%global cairo_version 1.13.1 +%global freetype_version 2.1.9 +%if %{?system_libvpx} +%global libvpx_version 1.4.0 +%endif + +%if 0%{?system_nss} +%global nspr_version 4.25 +# NSS/NSPR quite often ends in build override, so as requirement the version +# we're building against could bring us some broken dependencies from time to time. +#%%global nspr_build_version %%(pkg-config --silence-errors --modversion nspr 2>/dev/null || echo 65536) +%global nspr_build_version %{nspr_version} +%global nss_version 3.53.1 +#%%global nss_build_version %%(pkg-config --silence-errors --modversion nss 2>/dev/null || echo 65536) +%global nss_build_version %{nss_version} +%endif + +%if %{?system_sqlite} +%global sqlite_version 3.8.4.2 +# The actual sqlite version (see #480989): +%global sqlite_build_version %(pkg-config --silence-errors --modversion sqlite3 2>/dev/null || echo 65536) +%endif + +%define bundled_python_version_2 2.7.13 +%define bundled_python_version_3 3.6.8 +%define use_bundled_openssl 0 +%define use_bundled_nodejs 0 +%define use_bundled_yasm 0 + +%if 0%{?rhel} >= 8 + %if %{rhel_minor_version} <= 2 +%define use_bundled_nodejs 1 + %endif +%endif + +%if 0%{?rhel} == 7 +%define use_bundled_nodejs 1 +%define use_bundled_yasm 1 +%endif + +# GTK3 bundling +%define avoid_bundled_rebuild 0 + +%define gtk3_nvr 3.22.26-1 +%define gtk3_install_path %{mozappdir}/bundled + +# We could use %%include, but in %%files, %%post and other sections, but in these +# sections it could lead to syntax errors about unclosed %%if. Work around it by +# using the following macro +%define include_file() %{expand:%(cat '%1')} + +%global mozappdir %{_libdir}/%{name} +%global mozappdirdev %{_libdir}/%{name}-devel-%{version} +%global langpackdir %{mozappdir}/langpacks +%global tarballdir %{name}-%{version} +%global pre_version esr +#global pre_tag alpha + +%global official_branding 1 +%global build_langpacks 1 + +%global enable_mozilla_crashreporter 0 +%if !%{debug_build} +%ifarch %{ix86} x86_64 +%global enable_mozilla_crashreporter 0 +%endif +%endif + +Summary: Mozilla Firefox Web browser +Name: firefox +Version: 78.13.0 +Release: 3%{?dist} +URL: https://www.mozilla.org/firefox/ +License: MPLv1.1 or GPLv2+ or LGPLv2+ +%if 0%{?rhel} == 7 +ExcludeArch: s390 ppc +%endif + +# We can't use the official tarball as it contains some test files that use +# licenses that are rejected by Red Hat Legal. +# The official tarball has to be always processed by the process-official-tarball +# script. +# Link to official tarball: https://hg.mozilla.org/releases/mozilla-release/archive/firefox-%%{version}%%{?pre_version}.source.tar.xz +Source0: firefox-%{version}%{?pre_version}.processed-source.tar.xz +%if %{build_langpacks} +Source1: firefox-langpacks-%{version}%{?pre_version}-20210805.tar.xz +%endif +Source2: cbindgen-vendor-0.14.3.tar.xz +Source3: process-official-tarball +Source10: firefox-mozconfig +Source12: firefox-redhat-default-prefs.js +Source20: firefox.desktop +Source21: firefox.sh.in +Source23: firefox.1 +Source24: mozilla-api-key +Source25: firefox-symbolic.svg +Source26: distribution.ini +Source27: google-api-key +Source28: node-stdout-nonblocking-wrapper + +Source200: gtk3-private-%{gtk3_nvr}.el6.src.rpm +Source201: gtk3-private-%{gtk3_nvr}-post.inc +Source202: gtk3-private-%{gtk3_nvr}-postun.inc +Source203: gtk3-private-%{gtk3_nvr}-posttrans.inc +Source204: gtk3-private-%{gtk3_nvr}-files.inc +Source205: gtk3-private-%{gtk3_nvr}-setup-flags-env.inc +Source206: gtk3-private-%{gtk3_nvr}-requires-provides-filter.inc +Source301: yasm-1.2.0-3.el5.src.rpm +Source303: libffi-3.0.13-18.el7_3.src.rpm +Source304: nodejs-10.21.0-5.fc32.src.rpm +Source305: openssl-1.0.2k-19.6.bundle.el7_7.src.rpm + +Source403: nss-3.53.1-3.fc32.src.rpm +Source401: nss-setup-flags-env.inc +Source402: nspr-4.25.0-1.el8_0.src.rpm +#Python +%if 0%{?use_bundled_python_2} +Source100: https://www.python.org/ftp/python/%{bundled_python_version_2}/Python-%{bundled_python_version_2}.tar.xz +%endif +%if 0%{?use_bundled_python_3} +Source101: https://www.python.org/ftp/python/%{bundled_python_version_3}/Python-%{bundled_python_version_3}.tar.xz +%endif +# Build patches +Patch1000: python-2.7.patch +Patch1001: build-ppc64le-inline.patch +Patch1002: python-2.7-gcc8-fix.patch +Patch1003: python-missing-utimensat.patch +Patch1004: build-icu-make.patch +Patch1006: D89554-autoconf1.diff +Patch1007: D94538-autoconf2.diff +# workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1699374 +Patch4: build-mozconfig-fix.patch +Patch6: build-nss-version.patch +Patch7: firefox-debugedits-error.patch + +# Fedora/RHEL specific patches +Patch215: firefox-enable-addons.patch +Patch219: rhbz-1173156.patch +Patch224: mozilla-1170092.patch +#ARM run-time patch +Patch231: firefox-pipewire.patch +Patch232: firefox-rhel6-hugepage.patch +Patch233: firefox-rhel6-nss-tls1.3.patch +Patch234: rhbz-1821418.patch +Patch235: firefox-pipewire-0-3.patch +Patch236: firefox-nss-addon-hack.patch +Patch237: firefox-glibc-dynstack.patch + +# Upstream patches +Patch402: mozilla-1196777.patch + +Patch501: python-encode.patch +Patch503: mozilla-s390-context.patch +Patch505: mozilla-bmo1005535.patch +Patch506: mozilla-bmo1504834-part1.patch +Patch507: mozilla-bmo1504834-part2.patch +Patch508: mozilla-bmo1504834-part3.patch +Patch509: mozilla-bmo1504834-part4.patch +Patch510: mozilla-bmo1554971.patch +Patch511: mozilla-bmo1602730.patch +Patch512: mozilla-bmo849632.patch +Patch513: mozilla-bmo998749.patch +Patch514: mozilla-s390x-skia-gradient.patch +Patch515: mozilla-bmo1626236.patch +Patch516: D87019-thin-vec-big-endian.diff +Patch517: mozilla-1703636-slot-fail-workaround.patch +Patch518: D110204-fscreen.diff +Patch519: D117297-clone3.diff + +# Flatpak patches + +%if %{?system_nss} +%if !0%{?bundle_nss} +BuildRequires: pkgconfig(nspr) >= %{nspr_version} +BuildRequires: pkgconfig(nss) >= %{nss_version} +BuildRequires: nss-static >= %{nss_version} +%endif +%endif +%if %{?system_cairo} +BuildRequires: pkgconfig(cairo) >= %{cairo_version} +%endif +BuildRequires: pkgconfig(libpng) +BuildRequires: xz +BuildRequires: libXt-devel +BuildRequires: mesa-libGL-devel +Requires: liberation-fonts-common +Requires: liberation-sans-fonts +%if %{?system_jpeg} +BuildRequires: libjpeg-devel +%endif +BuildRequires: zip +BuildRequires: bzip2-devel +BuildRequires: pkgconfig(zlib) +BuildRequires: pkgconfig(gtk+-2.0) +BuildRequires: krb5-devel +BuildRequires: pkgconfig(pango) +BuildRequires: pkgconfig(freetype2) >= %{freetype_version} +BuildRequires: pkgconfig(xt) +BuildRequires: pkgconfig(xrender) +%if %{?system_hunspell} +BuildRequires: hunspell-devel +%endif +BuildRequires: pkgconfig(libstartup-notification-1.0) +BuildRequires: pkgconfig(libnotify) +BuildRequires: pkgconfig(dri) +BuildRequires: pkgconfig(libcurl) +BuildRequires: dbus-glib-devel +%if %{?system_libvpx} +BuildRequires: libvpx-devel >= %{libvpx_version} +%endif +BuildRequires: pkgconfig(libpulse) +BuildRequires: m4 + +%if 0%{?use_dts} +BuildRequires: devtoolset-%{dts_version}-gcc-c++ +BuildRequires: devtoolset-%{dts_version}-gcc +BuildRequires: devtoolset-%{dts_version}-binutils +BuildRequires: devtoolset-%{dts_version}-libatomic-devel +%if 0%{?use_llvmts} +BuildRequires: llvm-toolset-%{llvm_version} +BuildRequires: llvm-toolset-%{llvm_version}-llvm-devel +%endif +%endif + +BuildRequires: scl-utils +BuildRequires: findutils + + +%if 0%{?rhel} >= 8 +BuildRequires: cargo +BuildRequires: rust >= %{rust_version} +BuildRequires: llvm >= %{llvm_version} +BuildRequires: llvm-devel >= %{llvm_version} +BuildRequires: clang >= %{llvm_version} +BuildRequires: clang-devel >= %{llvm_version} +BuildRequires: rustfmt >= %{rust_version} +BuildRequires: python3 +BuildRequires: nodejs >= 10.21 +%else +%if 0%{?use_rustts} +BuildRequires: rust-toolset-%{rust_toolset_version} +%endif +%if 0%{?rhel} == 7 +#BuildRequires: rh-nodejs12 +%endif +%if 0%{?use_llvmts} +BuildRequires: llvm-toolset-%{llvm_version} +BuildRequires: llvm-toolset-%{llvm_version}-llvm-devel +%endif +%endif + +%if ! 0%{?use_bundled_yasm} +BuildRequires: yasm +%endif + +%if 0%{?use_bundled_python_2} +# Needed for Python in RHEL6 +BuildRequires: openssl-devel +%endif + +%if 0%{?rhel} >= 8 + %if %{rhel_minor_version} >= 3 +BuildRequires: pkgconfig(libpipewire-0.3) + %else +BuildRequires: pipewire-devel + %endif +%endif + +%if 0%{?bundle_gtk3} +BuildRequires: automake +BuildRequires: autoconf +BuildRequires: cups-devel +BuildRequires: dbus-devel +BuildRequires: desktop-file-utils +BuildRequires: expat-devel +BuildRequires: fontpackages-devel +BuildRequires: gamin-devel +BuildRequires: gettext-devel +BuildRequires: git +BuildRequires: intltool +BuildRequires: jasper-devel +BuildRequires: libepoxy-devel +BuildRequires: libcroco-devel +BuildRequires: libffi-devel +BuildRequires: libpng-devel +BuildRequires: libtiff-devel +BuildRequires: libtool +BuildRequires: libxml2-devel +BuildRequires: libX11-devel +BuildRequires: libXcomposite-devel +BuildRequires: libXcursor-devel +BuildRequires: libXinerama-devel +BuildRequires: libXevie-devel +BuildRequires: libXrandr-devel +BuildRequires: libXrender-devel +BuildRequires: libXtst-devel +BuildRequires: mesa-libGL-devel +BuildRequires: mesa-libEGL-devel +BuildRequires: pixman-devel +BuildRequires: rest-devel +BuildRequires: readline-devel +# TODO: We miss that dependency in our bundled gtk3 package. +# As a hotfix we put it here and fix gtk3 in next release. +Requires: mesa-libEGL%{?_isa} +Requires: libcroco%{?_isa} +Requires: mesa-libGL%{?_isa} +Requires: bzip2-libs%{?_isa} +Requires: libXtst%{?_isa} +%else +BuildRequires: gtk3-devel +BuildRequires: glib2-devel +%endif + +# Bundled nss/nspr requirement +%if 0%{?bundle_nss} +BuildRequires: nss-softokn +BuildRequires: sqlite-devel +BuildRequires: zlib-devel +BuildRequires: pkgconfig +BuildRequires: gawk +BuildRequires: psmisc +BuildRequires: perl-interpreter +BuildRequires: gcc-c++ +BuildRequires: xmlto +%endif +#RHEL9 +BuildRequires: perl-interpreter + +Requires: mozilla-filesystem +Requires: p11-kit-trust +%if %{?system_nss} +%if !0%{?bundle_nss} +Requires: nspr >= %{nspr_build_version} +Requires: nss >= %{nss_build_version} +%endif +%endif + +BuildRequires: desktop-file-utils +BuildRequires: system-bookmarks +Requires: redhat-indexhtml +#for the python2 +BuildRequires: pkgconfig(sqlite3) +%if %{?system_sqlite} +BuildRequires: pkgconfig(sqlite3) >= %{sqlite_version} +Requires: sqlite >= %{sqlite_build_version} +%endif + + +%if %{?run_tests} +BuildRequires: xorg-x11-server-Xvfb +%endif + +%if %{?system_ffi} + %if !%{use_bundled_ffi}0 +BuildRequires: pkgconfig(libffi) + %endif +%endif + +%if %{?use_bundled_nodejs} +%if !0%{?use_bundled_python_3} +BuildRequires: python3-devel +%endif +BuildRequires: zlib-devel +#BuildRequires: brotli-devel +#BuildRequires: gcc >= 4.9.4 +#BuildRequires: gcc-c++ >= 4.9.4 +BuildRequires: chrpath +BuildRequires: libatomic +BuildRequires: openssl-devel +%endif + +%if 0%{?big_endian} +BuildRequires: icu +%endif + +Obsoletes: mozilla <= 37:1.7.13 +Provides: webclient + +# Bundled libraries +Provides: bundled(angle) +Provides: bundled(cairo) +Provides: bundled(graphite2) +Provides: bundled(harfbuzz) +Provides: bundled(ots) +Provides: bundled(sfntly) +Provides: bundled(skia) +Provides: bundled(thebes) +Provides: bundled(WebRender) +Provides: bundled(audioipc-2) +Provides: bundled(ffvpx) +Provides: bundled(kissfft) +Provides: bundled(libaom) +Provides: bundled(libcubeb) +Provides: bundled(libdav1d) +Provides: bundled(libjpeg) +Provides: bundled(libmkv) +Provides: bundled(libnestegg) +Provides: bundled(libogg) +Provides: bundled(libopus) +Provides: bundled(libpng) +Provides: bundled(libsoundtouch) +Provides: bundled(libspeex_resampler) +Provides: bundled(libtheora) +Provides: bundled(libtremor) +Provides: bundled(libvorbis) +Provides: bundled(libvpx) +Provides: bundled(libwebp) +Provides: bundled(libyuv) +Provides: bundled(mp4parse-rust) +Provides: bundled(mtransport) +Provides: bundled(openmax_dl) +Provides: bundled(double-conversion) +Provides: bundled(brotli) +Provides: bundled(fdlibm) +Provides: bundled(freetype2) +Provides: bundled(libmar) +Provides: bundled(woff2) +Provides: bundled(xz-embedded) +Provides: bundled(zlib) +Provides: bundled(expat) +Provides: bundled(msgpack-c) +Provides: bundled(libprio) +Provides: bundled(rlbox_sandboxing_api) +Provides: bundled(sqlite3) + +%description +Mozilla Firefox is an open-source web browser, designed for standards +compliance, performance and portability. + +%if %{enable_mozilla_crashreporter} +%global moz_debug_prefix %{_prefix}/lib/debug +%global moz_debug_dir %{moz_debug_prefix}%{mozappdir} +%global uname_m %(uname -m) +%global symbols_file_name %{name}-%{version}.en-US.%{_os}-%{uname_m}.crashreporter-symbols.zip +%global symbols_file_path %{moz_debug_dir}/%{symbols_file_name} +%global _find_debuginfo_opts -p %{symbols_file_path} -o debugcrashreporter.list +%global crashreporter_pkg_name mozilla-crashreporter-%{name}-debuginfo +%package -n %{crashreporter_pkg_name} +Summary: Debugging symbols used by Mozilla's crash reporter servers +%description -n %{crashreporter_pkg_name} +This package provides debug information for Firefox, for use by +Mozilla's crash reporter servers. If you are trying to locally +debug %{name}, you want to install %{name}-debuginfo instead. +%files -n %{crashreporter_pkg_name} -f debugcrashreporter.list +%endif + +%if %{run_tests} +%global testsuite_pkg_name mozilla-%{name}-testresults +%package -n %{testsuite_pkg_name} +Summary: Results of testsuite +%description -n %{testsuite_pkg_name} +This package contains results of tests executed during build. +%files -n %{testsuite_pkg_name} +/test_results +%endif + +#--------------------------------------------------------------------- + +%if %{?bundle_gnome_extension} +%package -n firefox-gnome-shell-extension +%global firefox_gnome_shell_addon_name addon-751081-latest.xpi +Summary: Support for managing GNOME Shell Extensions through web browsers +Requires: %{name}%{?_isa} = %{version}-%{release} + +License: GPLv3+ +URL: https://wiki.gnome.org/Projects/GnomeShellIntegrationForChrome +Source2: https://addons.mozilla.org/firefox/downloads/latest/gnome-shell-integration/platform:2/%{firefox_gnome_shell_addon_name} + +Requires: dbus +Requires: gnome-icon-theme +Requires: gnome-shell +Requires: hicolor-icon-theme +Requires: mozilla-filesystem + +%description -n firefox-gnome-shell-extension +Browser extension for Firefox and native host messaging connector that provides +integration with GNOME Shell and the corresponding extensions repository +https://extensions.gnome.org. + +%files -n firefox-gnome-shell-extension +%{mozappdir}/distribution/extensions/chrome-gnome-shell@gnome.org.xpi +%endif + +%prep +echo "Build environment" +echo "dist %{?dist}" +echo "RHEL 8 minor version: %{rhel_minor_version}" +echo "use_bundled_ffi %{?use_bundled_ffi}" +echo "use_bundled_python_2 %{?use_bundled_python_2}" +echo "use_bundled_python_3 %{?use_bundled_python_3}" +echo "bundle_nss %{?bundle_nss}" +echo "system_nss %{?system_nss}" +echo "use_rustts %{?use_rustts}" +echo "use_bundled_nodejs %{?use_bundled_nodejs}" +echo "use_bundled_openssl %{?use_bundled_openssl}" +echo "use_bundled_yasm %{?use_bundled_yasm}" + + +%if 0%{?use_bundled_python_2} +%setup -q -T -c -n python2 -a 100 +%patch1000 -p0 -b .build +%patch1002 -p0 -b .gcc8 +%endif +%if 0%{?use_bundled_python_3} +%setup -q -T -c -n python3 -a 101 +%endif +%setup -q -n %{tarballdir} +# Build patches, can't change backup suffix from default because during build +# there is a compare of config and js/config directories and .orig suffix is +# ignored during this compare. +%patch7 -p1 -b .debugedits-error +%ifarch %{ix86} %{arm} ppc +# binary check fails OOM on 32bit arches +%endif + +%patch4 -p1 -b .build-mozconfig-fix +#%patch6 -p1 -b .nss-version + +# Fedora patches +%patch215 -p1 -b .addons +%patch219 -p1 -b .rhbz-1173156 +%patch224 -p1 -b .1170092 + +# fixing /usr/include in the patch for the flatpak build +%if 0%{?flatpak} +sed -ie 's|/usr/include|/app/include|' %_sourcedir/firefox-pipewire-0-3.patch +%endif + +%if 0%{?rhel} >= 8 + %if %{rhel_minor_version} >= 3 +%patch235 -p1 -b .pipewire-0-3 + + %else +%patch231 -p1 -b .pipewire + %endif +%endif +%patch236 -p1 -b .firefox-nss-addon-hack +%patch237 -p1 -b .firefox-glibc-dynstack + + +%patch234 -p1 -b .rhbz-1821418 + +%patch402 -p1 -b .1196777 + +# Patch for big endian platforms only +%if 0%{?big_endian} +%endif + +%patch501 -p1 -b .python-encode +%patch503 -p1 -b .mozilla-s390-context +%patch505 -p1 -b .mozilla-bmo1005535 +%patch506 -p1 -b .mozilla-bmo1504834-part1 +%patch507 -p1 -b .mozilla-bmo1504834-part2 +%patch508 -p1 -b .mozilla-bmo1504834-part3 +%patch509 -p1 -b .mozilla-bmo1504834-part4 +%patch510 -p1 -b .mozilla-bmo1554971 +%patch511 -p1 -b .mozilla-bmo1602730 +%patch512 -p1 -b .mozilla-bmo849632 +%patch513 -p1 -b .mozilla-bmo998749 +%patch514 -p1 -b .mozilla-s390x-skia-gradient +%patch515 -p1 -b .mozilla-bmo1626236 +%patch516 -p1 -b .D87019-thin-vec-big-endian.diff +%patch517 -p1 -b .mozilla-1703636-slot-fail-workaround +%patch518 -p1 -b .D110204-fscreen.diff +%patch519 -p1 -b .D117297-clone3.diff + + +%patch1001 -p1 -b .ppc64le-inline +%patch1004 -p1 -b .icu-make +%patch1006 -p1 -b .D89554-autoconf1.diff +%patch1007 -p1 -b .D94538-autoconf2.diff + +%{__rm} -f .mozconfig +%{__cp} %{SOURCE10} .mozconfig +%if %{official_branding} +echo "ac_add_options --enable-official-branding" >> .mozconfig +%endif +%{__cp} %{SOURCE24} mozilla-api-key +%{__cp} %{SOURCE27} google-api-key + +%if %{?system_nss} +echo "ac_add_options --with-system-nspr" >> .mozconfig +echo "ac_add_options --with-system-nss" >> .mozconfig +%else +echo "ac_add_options --without-system-nspr" >> .mozconfig +echo "ac_add_options --without-system-nss" >> .mozconfig +%endif + +%if %{?system_cairo} +echo "ac_add_options --enable-system-cairo" >> .mozconfig +%else +echo "ac_add_options --disable-system-cairo" >> .mozconfig +%endif + +%if 0%{?use_bundled_ffi} +echo "ac_add_options --enable-system-ffi" >> .mozconfig +%endif +%if 0%{?system_ffi} +echo "ac_add_options --enable-system-ffi" >> .mozconfig +%endif + +%ifarch %{arm} %{ix86} x86_64 +echo "ac_add_options --disable-elf-hack" >> .mozconfig +%endif + +%if %{?system_hunspell} +echo "ac_add_options --enable-system-hunspell" >> .mozconfig +%else +# not available? +#echo "ac_add_options --disable-system-hunspell" >> .mozconfig +%endif + +%if %{?debug_build} +echo "ac_add_options --enable-debug" >> .mozconfig +echo "ac_add_options --disable-optimize" >> .mozconfig +%else +%global optimize_flags "-g -O2" +%ifarch s390 s390x +%global optimize_flags "-g -O1" +%endif +%ifarch armv7hl +# ARMv7 need that (rhbz#1426850) +%global optimize_flags "-g -O2 -fno-schedule-insns" +%endif +%ifarch ppc64le aarch64 +%global optimize_flags "-g -O2" +%endif +%if %{optimize_flags} != "none" +echo 'ac_add_options --enable-optimize=%{?optimize_flags}' >> .mozconfig +%else +echo 'ac_add_options --enable-optimize' >> .mozconfig +%endif +echo "ac_add_options --disable-debug" >> .mozconfig +%endif + +# Second arches fail to start with jemalloc enabled +%ifnarch %{ix86} x86_64 +echo "ac_add_options --disable-jemalloc" >> .mozconfig +%endif + +%ifnarch %{ix86} x86_64 +echo "ac_add_options --disable-webrtc" >> .mozconfig +%endif + +%if !%{enable_mozilla_crashreporter} +echo "ac_add_options --disable-crashreporter" >> .mozconfig +%endif + +%if %{?run_tests} +echo "ac_add_options --enable-tests" >> .mozconfig +%endif + +%if !%{?system_jpeg} +echo "ac_add_options --without-system-jpeg" >> .mozconfig +%else +echo "ac_add_options --with-system-jpeg" >> .mozconfig +%endif + +%if %{?system_libvpx} +echo "ac_add_options --with-system-libvpx" >> .mozconfig +%else +echo "ac_add_options --without-system-libvpx" >> .mozconfig +%endif + +%if %{?system_libicu} +echo "ac_add_options --with-system-icu" >> .mozconfig +%else +echo "ac_add_options --without-system-icu" >> .mozconfig +%endif +%ifarch s390 s390x +echo "ac_add_options --disable-jit" >> .mozconfig +%endif + +%ifnarch %{ix86} +%if !0%{?debug_build} +echo "ac_add_options --disable-debug-symbols" >> .mozconfig +%endif +%endif + +echo 'export NODEJS="%{_buildrootdir}/bin/node-stdout-nonblocking-wrapper"' >> .mozconfig + +# Remove executable bit to make brp-mangle-shebangs happy. +chmod -x third_party/rust/itertools/src/lib.rs +chmod a-x third_party/rust/gfx-backend-vulkan/src/*.rs +chmod a-x third_party/rust/gfx-hal/src/*.rs +chmod a-x third_party/rust/ash/src/extensions/ext/*.rs +chmod a-x third_party/rust/ash/src/extensions/khr/*.rs +chmod a-x third_party/rust/ash/src/extensions/mvk/*.rs +chmod a-x third_party/rust/ash/src/extensions/nv/*.rs + +#--------------------------------------------------------------------- + +%build +# Disable LTO to work around rhbz#1883904 +%define _lto_cflags %{nil} +ulimit -a +free +#set -e + +%if ! 0%{?avoid_bundled_rebuild} + rm -rf %{_buildrootdir}/* +%endif +export PATH="%{_buildrootdir}/bin:$PATH" + +function install_rpms_to_current_dir() { + PACKAGE_RPM=$(eval echo $1) + PACKAGE_DIR=%{_rpmdir} + + if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then + # Hack for tps tests + ARCH_STR=%{_arch} + %ifarch i386 i686 + ARCH_STR="i?86" + %endif + PACKAGE_DIR="$PACKAGE_DIR/$ARCH_STR" + fi + + for package in $(ls $PACKAGE_DIR/$PACKAGE_RPM) + do + echo "$package" + rpm2cpio "$package" | cpio -idu + done +} + +function build_bundled_package() { + PACKAGE_RPM=$1 + PACKAGE_FILES=$2 + PACKAGE_SOURCE=$3 + PACKAGE_BUILD_OPTIONS=$4 + export PACKAGE_DIR="%{_topdir}/RPMS" + + PACKAGE_ALREADY_BUILD=0 + %if %{?avoid_bundled_rebuild} + if ls $PACKAGE_DIR/$PACKAGE_RPM; then + PACKAGE_ALREADY_BUILD=1 + fi + if ls $PACKAGE_DIR/%{_arch}/$PACKAGE_RPM; then + PACKAGE_ALREADY_BUILD=1 + fi + %endif + if [ $PACKAGE_ALREADY_BUILD == 0 ]; then + echo "Rebuilding $PACKAGE_RPM from $PACKAGE_SOURCE"; echo "===============================" + rpmbuild --nodeps $PACKAGE_BUILD_OPTIONS --rebuild $PACKAGE_SOURCE + cat /var/tmp/rpm-tmp* + fi + + find $PACKAGE_DIR + if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then + # Hack for tps tests + ARCH_STR=%{_arch} + %ifarch i386 i686 + ARCH_STR="i?86" + %endif + export PACKAGE_DIR="$PACKAGE_DIR/$ARCH_STR" + fi + pushd $PACKAGE_DIR + + echo "Installing $PACKAGE_DIR/$PACKAGE_RPM"; echo "===============================" + pwd + PACKAGE_LIST=$(echo $PACKAGE_DIR/$PACKAGE_RPM | tr " " "\n") + for PACKAGE in $PACKAGE_LIST + do + rpm2cpio $PACKAGE | cpio -iduv + done + + PATH=$PACKAGE_DIR/usr/bin:$PATH + export PATH + LD_LIBRARY_PATH=$PACKAGE_DIR/usr/%{_lib}:$LD_LIBRARY_PATH + export LD_LIBRARY_PATH + + # Clean rpms to avoid including them to package + %if ! 0%{?avoid_bundled_rebuild} + rm -f $PACKAGE_FILES + %endif + + popd +} + +# Build and install local yasm if needed +# ====================================== +%if 0%{?use_bundled_yasm} + build_bundled_package 'yasm-1*.rpm' 'yasm-*.rpm' '%{SOURCE301}' +%endif + +%if 0%{?bundle_nss} + rpm -ivh %{SOURCE402} + #rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' --without=tests -ba %{_specdir}/nspr.spec + rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' -ba %{_specdir}/nspr.spec + pushd %{_buildrootdir} + install_rpms_to_current_dir nspr-4*.rpm + install_rpms_to_current_dir nspr-devel*.rpm + popd + echo "Setting nspr flags" + # nss-setup-flags-env.inc + sed -i 's@%{gtk3_install_path}@%{_buildrootdir}%{gtk3_install_path}@g' %{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig/nspr*.pc + + export LDFLAGS="-L%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS" + export LDFLAGS="-Wl,-rpath,%{gtk3_install_path}/%{_lib} $LDFLAGS" + export LDFLAGS="-Wl,-rpath-link,%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS" + export PKG_CONFIG_PATH=%{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig + export PATH="{_buildrootdir}%{gtk3_install_path}/bin:$PATH" + + export PATH=%{_buildrootdir}/%{gtk3_install_path}/bin:$PATH + echo $PKG_CONFIG_PATH + + rpm -ivh %{SOURCE403} + rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' -ba %{_specdir}/nss.spec + pushd %{_buildrootdir} + #cleanup + #rm -rf {_buildrootdir}/usr/lib/debug/* + #rm -rf {_buildrootdir}/usr/lib/.build-id + #install_rpms_to_current_dir nss-%{gtk3_nvr}*.rpm + #install_rpms_to_current_dir nss-devel-%{gtk3_nvr}*.rpm + install_rpms_to_current_dir nss-3*.rpm + install_rpms_to_current_dir nss-devel*.rpm + install_rpms_to_current_dir nss-pkcs11-devel*.rpm + install_rpms_to_current_dir nss-softokn-3*.rpm + install_rpms_to_current_dir nss-softokn-devel*.rpm + install_rpms_to_current_dir nss-softokn-freebl-3*.rpm + install_rpms_to_current_dir nss-softokn-freebl-devel*.rpm + install_rpms_to_current_dir nss-util-3*.rpm + install_rpms_to_current_dir nss-util-devel*.rpm + popd + %filter_provides_in %{gtk3_install_path}/%{_lib} + %filter_requires_in %{gtk3_install_path}/%{_lib} + %filter_from_requires /libnss3.so.*/d + %filter_from_requires /libsmime3.so.*/d + %filter_from_requires /libssl3.so.*/d + %filter_from_requires /libnssutil3.so.*/d + %filter_from_requires /libnspr4.so.*/d +%endif + +%if 0%{?bundle_gtk3} + %if ! 0%{?avoid_bundled_rebuild} + rpm -ivh %{SOURCE200} + rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' -ba %{_specdir}/gtk3-private.spec + %endif + pushd %{_buildrootdir} + install_rpms_to_current_dir gtk3-private-%{gtk3_nvr}*.rpm + install_rpms_to_current_dir gtk3-private-devel-%{gtk3_nvr}*.rpm + install_rpms_to_current_dir gtk3-private-rpm-scripts-%{gtk3_nvr}*.rpm + popd +%endif + +%if 0%{?bundle_gtk3} +# gtk3-private-3.22.26.el6-1-requires-provides-filter.inc +%include_file %{SOURCE206} +%endif +%if 0%{use_bundled_ffi} + # Install libraries to the predefined location to later add them to the Firefox libraries + rpm -ivh %{SOURCE303} + rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' -ba %{_specdir}/libffi.spec + pushd %{_buildrootdir} + install_rpms_to_current_dir 'libffi*.rpm' + popd + %filter_from_requires /libffi.so.6/d +%endif +%filter_setup + +# If needed build the bundled python 2.7 and 3.6 and put it in the PATH +%if 0%{?use_bundled_python_3} + pushd %{_builddir}/python3/Python-%{bundled_python_version_3} + ./configure --prefix="%{_buildrootdir}" --exec-prefix="%{_buildrootdir}" --libdir="%{_buildrootdir}/lib" || cat config.log + make %{?_smp_mflags} install V=1 -j1 + cp Tools/scripts/pathfix.py %{_buildrootdir}/bin + popd +%endif +%if 0%{?use_bundled_python_2} + pushd %{_builddir}/python2/Python-%{bundled_python_version_2} + ./configure --prefix="%{_buildrootdir}" --exec-prefix="%{_buildrootdir}" --libdir="%{_buildrootdir}/lib" || cat config.log + make %{?_smp_mflags} install V=1 + popd +%endif + +function replace_prefix() { + FILE_NAME=$1 + PKG_CONFIG_PREFIX=$2 + + cat $FILE_NAME | tail -n +2 > tmp.txt + echo "$PKG_CONFIG_PREFIX" > $FILE_NAME + cat tmp.txt >> $FILE_NAME + rm -rf tmp.txt +} + +# Build and install local openssl if needed +# ========================================= +%if 0%{?use_bundled_openssl} + rpm -ivh %{SOURCE305} + rpmbuild --nodeps -ba %{_specdir}/openssl.spec + pushd %{_buildrootdir} + install_rpms_to_current_dir openssl-1.0.2k*.rpm + install_rpms_to_current_dir openssl-libs-1.0.2k*.rpm + install_rpms_to_current_dir openssl-devel-1.0.2k*.rpm + install_rpms_to_current_dir openssl-static-1.0.2k*.rpm + # openssl is installed to %{_buildrootdir}/usr/lib(64)/... + export PKG_CONFIG_PATH=%{_buildrootdir}/%{_libdir}/pkgconfig/:$PKG_CONFIG_PATH + replace_prefix %{_buildrootdir}/%{_libdir}/pkgconfig/libcrypto.pc prefix=%{_buildrootdir}/usr + replace_prefix %{_buildrootdir}/%{_libdir}/pkgconfig/libssl.pc prefix=%{_buildrootdir}/usr + replace_prefix %{_buildrootdir}/%{_libdir}/pkgconfig/openssl.pc prefix=%{_buildrootdir}/usr + cat %{_buildrootdir}/%{_libdir}/pkgconfig/libcrypto.pc + cat %{_buildrootdir}/%{_libdir}/pkgconfig/libssl.pc + cat %{_buildrootdir}/%{_libdir}/pkgconfig/openssl.pc + pushd %{_rpmdir} + rm -f openssl-*.rpm + popd + popd +%endif + +# We need to disable exit on error temporarily for the following scripts: +set +e +%if 0%{?use_dts} +source scl_source enable devtoolset-%{dts_version} +%endif +%if 0%{?use_rustts} +source scl_source enable rust-toolset-%{rust_toolset_version} +%endif + +env +which gcc +which c++ +which g++ +which ld +# Build and install local node if needed +# ====================================== +%if %{use_bundled_nodejs} + build_bundled_package 'nodejs-10*.rpm' 'nodejs-*.rpm npm-*.rpm' %{SOURCE304} "--with bootstrap" + export MOZ_NODEJS=$PACKAGE_DIR/usr/bin/node +%else + export MOZ_NODEJS=/usr/bin/node +%endif + +mkdir -p my_rust_vendor +cd my_rust_vendor +%{__tar} xf %{SOURCE2} +cd - +mkdir -p .cargo +cat > .cargo/config < 23 +# Disable null pointer gcc6 optimization in gcc6 (rhbz#1328045) +MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -fno-delete-null-pointer-checks" +%endif +# Use hardened build? +%if %{?hardened_build} +MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -fPIC -Wl,-z,relro -Wl,-z,now" +%endif +%if %{?debug_build} +MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-O2//') +%endif +%ifarch s390 +MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-g/-g1/') +# If MOZ_DEBUG_FLAGS is empty, firefox's build will default it to "-g" which +# overrides the -g1 from line above and breaks building on s390 +# (OOM when linking, rhbz#1238225) +export MOZ_DEBUG_FLAGS=" " +%endif + +# We don't wantfirefox to use CK_GCM_PARAMS_V3 in nss +MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -DNSS_PKCS11_3_0_STRICT" + +%if !%{build_with_clang} +%ifarch s390 %{arm} ppc aarch64 i686 x86_64 s390x +MOZ_LINK_FLAGS="-Wl,--no-keep-memory -Wl,--reduce-memory-overheads" +%endif +%ifarch %{arm} i686 +MOZ_LINK_FLAGS="-Wl,--no-keep-memory -Wl,--strip-debug" +echo "ac_add_options --enable-linker=gold" >> .mozconfig +%endif +%endif + +%ifarch %{arm} i686 +export RUSTFLAGS="-Cdebuginfo=0" +%endif +export CFLAGS=$MOZ_OPT_FLAGS +export CXXFLAGS=$MOZ_OPT_FLAGS +export LDFLAGS=$MOZ_LINK_FLAGS + +export PREFIX='%{_prefix}' +export LIBDIR='%{_libdir}' + +%if %{build_with_clang} +echo "export LLVM_PROFDATA=\"llvm-profdata\"" >> .mozconfig +echo "export AR=\"llvm-ar\"" >> .mozconfig +echo "export NM=\"llvm-nm\"" >> .mozconfig +echo "export RANLIB=\"llvm-ranlib\"" >> .mozconfig +%else +echo "export CC=gcc" >> .mozconfig +echo "export CXX=g++" >> .mozconfig +echo "export AR=\"gcc-ar\"" >> .mozconfig +echo "export NM=\"gcc-nm\"" >> .mozconfig +echo "export RANLIB=\"gcc-ranlib\"" >> .mozconfig +%endif + +MOZ_SMP_FLAGS=-j1 +# More than two build tasks can lead to OOM gcc crash. +%if 0%{?rhel} < 8 +[ -z "$RPM_BUILD_NCPUS" ] && \ + RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`" +[ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2 +%else +%ifarch %{ix86} x86_64 ppc ppc64 ppc64le aarch64 +[ -z "$RPM_BUILD_NCPUS" ] && \ + RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`" +[ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2 +[ "$RPM_BUILD_NCPUS" -ge 4 ] && MOZ_SMP_FLAGS=-j3 +[ "$RPM_BUILD_NCPUS" -ge 8 ] && MOZ_SMP_FLAGS=-j3 +%endif +%endif + +cat /proc/meminfo + +# Free memory in kB +if grep -q MemAvailable /proc/meminfo; then + MEM_AVAILABLE=$(grep MemAvailable /proc/meminfo | awk '{ print $2 }') +else + MEM_AVAILABLE=$(grep MemFree /proc/meminfo | awk '{ print $2 }') +fi + +# Usually the compiler processes can take 2 GB of memory at peaks +TASK_SIZE=4000000 +MEM_CONSTRAINED_JOBS=$(( MEM_AVAILABLE / TASK_SIZE )) + +if [ $MEM_CONSTRAINED_JOBS -le 0 ]; then + MEM_CONSTRAINED_JOBS=1 +fi + +CPU_AVAILABLE=$(/usr/bin/getconf _NPROCESSORS_ONLN) +# Pick the minimum from available CPUs or memory constrained number of jobs +MOZ_SMP_FLAGS=-j$([ "$CPU_AVAILABLE" -le "$MEM_CONSTRAINED_JOBS" ] && echo "$CPU_AVAILABLE" || echo "$MEM_CONSTRAINED_JOBS") +#MOZ_SMP_FLAGS=-j16 + +%if 0%{?bundle_gtk3} +# gtk3-private-setup-flags-env.inc +%include_file %{SOURCE205} +%endif + +%if 0%{?bundle_nss} +echo "Setting nss flags" +# nss-setup-flags-env.inc +%include_file %{SOURCE401} +export PATH=%{_buildrootdir}/%{gtk3_install_path}/bin:$PATH +echo $PKG_CONFIG_PATH +%endif + +export MOZ_MAKE_FLAGS="$MOZ_SMP_FLAGS" +export MOZ_SERVICES_SYNC="1" +# we need to strip the sources on i686 because to we don't use rpm to generate debugsymbols because of oom +%ifnarch i686 i386 +export STRIP=/bin/true +%endif +which node +echo 'export NODEJS="%{_buildrootdir}/bin/node-stdout-nonblocking-wrapper"' +env +ls %{_buildrootdir} + + +%if 0%{?use_llvmts} +scl enable llvm-toolset-%{llvm_version} './mach build -v' +%else +./mach build -v +%endif + +# create debuginfo for crash-stats.mozilla.com +%if %{enable_mozilla_crashreporter} +#cd %{moz_objdir} +make -C objdir buildsymbols +%endif + +%if %{?run_tests} +%if %{?system_nss} +ln -s /usr/bin/certutil objdir/dist/bin/certutil +ln -s /usr/bin/pk12util objdir/dist/bin/pk12util + +%endif +mkdir test_results +./mach --log-no-times check-spidermonkey &> test_results/check-spidermonkey || true +./mach --log-no-times check-spidermonkey &> test_results/check-spidermonkey-2nd-run || true +./mach --log-no-times cppunittest &> test_results/cppunittest || true +xvfb-run ./mach --log-no-times crashtest &> test_results/crashtest || true +./mach --log-no-times gtest &> test_results/gtest || true +xvfb-run ./mach --log-no-times jetpack-test &> test_results/jetpack-test || true +# not working right now ./mach marionette-test &> test_results/marionette-test || true +xvfb-run ./mach --log-no-times mochitest-a11y &> test_results/mochitest-a11y || true +xvfb-run ./mach --log-no-times mochitest-browser &> test_results/mochitest-browser || true +xvfb-run ./mach --log-no-times mochitest-chrome &> test_results/mochitest-chrome || true +xvfb-run ./mach --log-no-times mochitest-devtools &> test_results/mochitest-devtools || true +xvfb-run ./mach --log-no-times mochitest-plain &> test_results/mochitest-plain || true +xvfb-run ./mach --log-no-times reftest &> test_results/reftest || true +xvfb-run ./mach --log-no-times webapprt-test-chrome &> test_results/webapprt-test-chrome || true +xvfb-run ./mach --log-no-times webapprt-test-content &> test_results/webapprt-test-content || true +./mach --log-no-times webidl-parser-test &> test_results/webidl-parser-test || true +xvfb-run ./mach --log-no-times xpcshell-test &> test_results/xpcshell-test || true +%if %{?system_nss} +rm -f objdir/dist/bin/certutil +rm -f objdir/dist/bin/pk12util +%endif + +%endif +#--------------------------------------------------------------------- + +%install + +function install_rpms_to_current_dir() { + PACKAGE_RPM=$(eval echo $1) + PACKAGE_DIR=%{_rpmdir} + + if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then + # Hack for tps tests + ARCH_STR=%{_arch} + %ifarch i386 i686 + ARCH_STR="i?86" + %endif + PACKAGE_DIR="$PACKAGE_DIR/$ARCH_STR" + fi + + for package in $(ls $PACKAGE_DIR/$PACKAGE_RPM) + do + echo "$package" + rpm2cpio "$package" | cpio -idu + done +} + +%if 0%{?bundle_gtk3} +pushd %{buildroot} +# Install gtk3-private again to the buildroot, but without devel subpackage +install_rpms_to_current_dir gtk3-private-%{gtk3_nvr}*.rpm +install_rpms_to_current_dir gtk3-private-rpm-scripts-%{gtk3_nvr}*.rpm +popd +%endif + +%if 0%{?bundle_nss} + pushd %{buildroot} + #install_rpms_to_current_dir nss-*.rpm + install_rpms_to_current_dir nspr-4*.rpm + install_rpms_to_current_dir nss-3*.rpm + install_rpms_to_current_dir nss-softokn-3*.rpm + install_rpms_to_current_dir nss-softokn-freebl-3*.rpm + install_rpms_to_current_dir nss-util-3*.rpm + + # cleanup unecessary nss files + #rm -rf %{_buildrootdir}/%{gtk3_install_path}/bin + #rm -rf %{_buildrootdir}/%{gtk3_install_path}/include + rm -rf %{buildroot}/%{gtk3_install_path}/lib/dracut + rm -rf %{buildroot}/%{gtk3_install_path}/%{_lib}/nss + #rm -rf %{_buildrootdir}/%{gtk3_install_path}/%{_lib}/pkgconfig + rm -rf %{buildroot}/%{gtk3_install_path}/%{_lib}/share + rm -rf %{buildroot}/%{gtk3_install_path}/share + rm -rf %{buildroot}/etc/pki + rm -rf %{buildroot}/usr/lib/.build-id + rm -rf %{buildroot}/etc/crypto-policies + popd +%endif + +# Install bundled libffi +%if %{use_bundled_ffi} + pushd %{buildroot} + install_rpms_to_current_dir libffi-3*.rpm + popd +%endif + +# set up our default bookmarks +%{__cp} -p %{default_bookmarks_file} objdir/dist/bin/browser/chrome/en-US/locale/browser/bookmarks.html + +# Make sure locale works for langpacks +%{__cat} > objdir/dist/bin/browser/defaults/preferences/firefox-l10n.js << EOF +pref("general.useragent.locale", "chrome://global/locale/intl.properties"); +EOF + +DESTDIR=%{buildroot} make -C objdir install + +%{__mkdir_p} %{buildroot}{%{_libdir},%{_bindir},%{_datadir}/applications} + +desktop-file-install --dir %{buildroot}%{_datadir}/applications %{SOURCE20} + +# set up the firefox start script +%{__rm} -rf %{buildroot}%{_bindir}/firefox +%{__cat} %{SOURCE21} > %{buildroot}%{_bindir}/firefox +sed -i -e 's|%PREFIX%|%{_prefix}|' %{buildroot}%{_bindir}/firefox +%if 0%{?bundle_gtk3} +sed -i -e 's|%RHEL_ENV_VARS%|export XDG_DATA_DIRS="$MOZ_LIB_DIR/firefox/bundled/share:/usr/share:$XDG_DATA_DIRS"\nexport FONTCONFIG_FILE="$MOZ_LIB_DIR/firefox/bundled/etc/fonts/fonts.conf"|' %{buildroot}%{_bindir}/firefox +%else +sed -i -e 's|%RHEL_ENV_VARS%||' %{buildroot}%{_bindir}/firefox +%endif + +%{__chmod} 755 %{buildroot}%{_bindir}/firefox + +%{__install} -p -D -m 644 %{SOURCE23} %{buildroot}%{_mandir}/man1/firefox.1 + +%{__rm} -f %{buildroot}/%{mozappdir}/firefox-config +%{__rm} -f %{buildroot}/%{mozappdir}/update-settings.ini + +for s in 16 22 24 32 48 256; do + %{__mkdir_p} %{buildroot}%{_datadir}/icons/hicolor/${s}x${s}/apps + %{__cp} -p browser/branding/official/default${s}.png \ + %{buildroot}%{_datadir}/icons/hicolor/${s}x${s}/apps/firefox.png +done + +# Install hight contrast icon +%{__mkdir_p} %{buildroot}%{_datadir}/icons/hicolor/symbolic/apps +%{__cp} -p %{SOURCE25} \ + %{buildroot}%{_datadir}/icons/hicolor/symbolic/apps + +# Register as an application to be visible in the software center +# +# NOTE: It would be *awesome* if this file was maintained by the upstream +# project, translated and installed into the right place during `make install`. +# +# See http://www.freedesktop.org/software/appstream/docs/ for more details. +# +%{__mkdir_p} %{buildroot}%{_datadir}/appdata +cat > %{buildroot}%{_datadir}/appdata/%{name}.appdata.xml < + + + + firefox.desktop + CC0-1.0 + MPLv1.1 or GPLv2+ or LGPLv2+ + +

+ Bringing together all kinds of awesomeness to make browsing better for you. + Get to your favorite sites quickly – even if you don’t remember the URLs. + Type your term into the location bar (aka the Awesome Bar) and the autocomplete + function will include possible matches from your browsing history, bookmarked + sites and open tabs. +

+ +
+ http://www.mozilla.org/ + + https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/a.png + https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/b.png + https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/c.png + + +
+EOF + +echo > %{name}.lang +%if %{build_langpacks} +# Extract langpacks, make any mods needed, repack the langpack, and install it. +%{__mkdir_p} %{buildroot}%{langpackdir} +%{__tar} xf %{SOURCE1} +for langpack in `ls firefox-langpacks/*.xpi`; do + language=`basename $langpack .xpi` + extensionID=langpack-$language@firefox.mozilla.org + %{__mkdir_p} $extensionID + unzip -qq $langpack -d $extensionID + find $extensionID -type f | xargs chmod 644 + + cd $extensionID + zip -qq -r9mX ../${extensionID}.xpi * + cd - + + %{__install} -m 644 ${extensionID}.xpi %{buildroot}%{langpackdir} + language=`echo $language | sed -e 's/-/_/g'` + echo "%%lang($language) %{langpackdir}/${extensionID}.xpi" >> %{name}.lang +done +%{__rm} -rf firefox-langpacks + +# Install langpack workaround (see #707100, #821169) +function create_default_langpack() { +language_long=$1 +language_short=$2 +cd %{buildroot}%{langpackdir} +ln -s langpack-$language_long@firefox.mozilla.org.xpi langpack-$language_short@firefox.mozilla.org.xpi +cd - +echo "%%lang($language_short) %{langpackdir}/langpack-$language_short@firefox.mozilla.org.xpi" >> %{name}.lang +} + +# Table of fallbacks for each language +# please file a bug at bugzilla.redhat.com if the assignment is incorrect +create_default_langpack "es-AR" "es" +create_default_langpack "fy-NL" "fy" +create_default_langpack "ga-IE" "ga" +create_default_langpack "gu-IN" "gu" +create_default_langpack "hi-IN" "hi" +create_default_langpack "hy-AM" "hy" +create_default_langpack "nb-NO" "nb" +create_default_langpack "nn-NO" "nn" +create_default_langpack "pa-IN" "pa" +create_default_langpack "pt-PT" "pt" +create_default_langpack "sv-SE" "sv" +create_default_langpack "zh-TW" "zh" +%endif + +# Keep compatibility with the old preference location. +%{__mkdir_p} %{buildroot}%{mozappdir}/defaults/preferences +%{__mkdir_p} %{buildroot}%{mozappdir}/browser/defaults +ln -s %{mozappdir}/defaults/preferences $RPM_BUILD_ROOT/%{mozappdir}/browser/defaults/preferences +# Default preferences +%{__cp} %{SOURCE12} %{buildroot}%{mozappdir}/defaults/preferences/all-redhat.js +sed -i -e 's|%PREFIX%|%{_prefix}|' %{buildroot}%{mozappdir}/defaults/preferences/all-redhat.js + +# System config dir +%{__mkdir_p} %{buildroot}/%{_sysconfdir}/%{name}/pref + +# System extensions +%{__mkdir_p} %{buildroot}%{_datadir}/mozilla/extensions/%{firefox_app_id} +%{__mkdir_p} %{buildroot}%{_libdir}/mozilla/extensions/%{firefox_app_id} + +# Copy over the LICENSE +%{__install} -p -c -m 644 LICENSE %{buildroot}/%{mozappdir} + +# Use the system hunspell dictionaries +%{__rm} -rf %{buildroot}%{mozappdir}/dictionaries +ln -s %{_datadir}/myspell %{buildroot}%{mozappdir}/dictionaries + +# Enable crash reporter for Firefox application +%if %{enable_mozilla_crashreporter} +sed -i -e "s/\[Crash Reporter\]/[Crash Reporter]\nEnabled=1/" %{buildroot}/%{mozappdir}/application.ini +# Add debuginfo for crash-stats.mozilla.com +%{__mkdir_p} %{buildroot}/%{moz_debug_dir} +%{__cp} objdir/dist/%{symbols_file_name} %{buildroot}/%{moz_debug_dir} +%endif + +%if %{run_tests} +# Add debuginfo for crash-stats.mozilla.com +%{__mkdir_p} %{buildroot}/test_results +%{__cp} test_results/* %{buildroot}/test_results +%endif + + +# Copy over run-mozilla.sh +%{__cp} build/unix/run-mozilla.sh %{buildroot}%{mozappdir} + +# Add distribution.ini +%{__mkdir_p} %{buildroot}%{mozappdir}/distribution +%{__cp} %{SOURCE26} %{buildroot}%{mozappdir}/distribution + +# Remove copied libraries to speed up build +rm -f %{buildroot}%{mozappdirdev}/sdk/lib/libmozjs.so +rm -f %{buildroot}%{mozappdirdev}/sdk/lib/libmozalloc.so +rm -f %{buildroot}%{mozappdirdev}/sdk/lib/libxul.so + +%if %{bundle_gnome_extension} +# Gnome extension +%{__mkdir_p} %{buildroot}%{mozappdir}/distribution/extensions +%{__cp} -p %{SOURCE2} %{buildroot}%{mozappdir}/distribution/extensions/chrome-gnome-shell@gnome.org.xpi +chmod 644 %{buildroot}%{mozappdir}/distribution/extensions/chrome-gnome-shell@gnome.org.xpi +%endif +#--------------------------------------------------------------------- + +%preun +# is it a final removal? +if [ $1 -eq 0 ]; then + %{__rm} -rf %{mozappdir}/components + %{__rm} -rf %{mozappdir}/extensions + %{__rm} -rf %{mozappdir}/plugins +fi + +%clean +rm -rf %{_srcrpmdir}/gtk3-private-%{gtk3_nvr}*.src.rpm +find %{_rpmdir} -name "gtk3-private-*%{gtk3_nvr}*.rpm" -delete +rm -rf %{_srcrpmdir}/libffi*.src.rpm +find %{_rpmdir} -name "libffi*.rpm" -delete +rm -rf %{_srcrpmdir}/openssl*.src.rpm +find %{_rpmdir} -name "openssl*.rpm" -delete +rm -rf %{_srcrpmdir}/nss*.src.rpm +find %{_rpmdir} -name "nss*.rpm" -delete +rm -rf %{_srcrpmdir}/nspr*.src.rpm +find %{_rpmdir} -name "nspr*.rpm" -delete + +%post +update-desktop-database &> /dev/null || : +touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : +%if 0%{?bundle_gtk3} +# gtk3-private-post.inc +%include_file %{SOURCE201} +%endif + +%postun +update-desktop-database &> /dev/null || : +if [ $1 -eq 0 ] ; then + touch --no-create %{_datadir}/icons/hicolor &>/dev/null + gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : +fi +%if 0%{?bundle_gtk3} +# gtk3-private-postun.inc +%include_file %{SOURCE202} +%endif + +%posttrans +gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : +%if 0%{?bundle_gtk3} +# gtk3-private-posttrans.inc +%include_file %{SOURCE203} +%endif + +%files -f %{name}.lang +%{_bindir}/firefox +%{mozappdir}/firefox +%{mozappdir}/firefox-bin +%doc %{_mandir}/man1/* +%dir %{_sysconfdir}/%{name} +%dir %{_sysconfdir}/%{name}/* +%dir %{_datadir}/mozilla/extensions/* +%dir %{_libdir}/mozilla/extensions/* +%{_datadir}/appdata/*.appdata.xml +%{_datadir}/applications/*.desktop +%dir %{mozappdir} +%doc %{mozappdir}/LICENSE +%{mozappdir}/browser/chrome +%{mozappdir}/defaults/preferences/* +%{mozappdir}/browser/defaults/preferences +%{mozappdir}/browser/features/*.xpi +%{mozappdir}/distribution/distribution.ini +%if %{build_langpacks} +%dir %{langpackdir} +%endif +%{mozappdir}/browser/omni.ja +%{mozappdir}/run-mozilla.sh +%{mozappdir}/application.ini +%{mozappdir}/pingsender +%exclude %{mozappdir}/removed-files +%{_datadir}/icons/hicolor/16x16/apps/firefox.png +%{_datadir}/icons/hicolor/22x22/apps/firefox.png +%{_datadir}/icons/hicolor/24x24/apps/firefox.png +%{_datadir}/icons/hicolor/256x256/apps/firefox.png +%{_datadir}/icons/hicolor/32x32/apps/firefox.png +%{_datadir}/icons/hicolor/48x48/apps/firefox.png +%{_datadir}/icons/hicolor/symbolic/apps/firefox-symbolic.svg +%if %{enable_mozilla_crashreporter} +%{mozappdir}/crashreporter +%{mozappdir}/crashreporter.ini +%{mozappdir}/minidump-analyzer +%{mozappdir}/Throbber-small.gif +%{mozappdir}/browser/crashreporter-override.ini +%endif +%{mozappdir}/*.so +%{mozappdir}/gtk2/*.so +%{mozappdir}/defaults/pref/channel-prefs.js +%{mozappdir}/dependentlibs.list +%{mozappdir}/dictionaries +%{mozappdir}/omni.ja +%{mozappdir}/platform.ini +%{mozappdir}/plugin-container +%{mozappdir}/gmp-clearkey +%{mozappdir}/fonts/*.ttf +%if !%{?system_nss} +%exclude %{mozappdir}/libnssckbi.so +%endif +%if 0%{use_bundled_ffi} +%{mozappdir}/bundled/%{_lib}/libffi.so* +%exclude %{_datadir}/doc/libffi* +%endif + +%if 0%{?bundle_gtk3} +# gtk3-private-files.inc +%include_file %{SOURCE204} +%endif + +%if 0%{?bundle_nss} +%{mozappdir}/bundled/%{_lib}/libfreebl* +%{mozappdir}/bundled/%{_lib}/libnss3* +%{mozappdir}/bundled/%{_lib}/libnssdbm3* +%{mozappdir}/bundled/%{_lib}/libnssutil3* +%{mozappdir}/bundled/%{_lib}/libsmime3* +%{mozappdir}/bundled/%{_lib}/libsoftokn* +%{mozappdir}/bundled/%{_lib}/libssl3* +%{mozappdir}/bundled/%{_lib}/libnspr4.so +%{mozappdir}/bundled/%{_lib}/libplc4.so +%{mozappdir}/bundled/%{_lib}/libplds4.so +%endif + + +#--------------------------------------------------------------------- + +%changelog +* Wed Aug 18 2021 DJ Delorie - 78.13.0-3 +- Rebuilt for libffi 3.4.2 SONAME transition. + Related: rhbz#1891914 + +* Mon Aug 09 2021 Mohan Boddu - 78.13.0-2 +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Mon Aug 09 2021 Eike Rathke - 78.13.0-1 +- Update to 78.13.0 + +* Fri Jul 30 2021 Tomas Popela - 78.12.0-2 +- Add script to process the official tarball to comply with PELC review +- Fix build with newer glibc + +* Wed Jul 07 2021 Eike Rathke - 78.12.0-1 +- Update to 78.12.0 build1 + +* Tue Jun 29 2021 Jan Horak - 78.11.0-4 +- Added bundled librarie + +* Fri Jun 25 2021 Eike Rathke - 78.11.0-3 +- Update to 78.11.0 build2 (release) + +* Tue Jun 22 2021 Mohan Boddu - 78.8.0-7 +- Rebuilt for RHEL 9 BETA for openssl 3.0 + Related: rhbz#1971065 + +* Tue Apr 27 2021 Jan Horak - 78.8.0-6 +- Added patch for SHA-1 support for the addons + +* Thu Apr 15 2021 Mohan Boddu - 78.8.0-5 +- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 + +* Mon Mar 01 2021 Jan Horak - 78.8.0-4 +- Removed autoconf213 dependency + +* Mon Feb 22 2021 Jan Horak - 78.8.0-2 +- Update to 78.8.0 build2 +- Removed dependency on gconf-2 + +* Wed Jan 6 2021 Eike Rathke - 78.6.1-1 +- Update to 78.6.1 build1 + +* Thu Dec 10 2020 Jan Horak - 78.6.0-1 +- Update to 78.6.0 build1 + +* Wed Nov 18 2020 Jan Horak - 78.5.0-1 +- Update to 78.5.0 build1 + +* Tue Nov 10 2020 erack@redhat.com - 78.4.1-1 +- Update to 78.4.1 + +* Tue Nov 10 2020 Jan Horak - 78.4.0-3 +- Fixing flatpak build, fixing firefox.sh.in to not disable langpacks loading + +* Thu Oct 29 2020 Jan Horak - 78.4.0-2 +- Enable addon sideloading + +* Fri Oct 16 2020 Jan Horak - 78.4.0-1 +- Update to 78.4.0 build2 + +* Fri Sep 18 2020 Jan Horak +- Update to 78.3.0 build1 + +* Tue Aug 18 2020 Jan Horak - 78.2.0-3 +- Update to 78.2.0 build1 + +* Fri Jul 24 2020 Jan Horak +- Update to 68.11.0 build1 + +* Fri Jun 26 2020 Jan Horak +- Update to 68.10.0 build1 + +* Fri May 29 2020 Jan Horak +- Update to 68.9.0 build1 +- Added patch for pipewire 0.3 + +* Mon May 11 2020 Jan Horak +- Added s390x specific patches + +* Wed Apr 29 2020 Jan Horak +- Update to 68.8.0 build1 + +* Thu Apr 23 2020 Martin Stransky - 68.7.0-3 +- Added fix for rhbz#1821418 + +* Tue Apr 07 2020 Jan Horak - 68.7.0-2 +- Update to 68.7.0 build3 + +* Mon Apr 6 2020 Jan Horak - 68.6.1-1 +- Update to 68.6.1 ESR + +* Wed Mar 04 2020 Jan Horak +- Update to 68.6.0 build1 + +* Mon Feb 24 2020 Martin Stransky - 68.5.0-3 +- Added fix for rhbz#1805667 +- Enabled mzbz@1170092 - Firefox prefs at /etc + +* Fri Feb 07 2020 Jan Horak +- Update to 68.5.0 build2 + +* Wed Feb 05 2020 Jan Horak +- Update to 68.5.0 build1 + +* Wed Jan 08 2020 Jan Horak +- Update to 68.4.1esr build1 + +* Fri Jan 03 2020 Jan Horak +- Update to 68.4.0esr build1 + +* Wed Dec 18 2019 Jan Horak +- Fix for wrong intl.accept_lang when using non en-us langpack + +* Wed Nov 27 2019 Martin Stransky - 68.3.0-1 +- Update to 68.3.0 ESR + +* Thu Oct 24 2019 Martin Stransky - 68.2.0-4 +- Added patch for TLS 1.3 support. + +* Wed Oct 23 2019 Martin Stransky - 68.2.0-3 +- Rebuild + +* Mon Oct 21 2019 Martin Stransky - 68.2.0-2 +- Rebuild + +* Thu Oct 17 2019 Martin Stransky - 68.2.0-1 +- Update to 68.2.0 ESR + +* Thu Oct 10 2019 Martin Stransky - 68.1.0-6 +- Enable system nss on RHEL6 + +* Thu Sep 5 2019 Jan Horak - 68.1.0-2 +- Enable building langpacks + +* Wed Aug 28 2019 Jan Horak - 68.1.0-1 +- Update to 68.1.0 ESR + +* Mon Aug 5 2019 Martin Stransky - 68.0.1-4 +- Enable system nss + +* Mon Jul 29 2019 Martin Stransky - 68.0.1-3 +- Enable official branding + +* Fri Jul 26 2019 Martin Stransky - 68.0.1-2 +- Enabled PipeWire on RHEL8 + +* Fri Jul 26 2019 Martin Stransky - 68.0.1-1 +- Updated to 68.0.1 ESR + +* Tue Jul 16 2019 Jan Horak - 68.0-0.11 +- Update to 68.0 ESR + +* Tue Jun 25 2019 Martin Stransky - 68.0-0.10 +- Updated to 68.0 alpha 13 +- Enabled second arches + +* Fri Mar 22 2019 Martin Stransky - 68.0-0.1 +- Updated to 68.0 alpha + +* Fri Mar 15 2019 Martin Stransky - 60.6.0-3 +- Added Google API keys (mozbz#1531176) + +* Thu Mar 14 2019 Martin Stransky - 60.6.0-2 +- Update to 60.6.0 ESR (Build 2) + +* Wed Mar 13 2019 Martin Stransky - 60.6.0-1 +- Update to 60.6.0 ESR (Build 1) + +* Wed Feb 13 2019 Jan Horak - 60.5.1-1 +- Update to 60.5.1 ESR + +* Wed Feb 6 2019 Martin Stransky - 60.5.0-3 +- Added fix for rhbz#1672424 - Firefox crashes on NFS drives. + +* Fri Jan 25 2019 Martin Stransky - 60.5.0-2 +- Updated to 60.5.0 ESR build2 + +* Tue Jan 22 2019 Martin Stransky - 60.5.0-1 +- Updated to 60.5.0 ESR build1 + +* Thu Jan 10 2019 Jan Horak - 60.4.0-3 +- Fixing fontconfig warnings (rhbz#1601475) + +* Wed Jan 9 2019 Jan Horak - 60.4.0-2 +- Added pipewire patch from Tomas Popela (rhbz#1664270) + +* Wed Dec 5 2018 Jan Horak - 60.4.0-1 +- Update to 60.4.0 ESR + +* Tue Dec 4 2018 Jan Horak - 60.3.0-2 +- Added firefox-gnome-shell-extension + +* Fri Oct 19 2018 Jan Horak - 60.3.0-1 +- Update to 60.3.0 ESR + +* Wed Oct 10 2018 Jan Horak - 60.2.2-2 +- Added patch for rhbz#1633932 + +* Tue Oct 2 2018 Jan Horak - 60.2.2-1 +- Update to 60.2.2 ESR + +* Mon Sep 24 2018 Jan Horak - 60.2.1-1 +- Update to 60.2.1 ESR + +* Fri Aug 31 2018 Jan Horak - 60.2.0-1 +- Update to 60.2.0 ESR + +* Tue Aug 28 2018 Jan Horak - 60.1.0-9 +- Do not set user agent (rhbz#1608065) +- GTK dialogs are localized now (rhbz#1619373) +- JNLP association works again (rhbz#1607457) + +* Thu Aug 16 2018 Jan Horak - 60.1.0-8 +- Fixed homepage and bookmarks (rhbz#1606778) +- Fixed missing file associations in RHEL6 (rhbz#1613565) + +* Thu Jul 12 2018 Jan Horak - 60.1.0-7 +- Run at-spi-bus if not running already (for the bundled gtk3) + +* Mon Jul 9 2018 Jan Horak - 60.1.0-6 +- Fix for missing schemes for bundled gtk3 + +* Mon Jun 25 2018 Martin Stransky - 60.1.0-5 +- Added mesa-libEGL dependency to gtk3/rhel6 + +* Sun Jun 24 2018 Martin Stransky - 60.1.0-4 +- Disabled jemalloc on all second arches + +* Fri Jun 22 2018 Martin Stransky - 60.1.0-3 +- Updated to 60.1.0 ESR build2 + +* Thu Jun 21 2018 Martin Stransky - 60.1.0-2 +- Disabled jemalloc on second arches + +* Wed Jun 20 2018 Martin Stransky - 60.1.0-1 +- Updated to 60.1.0 ESR + +* Wed Jun 13 2018 Jan Horak - 60.0-12 +- Fixing bundled libffi issues +- Readded some requirements + +* Mon Jun 11 2018 Martin Stransky - 60.0-10 +- Added fix for mozilla BZ#1436242 - IPC crashes. + +* Mon Jun 11 2018 Jan Horak - 60.0-9 +- Bundling libffi for the sec-arches +- Added openssl-devel for the Python +- Fixing bundled gtk3 + +* Fri May 18 2018 Martin Stransky - 60.0-8 +- Added fix for mozilla BZ#1458492 + +* Wed May 16 2018 Martin Stransky - 60.0-7 +- Added patch from rhbz#1498561 to fix ppc64(le) crashes. + +* Wed May 16 2018 Martin Stransky - 60.0-6 +- Disabled jemalloc on second arches + +* Sun May 6 2018 Jan Horak - 60.0-4 +- Update to 60.0 ESR + +* Thu Mar 8 2018 Jan Horak - 52.7.0-1 +- Update to 52.7.0 ESR + +* Mon Jan 29 2018 Martin Stransky - 52.6.0-2 +- Build Firefox for desktop arches only (x86_64 and ppc64le) + +* Thu Jan 18 2018 Martin Stransky - 52.6.0-1 +- Update to 52.6.0 ESR + +* Thu Nov 9 2017 Jan Horak - 52.5.0-1 +- Update to 52.5.0 ESR + +* Mon Sep 25 2017 Jan Horak - 52.4.0-1 +- Update to 52.4.0 ESR + +* Thu Aug 3 2017 Jan Horak - 52.3.0-3 +- Update to 52.3.0 ESR (b2) +- Require correct nss version + +* Tue Jun 13 2017 Jan Horak - 52.2.0-1 +- Update to 52.2.0 ESR + +* Wed May 24 2017 Jan Horak - 52.1.2-1 +- Update to 52.1.2 ESR + +* Wed May 24 2017 Jan Horak - 52.0-7 +- Added fix for accept language (rhbz#1454322) + +* Wed Mar 22 2017 Jan Horak - 52.0-6 +- Removing patch required for older NSS from RHEL 7.3 +- Added patch for rhbz#1414564 + +* Fri Mar 17 2017 Martin Stransky - 52.0-5 +- Added fix for mozbz#1348168/CVE-2017-5428 + +* Mon Mar 6 2017 Jan Horak - 52.0-4 +- Update to 52.0 ESR (b4) + +* Thu Mar 2 2017 Martin Stransky - 52.0-3 +- Added fix for rhbz#1423012 - ppc64 gfx crashes + +* Wed Mar 1 2017 Jan Horak - 52.0-2 +- Enable system nss + +* Tue Feb 28 2017 Martin Stransky - 52.0-1 +- Update to 52.0ESR (B1) +- Build RHEL7 package for Gtk3 + +* Mon Feb 27 2017 Martin Stransky - 52.0-0.13 +- Added fix for rhbz#1414535 + +* Tue Feb 21 2017 Jan Horak - 52.0-0.12 +- Update to 52.0b8 + +* Tue Feb 7 2017 Jan Horak - 52.0-0.11 +- Readded addons patch + +* Mon Feb 6 2017 Jan Horak - 52.0-0.10 +- Update to 52.0b3 + +* Tue Jan 31 2017 Jan Horak - 52.0-0.9 +- Update to 52.0b2 + +* Fri Jan 27 2017 Jan Horak - 52.0-0.8 +- Update to 52.0b1 + +* Thu Dec 8 2016 Jan Horak - 52.0-0.5 +- Firefox Aurora 52 testing build