build extras together
diff --git a/SConstruct b/SConstruct
index e015218f2ab81a..23ab37dc1eb7a0 100644
--- a/SConstruct
+++ b/SConstruct
@@ -431,11 +431,12 @@ SConscript(['selfdrive/sensord/SConscript'])
 SConscript(['selfdrive/ui/SConscript'])
 SConscript(['selfdrive/navd/SConscript'])
 
-SConscript(['tools/replay/SConscript'])
+if arch in ['x86_64', 'Darwin'] or GetOption('extras'):
+  SConscript(['tools/replay/SConscript'])
 
-opendbc = abspath([File('opendbc/can/libdbc.so')])
-Export('opendbc')
-SConscript(['tools/cabana/SConscript'])
+  opendbc = abspath([File('opendbc/can/libdbc.so')])
+  Export('opendbc')
+  SConscript(['tools/cabana/SConscript'])
 
 if GetOption('test'):
   SConscript('panda/tests/safety/SConscript')
diff --git a/tools/cabana/SConscript b/tools/cabana/SConscript
index b94741ea9c74d2..8dbd4f1d1ce79a 100644
--- a/tools/cabana/SConscript
+++ b/tools/cabana/SConscript
@@ -11,7 +11,6 @@ else:
   base_libs.append('OpenCL')
 
 qt_libs = ['qt_util', 'Qt5Charts'] + base_libs
-if arch in ['x86_64', 'Darwin'] and GetOption('extras'):
-  cabana_libs = [widgets, cereal, messaging, visionipc, replay_lib, opendbc,'avutil', 'avcodec', 'avformat', 'bz2', 'curl', 'yuv'] + qt_libs
-  qt_env.Program('_cabana', ['cabana.cc', 'mainwin.cc', 'chartswidget.cc', 'historylog.cc', 'videowidget.cc', 'signaledit.cc', 'dbcmanager.cc',
-                             'canmessages.cc', 'messageswidget.cc', 'detailwidget.cc'], LIBS=cabana_libs, FRAMEWORKS=base_frameworks)
+cabana_libs = [widgets, cereal, messaging, visionipc, replay_lib, opendbc,'avutil', 'avcodec', 'avformat', 'bz2', 'curl', 'yuv'] + qt_libs
+qt_env.Program('_cabana', ['cabana.cc', 'mainwin.cc', 'chartswidget.cc', 'historylog.cc', 'videowidget.cc', 'signaledit.cc', 'dbcmanager.cc',
+                            'canmessages.cc', 'messageswidget.cc', 'detailwidget.cc'], LIBS=cabana_libs, FRAMEWORKS=base_frameworks)
diff --git a/tools/replay/SConscript b/tools/replay/SConscript
index 9985375688f52b..4ddeb662e0175c 100644
--- a/tools/replay/SConscript
+++ b/tools/replay/SConscript
@@ -12,15 +12,14 @@ else:
   base_libs.append('OpenCL')
 
 qt_libs = ['qt_util'] + base_libs
-if arch in ['x86_64', 'Darwin'] or GetOption('extras'):
-  qt_env['CXXFLAGS'] += ["-Wno-deprecated-declarations"]
+qt_env['CXXFLAGS'] += ["-Wno-deprecated-declarations"]
 
-  replay_lib_src = ["replay.cc", "consoleui.cc", "camera.cc", "filereader.cc", "logreader.cc", "framereader.cc", "route.cc", "util.cc"]
+replay_lib_src = ["replay.cc", "consoleui.cc", "camera.cc", "filereader.cc", "logreader.cc", "framereader.cc", "route.cc", "util.cc"]
 
-  replay_lib = qt_env.Library("qt_replay", replay_lib_src, LIBS=qt_libs, FRAMEWORKS=base_frameworks)
-  Export('replay_lib')
-  replay_libs = [replay_lib, 'avutil', 'avcodec', 'avformat', 'bz2', 'curl', 'yuv', 'ncurses'] + qt_libs
-  qt_env.Program("replay", ["main.cc"], LIBS=replay_libs, FRAMEWORKS=base_frameworks)
+replay_lib = qt_env.Library("qt_replay", replay_lib_src, LIBS=qt_libs, FRAMEWORKS=base_frameworks)
+Export('replay_lib')
+replay_libs = [replay_lib, 'avutil', 'avcodec', 'avformat', 'bz2', 'curl', 'yuv', 'ncurses'] + qt_libs
+qt_env.Program("replay", ["main.cc"], LIBS=replay_libs, FRAMEWORKS=base_frameworks)
 
-  if GetOption('test'):
-    qt_env.Program('tests/test_replay', ['tests/test_runner.cc', 'tests/test_replay.cc'], LIBS=[replay_libs])
+if GetOption('test'):
+  qt_env.Program('tests/test_replay', ['tests/test_runner.cc', 'tests/test_replay.cc'], LIBS=[replay_libs])

I think https://github.com/commaai/openpilot/pull/26004 broke builds as `replay_lib` is not always exported, but the cabana build imports it