commandline session utilities
This commit is contained in:
parent
f05afd973b
commit
b228c11311
29
session_utils/README
Normal file
29
session_utils/README
Normal file
@ -0,0 +1,29 @@
|
||||
Ardour Session Utilities
|
||||
========================
|
||||
|
||||
This folder contains some tools which directly use libardour to access ardour
|
||||
sessions.
|
||||
|
||||
The overall goal it to provide some non-interactive unix-style commandline
|
||||
tools, which are installed along with DAW.
|
||||
|
||||
|
||||
Adding new tools
|
||||
----------------
|
||||
|
||||
One c++ source per tool, see "example.cc" and "export.cc"
|
||||
|
||||
cp session_utils/example.cc session_utils/your_new_tool_name.cc
|
||||
edit session_utils/new_tool_name.cc
|
||||
./waf
|
||||
|
||||
The tool is automatically compiled and deployed when installing, using the
|
||||
program-name as prefix. e.g. "export.cc" becomes "ardour4-export".
|
||||
(or "mixbus3-export", depending on the project configuration)
|
||||
|
||||
|
||||
Test run from the source
|
||||
------------------------
|
||||
|
||||
cd session_utils
|
||||
./run ardour4-your_new_tool_name
|
17
session_utils/ardour-util.sh.in
Normal file
17
session_utils/ardour-util.sh.in
Normal file
@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This is a wrapper script for using the ardour-session utilities
|
||||
# it is intended to be symlinked into $PATH for every session-tool
|
||||
|
||||
export GTK_PATH=@CONFDIR@:@LIBDIR@${GTK_PATH:+:$GTK_PATH}
|
||||
export LD_LIBRARY_PATH=@LIBDIR@${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
|
||||
|
||||
# Running Ardour requires these 3 variables to be set
|
||||
|
||||
export ARDOUR_DATA_PATH=@DATADIR@
|
||||
export ARDOUR_CONFIG_PATH=@CONFDIR@
|
||||
export ARDOUR_DLL_PATH=@LIBDIR@
|
||||
export VAMP_PATH=@LIBDIR@/vamp
|
||||
|
||||
SELF=`basename $0`
|
||||
exec "@LIBDIR@/utils/$SELF" "$@"
|
161
session_utils/common.cc
Normal file
161
session_utils/common.cc
Normal file
@ -0,0 +1,161 @@
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
|
||||
|
||||
#include "pbd/debug.h"
|
||||
#include "pbd/event_loop.h"
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/failed_constructor.h"
|
||||
#include "pbd/pthread_utils.h"
|
||||
|
||||
#include "ardour/audioengine.h"
|
||||
|
||||
#include "common.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace ARDOUR;
|
||||
using namespace PBD;
|
||||
|
||||
static const char* localedir = LOCALEDIR;
|
||||
TestReceiver test_receiver;
|
||||
|
||||
void
|
||||
TestReceiver::receive (Transmitter::Channel chn, const char * str)
|
||||
{
|
||||
const char *prefix = "";
|
||||
|
||||
switch (chn) {
|
||||
case Transmitter::Error:
|
||||
prefix = ": [ERROR]: ";
|
||||
break;
|
||||
case Transmitter::Info:
|
||||
/* ignore */
|
||||
return;
|
||||
case Transmitter::Warning:
|
||||
prefix = ": [WARNING]: ";
|
||||
break;
|
||||
case Transmitter::Fatal:
|
||||
prefix = ": [FATAL]: ";
|
||||
break;
|
||||
case Transmitter::Throw:
|
||||
/* this isn't supposed to happen */
|
||||
abort ();
|
||||
}
|
||||
|
||||
/* note: iostreams are already thread-safe: no external
|
||||
lock required.
|
||||
*/
|
||||
|
||||
std::cout << prefix << str << std::endl;
|
||||
|
||||
if (chn == Transmitter::Fatal) {
|
||||
::exit (9);
|
||||
}
|
||||
}
|
||||
|
||||
/* temporarily required due to some code design confusion (Feb 2014) */
|
||||
|
||||
#include "ardour/vst_types.h"
|
||||
|
||||
int vstfx_init (void*) { return 0; }
|
||||
void vstfx_exit () {}
|
||||
void vstfx_destroy_editor (VSTState*) {}
|
||||
|
||||
class MyEventLoop : public sigc::trackable, public EventLoop
|
||||
{
|
||||
public:
|
||||
MyEventLoop (std::string const& name) : EventLoop (name) {
|
||||
run_loop_thread = Glib::Threads::Thread::self();
|
||||
}
|
||||
|
||||
void call_slot (InvalidationRecord*, const boost::function<void()>& f) {
|
||||
if (Glib::Threads::Thread::self() == run_loop_thread) {
|
||||
f ();
|
||||
}
|
||||
}
|
||||
|
||||
Glib::Threads::Mutex& slot_invalidation_mutex() { return request_buffer_map_lock; }
|
||||
|
||||
private:
|
||||
Glib::Threads::Thread* run_loop_thread;
|
||||
Glib::Threads::Mutex request_buffer_map_lock;
|
||||
};
|
||||
|
||||
static MyEventLoop *event_loop;
|
||||
|
||||
void
|
||||
SessionUtils::init ()
|
||||
{
|
||||
if (!ARDOUR::init (false, true, localedir)) {
|
||||
cerr << "Ardour failed to initialize\n" << endl;
|
||||
::exit (1);
|
||||
}
|
||||
|
||||
event_loop = new MyEventLoop ("util");
|
||||
EventLoop::set_event_loop_for_thread (event_loop);
|
||||
SessionEvent::create_per_thread_pool ("util", 512);
|
||||
|
||||
test_receiver.listen_to (error);
|
||||
test_receiver.listen_to (info);
|
||||
test_receiver.listen_to (fatal);
|
||||
test_receiver.listen_to (warning);
|
||||
}
|
||||
|
||||
static Session * _load_session (string dir, string state)
|
||||
{
|
||||
AudioEngine* engine = AudioEngine::create ();
|
||||
|
||||
if (!engine->set_backend ("None (Dummy)", "Unit-Test", "")) {
|
||||
std::cerr << "Cannot create Audio/MIDI engine\n";
|
||||
::exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
init_post_engine ();
|
||||
|
||||
if (engine->start () != 0) {
|
||||
std::cerr << "Cannot start Audio/MIDI engine\n";
|
||||
::exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
Session* session = new Session (*engine, dir, state);
|
||||
engine->set_session (session);
|
||||
return session;
|
||||
}
|
||||
|
||||
Session *
|
||||
SessionUtils::load_session (string dir, string state)
|
||||
{
|
||||
Session* s = 0;
|
||||
try {
|
||||
s = _load_session (dir, state);
|
||||
} catch (failed_constructor& e) {
|
||||
cerr << "failed_constructor: " << e.what() << "\n";
|
||||
exit (EXIT_FAILURE);
|
||||
} catch (AudioEngine::PortRegistrationFailure& e) {
|
||||
cerr << "PortRegistrationFailure: " << e.what() << "\n";
|
||||
exit (EXIT_FAILURE);
|
||||
} catch (exception& e) {
|
||||
cerr << "exception: " << e.what() << "\n";
|
||||
exit (EXIT_FAILURE);
|
||||
} catch (...) {
|
||||
cerr << "unknown exception.\n";
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
void
|
||||
SessionUtils::unload_session (Session *s)
|
||||
{
|
||||
delete s;
|
||||
AudioEngine::instance()->stop ();
|
||||
AudioEngine::destroy ();
|
||||
}
|
||||
|
||||
void
|
||||
SessionUtils::cleanup ()
|
||||
{
|
||||
ARDOUR::cleanup ();
|
||||
delete event_loop;
|
||||
pthread_cancel_all ();
|
||||
}
|
38
session_utils/common.h
Normal file
38
session_utils/common.h
Normal file
@ -0,0 +1,38 @@
|
||||
#ifndef _session_utils_common_h_
|
||||
#define _session_utils_common_h_
|
||||
|
||||
#include "pbd/transmitter.h"
|
||||
#include "pbd/receiver.h"
|
||||
|
||||
#include "ardour/ardour.h"
|
||||
#include "ardour/session.h"
|
||||
|
||||
class TestReceiver : public Receiver
|
||||
{
|
||||
protected:
|
||||
void receive (Transmitter::Channel chn, const char * str);
|
||||
};
|
||||
|
||||
namespace SessionUtils {
|
||||
|
||||
/** initialize libardour */
|
||||
void init ();
|
||||
|
||||
/** clean up, stop Processing Engine
|
||||
* @param s Session to close (may me NULL)
|
||||
*/
|
||||
void cleanup ();
|
||||
|
||||
/** @param dir Session directory.
|
||||
* @param state Session state file, without .ardour suffix.
|
||||
*/
|
||||
ARDOUR::Session * load_session (std::string dir, std::string state);
|
||||
|
||||
/** close session and stop engine
|
||||
* @param s Session to close (may me NULL)
|
||||
*/
|
||||
void unload_session (ARDOUR::Session *s);
|
||||
|
||||
};
|
||||
|
||||
#endif /* _session_utils_misc_h_ */
|
14
session_utils/debug
Executable file
14
session_utils/debug
Executable file
@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
TOP=`dirname "$0"`/..
|
||||
. "$TOP/build/gtk2_ardour/ardev_common_waf.sh"
|
||||
SELF=$1
|
||||
shift
|
||||
|
||||
export ARDOUR_INSIDE_GDB=1
|
||||
|
||||
if test -n "`which gdb`"; then
|
||||
exec gdb --args "$TOP/build/session_utils/$SELF" "$@"
|
||||
fi
|
||||
if test -n "`which lldb`"; then
|
||||
exec lldb -- "$TOP/build/session_utils/$SELF" "$@"
|
||||
fi
|
30
session_utils/example.cc
Normal file
30
session_utils/example.cc
Normal file
@ -0,0 +1,30 @@
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace ARDOUR;
|
||||
using namespace SessionUtils;
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
SessionUtils::init();
|
||||
Session* s = 0;
|
||||
|
||||
s = SessionUtils::load_session (
|
||||
"/home/rgareus/Documents/ArdourSessions/TestA/",
|
||||
"TestA"
|
||||
);
|
||||
|
||||
printf ("SESSION INFO: routes: %lu\n", s->get_routes()->size ());
|
||||
|
||||
sleep(2);
|
||||
|
||||
//s->save_state ("");
|
||||
|
||||
SessionUtils::unload_session(s);
|
||||
SessionUtils::cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
235
session_utils/export.cc
Normal file
235
session_utils/export.cc
Normal file
@ -0,0 +1,235 @@
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <getopt.h>
|
||||
#include <glibmm.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include "pbd/basename.h"
|
||||
|
||||
#include "ardour/export_handler.h"
|
||||
#include "ardour/export_status.h"
|
||||
#include "ardour/export_timespan.h"
|
||||
#include "ardour/export_channel_configuration.h"
|
||||
#include "ardour/export_format_specification.h"
|
||||
#include "ardour/export_filename.h"
|
||||
#include "ardour/route.h"
|
||||
#include "ardour/session_metadata.h"
|
||||
#include "ardour/broadcast_info.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace ARDOUR;
|
||||
using namespace SessionUtils;
|
||||
|
||||
static int export_session (Session *session,
|
||||
std::string outfile,
|
||||
std::string samplerate,
|
||||
bool normalize)
|
||||
{
|
||||
ExportTimespanPtr tsp = session->get_export_handler()->add_timespan();
|
||||
boost::shared_ptr<ExportChannelConfiguration> ccp = session->get_export_handler()->add_channel_config();
|
||||
boost::shared_ptr<ARDOUR::ExportFilename> fnp = session->get_export_handler()->add_filename();
|
||||
boost::shared_ptr<AudioGrapher::BroadcastInfo> b;
|
||||
|
||||
XMLTree tree;
|
||||
|
||||
tree.read_buffer(std::string(
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
||||
"<ExportFormatSpecification name=\"UTIL-WAV-16\" id=\"14792644-44ab-4209-a4f9-7ce6c2910cac\">"
|
||||
" <Encoding id=\"F_WAV\" type=\"T_Sndfile\" extension=\"wav\" name=\"WAV\" has-sample-format=\"true\" channel-limit=\"256\"/>"
|
||||
" <SampleRate rate=\""+ samplerate +"\"/>"
|
||||
" <SRCQuality quality=\"SRC_SincBest\"/>"
|
||||
" <EncodingOptions>"
|
||||
" <Option name=\"sample-format\" value=\"SF_16\"/>"
|
||||
" <Option name=\"dithering\" value=\"D_None\"/>"
|
||||
" <Option name=\"tag-metadata\" value=\"true\"/>"
|
||||
" <Option name=\"tag-support\" value=\"false\"/>"
|
||||
" <Option name=\"broadcast-info\" value=\"false\"/>"
|
||||
" </EncodingOptions>"
|
||||
" <Processing>"
|
||||
" <Normalize enabled=\""+ (normalize ? "true" : "false") +"\" target=\"0\"/>"
|
||||
" <Silence>"
|
||||
" <Start>"
|
||||
" <Trim enabled=\"false\"/>"
|
||||
" <Add enabled=\"false\">"
|
||||
" <Duration format=\"Timecode\" hours=\"0\" minutes=\"0\" seconds=\"0\" frames=\"0\"/>"
|
||||
" </Add>"
|
||||
" </Start>"
|
||||
" <End>"
|
||||
" <Trim enabled=\"false\"/>"
|
||||
" <Add enabled=\"false\">"
|
||||
" <Duration format=\"Timecode\" hours=\"0\" minutes=\"0\" seconds=\"0\" frames=\"0\"/>"
|
||||
" </Add>"
|
||||
" </End>"
|
||||
" </Silence>"
|
||||
" </Processing>"
|
||||
"</ExportFormatSpecification>"
|
||||
));
|
||||
|
||||
boost::shared_ptr<ExportFormatSpecification> fmp = session->get_export_handler()->add_format(*tree.root());
|
||||
|
||||
/* set up range */
|
||||
framepos_t start, end;
|
||||
start = session->current_start_frame();
|
||||
end = session->current_end_frame();
|
||||
tsp->set_range (start, end);
|
||||
tsp->set_range_id ("session");
|
||||
|
||||
/* add master outs as default */
|
||||
IO* master_out = session->master_out()->output().get();
|
||||
if (!master_out) {
|
||||
PBD::warning << _("Export Util: No Master Out Ports to Connect for Audio Export") << endmsg;
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (uint32_t n = 0; n < master_out->n_ports().n_audio(); ++n) {
|
||||
PortExportChannel * channel = new PortExportChannel ();
|
||||
channel->add_port (master_out->audio (n));
|
||||
ExportChannelPtr chan_ptr (channel);
|
||||
ccp->register_channel (chan_ptr);
|
||||
}
|
||||
|
||||
/* output filename */
|
||||
if (outfile.empty ()) {
|
||||
tsp->set_name ("session");
|
||||
} else {
|
||||
std::string dirname = Glib::path_get_dirname (outfile);
|
||||
std::string basename = Glib::path_get_basename (outfile);
|
||||
|
||||
if (basename.size() > 4 && !basename.compare (basename.size() - 4, 4, ".wav")) {
|
||||
basename = PBD::basename_nosuffix (basename);
|
||||
}
|
||||
|
||||
fnp->set_folder(dirname);
|
||||
tsp->set_name (basename);
|
||||
}
|
||||
|
||||
cout << "* Writing " << Glib::build_filename (fnp->get_folder(), tsp->name() + ".wav") << endl;
|
||||
|
||||
|
||||
/* output */
|
||||
fnp->set_timespan(tsp);
|
||||
fnp->include_label = false;
|
||||
|
||||
/* do audio export */
|
||||
fmp->set_soundcloud_upload(false);
|
||||
session->get_export_handler()->add_export_config (tsp, ccp, fmp, fnp, b);
|
||||
session->get_export_handler()->do_export();
|
||||
|
||||
boost::shared_ptr<ARDOUR::ExportStatus> status = session->get_export_status ();
|
||||
|
||||
// TODO trap SIGINT -> status->abort();
|
||||
|
||||
while (status->running) {
|
||||
if (status->normalizing) {
|
||||
double progress = ((float) status->current_normalize_cycle) / status->total_normalize_cycles;
|
||||
printf ("* Normalizing %.1f%% \r", 100. * progress); fflush (stdout);
|
||||
} else {
|
||||
double progress = ((float) status->processed_frames_current_timespan) / status->total_frames_current_timespan;
|
||||
printf ("* Exporting Audio %.1f%% \r", 100. * progress); fflush (stdout);
|
||||
}
|
||||
Glib::usleep (1000000);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
status->finish ();
|
||||
|
||||
printf ("* Done.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void usage (int status) {
|
||||
// help2man compatible format (standard GNU help-text)
|
||||
printf ("export - export an ardour session from the commandline.\n\n");
|
||||
printf ("Usage: export [ OPTIONS ] <session-dir> <session-name>\n\n");
|
||||
printf ("Options:\n\
|
||||
-h, --help display this help and exit\n\
|
||||
-n, --normalize normalize signal level (to 0dBFS)\n\
|
||||
-o, --output <file> set expected [initial] framerate\n\
|
||||
-s, --samplerate <rate> samplerate to use (default: 48000)\n\
|
||||
-V, --version print version information and exit\n\
|
||||
\n");
|
||||
printf ("\n\
|
||||
The session is exported as 16bit wav.\n\
|
||||
If the no output file is given, the session's export dir is used.\n\
|
||||
\n");
|
||||
|
||||
printf ("Report bugs to <http://tracker.ardour.org/>\n"
|
||||
"Website: <http://ardour.org/>\n");
|
||||
::exit (status);
|
||||
}
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
std::string rate = "48000";
|
||||
std::string outfile;
|
||||
bool normalize = false;
|
||||
|
||||
const char *optstring = "hno:r:V";
|
||||
|
||||
const struct option longopts[] = {
|
||||
{ "help", 0, 0, 'h' },
|
||||
{ "normalize", 0, 0, 'n' },
|
||||
{ "output", 1, 0, 'o' },
|
||||
{ "samplerate", 1, 0, 'r' },
|
||||
{ "version", 0, 0, 'V' },
|
||||
};
|
||||
|
||||
int c = 0;
|
||||
while (EOF != (c = getopt_long (argc, argv,
|
||||
optstring, longopts, (int *) 0))) {
|
||||
switch (c) {
|
||||
|
||||
case 'n':
|
||||
normalize = true;
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
outfile = optarg;
|
||||
break;
|
||||
|
||||
case 's':
|
||||
{
|
||||
const int sr = atoi (optarg);
|
||||
if (sr >= 8000 && sr <= 192000) {
|
||||
stringstream ss;
|
||||
ss << sr;
|
||||
rate = ss.str();
|
||||
} else {
|
||||
fprintf(stderr, "Invalid Samplerate\n");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
printf ("ardour-utils version %s\n\n", VERSIONSTRING);
|
||||
printf ("Copyright (C) GPL 2015 Robin Gareus <robin@gareus.org>\n");
|
||||
exit (0);
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
usage (0);
|
||||
break;
|
||||
|
||||
default:
|
||||
usage (EXIT_FAILURE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (optind + 2 > argc) {
|
||||
usage (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
SessionUtils::init();
|
||||
Session* s = 0;
|
||||
|
||||
s = SessionUtils::load_session (argv[optind], argv[optind+1]);
|
||||
|
||||
export_session (s, outfile, rate, normalize);
|
||||
|
||||
SessionUtils::unload_session(s);
|
||||
SessionUtils::cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
6
session_utils/run
Executable file
6
session_utils/run
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
TOP=`dirname "$0"`/..
|
||||
. "$TOP/build/gtk2_ardour/ardev_common_waf.sh"
|
||||
SELF=$1
|
||||
shift
|
||||
exec "$TOP/build/session_utils/$SELF" "$@"
|
94
session_utils/wscript
Normal file
94
session_utils/wscript
Normal file
@ -0,0 +1,94 @@
|
||||
#!/usr/bin/env python
|
||||
from waflib.extras import autowaf as autowaf
|
||||
from waflib import Options, TaskGen
|
||||
import waflib.Logs as Logs, waflib.Utils as Utils
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import re
|
||||
import time
|
||||
from waflib.Task import Task
|
||||
|
||||
# Mandatory variables
|
||||
top = '.'
|
||||
out = 'build'
|
||||
|
||||
def options(opt):
|
||||
autowaf.set_options(opt)
|
||||
|
||||
def configure(conf):
|
||||
conf.load('misc')
|
||||
conf.load('compiler_cxx')
|
||||
autowaf.configure(conf)
|
||||
|
||||
def build_ardour_util(bld, util):
|
||||
pgmprefix = bld.env['PROGRAM_NAME'].lower() + str(bld.env['MAJOR'])
|
||||
|
||||
# just the normal executable version of the GTK GUI
|
||||
obj = bld (features = 'cxx c cxxprogram')
|
||||
# this program does not do the whole hidden symbols thing
|
||||
obj.cxxflags = [ '-fvisibility=default' ]
|
||||
obj.source = ['common.cc', util + '.cc' ]
|
||||
obj.target = pgmprefix + '-' + util
|
||||
obj.includes = ['.']
|
||||
obj.use = [ 'libpbd',
|
||||
'libardour',
|
||||
'libardour_cp',
|
||||
'libtimecode',
|
||||
'libmidipp',
|
||||
]
|
||||
obj.defines = [
|
||||
'VERSIONSTRING="' + str(bld.env['VERSION']) + '"',
|
||||
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
|
||||
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
|
||||
'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
|
||||
'PACKAGE="' + "ARDOURUTILS" + '"',
|
||||
]
|
||||
obj.install_path = bld.env['LIBDIR'] + '/utils'
|
||||
obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL'
|
||||
obj.uselib += ' FFTW3F'
|
||||
obj.uselib += ' AUDIOUNITS OSX LO '
|
||||
obj.uselib += ' TAGLIB '
|
||||
|
||||
if sys.platform == 'darwin':
|
||||
obj.uselib += ' AUDIOUNITS OSX'
|
||||
obj.use += ' libappleutility'
|
||||
obj.includes += ['../libs']
|
||||
|
||||
if bld.env['build_target'] == 'mingw':
|
||||
if bld.env['DEBUG'] == False:
|
||||
obj.linkflags = ['-mwindows']
|
||||
|
||||
if bld.is_defined('NEED_INTL'):
|
||||
obj.linkflags = ' -lintl'
|
||||
|
||||
|
||||
def build(bld):
|
||||
VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
|
||||
# no wine
|
||||
if bld.is_defined('WINDOWS_VST_SUPPORT') and bld.env['build_target'] != 'mingw':
|
||||
return
|
||||
|
||||
# don't build/install windows version just yet.
|
||||
# tools/x-win/package.sh uses 'waf install'. The symlinks
|
||||
# and shell wrapper script won't work on windows.
|
||||
if bld.env['build_target'] == 'mingw':
|
||||
return
|
||||
|
||||
pgmprefix = bld.env['PROGRAM_NAME'].lower() + str(bld.env['MAJOR'])
|
||||
|
||||
utils = bld.path.ant_glob('*.cc', excl=['example.cc', 'common.cc'])
|
||||
|
||||
for util in utils:
|
||||
fn = str(util)[:-3]
|
||||
build_ardour_util(bld, fn)
|
||||
bld.symlink_as(bld.env['BINDIR'] + '/' + pgmprefix + "-" + fn, bld.env['LIBDIR'] + '/utils/ardour-util.sh')
|
||||
|
||||
obj = bld(features = 'subst')
|
||||
obj.source = 'ardour-util.sh.in'
|
||||
obj.target = 'ardour-util.sh'
|
||||
obj.chmod = Utils.O755
|
||||
obj.install_path = bld.env['LIBDIR'] + '/utils'
|
||||
obj.LIBDIR = os.path.normpath(bld.env['DLLDIR'])
|
||||
obj.DATADIR = os.path.normpath(bld.env['DATADIR'])
|
||||
obj.CONFDIR = os.path.normpath(bld.env['CONFDIR'])
|
Loading…
Reference in New Issue
Block a user