class Octave < Formula desc "High-level interpreted language for numerical computing" homepage "https://www.gnu.org/software/octave/index.html" url "https://ftp.gnu.org/gnu/octave/octave-7.3.0.tar.xz" mirror "https://ftpmirror.gnu.org/octave/octave-7.3.0.tar.xz" sha256 "a508ee6aebccfa68967c9e7e0a08793c4ca8e4ddace723aabdb8f71ad34d57f1" license "GPL-3.0-or-later" revision 2 bottle do sha256 arm64_ventura: "06f78c69007f530b2b69f0a8388e7056696421dd6a5b4d78d73f36c1f972ca4a" sha256 arm64_monterey: "748e5dc86679b9bc66c0755431b7e80a42c54924098f90a429e02b73e26683b4" sha256 arm64_big_sur: "de05a64424f4687e7e77a21602e2dea82832597d204f6b0b664265255d9ce3c3" sha256 ventura: "e0bf6c0948f402b7f2e6a938f103d6d111ef961406176f0ef4a8236075904378" sha256 monterey: "23c21ec21f432cb75d7e52620d650d6f0a0083f80c06493b9b687ce413526667" sha256 big_sur: "d784dd85c17f6103437b830e4603994a83b12d1a082cfff7208662e5c218a828" sha256 x86_64_linux: "0c60fcafc350652ffe00df56cef5e2d92d8ae18f134f1a6ca3beb3e2313bbe5f" end head do url "https://hg.savannah.gnu.org/hgweb/octave", branch: "default", using: :hg depends_on "autoconf" => :build depends_on "automake" => :build depends_on "bison" => :build depends_on "icoutils" => :build depends_on "librsvg" => :build end # Complete list of dependencies at https://wiki.octave.org/Building depends_on "gnu-sed" => :build # https://lists.gnu.org/archive/html/octave-maintainers/2016-09/msg00193.html depends_on "openjdk" => :build depends_on "pkg-config" => :build depends_on "arpack" depends_on "epstool" depends_on "fftw" depends_on "fig2dev" depends_on "fltk" depends_on "fontconfig" depends_on "freetype" depends_on "gcc" # for gfortran depends_on "ghostscript" depends_on "gl2ps" depends_on "glpk" depends_on "gnuplot" depends_on "graphicsmagick" depends_on "hdf5" depends_on "libsndfile" depends_on "libtool" depends_on "openblas" depends_on "pcre" depends_on "portaudio" depends_on "pstoedit" depends_on "qhull" depends_on "qrupdate" depends_on "qscintilla2" depends_on "qt@5" depends_on "readline" depends_on "suite-sparse" depends_on "sundials" depends_on "texinfo" uses_from_macos "curl" on_linux do depends_on "autoconf" depends_on "automake" depends_on "mesa" depends_on "mesa-glu" end # Dependencies use Fortran, leading to spurious messages about GCC cxxstdlib_check :skip fails_with gcc: "5" def install # Default configuration passes all linker flags to mkoctfile, to be # inserted into every oct/mex build. This is unnecessary and can cause # cause linking problems. inreplace "src/mkoctfile.in.cc", /%OCTAVE_CONF_OCT(AVE)?_LINK_(DEPS|OPTS)%/, '""' # SUNDIALS 6.4.0 and later needs C++14 for C++ based features ENV.append "CXXFLAGS", "-std=c++14" # Qt 5.12 compatibility # https://savannah.gnu.org/bugs/?55187 ENV["QCOLLECTIONGENERATOR"] = "qhelpgenerator" # These "shouldn't" be necessary, but the build breaks without them. # https://savannah.gnu.org/bugs/?55883 ENV["QT_CPPFLAGS"]="-I#{Formula["qt@5"].opt_include}" ENV.append "CPPFLAGS", "-I#{Formula["qt@5"].opt_include}" ENV["QT_LDFLAGS"]="-F#{Formula["qt@5"].opt_lib}" ENV.append "LDFLAGS", "-F#{Formula["qt@5"].opt_lib}" system "./bootstrap" if build.head? args = ["--prefix=#{prefix}", "--disable-dependency-tracking", "--disable-silent-rules", "--enable-shared", "--disable-static", "--with-hdf5-includedir=#{Formula["hdf5"].opt_include}", "--with-hdf5-libdir=#{Formula["hdf5"].opt_lib}", "--with-java-homedir=#{Formula["openjdk"].opt_prefix}", "--with-x=no", "--with-blas=-L#{Formula["openblas"].opt_lib} -lopenblas", "--with-portaudio", "--with-sndfile"] if OS.linux? # Explicitly specify aclocal and automake without versions args << "ACLOCAL=aclocal" args << "AUTOMAKE=automake" # Mesa OpenGL location must be supplied by LDFLAGS on Linux args << "LDFLAGS=-L#{Formula["mesa"].opt_lib} -L#{Formula["mesa-glu"].opt_lib}" # Docs building is broken on Linux args << "--disable-docs" # Need to regenerate aclocal.m4 so that it will work with brewed automake system "aclocal" end system "./configure", *args system "make", "all" # Avoid revision bumps whenever fftw's, gcc's or OpenBLAS' Cellar paths change inreplace "src/mkoctfile.cc" do |s| s.gsub! Formula["fftw"].prefix.realpath, Formula["fftw"].opt_prefix s.gsub! Formula["gcc"].prefix.realpath, Formula["gcc"].opt_prefix end # Make sure that Octave uses the modern texinfo at run time rcfile = buildpath/"scripts/startup/site-rcfile" rcfile.append_lines "makeinfo_program(\"#{Formula["texinfo"].opt_bin}/makeinfo\");" system "make", "install" end test do system bin/"octave", "--eval", "(22/7 - pi)/pi" # This is supposed to crash octave if there is a problem with BLAS system bin/"octave", "--eval", "single ([1+i 2+i 3+i]) * single ([ 4+i ; 5+i ; 6+i])" # Test basic compilation (testpath/"oct_demo.cc").write <<~EOS #include DEFUN_DLD (oct_demo, args, /*nargout*/, "doc str") { return ovl (42); } EOS system bin/"octave", "--eval", <<~EOS mkoctfile ('-v', '-std=c++11', '-L#{lib}/octave/#{version}', 'oct_demo.cc'); assert(oct_demo, 42) EOS # Test FLIBS environment variable system bin/"octave", "--eval", <<~EOS args = strsplit (mkoctfile ('-p', 'FLIBS')); args = args(~cellfun('isempty', args)); mkoctfile ('-v', '-std=c++11', '-L#{lib}/octave/#{version}', args{:}, 'oct_demo.cc'); assert(oct_demo, 42) EOS end end