diff --git a/apps/logsupport.cpp b/apps/logsupport.cpp index fc124e76c..573cbb97a 100644 --- a/apps/logsupport.cpp +++ b/apps/logsupport.cpp @@ -15,6 +15,7 @@ #include #include "logsupport.hpp" #include "../srtcore/srt.h" +#include "../srtcore/utilities.h" using namespace std; @@ -74,6 +75,36 @@ srt_logging::LogLevel::type SrtParseLogLevel(string level) return LogLevel::type(i->second); } +struct ToLowerFormat +{ + char operator()(char in) + { + if (islower(in)) + return in; + if (isupper(in)) + return tolower(in); + if (in == '_') + return '-'; + + throw std::invalid_argument("Wrong FA name - please check the definition in scripts/generate-logging-defs.tcl file"); + } +}; + +void LogFANames::Install(string upname, int value) +{ + string id; + transform(upname.begin(), upname.end(), back_inserter(id), ToLowerFormat()); + namemap[id] = value; +} + +// See logsupport_appdefs.cpp for log FA definitions +LogFANames srt_transmit_logfa_names; + +const map SrtLogFAList() +{ + return srt_transmit_logfa_names.namemap; +} + set SrtParseLogFA(string fa, set* punknown) { using namespace srt_logging; @@ -84,18 +115,17 @@ set SrtParseLogFA(string fa, set* punknown) if ( fa == "" ) return fas; - static string names [] = { "general", "bstats", "control", "data", "tsbpd", "rexmit", "haicrypt", "cc" }; - size_t names_s = sizeof (names)/sizeof (names[0]); + auto& names = srt_transmit_logfa_names.namemap; if ( fa == "all" ) { - // Skip "general", it's always on - fas.insert(SRT_LOGFA_BSTATS); - fas.insert(SRT_LOGFA_CONTROL); - fas.insert(SRT_LOGFA_DATA); - fas.insert(SRT_LOGFA_TSBPD); - fas.insert(SRT_LOGFA_REXMIT); - fas.insert(SRT_LOGFA_CONGEST); + for (auto entry: names) + { + // Skip "general", it's always on + if (entry.first == "general") + continue; + fas.insert(entry.second); + } return fas; } @@ -124,8 +154,8 @@ set SrtParseLogFA(string fa, set* punknown) for (size_t i = 0; i < xfas.size(); ++i) { fa = xfas[i]; - string* names_p = find(names, names + names_s, fa); - if ( names_p == names + names_s ) + int* pfa = map_getp(names, fa); + if (!pfa) { if (punknown) punknown->insert(fa); // If requested, add it back silently @@ -134,10 +164,7 @@ set SrtParseLogFA(string fa, set* punknown) continue; } - size_t nfa = names_p - names; - - if ( nfa != 0 ) - fas.insert(nfa); + fas.insert(*pfa); } return fas; diff --git a/apps/logsupport.hpp b/apps/logsupport.hpp index 319909a2a..63e732560 100644 --- a/apps/logsupport.hpp +++ b/apps/logsupport.hpp @@ -11,13 +11,22 @@ #ifndef INC_SRT_LOGSUPPORT_HPP #define INC_SRT_LOGSUPPORT_HPP +#include +#include #include "../srtcore/srt.h" #include "../srtcore/logging_api.h" srt_logging::LogLevel::type SrtParseLogLevel(std::string level); std::set SrtParseLogFA(std::string fa, std::set* punknown = nullptr); +const std::map SrtLogFAList(); SRT_API extern std::map srt_level_names; +struct LogFANames +{ + std::map namemap; + void Install(std::string upname, int value); + LogFANames(); +}; #endif diff --git a/apps/logsupport_appdefs.cpp b/apps/logsupport_appdefs.cpp new file mode 100644 index 000000000..dea143e93 --- /dev/null +++ b/apps/logsupport_appdefs.cpp @@ -0,0 +1,23 @@ +/* + WARNING: Generated from ../scripts/generate-logging-defs.tcl + + DO NOT MODIFY. + + Copyright applies as per the generator script. + */ + + +#include "logsupport.hpp" + +LogFANames::LogFANames() +{ + Install("GENERAL", SRT_LOGFA_GENERAL); + + Install("CONTROL", SRT_LOGFA_CONTROL); + Install("DATA", SRT_LOGFA_DATA); + Install("TSBPD", SRT_LOGFA_TSBPD); + Install("REXMIT", SRT_LOGFA_REXMIT); + + Install("CONGEST", SRT_LOGFA_CONGEST); + Install("HAICRYPT", SRT_LOGFA_HAICRYPT); +} diff --git a/apps/srt-live-transmit.cpp b/apps/srt-live-transmit.cpp index c14062712..904c9b088 100644 --- a/apps/srt-live-transmit.cpp +++ b/apps/srt-live-transmit.cpp @@ -206,7 +206,7 @@ int parse_args(LiveTransmitConfig &cfg, int argc, char** argv) { o_logfile, OptionScheme::ARG_ONE }, { o_quiet, OptionScheme::ARG_NONE }, { o_verbose, OptionScheme::ARG_NONE }, - { o_help, OptionScheme::ARG_NONE }, + { o_help, OptionScheme::ARG_VAR }, { o_version, OptionScheme::ARG_NONE } }; @@ -229,6 +229,44 @@ int parse_args(LiveTransmitConfig &cfg, int argc, char** argv) if (print_help) { + string helpspec = Option(params, o_help); + + if (helpspec == "logging") + { + cerr << "Logging options:\n"; + cerr << " -ll - specify minimum log level\n"; + cerr << " -lfa - specify functional areas\n"; + cerr << "Where:\n\n"; + cerr << " : fatal error note warning debug\n\n"; + cerr << "This turns on logs that are at the given log name and all on the left.\n"; + cerr << "(Names from syslog, like alert, crit, emerg, err, info, panic, are also\n"; + cerr << "recognized, but they are aligned to those that lie close in hierarchy.)\n\n"; + cerr << " is a space-sep list of areas to turn on or ~areas to turn off.\n\n"; + cerr << "The list may include 'all' to turn all on or off, beside those selected.\n"; + cerr << "Example: `-lfa ~all cc` - turns off all FA, except cc\n"; + cerr << "Areas: general bstats control data tsbpd rexmit haicrypt cc\n"; + cerr << "Default: all are on except haicrypt. NOTE: 'general' can't be off.\n\n"; + cerr << "List of functional areas:\n"; + + map revmap; + for (auto entry: SrtLogFAList()) + revmap[entry.second] = entry.first; + + int en10 = 0; + for (auto entry: revmap) + { + cerr << " " << entry.second; + if (entry.first/10 != en10) + { + cerr << endl; + en10 = entry.first/10; + } + } + cerr << endl; + + return 1; + } + cout << "SRT sample application to transmit live streaming.\n"; cerr << "Built with SRT Library version: " << SRT_VERSION << endl; const uint32_t srtver = srt_getversion(); @@ -252,13 +290,13 @@ int parse_args(LiveTransmitConfig &cfg, int argc, char** argv) PrintOptionHelp(o_statspf, "", "stats printing format {json, csv, default}"); PrintOptionHelp(o_statsfull, "", "full counters in stats-report (prints total statistics)"); PrintOptionHelp(o_loglevel, "", "log level {fatal,error,info,note,warning}"); - PrintOptionHelp(o_logfa, "", "log functional area {all,general,bstats,control,data,tsbpd,rexmit}"); + PrintOptionHelp(o_logfa, "", "log functional area (see '-h logging' for more info)"); //PrintOptionHelp(o_log_internal, "", "use internal logger"); PrintOptionHelp(o_logfile, "", "write logs to file"); PrintOptionHelp(o_quiet, "", "quiet mode (default off)"); PrintOptionHelp(o_verbose, "", "verbose mode (default off)"); cerr << "\n"; - cerr << "\t-h,-help - show this help\n"; + cerr << "\t-h,-help - show this help (use '-h logging' for logging system)\n"; cerr << "\t-version - print SRT library version\n"; cerr << "\n"; cerr << "\t - URI specifying a medium to read from\n"; diff --git a/apps/support.maf b/apps/support.maf index 5c1d6dfcc..19ac894b4 100644 --- a/apps/support.maf +++ b/apps/support.maf @@ -10,6 +10,7 @@ SOURCES apputil.cpp logsupport.cpp +logsupport_appdefs.cpp socketoptions.cpp transmitmedia.cpp uriparser.cpp diff --git a/scripts/generate-logging-defs.tcl b/scripts/generate-logging-defs.tcl new file mode 100755 index 000000000..3fc3a0075 --- /dev/null +++ b/scripts/generate-logging-defs.tcl @@ -0,0 +1,328 @@ +#!/usr/bin/tclsh +#* +#* SRT - Secure, Reliable, Transport +#* Copyright (c) 2020 Haivision Systems Inc. +#* +#* This Source Code Form is subject to the terms of the Mozilla Public +#* License, v. 2.0. If a copy of the MPL was not distributed with this +#* file, You can obtain one at http://mozilla.org/MPL/2.0/. +#* +#*/ +# +#***************************************************************************** +#written by +# Haivision Systems Inc. +#***************************************************************************** + +# What fields are there in every entry +set model { + longname + shortname + id +} + +# Logger definitions. +# Comments here allowed, just only for the whole line. + +# Use values greater than 0. Value 0 is reserved for LOGFA_GENERAL, +# which is considered always enabled. +set loggers { + GENERAL g 0 + CONTROL mg 2 + DATA d 3 + TSBPD ts 4 + REXMIT rx 5 + CONGEST cc 7 +} + +set hidden_loggers { + # Haicrypt logging - usually off. + HAICRYPT hc 6 + + # APPLOG=10 - defined in apps, this is only a stub to lock the value + # APPLOG ap 10 +} + +set globalheader { + /* + WARNING: Generated from ../scripts/generate-logging-defs.tcl + + DO NOT MODIFY. + + Copyright applies as per the generator script. + */ + +} + + +# This defines, what kind of definition will be generated +# for a given file out of the log FA entry list. + +# Fields: +# - prefix/postfix model +# - logger_format +# - hidden_logger_format + +# COMMENTS NOT ALLOWED HERE! Only as C++ comments inside C++ model code. +set special { + srtcore/logger_default.cpp { + if {"$longname" == "HAICRYPT"} { + puts $od " +#if ENABLE_HAICRYPT_LOGGING + allfa.set(SRT_LOGFA_HAICRYPT, true); +#endif" + } + } +} + +# COMMENTS NOT ALLOWED HERE! Only as C++ comments inside C++ model code. +set generation { + srt.inc.h { + {} + {#define [format "%-20s %d" SRT_LOGFA_${longname} $id] // ${shortname}log} + {#define [format "%-20s %d" SRT_LOGFA_${longname} $id] // ${shortname}log} + } + + srtcore/logger_default.cpp { + + { + $globalheader + #include "srt.h" + #include "logging.h" + #include "logger_defs.h" + + namespace srt_logging + { + AllFaOn::AllFaOn() + { + $entries + } + } // namespace srt_logging + + } + + { + allfa.set(SRT_LOGFA_${longname}, true); + } + } + + srtcore/logger_defs.cpp { + + { + $globalheader + #include "srt.h" + #include "logging.h" + #include "logger_defs.h" + + namespace srt_logging { AllFaOn logger_fa_all; } + // We need it outside the namespace to preserve the global name. + // It's a part of "hidden API" (used by applications) + SRT_API srt_logging::LogConfig srt_logger_config(srt_logging::logger_fa_all.allfa); + + namespace srt_logging + { + $entries + } // namespace srt_logging + } + + { + Logger ${shortname}log(SRT_LOGFA_${longname}, srt_logger_config, "SRT.${shortname}"); + } + } + + srtcore/logger_defs.h { + { + $globalheader + #ifndef INC_SRT_LOGGER_DEFS_H + #define INC_SRT_LOGGER_DEFS_H + + #include "srt.h" + #include "logging.h" + + namespace srt_logging + { + struct AllFaOn + { + LogConfig::fa_bitset_t allfa; + AllFaOn(); + }; + + $entries + + } // namespace srt_logging + + #endif + } + + { + extern Logger ${shortname}log; + } + } + + apps/logsupport_appdefs.cpp { + { + $globalheader + #include "logsupport.hpp" + + LogFANames::LogFANames() + { + $entries + } + } + + { + Install("$longname", SRT_LOGFA_${longname}); + } + + { + Install("$longname", SRT_LOGFA_${longname}); + } + } +} + +# EXECUTION + +set here [file dirname [file normalize $argv0]] + +if {[lindex [file split $here] end] != "scripts"} { + puts stderr "The script is in weird location." + exit 1 +} + +set path [file join {*}[lrange [file split $here] 0 end-1]] + +# Utility. Allows to put line-oriented comments and have empty lines +proc no_comments {input} { + set output "" + foreach line [split $input \n] { + set nn [string trim $line] + if { $nn == "" || [string index $nn 0] == "#" } { + continue + } + append output $line\n + } + + return $output +} + +proc generate_file {od target} { + + global globalheader + lassign [dict get $::generation $target] format_model pattern hpattern + + set ptabprefix "" + + if {$format_model != ""} { + set beginindex 0 + while { [string index $format_model $beginindex] == "\n" } { + incr beginindex + } + + set endindex $beginindex + while { [string is space [string index $format_model $endindex]] } { + incr endindex + } + + set tabprefix [string range $pattern $beginindex $endindex-1] + + set newformat "" + foreach line [split $format_model \n] { + if {[string trim $line] == ""} { + append newformat "\n" + continue + } + + if {[string first $tabprefix $line] == 0} { + set line [string range $line [string length $tabprefix] end] + } + append newformat $line\n + + set ie [string first {$} $line] + if {$ie != -1} { + if {[string range $line $ie end] == {$entries}} { + set ptabprefix "[string range $line 0 $ie-1]" + } + } + } + + set format_model $newformat + unset newformat + } + + set entries "" + + if {[string trim $pattern] != "" } { + + set prevval 0 + set pattern [string trim $pattern] + + # The first "$::model" will expand into variable names + # as defined there. + foreach [list {*}$::model] [no_comments $::loggers] { + if {$prevval + 1 != $id} { + append entries "\n" + } + + append entries ${ptabprefix}[subst -nobackslashes $pattern]\n + set prevval $id + } + } + + if {$hpattern != ""} { + set hpattern [string trim $hpattern] + foreach [list {*}$::model] [no_comments $::hidden_loggers] { + append entries ${ptabprefix}[subst -nobackslashes $hpattern]\n + } + } + + if { [dict exists $::special $target] } { + set code [subst [dict get $::special $target]] + + # The code should contain "append entries" ! + eval $code + } + + set entries [string trim $entries] + + if {$format_model == ""} { + set format_model $entries + } + + # For any case, cut external spaces + puts $od [string trim [subst -nocommands -nobackslashes $format_model]] +} + +set entryfiles $argv + +if {$entryfiles == ""} { + set entryfiles [dict keys $generation] +} else { + foreach ef $entryfiles { + if { $ef ni [dict keys $generation] } { + error "Unknown generation target: $entryfiles" + } + } +} + +foreach f $entryfiles { + + # Set simple relative path, if the file isn't defined as path. + if { [llength [file split $f]] == 1 } { + set filepath $f + } else { + set filepath [file join $path $f] + } + + if { [file exists $filepath] } { + puts "WARNING: will overwrite exiting '$f'. Hit ENTER to confirm, or Control-C to stop" + gets stdin + } + + puts stderr "Generating '$filepath'" + set od [open $filepath w] + generate_file $od $f + close $od +} + +puts stderr Done. + diff --git a/srtcore/core.cpp b/srtcore/core.cpp index c82fe7e6f..6167ca7ba 100644 --- a/srtcore/core.cpp +++ b/srtcore/core.cpp @@ -68,6 +68,7 @@ modified by #include "logging.h" #include "crypto.h" #include "logging_api.h" // Required due to containing extern srt_logger_config +#include "logger_defs.h" // Again, just in case when some "smart guy" provided such a global macro #ifdef min @@ -79,48 +80,6 @@ modified by using namespace std; using namespace srt::sync; - -namespace srt_logging -{ - -struct AllFaOn -{ - LogConfig::fa_bitset_t allfa; - - AllFaOn() - { - // allfa.set(SRT_LOGFA_BSTATS, true); - allfa.set(SRT_LOGFA_CONTROL, true); - allfa.set(SRT_LOGFA_DATA, true); - allfa.set(SRT_LOGFA_TSBPD, true); - allfa.set(SRT_LOGFA_REXMIT, true); - allfa.set(SRT_LOGFA_CONGEST, true); -#if ENABLE_HAICRYPT_LOGGING - allfa.set(SRT_LOGFA_HAICRYPT, true); -#endif - } -} logger_fa_all; - -} // namespace srt_logging - -// We need it outside the namespace to preserve the global name. -// It's a part of "hidden API" (used by applications) -SRT_API srt_logging::LogConfig srt_logger_config(srt_logging::logger_fa_all.allfa); - -namespace srt_logging -{ - -Logger glog(SRT_LOGFA_GENERAL, srt_logger_config, "SRT.g"); -// Unused. If not found useful, maybe reuse for another FA. -// Logger blog(SRT_LOGFA_BSTATS, srt_logger_config, "SRT.b"); -Logger mglog(SRT_LOGFA_CONTROL, srt_logger_config, "SRT.c"); -Logger dlog(SRT_LOGFA_DATA, srt_logger_config, "SRT.d"); -Logger tslog(SRT_LOGFA_TSBPD, srt_logger_config, "SRT.t"); -Logger rxlog(SRT_LOGFA_REXMIT, srt_logger_config, "SRT.r"); -Logger cclog(SRT_LOGFA_CONGEST, srt_logger_config, "SRT.cc"); - -} // namespace srt_logging - using namespace srt_logging; CUDTUnited CUDT::s_UDTUnited; diff --git a/srtcore/core.h b/srtcore/core.h index 9397ee31d..a4b419716 100644 --- a/srtcore/core.h +++ b/srtcore/core.h @@ -70,23 +70,10 @@ modified by #include "congctl.h" #include "packetfilter.h" #include "utilities.h" +#include "logger_defs.h" #include -namespace srt_logging -{ - -extern Logger - glog, -// blog, - mglog, - dlog, - tslog, - rxlog, - cclog; - -} - // XXX Utility function - to be moved to utilities.h? template diff --git a/srtcore/filelist.maf b/srtcore/filelist.maf index 0d36a601e..e3a5e847d 100644 --- a/srtcore/filelist.maf +++ b/srtcore/filelist.maf @@ -12,6 +12,8 @@ epoll.cpp fec.cpp handshake.cpp list.cpp +logger_default.cpp +logger_defs.cpp md5.cpp packet.cpp packetfilter.cpp diff --git a/srtcore/logger_default.cpp b/srtcore/logger_default.cpp new file mode 100644 index 000000000..f91ecc406 --- /dev/null +++ b/srtcore/logger_default.cpp @@ -0,0 +1,27 @@ +/* + WARNING: Generated from ../scripts/generate-logging-defs.tcl + + DO NOT MODIFY. + + Copyright applies as per the generator script. + */ + + +#include "srt.h" +#include "logging.h" +#include "logger_defs.h" + +namespace srt_logging +{ + AllFaOn::AllFaOn() + { + allfa.set(SRT_LOGFA_GENERAL, true); + + allfa.set(SRT_LOGFA_CONTROL, true); + allfa.set(SRT_LOGFA_DATA, true); + allfa.set(SRT_LOGFA_TSBPD, true); + allfa.set(SRT_LOGFA_REXMIT, true); + + allfa.set(SRT_LOGFA_CONGEST, true); + } +} // namespace srt_logging diff --git a/srtcore/logger_defs.cpp b/srtcore/logger_defs.cpp new file mode 100644 index 000000000..54d7b807b --- /dev/null +++ b/srtcore/logger_defs.cpp @@ -0,0 +1,29 @@ +/* + WARNING: Generated from ../scripts/generate-logging-defs.tcl + + DO NOT MODIFY. + + Copyright applies as per the generator script. + */ + + +#include "srt.h" +#include "logging.h" +#include "logger_defs.h" + +namespace srt_logging { AllFaOn logger_fa_all; } +// We need it outside the namespace to preserve the global name. +// It's a part of "hidden API" (used by applications) +SRT_API srt_logging::LogConfig srt_logger_config(srt_logging::logger_fa_all.allfa); + +namespace srt_logging +{ + Logger glog(SRT_LOGFA_GENERAL, srt_logger_config, "SRT.g"); + + Logger mglog(SRT_LOGFA_CONTROL, srt_logger_config, "SRT.mg"); + Logger dlog(SRT_LOGFA_DATA, srt_logger_config, "SRT.d"); + Logger tslog(SRT_LOGFA_TSBPD, srt_logger_config, "SRT.ts"); + Logger rxlog(SRT_LOGFA_REXMIT, srt_logger_config, "SRT.rx"); + + Logger cclog(SRT_LOGFA_CONGEST, srt_logger_config, "SRT.cc"); +} // namespace srt_logging diff --git a/srtcore/logger_defs.h b/srtcore/logger_defs.h new file mode 100644 index 000000000..f53f41bfe --- /dev/null +++ b/srtcore/logger_defs.h @@ -0,0 +1,35 @@ +/* + WARNING: Generated from ../scripts/generate-logging-defs.tcl + + DO NOT MODIFY. + + Copyright applies as per the generator script. + */ + + +#ifndef INC_SRT_LOGGER_DEFS_H +#define INC_SRT_LOGGER_DEFS_H + +#include "srt.h" +#include "logging.h" + +namespace srt_logging +{ + struct AllFaOn + { + LogConfig::fa_bitset_t allfa; + AllFaOn(); + }; + + extern Logger glog; + + extern Logger mglog; + extern Logger dlog; + extern Logger tslog; + extern Logger rxlog; + + extern Logger cclog; + +} // namespace srt_logging + +#endif diff --git a/srtcore/srt.h b/srtcore/srt.h index f9dff664a..d54cfb810 100644 --- a/srtcore/srt.h +++ b/srtcore/srt.h @@ -570,22 +570,19 @@ enum SRT_REJECT_REASON // Logging API - specialization for SRT. -// Define logging functional areas for log selection. -// Use values greater than 0. Value 0 is reserved for LOGFA_GENERAL, -// which is considered always enabled. - -// Logger Functional Areas -// Note that 0 is "general". - -// Made by #define so that it's available also for C API. -#define SRT_LOGFA_GENERAL 0 -#define SRT_LOGFA_BSTATS 1 -#define SRT_LOGFA_CONTROL 2 -#define SRT_LOGFA_DATA 3 -#define SRT_LOGFA_TSBPD 4 -#define SRT_LOGFA_REXMIT 5 -#define SRT_LOGFA_HAICRYPT 6 -#define SRT_LOGFA_CONGEST 7 +// WARNING: This part is generated. +// Use ../scripts/generate-logging-defs.tcl to regenerate. + +#define SRT_LOGFA_GENERAL 0 // glog + +#define SRT_LOGFA_CONTROL 2 // mglog +#define SRT_LOGFA_DATA 3 // dlog +#define SRT_LOGFA_TSBPD 4 // tslog +#define SRT_LOGFA_REXMIT 5 // rxlog + +#define SRT_LOGFA_CONGEST 7 // cclog +#define SRT_LOGFA_HAICRYPT 6 // hclog + // To make a typical int32_t size, although still use std::bitset. // C API will carry it over. diff --git a/testing/srt-test-file.maf b/testing/srt-test-file.maf index 36a8582b7..337415225 100644 --- a/testing/srt-test-file.maf +++ b/testing/srt-test-file.maf @@ -7,4 +7,5 @@ testmedia.cpp ../apps/socketoptions.cpp ../apps/uriparser.cpp ../apps/logsupport.cpp +../apps/logsupport_appdefs.cpp diff --git a/testing/srt-test-live.cpp b/testing/srt-test-live.cpp index 767b349a7..882c0f4bd 100644 --- a/testing/srt-test-live.cpp +++ b/testing/srt-test-live.cpp @@ -562,6 +562,24 @@ int main( int argc, char** argv ) cerr << "Example: `-lfa ~all cc` - turns off all FA, except cc\n"; cerr << "Areas: general bstats control data tsbpd rexmit haicrypt cc\n"; cerr << "Default: all are on except haicrypt. NOTE: 'general' can't be off.\n\n"; + cerr << "List of functional areas:\n"; + + map revmap; + for (auto entry: SrtLogFAList()) + revmap[entry.second] = entry.first; + + int en10 = 0; + for (auto entry: revmap) + { + cerr << " " << entry.second; + if (entry.first/10 != en10) + { + cerr << endl; + en10 = entry.first/10; + } + } + cerr << endl; + return 1; } diff --git a/testing/srt-test-live.maf b/testing/srt-test-live.maf index f609b77b7..17368a660 100644 --- a/testing/srt-test-live.maf +++ b/testing/srt-test-live.maf @@ -8,4 +8,5 @@ testmedia.cpp ../apps/socketoptions.cpp ../apps/uriparser.cpp ../apps/logsupport.cpp +../apps/logsupport_appdefs.cpp diff --git a/testing/srt-test-mpbond.maf b/testing/srt-test-mpbond.maf index a5eefed17..e2609b1b0 100644 --- a/testing/srt-test-mpbond.maf +++ b/testing/srt-test-mpbond.maf @@ -7,4 +7,5 @@ testmedia.cpp ../apps/socketoptions.cpp ../apps/uriparser.cpp ../apps/logsupport.cpp +../apps/logsupport_appdefs.cpp diff --git a/testing/srt-test-multiplex.maf b/testing/srt-test-multiplex.maf index e6fbccb3a..5e7cd8507 100644 --- a/testing/srt-test-multiplex.maf +++ b/testing/srt-test-multiplex.maf @@ -8,4 +8,5 @@ testmedia.cpp ../apps/socketoptions.cpp ../apps/uriparser.cpp ../apps/logsupport.cpp +../apps/logsupport_appdefs.cpp diff --git a/testing/srt-test-relay.maf b/testing/srt-test-relay.maf index 594a650af..b1b22afb2 100644 --- a/testing/srt-test-relay.maf +++ b/testing/srt-test-relay.maf @@ -8,4 +8,5 @@ testmedia.cpp ../apps/socketoptions.cpp ../apps/uriparser.cpp ../apps/logsupport.cpp +../apps/logsupport_appdefs.cpp