require "language/node" class Sunshine < Formula GCC_VERSION = "14".freeze GCC_FORMULA = "gcc@#{GCC_VERSION}".freeze IS_UPSTREAM_REPO = ENV.fetch("GITHUB_REPOSITORY", "") == "LizardByte/Sunshine" desc "@PROJECT_DESCRIPTION@" homepage "@PROJECT_HOMEPAGE_URL@" url "@GITHUB_CLONE_URL@", tag: "@GITHUB_TAG@" version "@BUILD_VERSION@" license all_of: ["GPL-3.0-only"] head "@GITHUB_CLONE_URL@", branch: "@GITHUB_DEFAULT_BRANCH@" # https://docs.brew.sh/Brew-Livecheck#githublatest-strategy-block livecheck do url :stable regex(/^v?(\d+\.\d+\.\d+)$/i) strategy :github_latest do |json, regex| match = json["tag_name"]&.match(regex) next if match.blank? match[1] end end option "with-docs", "Enable docs" option "with-static-boost", "Enable static link of Boost libraries" option "without-static-boost", "Disable static link of Boost libraries" # default option depends_on "cmake" => :build depends_on "doxygen" => :build depends_on "graphviz" => :build depends_on "node" => :build depends_on "pkgconf" => :build depends_on "gcovr" => :test depends_on "boost" depends_on "curl" depends_on "icu4c@78" depends_on "miniupnpc" depends_on "openssl@3" depends_on "opus" on_macos do depends_on "llvm" => [:build, :test] end on_linux do depends_on GCC_FORMULA => [:build, :test] depends_on "at-spi2-core" depends_on "avahi" depends_on "ayatana-ido" depends_on "cairo" depends_on "gdk-pixbuf" depends_on "glib" depends_on "gnu-which" depends_on "gtk+3" depends_on "harfbuzz" depends_on "libayatana-appindicator" depends_on "libayatana-indicator" depends_on "libcap" depends_on "libdbusmenu" depends_on "libdrm" depends_on "libice" depends_on "libnotify" depends_on "libsm" depends_on "libva" depends_on "libx11" depends_on "libxcb" depends_on "libxcursor" depends_on "libxext" depends_on "libxfixes" depends_on "libxi" depends_on "libxinerama" depends_on "libxrandr" depends_on "libxtst" depends_on "mesa" depends_on "numactl" depends_on "pango" depends_on "pulseaudio" depends_on "systemd" depends_on "wayland" end conflicts_with "sunshine-beta", because: "sunshine and sunshine-beta cannot be installed at the same time" fails_with :clang do build 1400 cause "Requires C++23 support" end fails_with :gcc do version "12" # fails with GCC 12.x and earlier cause "Requires C++23 support" end def install ENV["BRANCH"] = "@GITHUB_BRANCH@" ENV["BUILD_VERSION"] = "@BUILD_VERSION@" ENV["COMMIT"] = "@GITHUB_COMMIT@" if OS.linux? # Use GCC because gcov from llvm cannot handle our paths gcc_path = Formula[GCC_FORMULA] ENV["CC"] = "#{gcc_path.opt_bin}/gcc-#{GCC_VERSION}" ENV["CXX"] = "#{gcc_path.opt_bin}/g++-#{GCC_VERSION}" end args = %W[ -DBUILD_WERROR=ON -DCMAKE_CXX_STANDARD=23 -DCMAKE_INSTALL_PREFIX=#{prefix} -DHOMEBREW_ALLOW_FETCHCONTENT=ON -DOPENSSL_ROOT_DIR=#{Formula["openssl"].opt_prefix} -DSUNSHINE_ASSETS_DIR=sunshine/assets -DSUNSHINE_BUILD_HOMEBREW=ON -DSUNSHINE_PUBLISHER_NAME='LizardByte' -DSUNSHINE_PUBLISHER_WEBSITE='https://app.lizardbyte.dev' -DSUNSHINE_PUBLISHER_ISSUE_URL='https://app.lizardbyte.dev/support' ] if IS_UPSTREAM_REPO args << "-DBUILD_TESTS=ON" ohai "Building tests: enabled" else args << "-DBUILD_TESTS=OFF" ohai "Building tests: disabled" end if build.with? "docs" ohai "Building docs: enabled" args << "-DBUILD_DOCS=ON" else ohai "Building docs: disabled" args << "-DBUILD_DOCS=OFF" end if build.without? "static-boost" args << "-DBOOST_USE_STATIC=OFF" ohai "Disabled statically linking Boost libraries" else args << "-DBOOST_USE_STATIC=ON" ohai "Enabled statically linking Boost libraries" unless Formula["icu4c"].any_version_installed? odie <<~EOS icu4c must be installed to link against static Boost libraries, either install icu4c or use brew install sunshine --with-static-boost instead EOS end ENV.append "CXXFLAGS", "-I#{Formula["icu4c"].opt_include}" icu4c_lib_path = Formula["icu4c"].opt_lib.to_s ENV.append "LDFLAGS", "-L#{icu4c_lib_path}" ENV["LIBRARY_PATH"] = icu4c_lib_path ohai "Linking against ICU libraries at: #{icu4c_lib_path}" end args << "-DCUDA_FAIL_ON_MISSING=OFF" if OS.linux? system "cmake", "-S", ".", "-B", "build", "-G", "Unix Makefiles", *std_cmake_args, *args system "make", "-C", "build" system "make", "-C", "build", "install" bin.install "build/tests/test_sunshine" if IS_UPSTREAM_REPO # codesign the binary on intel macs system "codesign", "-s", "-", "--force", "--deep", bin/"sunshine" if OS.mac? && Hardware::CPU.intel? bin.install "src_assets/linux/misc/postinst" if OS.linux? end service do run [opt_bin/"sunshine", "~/.config/sunshine/sunshine.conf"] end def post_install if OS.linux? opoo <<~EOS ATTENTION: To complete installation, you must run the following command: `sudo #{bin}/postinst` EOS end if OS.mac? opoo <<~EOS Sunshine can only access microphones on macOS due to system limitations. To stream system audio use "Soundflower" or "BlackHole". Gamepads are not currently supported on macOS. EOS end end def caveats <<~EOS Thanks for installing @PROJECT_NAME@! To get started, review the documentation at: https://docs.lizardbyte.dev/projects/sunshine EOS end test do # test that the binary runs at all system bin/"sunshine", "--version" if IS_UPSTREAM_REPO && ENV.fetch("HOMEBREW_BOTTLE_BUILD", "false") != "true" # run the test suite system bin/"test_sunshine", "--gtest_color=yes", "--gtest_output=xml:tests/test_results.xml" assert_path_exists File.join(testpath, "tests", "test_results.xml") # create gcovr report buildpath = ENV.fetch("HOMEBREW_BUILDPATH", "") unless buildpath.empty? # Change to the source directory for gcovr to work properly cd "#{buildpath}/build" do # Use GCC version to match what was used during compilation if OS.linux? gcc_path = Formula[GCC_FORMULA] gcov_executable = "#{gcc_path.opt_bin}/gcov-#{GCC_VERSION}" system "gcovr", ".", "-r", "../src", "--gcov-executable", gcov_executable, "--exclude-noncode-lines", "--exclude-throw-branches", "--exclude-unreachable-branches", "--xml-pretty", "-o=#{testpath}/coverage.xml" assert_path_exists File.join(testpath, "coverage.xml") end end end end end end