sctp: Reorganize build targets

Bug: webrtc:12614
Change-Id: I2d276139746bb8cafdd5c50fe4595e60a6b1c7fc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/215234
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33745}
diff --git a/media/BUILD.gn b/media/BUILD.gn
index af59b59..eedf96f 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -392,59 +392,73 @@
   ]
 }
 
-rtc_library("rtc_data") {
-  defines = [
-    # "SCTP_DEBUG" # Uncomment for SCTP debugging.
-  ]
+rtc_source_set("rtc_data_sctp_transport_internal") {
+  sources = [ "sctp/sctp_transport_internal.h" ]
   deps = [
-    ":rtc_media_base",
-    "../api:call_api",
-    "../api:sequence_checker",
-    "../api:transport_api",
+    "../media:rtc_media_base",
     "../p2p:rtc_p2p",
-    "../rtc_base",
     "../rtc_base:rtc_base_approved",
     "../rtc_base:threading",
-    "../rtc_base/synchronization:mutex",
-    "../rtc_base/task_utils:pending_task_safety_flag",
-    "../rtc_base/task_utils:to_queued_task",
     "../rtc_base/third_party/sigslot",
-    "../system_wrappers",
   ]
-  absl_deps = [
-    "//third_party/abseil-cpp/absl/algorithm:container",
-    "//third_party/abseil-cpp/absl/base:core_headers",
-    "//third_party/abseil-cpp/absl/types:optional",
-  ]
+}
 
-  if (rtc_enable_sctp) {
+if (rtc_build_usrsctp) {
+  rtc_library("rtc_data_usrsctp_transport") {
+    defines = [
+      # "SCTP_DEBUG" # Uncomment for SCTP debugging.
+    ]
     sources = [
-      "sctp/sctp_transport_factory.cc",
-      "sctp/sctp_transport_factory.h",
-      "sctp/sctp_transport_internal.h",
       "sctp/usrsctp_transport.cc",
       "sctp/usrsctp_transport.h",
     ]
-  } else {
-    # libtool on mac does not like empty targets.
-    sources = [ "sctp/noop.cc" ]
-  }
-
-  if (rtc_enable_sctp && rtc_build_usrsctp) {
-    deps += [
-      "../api/transport:sctp_transport_factory_interface",
+    deps = [
+      ":rtc_data_sctp_transport_internal",
+      "../media:rtc_media_base",
+      "../p2p:rtc_p2p",
+      "../rtc_base",
+      "../rtc_base:rtc_base_approved",
+      "../rtc_base:threading",
+      "../rtc_base/synchronization:mutex",
+      "../rtc_base/task_utils:pending_task_safety_flag",
+      "../rtc_base/task_utils:to_queued_task",
+      "../rtc_base/third_party/sigslot:sigslot",
       "//third_party/usrsctp",
     ]
+    absl_deps = [
+      "//third_party/abseil-cpp/absl/algorithm:container",
+      "//third_party/abseil-cpp/absl/types:optional",
+    ]
+  }
+}
+
+rtc_library("rtc_data_sctp_transport_factory") {
+  defines = []
+  sources = [
+    "sctp/sctp_transport_factory.cc",
+    "sctp/sctp_transport_factory.h",
+  ]
+  deps = [
+    ":rtc_data_sctp_transport_internal",
+    "../api/transport:sctp_transport_factory_interface",
+    "../rtc_base:threading",
+    "../rtc_base/system:unused",
+  ]
+
+  if (rtc_enable_sctp) {
+    assert(rtc_build_usrsctp, "An SCTP backend is required to enable SCTP")
+  }
+
+  if (rtc_build_usrsctp) {
+    defines += [ "WEBRTC_HAVE_USRSCTP" ]
+    deps += [ ":rtc_data_usrsctp_transport" ]
   }
 }
 
 rtc_source_set("rtc_media") {
   visibility = [ "*" ]
   allow_poison = [ "audio_codecs" ]  # TODO(bugs.webrtc.org/8396): Remove.
-  deps = [
-    ":rtc_audio_video",
-    ":rtc_data",
-  ]
+  deps = [ ":rtc_audio_video" ]
 }
 
 if (rtc_include_tests) {
@@ -537,7 +551,6 @@
       defines = []
       deps = [
         ":rtc_audio_video",
-        ":rtc_data",
         ":rtc_encoder_simulcast_proxy",
         ":rtc_internal_video_codecs",
         ":rtc_media",
@@ -641,15 +654,18 @@
         sources += [ "engine/webrtc_voice_engine_unittest.cc" ]
       }
 
-      if (rtc_enable_sctp) {
+      if (rtc_build_usrsctp) {
         sources += [
           "sctp/usrsctp_transport_reliability_unittest.cc",
           "sctp/usrsctp_transport_unittest.cc",
         ]
         deps += [
+          ":rtc_data_sctp_transport_internal",
+          ":rtc_data_usrsctp_transport",
           "../rtc_base:rtc_event",
           "../rtc_base/task_utils:pending_task_safety_flag",
           "../rtc_base/task_utils:to_queued_task",
+          "//third_party/usrsctp",
         ]
       }
 
@@ -669,10 +685,6 @@
       if (is_ios) {
         deps += [ ":rtc_media_unittests_bundle_data" ]
       }
-
-      if (rtc_enable_sctp && rtc_build_usrsctp) {
-        deps += [ "//third_party/usrsctp" ]
-      }
     }
   }
 }
diff --git a/media/sctp/noop.cc b/media/sctp/noop.cc
deleted file mode 100644
index a3523b1..0000000
--- a/media/sctp/noop.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- *  Copyright 2017 The WebRTC Project Authors. All rights reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-// This file is only needed to make ninja happy on some platforms.
-// On some platforms it is not possible to link an rtc_static_library
-// without any source file listed in the GN target.
diff --git a/media/sctp/sctp_transport_factory.cc b/media/sctp/sctp_transport_factory.cc
index dd53d04..40480e7 100644
--- a/media/sctp/sctp_transport_factory.cc
+++ b/media/sctp/sctp_transport_factory.cc
@@ -10,16 +10,30 @@
 
 #include "media/sctp/sctp_transport_factory.h"
 
+#include "rtc_base/system/unused.h"
+
+#ifdef WEBRTC_HAVE_USRSCTP
+#include "media/sctp/usrsctp_transport.h"  // nogncheck
+#endif
+
 namespace cricket {
 
 SctpTransportFactory::SctpTransportFactory(rtc::Thread* network_thread)
-    : network_thread_(network_thread) {}
+    : network_thread_(network_thread) {
+  RTC_UNUSED(network_thread_);
+}
 
 std::unique_ptr<SctpTransportInternal>
 SctpTransportFactory::CreateSctpTransport(
     rtc::PacketTransportInternal* transport) {
-  return std::unique_ptr<SctpTransportInternal>(
-      new UsrsctpTransport(network_thread_, transport));
+  std::unique_ptr<SctpTransportInternal> result;
+#ifdef WEBRTC_HAVE_USRSCTP
+  if (!result) {
+    result = std::unique_ptr<SctpTransportInternal>(
+        new UsrsctpTransport(network_thread_, transport));
+  }
+#endif
+  return result;
 }
 
 }  // namespace cricket
diff --git a/media/sctp/sctp_transport_factory.h b/media/sctp/sctp_transport_factory.h
index 7fe4de0..4fff214 100644
--- a/media/sctp/sctp_transport_factory.h
+++ b/media/sctp/sctp_transport_factory.h
@@ -14,7 +14,7 @@
 #include <memory>
 
 #include "api/transport/sctp_transport_factory_interface.h"
-#include "media/sctp/usrsctp_transport.h"
+#include "media/sctp/sctp_transport_internal.h"
 #include "rtc_base/thread.h"
 
 namespace cricket {
diff --git a/media/sctp/usrsctp_transport.h b/media/sctp/usrsctp_transport.h
index 0241c2c..de018b9 100644
--- a/media/sctp/usrsctp_transport.h
+++ b/media/sctp/usrsctp_transport.h
@@ -21,7 +21,6 @@
 #include <vector>
 
 #include "absl/types/optional.h"
-#include "api/transport/sctp_transport_factory_interface.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/constructor_magic.h"
 #include "rtc_base/copy_on_write_buffer.h"
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index a61e04d..2b70f59 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -108,7 +108,7 @@
     "../common_video",
     "../common_video:common_video",
     "../logging:ice_log",
-    "../media:rtc_data",
+    "../media:rtc_data_sctp_transport_internal",
     "../media:rtc_h264_profile_id",
     "../media:rtc_media_base",
     "../media:rtc_media_config",
@@ -281,7 +281,7 @@
     "../call:call_interfaces",
     "../common_video",
     "../logging:ice_log",
-    "../media:rtc_data",
+    "../media:rtc_data_sctp_transport_internal",
     "../media:rtc_media_base",
     "../media:rtc_media_config",
     "../modules/audio_processing:audio_processing_statistics",
@@ -336,7 +336,7 @@
     "../api/transport:field_trial_based_config",
     "../api/transport:sctp_transport_factory_interface",
     "../api/transport:webrtc_key_value_config",
-    "../media:rtc_data",
+    "../media:rtc_data_sctp_transport_factory",
     "../media:rtc_media_base",
     "../p2p:rtc_p2p",
     "../rtc_base",
@@ -869,7 +869,7 @@
       "../api/video/test:mock_recordable_encoded_frame",
       "../call:rtp_interfaces",
       "../call:rtp_receiver",
-      "../media:rtc_data",
+      "../media:rtc_data_sctp_transport_internal",
       "../media:rtc_media_base",
       "../media:rtc_media_tests_utils",
       "../modules/rtp_rtcp:rtp_rtcp_format",
@@ -1011,10 +1011,6 @@
       "webrtc_sdp_unittest.cc",
     ]
 
-    if (rtc_enable_sctp) {
-      defines = [ "WEBRTC_HAVE_SCTP" ]
-    }
-
     deps = [
       ":audio_rtp_receiver",
       ":audio_track",
@@ -1065,6 +1061,7 @@
       "../api/video:video_rtp_headers",
       "../call/adaptation:resource_adaptation_test_utilities",
       "../logging:fake_rtc_event_log",
+      "../media:rtc_data_sctp_transport_internal",
       "../media:rtc_media_config",
       "../media:rtc_media_engine_defaults",
       "../modules/audio_device:audio_device_api",
@@ -1118,8 +1115,6 @@
       "../api/video_codecs:video_codecs_api",
       "../call:call_interfaces",
       "../media:rtc_audio_video",
-      "../media:rtc_data",  # TODO(phoglund): AFAIK only used for one sctp
-                            # constant.
       "../media:rtc_media_base",
       "../media:rtc_media_tests_utils",
       "../modules/audio_processing",
@@ -1328,7 +1323,6 @@
       "../api/video_codecs:builtin_video_encoder_factory",
       "../api/video_codecs:video_codecs_api",
       "../call:call_interfaces",
-      "../media:rtc_data",
       "../media:rtc_media",
       "../media:rtc_media_base",
       "../media:rtc_media_tests_utils",
diff --git a/pc/connection_context.h b/pc/connection_context.h
index 29ae99a..0c69c17 100644
--- a/pc/connection_context.h
+++ b/pc/connection_context.h
@@ -22,7 +22,6 @@
 #include "api/transport/sctp_transport_factory_interface.h"
 #include "api/transport/webrtc_key_value_config.h"
 #include "media/base/media_engine.h"
-#include "media/sctp/sctp_transport_internal.h"
 #include "p2p/base/basic_packet_socket_factory.h"
 #include "pc/channel_manager.h"
 #include "rtc_base/checks.h"
diff --git a/pc/peer_connection_factory.h b/pc/peer_connection_factory.h
index 71d7830..d2bac7a 100644
--- a/pc/peer_connection_factory.h
+++ b/pc/peer_connection_factory.h
@@ -37,7 +37,6 @@
 #include "api/transport/sctp_transport_factory_interface.h"
 #include "api/transport/webrtc_key_value_config.h"
 #include "call/call.h"
-#include "media/sctp/sctp_transport_internal.h"
 #include "p2p/base/port_allocator.h"
 #include "pc/channel_manager.h"
 #include "pc/connection_context.h"
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 054cd36..b276870 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -777,7 +777,6 @@
       "../../api/video_codecs:video_codecs_api",
       "../../call:call_interfaces",
       "../../media:rtc_audio_video",
-      "../../media:rtc_data",
       "../../media:rtc_media_base",
       "../../modules/audio_device",
       "../../modules/audio_processing:api",
diff --git a/test/pc/sctp/BUILD.gn b/test/pc/sctp/BUILD.gn
index 93ae1bf..b47cff2 100644
--- a/test/pc/sctp/BUILD.gn
+++ b/test/pc/sctp/BUILD.gn
@@ -11,5 +11,5 @@
 rtc_source_set("fake_sctp_transport") {
   visibility = [ "*" ]
   sources = [ "fake_sctp_transport.h" ]
-  deps = [ "../../../media:rtc_data" ]
+  deps = [ "../../../media:rtc_data_sctp_transport_internal" ]
 }
diff --git a/webrtc.gni b/webrtc.gni
index 6c80d72..574df1f 100644
--- a/webrtc.gni
+++ b/webrtc.gni
@@ -233,7 +233,6 @@
   rtc_libvpx_build_vp9 = !build_with_mozilla
   rtc_build_opus = !build_with_mozilla
   rtc_build_ssl = !build_with_mozilla
-  rtc_build_usrsctp = !build_with_mozilla
 
   # Enable libevent task queues on platforms that support it.
   if (is_win || is_mac || is_ios || is_nacl || is_fuchsia ||
@@ -290,6 +289,11 @@
   rtc_exclude_transient_suppressor = false
 }
 
+declare_args() {
+  # Enable the usrsctp backend for DataChannels and related unittests
+  rtc_build_usrsctp = !build_with_mozilla && rtc_enable_sctp
+}
+
 # Make it possible to provide custom locations for some libraries (move these
 # up into declare_args should we need to actually use them for the GN build).
 rtc_libvpx_dir = "//third_party/libvpx"