CINXE.COM

Pidgin3 Development Scripts :: Pidgin, the universal chat client

<!DOCTYPE html> <html lang="en" class="js csstransforms3d"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="generator" content="Hugo 0.80.0" /> <!-- Hugo: 2024-11-21T16:01:42 &#43;0000 - Job: n/a 2024-11-21T16:00:09 &#43;0000 - Commit: 6532ddaa35872bff96510daa851a60884a7abcee - production //--> <meta name="description" content="Pidgin is a universal chat client, allowing you to consolidate all your different messaging apps into a single tool."> <meta property="og:title" content="Pidgin3 Development Scripts" /> <meta property="og:description" content="Introduction Developing Pidgin 3 can be quite complicated and error prone. Compilation and installation takes a long time and even running an additional instance can be a painful as there are currently two command line arguments that need to be set to make it work. To make all of this work we use a number of scripts. In fact you may even have seen some of them in use on grim&rsquo;s stream." /> <meta property="og:type" content="article" /> <meta property="og:url" content="https://pidgin.im/posts/2021-06-pidgin3-development-scripts/" /> <meta property="og:image" content="https://pidgin.im/images/pidgin-circle-256.png" /> <meta property="article:published_time" content="2021-06-09T01:26:16-05:00" /> <meta property="article:modified_time" content="2021-06-09T01:26:16-05:00" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:image" content="https://pidgin.im/images/pidgin-circle-256.png" /> <meta name="twitter:title" content="Pidgin3 Development Scripts" /> <meta name="twitter:description" content="Introduction Developing Pidgin 3 can be quite complicated and error prone. Compilation and installation takes a long time and even running an additional instance can be a painful as there are currently two command line arguments that need to be set to make it work. To make all of this work we use a number of scripts. In fact you may even have seen some of them in use on grim&rsquo;s stream." /> <link rel="shortcut icon" href="/favicon/favicon.ico"> <link rel="icon" sizes="16x16 32x32 64x64" href="/favicon/favicon.ico"> <link rel="icon" type="image/png" sizes="196x196" href="/favicon/favicon-192.png"> <link rel="icon" type="image/png" sizes="160x160" href="/favicon/favicon-160.png"> <link rel="icon" type="image/png" sizes="96x96" href="/favicon/favicon-96.png"> <link rel="icon" type="image/png" sizes="64x64" href="/favicon/favicon-64.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicon/favicon-32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16.png"> <link rel="apple-touch-icon" href="/favicon/favicon-57.png"> <link rel="apple-touch-icon" sizes="114x114" href="/favicon/favicon-114.png"> <link rel="apple-touch-icon" sizes="72x72" href="/favicon/favicon-72.png"> <link rel="apple-touch-icon" sizes="144x144" href="/favicon/favicon-144.png"> <link rel="apple-touch-icon" sizes="60x60" href="/favicon/favicon-60.png"> <link rel="apple-touch-icon" sizes="120x120" href="/favicon/favicon-120.png"> <link rel="apple-touch-icon" sizes="76x76" href="/favicon/favicon-76.png"> <link rel="apple-touch-icon" sizes="152x152" href="/favicon/favicon-152.png"> <link rel="apple-touch-icon" sizes="180x180" href="/favicon/favicon-180.png"> <meta name="msapplication-TileColor" content="#8451A1"> <meta name="msapplication-TileImage" content="/favicon/favicon-144.png"> <meta name="msapplication-config" content="favicon/browserconfig.xml"> <title>Pidgin3 Development Scripts :: Pidgin, the universal chat client</title> <link href="/css/nucleus.css?1732204902" rel="stylesheet"> <link href="/css/fontawesome-all.min.css?1732204902" rel="stylesheet"> <link href="/css/hybrid.css?1732204902" rel="stylesheet"> <link href="/css/featherlight.min.css?1732204902" rel="stylesheet"> <link href="/css/perfect-scrollbar.min.css?1732204902" rel="stylesheet"> <link href="/css/auto-complete.css?1732204902" rel="stylesheet"> <link href="/css/atom-one-dark-reasonable.css?1732204902" rel="stylesheet"> <link href="/css/theme.css?1732204902" rel="stylesheet"> <link href="/css/hugo-theme.css?1732204902" rel="stylesheet"> <link href="/css/theme-pidgin.css?1732204902" rel="stylesheet"> <link href="/css/custom.css?1732204902" rel="stylesheet"> <script src="/js/jquery-3.3.1.min.js?1732204902"></script> <style> :root #header + #content > #left > #rlblock_left{ display:none !important; } </style> </head> <body class="" data-url="/posts/2021-06-pidgin3-development-scripts/"> <nav id="sidebar" class=""> <div id="header-wrapper"> <div id="header"> <a href="/"><img src="/images/logo.png" alt="pidgin logo"></a> </div> <div class="searchbox"> <label for="search-by"><i class="fas fa-search"></i></label> <input data-search-input id="search-by" type="search" placeholder="Search..."> <span data-search-clear=""><i class="fas fa-times"></i></span> </div> <script type="text/javascript" src="/js/lunr.min.js?1732204902"></script> <script type="text/javascript" src="/js/auto-complete.js?1732204902"></script> <script type="text/javascript"> var baseurl = "https:\/\/pidgin.im\/"; </script> <script type="text/javascript" src="/js/search.js?1732204902"></script> </div> <div class="highlightable"> <ul class="topics"> <li data-nav-id="/install/" title="Install" class="dd-item "> <a href="/install/"> Install </a> </li> <li data-nav-id="/plugins/" title="Plugins" class="dd-item "> <a href="/plugins/"> Plugins </a> </li> <li data-nav-id="/about/" title="About" class="dd-item "> <a href="/about/"> About </a> <ul> <li data-nav-id="/about/pidginchat/" title="Pidgin Chat" class="dd-item "> <a href="/about/pidginchat/"> Pidgin Chat </a> </li> <li data-nav-id="/about/philosophy/" title="Philosophy and Goals" class="dd-item "> <a href="/about/philosophy/"> Philosophy and Goals </a> </li> <li data-nav-id="/about/supported-languages/" title="Supported Languages" class="dd-item "> <a href="/about/supported-languages/"> Supported Languages </a> </li> <li data-nav-id="/about/security/" title="Security" class="dd-item "> <a href="/about/security/"> Security </a> <ul> <li data-nav-id="/about/security/advisories/" title="Advisories" class="dd-item "> <a href="/about/security/advisories/"> Advisories </a> <ul> <li data-nav-id="/about/security/advisories/cve-2022-26491/" title="cve-2022-26491-00" class="dd-item "> <a href="/about/security/advisories/cve-2022-26491/"> cve-2022-26491-00 </a> </li> </ul> </li> </ul> </li> </ul> </li> <li data-nav-id="/help/" title="Help" class="dd-item "> <a href="/help/"> Help </a> <ul> <li data-nav-id="/help/protocols/" title="Services (Protocols)" class="dd-item "> <a href="/help/protocols/"> Services (Protocols) </a> <ul> <li data-nav-id="/help/protocols/bonjour/" title="Bonjour" class="dd-item "> <a href="/help/protocols/bonjour/"> Bonjour </a> </li> <li data-nav-id="/help/protocols/gadugadu/" title="Gadu-Gadu" class="dd-item "> <a href="/help/protocols/gadugadu/"> Gadu-Gadu </a> </li> <li data-nav-id="/help/protocols/groupwise/" title="GroupWise" class="dd-item "> <a href="/help/protocols/groupwise/"> GroupWise </a> </li> <li data-nav-id="/help/protocols/irc/" title="IRC" class="dd-item "> <a href="/help/protocols/irc/"> IRC </a> </li> <li data-nav-id="/help/protocols/sametime/" title="Sametime" class="dd-item "> <a href="/help/protocols/sametime/"> Sametime </a> </li> <li data-nav-id="/help/protocols/silc/" title="SILC" class="dd-item "> <a href="/help/protocols/silc/"> SILC </a> </li> <li data-nav-id="/help/protocols/xmpp/" title="XMPP (Jabber)" class="dd-item "> <a href="/help/protocols/xmpp/"> XMPP (Jabber) </a> <ul> <li data-nav-id="/help/protocols/xmpp/supportedxep/" title="Supported XEP&#39;s" class="dd-item "> <a href="/help/protocols/xmpp/supportedxep/"> Supported XEP&#39;s </a> </li> </ul> </li> <li data-nav-id="/help/protocols/zephyr/" title="Zephyr" class="dd-item "> <a href="/help/protocols/zephyr/"> Zephyr </a> </li> <li data-nav-id="/help/protocols/otherprotocols/" title="Other Protocols" class="dd-item "> <a href="/help/protocols/otherprotocols/"> Other Protocols </a> </li> </ul> </li> <li data-nav-id="/help/theming/" title="Theming Pidgin" class="dd-item "> <a href="/help/theming/"> Theming Pidgin </a> </li> <li data-nav-id="/help/windows/" title="Windows-Specific Questions" class="dd-item "> <a href="/help/windows/"> Windows-Specific Questions </a> </li> </ul> </li> <li data-nav-id="/development/" title="Development" class="dd-item "> <a href="/development/"> Development </a> <ul> <li data-nav-id="/development/building/" title="Building" class="dd-item "> <a href="/development/building/"> Building </a> <ul> <li data-nav-id="/development/building/3.0.0/" title="3.0.0" class="dd-item "> <a href="/development/building/3.0.0/"> 3.0.0 </a> </li> <li data-nav-id="/development/building/2.x.y/" title="2.x.y" class="dd-item "> <a href="/development/building/2.x.y/"> 2.x.y </a> <ul> <li data-nav-id="/development/building/2.x.y/windows/" title="Windows" class="dd-item "> <a href="/development/building/2.x.y/windows/"> Windows </a> </li> </ul> </li> </ul> </li> <li data-nav-id="/development/contributing/" title="Contributing" class="dd-item "> <a href="/development/contributing/"> Contributing </a> </li> <li data-nav-id="/development/gsoc/" title="Google Summer of Code" class="dd-item "> <a href="/development/gsoc/"> Google Summer of Code </a> <ul> <li data-nav-id="/development/gsoc/instructions/" title="GSoC Instructions" class="dd-item "> <a href="/development/gsoc/instructions/"> GSoC Instructions </a> </li> <li data-nav-id="/development/gsoc/ideas/" title="GSoC Ideas" class="dd-item "> <a href="/development/gsoc/ideas/"> GSoC Ideas </a> </li> </ul> </li> <li data-nav-id="/development/debugging/" title="Debugging" class="dd-item "> <a href="/development/debugging/"> Debugging </a> </li> <li data-nav-id="/development/voice-and-video/" title="Voice and Video" class="dd-item "> <a href="/development/voice-and-video/"> Voice and Video </a> <ul> <li data-nav-id="/development/voice-and-video/voice-and-video-api/" title="Voice and Video API" class="dd-item "> <a href="/development/voice-and-video/voice-and-video-api/"> Voice and Video API </a> </li> </ul> </li> <li data-nav-id="/development/i18n/" title="Internationalization" class="dd-item "> <a href="/development/i18n/"> Internationalization </a> </li> <li data-nav-id="/development/release-process/" title="Release Process" class="dd-item "> <a href="/development/release-process/"> Release Process </a> </li> <li data-nav-id="/development/faq/" title="FAQ" class="dd-item "> <a href="/development/faq/"> FAQ </a> </li> <li data-nav-id="/development/design-guidelines/" title="Design Guidelines" class="dd-item "> <a href="/development/design-guidelines/"> Design Guidelines </a> </li> </ul> </li> <li data-nav-id="/contact/" title="Contact" class="dd-item "> <a href="/contact/"> Contact </a> </li> <li data-nav-id="/post/" title="Blog" class="dd-item parent "> <a href="/post/"> Blog </a> <ul> <li data-nav-id="/posts/2024-08-malicious-plugin/" title="Malicious Plugin" class="dd-item "> <a href="/posts/2024-08-malicious-plugin/"> Malicious Plugin </a> </li> <li data-nav-id="/posts/2024-02-2.14.13-released/" title="2.14.13 Released!" class="dd-item "> <a href="/posts/2024-02-2.14.13-released/"> 2.14.13 Released! </a> </li> <li data-nav-id="/posts/2024-02-state-of-the-bird-2023-q4/" title="State of the Bird 2023 Q4" class="dd-item "> <a href="/posts/2024-02-state-of-the-bird-2023-q4/"> State of the Bird 2023 Q4 </a> </li> <li data-nav-id="/posts/2023-11-state-of-the-bird-2023-q3/" title="State of the Bird 2023 Q3" class="dd-item "> <a href="/posts/2023-11-state-of-the-bird-2023-q3/"> State of the Bird 2023 Q3 </a> </li> <li data-nav-id="/posts/2023-08-facebook-republished/" title="Facebook Republished" class="dd-item "> <a href="/posts/2023-08-facebook-republished/"> Facebook Republished </a> </li> <li data-nav-id="/posts/2023-08-facebook-takedown/" title="Facebook Takedown" class="dd-item "> <a href="/posts/2023-08-facebook-takedown/"> Facebook Takedown </a> </li> <li data-nav-id="/posts/2023-07-state-of-the-bird-2023-q2/" title="State of the Bird 2023 Q2" class="dd-item "> <a href="/posts/2023-07-state-of-the-bird-2023-q2/"> State of the Bird 2023 Q2 </a> </li> <li data-nav-id="/posts/2023-01-state-of-the-bird-2022-q4/" title="State of the Bird 2022 Q4" class="dd-item "> <a href="/posts/2023-01-state-of-the-bird-2022-q4/"> State of the Bird 2022 Q4 </a> </li> <li data-nav-id="/posts/2022-12-2.14.12-released/" title="2.14.12 Released!" class="dd-item "> <a href="/posts/2022-12-2.14.12-released/"> 2.14.12 Released! </a> </li> <li data-nav-id="/posts/2022-10-state-of-the-bird-2022-q3/" title="State of the Bird 2022 Q3" class="dd-item "> <a href="/posts/2022-10-state-of-the-bird-2022-q3/"> State of the Bird 2022 Q3 </a> </li> <li data-nav-id="/posts/2022-09-digitalocean-sponsorship-renewed/" title="DigitalOcean Sponsorship Renewed" class="dd-item "> <a href="/posts/2022-09-digitalocean-sponsorship-renewed/"> DigitalOcean Sponsorship Renewed </a> </li> <li data-nav-id="/posts/2022-07-state-of-the-bird-2022-q2/" title="State of the Bird 2022 Q2" class="dd-item "> <a href="/posts/2022-07-state-of-the-bird-2022-q2/"> State of the Bird 2022 Q2 </a> </li> <li data-nav-id="/posts/2022-06-2.14.10-released/" title="2.14.10 Released!" class="dd-item "> <a href="/posts/2022-06-2.14.10-released/"> 2.14.10 Released! </a> </li> <li data-nav-id="/posts/2022-05-google-talk-shutdown/" title="Google Talk Shutdown" class="dd-item "> <a href="/posts/2022-05-google-talk-shutdown/"> Google Talk Shutdown </a> </li> <li data-nav-id="/posts/2022-04-2.14.9-released/" title="2.14.9 Released!" class="dd-item "> <a href="/posts/2022-04-2.14.9-released/"> 2.14.9 Released! </a> </li> <li data-nav-id="/posts/2022-04-state-of-the-bird-2022-q1/" title="State of the Bird 2022 Q1" class="dd-item "> <a href="/posts/2022-04-state-of-the-bird-2022-q1/"> State of the Bird 2022 Q1 </a> </li> <li data-nav-id="/posts/2022-02-libera-wallops/" title="Libera Wallops" class="dd-item "> <a href="/posts/2022-02-libera-wallops/"> Libera Wallops </a> </li> <li data-nav-id="/posts/2022-01-state-of-the-bird-2021-q4/" title="State of the Bird 2021 Q4" class="dd-item "> <a href="/posts/2022-01-state-of-the-bird-2021-q4/"> State of the Bird 2021 Q4 </a> </li> <li data-nav-id="/posts/2021-10-2.14.8-released/" title="2.14.8 Released!" class="dd-item "> <a href="/posts/2021-10-2.14.8-released/"> 2.14.8 Released! </a> </li> <li data-nav-id="/posts/2021-10-state-of-the-bird-2021-q3/" title="State of the Bird 2021 Q3" class="dd-item "> <a href="/posts/2021-10-state-of-the-bird-2021-q3/"> State of the Bird 2021 Q3 </a> </li> <li data-nav-id="/posts/2021-09-2.14.7-released/" title="2.14.7 Released!" class="dd-item "> <a href="/posts/2021-09-2.14.7-released/"> 2.14.7 Released! </a> </li> <li data-nav-id="/posts/2021-09-gsoc-2021-retrospective/" title="GSoC 2021 Retrospective" class="dd-item "> <a href="/posts/2021-09-gsoc-2021-retrospective/"> GSoC 2021 Retrospective </a> </li> <li data-nav-id="/posts/2021-07-2.14.6-released/" title="2.14.6 Released!" class="dd-item "> <a href="/posts/2021-07-2.14.6-released/"> 2.14.6 Released! </a> </li> <li data-nav-id="/posts/2021-06-irc-network-changes/" title="IRC Network Changes" class="dd-item "> <a href="/posts/2021-06-irc-network-changes/"> IRC Network Changes </a> </li> <li data-nav-id="/posts/2021-06-pidgin3-development-scripts/" title="Pidgin3 Development Scripts" class="dd-item active"> <a href="/posts/2021-06-pidgin3-development-scripts/"> Pidgin3 Development Scripts </a> </li> <li data-nav-id="/posts/2021-06-hgkeeper-and-mercurial-5.8-issue/" title="HGKeeper and Mercurial 5.8 Issue" class="dd-item "> <a href="/posts/2021-06-hgkeeper-and-mercurial-5.8-issue/"> HGKeeper and Mercurial 5.8 Issue </a> </li> <li data-nav-id="/posts/2021-06-2.14.5-released/" title="2.14.5 Released!" class="dd-item "> <a href="/posts/2021-06-2.14.5-released/"> 2.14.5 Released! </a> </li> <li data-nav-id="/posts/2021-05-gsoc-2021/" title="Gsoc 2021" class="dd-item "> <a href="/posts/2021-05-gsoc-2021/"> Gsoc 2021 </a> </li> <li data-nav-id="/posts/2021-05-thank-you-steadfast/" title="Thank You, Steadfast" class="dd-item "> <a href="/posts/2021-05-thank-you-steadfast/"> Thank You, Steadfast </a> </li> <li data-nav-id="/posts/2021-05-digitalocean-sponsorship/" title="DigitalOcean Sponsorship" class="dd-item "> <a href="/posts/2021-05-digitalocean-sponsorship/"> DigitalOcean Sponsorship </a> </li> <li data-nav-id="/posts/2021-04-2.14.4-released/" title="2.14.4 Released!" class="dd-item "> <a href="/posts/2021-04-2.14.4-released/"> 2.14.4 Released! </a> </li> <li data-nav-id="/posts/2021-04-2.14.3-released/" title="2.14.3 Released!" class="dd-item "> <a href="/posts/2021-04-2.14.3-released/"> 2.14.3 Released! </a> </li> <li data-nav-id="/posts/2021-04-2.14.2-released/" title="2.14.2 Released!" class="dd-item "> <a href="/posts/2021-04-2.14.2-released/"> 2.14.2 Released! </a> </li> <li data-nav-id="/posts/2021-03-pidginchat/" title="Pidginchat" class="dd-item "> <a href="/posts/2021-03-pidginchat/"> Pidginchat </a> </li> <li data-nav-id="/posts/2021-02-libgnt-2.14.1-released/" title="libgnt 2.14.1 Released" class="dd-item "> <a href="/posts/2021-02-libgnt-2.14.1-released/"> libgnt 2.14.1 Released </a> </li> <li data-nav-id="/posts/2021-02-bintray-sunsetting/" title="Bintray Sunsetting" class="dd-item "> <a href="/posts/2021-02-bintray-sunsetting/"> Bintray Sunsetting </a> </li> <li data-nav-id="/posts/2020-06-2.14.1-released/" title="2.14.1 Released!" class="dd-item "> <a href="/posts/2020-06-2.14.1-released/"> 2.14.1 Released! </a> </li> <li data-nav-id="/posts/2020-06-2.14.0-released/" title="2.14.0 Released!" class="dd-item "> <a href="/posts/2020-06-2.14.0-released/"> 2.14.0 Released! </a> </li> <li data-nav-id="/posts/2020-01-nest-launch/" title="Nest Launch" class="dd-item "> <a href="/posts/2020-01-nest-launch/"> Nest Launch </a> </li> </ul> </li> </ul> <section id="shortcuts"> <h3></h3> <ul> <li> <a class="padding" href="https://issues.imfreedom.org/issues/PIDGIN"><i class='fas fa-fw fa-tasks'></i> Issue Tracker</a> </li> <li> <a class="padding" href="https://keep.imfreedom.org/pidgin/"><i class='fas fa-fw fa-code'></i> Repositories</a> </li> <li> <a class="padding" href="https://shop.spreadshirt.com/imfreedom"><i class='fas fa-fw fa-tshirt'></i> Merchandise</a> </li> <li> <a class="padding" rel=me href="https://fosstodon.org/@pidgin"><i class='fab fa-fw fa-mastodon'></i> Mastodon</a> </li> </ul> </section> <section id="prefooter"> <hr /> <ul> <li> <a class="padding"> <i class="fas fa-language fa-fw"></i> <div class="select-style"> <select id="select-language" onchange="location = this.value;"> <option id="en" value="https://pidgin.im/posts/2021-06-pidgin3-development-scripts/" selected>English (US)</option> </select> <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="255px" height="255px" viewBox="0 0 255 255" style="enable-background:new 0 0 255 255;" xml:space="preserve"> <g> <g id="arrow-drop-down"> <polygon points="0,63.75 127.5,191.25 255,63.75 " /> </g> </g> </svg> </div> </a> </li> </ul> </section> <section id="footer"> <a href="https://imfreedom.org/donate" class="donate-button"> <i class="fas fa-heart"></i> Donate </a> </section> </div> </nav> <section id="body"> <div id="overlay"></div> <div class="padding highlightable"> <div> <div id="top-bar"> <div id="top-github-link"> <a class="github-link" title='Edit this page' href="https://keep.imfreedom.org/pidgin/nest/file/default/hugo/content/post/pidgin3-dev-scripts.md" target="blank"> <i class="fas fa-code-branch"></i> <span id="top-github-link-text">Edit this page</span> </a> </div> <div id="breadcrumbs" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"> <span id="sidebar-toggle-span"> <a href="#" id="sidebar-toggle" data-sidebar-toggle=""> <i class="fas fa-bars"></i> </a> </span> <span id="toc-menu"><i class="fas fa-list-alt"></i></span> <span class="links"> <a href='/'>Pidgin</a> > <a href='/post/'>Blog</a> > Pidgin3 Development Scripts </span> </div> <div class="progress"> <div class="wrapper"> <nav id="TableOfContents"> <ul> <li><a href="#introduction">Introduction</a></li> <li><a href="#prefixes">Prefixes</a></li> <li><a href="#scripts">Scripts</a> <ul> <li><a href="#dev-log-grep">dev-log-grep</a></li> <li><a href="#dev-pidgin">dev-pidgin</a></li> <li><a href="#local-pidgin">local-pidgin</a></li> <li><a href="#dev-pidgin-glade">dev-pidgin-glade</a></li> </ul> </li> </ul> </nav> </div> </div> </div> </div> <div id="head-tags"> </div> <div id="body-inner"> <h1> Pidgin3 Development Scripts </h1> <h2 id="introduction">Introduction</h2> <p>Developing Pidgin 3 can be quite complicated and error prone. Compilation and installation takes a long time and even running an additional instance can be a painful as there are currently two command line arguments that need to be set to make it work.</p> <p>To make all of this work we use a number of scripts. In fact you may even have seen some of them in use on <a href="https://twitch.tv/rw_grim">grim&rsquo;s stream</a>. But there&rsquo;s one more piece to all of this and that is the installation prefix.</p> <h2 id="prefixes">Prefixes</h2> <p>All projects that use autotools, cmake, meson, qmake, etc have what we call an installation prefix. It&rsquo;s what tells the build system where to install the software. By default this is typically <code>/usr/local</code> which means your executables will end up in <code>/usr/local/bin</code>, your libraries in <code>/usr/local/lib</code> and so on.</p> <p>Using the default is usually fine if you&rsquo;re just running the software, but while developing the need might arise for you to delete everything that&rsquo;s been installed. While all of these build systems include an uninstall target, there are times when you&rsquo;ll update your local copy and not realize that installed files have been removed and they end up polluting your install prefix and can cause bugs that are very difficult to debug because there are files that are there that you&rsquo;re not expecting.</p> <p>To avoid this or having to run the uninstall target before every update we make it easy to delete everything by using a custom prefix. You&rsquo;re free to use whatever prefix you like, but grim uses <code>~/l</code>. The <code>l</code> is just an abbreviation of <code>local</code> and is less likely to be confused with <code>~/.local</code> which is something <a href="https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html">completely different</a>.</p> <p>Using a custom prefix also makes it very easy to make sure we&rsquo;re always building our subprojects of GPlugin, libgnt, and Talkatu. This is important because at the current stage of development these are being updated directly for Pidgin 3 and vice versa. This works because meson doesn&rsquo;t add the prefix to the <code>PKG_CONFIG_PATH</code> environment variable so <code>pkg-config</code> is unable to find the installed copies of our subprojects and thus always builds them.</p> <p>To set the prefix we pass it as an argument to meson during initial configuration via <code>meson --prefix=~/l build</code> or after the fact using <code>meson configure --prefix=~/l</code> from an existing build directory.</p> <h2 id="scripts">Scripts</h2> <p>Now that the prefix is setup we can start talking about the main developer scripts. They are <code>dev-log-grep</code>, <code>dev-pidgin</code>, <code>local-pidgin</code>, and <code>dev-pidgin-glade</code>.</p> <ul> <li><a href="#dev-log-grep">dev-log-grep</a> helps sort through the compiler output as there are currently many deprecation warnings that we&rsquo;re slowing churning through.</li> <li><a href="#dev-pidgin">dev-pidgin</a> and <a href="#local-pidgin">local-pidgin</a> are used to run Pidgin 3 from a build directory and a local installation respectively.</li> <li><a href="#dev-pidgin-glade">dev-pidgin-glade</a> is used to create and edit our user interface templates in Glade.</li> </ul> <p>These scripts need to be available on your <code>PATH</code>. Typically people put these in <code>~/bin</code> or <code>~/.local/bin</code> and will need to be added to your <code>PATH</code> environment variable via your shell&rsquo;s initialization which is outside of the scope of this document.</p> <h3 id="dev-log-grep">dev-log-grep</h3> <p><code>dev-log-grep</code> is a simple script that uses grep to ignore the deprecation warnings from the compiler output. However, it was built to run after the build. This works best when doing a clean build, that is running <code>ninja clean</code> before running <code>ninja</code> but that isn&rsquo;t necessary. However, you need to slightly modify your <code>ninja</code> command to make this work. The ninja command you need to use is <code>ninja |&amp; tee log</code>. This will run the build like normal, then you can use <code>dev-log-grep</code> to see the warnings that we aren&rsquo;t ignoring.</p> <p>The contents of <code>dev-log-grep</code> can be found below.</p> <pre><code>#!/bin/sh grep -i warning log | grep -vi deprec | grep -vi &quot;failed to parse&quot; | grep -vi &quot;bare structure or union&quot; | grep -vi &quot;callbacks cannot be return values&quot; | grep -v &quot;Unresolved type&quot; </code></pre> <h3 id="dev-pidgin">dev-pidgin</h3> <p>The <code>dev-pidgin</code> script is used to run Pidgin from your build directory. This is useful if you&rsquo;re just testing something in libpurple or Pidgin directly, but if you&rsquo;re working on plugins you&rsquo;ll need to use <code>local-pidgin</code> which is explained later.</p> <p>The contents of <code>dev-pidgin</code> are below. You can tweak them as necessary, but we&rsquo;ll walk through what it does.</p> <div class="highlight"> <pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh"><span style="color:#75715e">#!/bin/sh -e </span><span style="color:#75715e"></span> TOOL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;gdb --args&#34;</span> <span style="color:#75715e">#TOOL=&#34;valgrind --leak-check=full --suppressions=/usr/share/glib-2.0/valgrind/glib.supp --suppressions=/usr/share/gtk-3.0/valgrind/gtk.supp&#34;</span> export LD_LIBRARY_PATH<span style="color:#f92672">=</span>libpurple/:pidgin/ <span style="color:#e6db74">${</span>TOOL<span style="color:#e6db74">}</span> pidgin/pidgin3 <span style="color:#ae81ff">\ </span><span style="color:#ae81ff"></span> --gapplication-app-id<span style="color:#f92672">=</span>im.pidgin.dev <span style="color:#ae81ff">\ </span><span style="color:#ae81ff"></span> --config ~/.pidgin3-dev <span style="color:#ae81ff">\ </span><span style="color:#ae81ff"></span> --debug <span style="color:#ae81ff">\ </span><span style="color:#ae81ff"></span> <span style="color:#e6db74">${</span>@<span style="color:#e6db74">}</span> </code></pre> </div> <p>The first line sets up our shell interpreter and tells it to exit on the first error it encounters. Lines 3 and 4 are an optional prefix we can use to run Pidgin 3 in either gdb or valgrind.</p> <p>We use gdb for debugging and valgrind for finding memory leaks and other memory errors. The paths for the valgrind suppressions are distribution dependent and may not be available on distributions. The ones listed here are from a Debian system. Only one of these can be used at a time so just make sure to uncomment the one you would like to use.</p> <p>Next we update <code>LD_LIBRARY_PATH</code> to tell the dynamic linker where to find the libraries that are part of our build. If you&rsquo;re on macOS you&rsquo;ll need to set <code>DYLIB_LIBRARY_PATH</code> instead.</p> <p>Finally we have the command that will actually run Pidgin 3. It uses the prefix variable if defined, then specifies the <code>pidgin3</code> executable to run. The <code>--gapplication-app-id</code> argument is used to uniquely identify this instance of Pidgin 3. This identifier is used to allow only one instance matching this identifier to run at a time.</p> <p>The <code>--config</code> argument specifies where Pidgin 3 will store its configuration data. Next the <code>--debug</code> argument tells Pidgin to output all of the debug statements to the console. Finally <code>${@}</code> will pass any arguments that were passed to <code>dev-pidgin</code> to be passed to the <code>pidgin3</code> executable.</p> <h3 id="local-pidgin">local-pidgin</h3> <p><code>local-pidgin</code> is nearly identical to <code>dev-pidgin</code> so we won&rsquo;t go into much depth as most of it is already covered above. The point of <code>local-pidgin</code> is to be able to run <code>pidgin3</code> from an installed prefix that is not <code>/usr</code> or <code>/usr/local</code>. In the example below we have Pidgin 3 installed with a prefix of <code>~/l</code> like we discussed earlier.</p> <pre><code>#!/bin/sh -e TOOL=&quot;gdb --args&quot; #TOOL=&quot;valgrind --leak-check=full --suppressions=/usr/share/glib-2.0/valgrind/glib.supp --suppressions=/usr/share/gtk-3.0/valgrind/gtk.supp&quot; export LD_LIBRARY_PATH=~/l/lib/x86_64-linux-gnu ${TOOL} ~/l/bin/pidgin3 \ --gapplication-app-id=im.pidgin.local \ --config ~/.pidgin3-local \ --debug \ ${@} </code></pre> <p>Since this is for the installed version of Pidgin 3 we just need to point to everything for that installation. That means updating <code>LD_LIBARY_PATH</code>, or <code>DYLIB_LIBRARY_PATH</code> if you&rsquo;re on macOS, as well as changing the path to the <code>pidgin3</code> executable.</p> <p>Finally we set a separate application id as well as configuration directory. These do not need to be different than the ones from <code>dev-pidgin</code> but if you want to run both instances for testing things this makes it easier.</p> <h3 id="dev-pidgin-glade">dev-pidgin-glade</h3> <p><code>dev-pidgin-glade</code> is the last of our development scripts. Its purpose is to allow developers to create and modify glade templates for Pidgin 3. This works by the use of a Glade catalog for the Pidgin widgets. However, in this intro we&rsquo;re just going to cover how to edit templates for Pidgin 3 but not adding new widgets to the catalog.</p> <p>This script is designed to be run from a Pidgin 3 build directory after Pidgin 3 has been built. This is necessary so that Glade can actually load the required libraries and catalogs.</p> <pre><code>#!/bin/sh export LD_LIBRARY_PATH=pidgin/:libpurple/:subprojects/talkatu/talkatu:subprojects/gplugin/gplugin-gtk/ export GLADE_CATALOG_SEARCH_PATH=pidgin/glade:subprojects/gplugin/gplugin-gtk:subprojects/talkatu/talkatu glade ${@} </code></pre> <p>Like the other script here, this one sets up <code>LD_LIBRARY_PATH</code> to point to the libraries in the build directory. Remember if you&rsquo;re on macOS this needs to be <code>DYLIB_LIBRARY_PATH</code>.</p> <p>Next, we tell Glade where to find the catalogs for Pidgin, GPluginGtk, and Talkatu all of which we are building and depend on.</p> <p>With everything set up we can finally run Glade passing along any arguments that were passed to our script.</p> <hr> <p>We hope you all found this information useful and we will keep this post updated in the future.</p> <footer class="footline"> </footer> </div> </div> <div id="navigation"> </div> </section> <div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"> <div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div> </div> <script src="/js/clipboard.min.js?1732204902"></script> <script src="/js/perfect-scrollbar.min.js?1732204902"></script> <script src="/js/perfect-scrollbar.jquery.min.js?1732204902"></script> <script src="/js/jquery.sticky.js?1732204902"></script> <script src="/js/featherlight.min.js?1732204902"></script> <script src="/js/highlight.pack.js?1732204902"></script> <script> hljs.initHighlightingOnLoad(); </script> <script src="/js/modernizr.custom-3.6.0.js?1732204902"></script> <script src="/js/learn.js?1732204902"></script> <script src="/js/hugo-learn.js?1732204902"></script> <link href="/mermaid/mermaid.css?1732204902" rel="stylesheet" /> <script src="/mermaid/mermaid.js?1732204902"></script> <script> mermaid.initialize({ startOnLoad: true }); </script> <footer id="footline"> <div class="footline-block"> Modified 2021-06-09 </div> <div class="footline-block footline-old-site-info"> To see content from the old wiki visit a <a href="https://old.pidgin.im" rel="nofollow"> old.pidgin.im </a> </div> <ul class="footline-block footline-columns"> <li> <a href="https://issues.imfreedom.org/issues/PIDGIN"><i class='fas fa-fw fa-tasks'></i> Issue Tracker</a> </li> <li> <a href="https://keep.imfreedom.org/pidgin/"><i class='fas fa-fw fa-code'></i> Repositories</a> </li> <li> <a href="https://shop.spreadshirt.com/imfreedom"><i class='fas fa-fw fa-tshirt'></i> Merchandise</a> </li> <li> <a href="https://fosstodon.org/@pidgin"><i class='fab fa-fw fa-mastodon'></i> Mastodon</a> </li> </ul> <div class="footline-block"> <section class="supporters"> <b>Our Supporters</b> <div> <a href="https://www.digitalocean.com/?refcode=b69e5dddf595&amp;utm_campaign=Referral_Invite&amp;utm_medium=Referral_Program&amp;utm_source=badge"> <img src="/images/badges/DO_Logo_horizontal_black.svg" alt="DigitalOcean" /> </a> <a href="https://sourceforge.net"> <img src="/images/badges/source-forge-logo.svg" alt="SourceForge" style="min-width:190px" /> </a> </div> </section> </div> <ul class="footline-block footline-columns copyright-text"> <li> &copy; Pidgin </li> <li> Content - GPL3 </li> <li> <a href="https://github.com/matcornic/hugo-theme-learn">Theme</a> - MIT </li> </ul> </footer> <script src="/js/js.cookie.min.js"></script> <div style="display:none;"> <div class="notices tip notification-bar"> <p> <span class="alert-bar-close-button"><i class="fas fa-times"></i></span> Looking to reach us via XMPP? Check out the new <a href='/about/pidginchat'>PidginChat</a> service! </p> </div> </div> <script> try { var code = "pidgin-chat-announcement"; } catch (e) { console.error("Error with cookie code", e); } if (code && code !== Cookies.get("hide-notification")) { var bar = $(".notification-bar"); $(".padding.highlightable").prepend(bar); $(".alert-bar-close-button").on("click", function(elem) { Cookies.set("hide-notification", code); bar.detach(); }); } </script> <style> .alert-bar-close-button { position: absolute; top: 2px; right: 10px; color: white; font-weight: bold; cursor: pointer; transition: 0.3s; } .alert-bar-close-button:hover { color: black; } </style> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10