require "language/go" class PerconaServerMongodb < Formula desc "Drop-in MongoDB replacement" homepage "https://www.percona.com" url "https://www.percona.com/downloads/percona-server-mongodb-3.4/percona-server-mongodb-3.4.4-1.4/source/tarball/percona-server-mongodb-3.4.4-1.4.tar.gz" version "3.4.4-1.4" sha256 "4111f54644a3e3d80de189c69967a1f2e520adce8b6ef97e9dff68b09a66da0a" option "with-boost", "Compile using installed boost, not the version shipped with this formula" option "with-sasl", "Compile with SASL support" depends_on "boost" => :optional depends_on "go" => :build depends_on :macos => :mountain_lion depends_on "scons" => :build depends_on "openssl" => :recommended conflicts_with "mongodb", :because => "percona-server-mongodb and mongodb install the same binaries." go_resource "github.com/mongodb/mongo-tools" do url "https://github.com/mongodb/mongo-tools.git", :tag => "r3.4.4", :revision => "17fbdf31abca50cdfe27482b05b1476f42ecab0a", :shallow => false end needs :cxx11 def install ENV.cxx11 if MacOS.version < :mavericks ENV.libcxx if build.devel? # New Go tools have their own build script but the server scons "install" target is still # responsible for installing them. Language::Go.stage_deps resources, buildpath/"src" cd "src/github.com/mongodb/mongo-tools" do args = %w[] if build.with? "openssl" args << "ssl" ENV["LIBRARY_PATH"] = Formula["openssl"].opt_lib ENV["CPATH"] = Formula["openssl"].opt_include end args << "sasl" if build.with? "sasl" system "./build.sh", *args end (buildpath/"src/mongo-tools").install Dir["src/github.com/mongodb/mongo-tools/bin/*"] args = %W[ --prefix=#{prefix} -j#{ENV.make_jobs} --osx-version-min=#{MacOS.version} ] args << "CC=#{ENV.cc}" args << "CXX=#{ENV.cxx}" args << "--use-sasl-client" if build.with? "sasl" args << "--use-system-boost" if build.with? "boost" args << "--use-new-tools" args << "--disable-warnings-as-errors" if MacOS.version >= :yosemite if build.with? "openssl" args << "--ssl" args << "CCFLAGS=-I#{Formula["openssl"].opt_include}" args << "LINKFLAGS=-L#{Formula["openssl"].opt_lib}" end scons "install", *args (buildpath/"mongod.conf").write <<-EOS.undent systemLog: destination: file path: #{var}/log/mongodb/mongo.log logAppend: true storage: dbPath: #{var}/mongodb net: bindIp: 127.0.0.1 EOS etc.install "mongod.conf" end def post_install (var/"mongodb").mkpath (var/"log/mongodb").mkpath end plist_options :manual => "mongod --config #{HOMEBREW_PREFIX}/etc/mongod.conf" def plist; <<-EOS.undent Label #{plist_name} ProgramArguments #{opt_bin}/mongod --config #{etc}/mongod.conf RunAtLoad KeepAlive WorkingDirectory #{HOMEBREW_PREFIX} StandardErrorPath #{var}/log/mongodb/output.log StandardOutPath #{var}/log/mongodb/output.log HardResourceLimits NumberOfFiles 4096 SoftResourceLimits NumberOfFiles 4096 EOS end test do begin (testpath/"mongodb_test.js").write <<-EOS.undent printjson(db.getCollectionNames()) // create test collection db.test.insertOne( { "name": "test" } ) printjson(db.getCollectionNames()) // shows documents cursor = db.test.find({}) while (cursor.hasNext()) { printjson(cursor.next()) } db.test.deleteMany({}) // drop test collection db.test.drop() printjson(db.getCollectionNames()) EOS pid = fork do exec "#{bin}/mongod", "--port", "27018", "--dbpath", testpath end sleep 1 system "#{bin}/mongo", "localhost:27018", testpath/"mongodb_test.js" ensure Process.kill "SIGTERM", pid Process.wait pid end end end