From de987e8c61bc6638e0c47bd7616bf3250192a000 Mon Sep 17 00:00:00 2001 From: Saunier Thibault Date: Wed, 24 Aug 2016 12:10:21 -0300 Subject: [PATCH 001/448] Initial commit --- .gitignore | 2 + LICENSE | 481 ++++++++++++++++++++++++++ README.md | 22 ++ gst-uninstalled.py | 98 ++++++ meson.build | 24 ++ subprojects/glib.wrap | 4 + subprojects/gst-devtools.wrap | 4 + subprojects/gst-editing-services.wrap | 4 + subprojects/gst-plugins-bad.wrap | 4 + subprojects/gst-plugins-base.wrap | 4 + subprojects/gst-plugins-good.wrap | 4 + subprojects/gst-plugins-ugly.wrap | 4 + subprojects/gstreamer.wrap | 4 + 13 files changed, 659 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100755 gst-uninstalled.py create mode 100644 meson.build create mode 100644 subprojects/glib.wrap create mode 100644 subprojects/gst-devtools.wrap create mode 100644 subprojects/gst-editing-services.wrap create mode 100644 subprojects/gst-plugins-bad.wrap create mode 100644 subprojects/gst-plugins-base.wrap create mode 100644 subprojects/gst-plugins-good.wrap create mode 100644 subprojects/gst-plugins-ugly.wrap create mode 100644 subprojects/gstreamer.wrap diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..f74811631b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*build*/ +subprojects/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..c87cfe8c99 --- /dev/null +++ b/LICENSE @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/README.md b/README.md new file mode 100644 index 0000000000..4a4b51fffc --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# gst-all + +GStreamer meson based repositories aggregrator + +You can build GStreamer and all its component at once using +meson and its "subproject" feature. + +## GStreamer uninstalled + +gst-all also contains a special `uninstalled` target that lets you enter +an uninstalled development environment where you will be able +to work on GStreamer easily. + +Inside that the environment you will find the GStreamer module +in subprojects/, you can simply hack in there and to rebuild you +just need to rerun ninja. + +## Build a project based on GStreamer + +You can make your own project that uses GStreamer and all its +components depend on `gst-all` making it Meson subproject +of your own project. diff --git a/gst-uninstalled.py b/gst-uninstalled.py new file mode 100755 index 0000000000..f4309b87f4 --- /dev/null +++ b/gst-uninstalled.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 + +import os +import argparse +import subprocess + + +SCRIPTDIR = os.path.dirname(__file__) + + +def prepend_env_var(env, var, value): + env[var] = os.pathsep + value + os.pathsep + env.get(var, "") + env[var] = env[var].replace(os.pathsep + os.pathsep, os.pathsep).strip(os.pathsep) + +def set_prompt_var(options, env): + ps1 = env.get("PS1") + if ps1: + env["PS1"] = "[gst-%s] %s" % (options.gst_version, ps1) + + prompt = env.get("PROMPT") + if prompt: + env["PROMPT"] = "[gst-%s] %s" % (options.gst_version, prompt) + + +def get_subprocess_env(options): + env = os.environ.copy() + + PATH = env.get("PATH", "") + subprojects_path = os.path.join(options.builddir, "subprojects") + for proj in os.listdir(subprojects_path): + projpath = os.path.join(subprojects_path, proj) + if not os.path.exists(projpath): + print("Subproject %s does not exist in %s.,\n" + " Make sure to build everything properly " + "and try again." % (proj, projpath)) + exit(1) + + envvars_file = os.path.join(projpath, os.path.basename(projpath) + "-uninstalled-envvars.py") + if os.path.exists(envvars_file): + envvars_env = {"envvars": {}} + with open(envvars_file) as f: + code = compile(f.read(), envvars_file, 'exec') + exec(code, None, envvars_env) + for var, value in envvars_env["envvars"].items(): + if var.startswith("+"): + prepend_env_var(env, var, value.strip("+")) + else: + env[var] = value + + toolsdir = os.path.join(projpath, "tools") + if os.path.exists(toolsdir): + prepend_env_var(env, "PATH", toolsdir) + + prepend_env_var(env, "GST_PLUGIN_PATH", projpath) + + env["GST_VALIDATE_SCENARIOS_PATH"] = os.path.normpath( + "%s/subprojects/gst-devtools/validate/data/scenarios" % SCRIPTDIR) + env["GST_VALIDATE_PLUGIN_PATH"] = os.path.normpath( + "%s/subprojects/gst-devtools/validate/plugins" % options.builddir) + prepend_env_var(env, "PATH", os.path.normpath( + "%s/subprojects/gst-devtools/validate/tools" % options.builddir)) + env["PATH"] += os.pathsep + PATH + env["GST_VERSION"] = options.gst_version + env["GST_PLUGIN_SYSTEM_PATH"] = "" + env["GST_PLUGIN_SCANNER"] = os.path.normpath( + "%s/subprojects/gstreamer/libs/gst/helpers/gst-plugin-scanner" % options.builddir) + env["GST_PTP_HELPER"] = os.path.normpath( + "%s/subprojects/gstreamer/libs/gst/helpers/gst-ptp-helper" % options.builddir) + env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") + + set_prompt_var(options, env) + + return env + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(prog="gstreamer-uninstalled") + + parser.add_argument("--builddir", + default=os.path.join(SCRIPTDIR, "build"), + help="The meson build directory") + parser.add_argument("--gst-version", default="master", + help="The meson build directory") + options = parser.parse_args() + + if not os.path.exists(options.builddir): + print("GStreamer not built in %s\n\nBuild it and try again" % + options.builddir) + exit(1) + + shell_args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] + if shell_args[0] == "/bin/bash": + shell_args.append("--noprofile") + + try: + exit(subprocess.run(shell_args, env=get_subprocess_env(options)).returncode) + except subprocess.CalledProcessError as e: + exit(e.returncode) diff --git a/meson.build b/meson.build new file mode 100644 index 0000000000..b5c1de2e14 --- /dev/null +++ b/meson.build @@ -0,0 +1,24 @@ +project('gstreamer uninstalled', 'c', version : '1.9.1.1') + +gst_version = meson.project_version() +gst_branch = 'master' + +glib_req = '>= 2.40.0' + +subprojects = [ + 'gstreamer', + 'gst-plugins-base', + 'gst-plugins-good', + 'gst-plugins-ugly', + 'gst-plugins-bad', + 'gst-devtools', + 'gst-editing-services' +] + +foreach subproj: subprojects + subproject(subproj, version: gst_version) +endforeach + +setenv = find_program('gst-uninstalled.py') +run_target('uninstalled', setenv, '--builddir=@0@'.format(meson.current_build_dir()), + '--gst-version=@0@'.format(gst_branch)) diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap new file mode 100644 index 0000000000..9ef1e6ca19 --- /dev/null +++ b/subprojects/glib.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=glib +url=https://github.com/centricular/glib.git +revision=meson diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap new file mode 100644 index 0000000000..1b9819fa60 --- /dev/null +++ b/subprojects/gst-devtools.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-devtools +url=git://anongit.freedesktop.org/gstreamer/gst-devtools +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap new file mode 100644 index 0000000000..6abb135364 --- /dev/null +++ b/subprojects/gst-editing-services.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-editing-services +url=git://anongit.freedesktop.org/gstreamer/gst-editing-services +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap new file mode 100644 index 0000000000..bb3f01ba63 --- /dev/null +++ b/subprojects/gst-plugins-bad.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-plugins-bad +url=git://anongit.freedesktop.org/gstreamer/gst-plugins-bad +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap new file mode 100644 index 0000000000..a58eecf2b1 --- /dev/null +++ b/subprojects/gst-plugins-base.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-plugins-base +url=git://anongit.freedesktop.org/gstreamer/gst-plugins-base +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap new file mode 100644 index 0000000000..6801284a8d --- /dev/null +++ b/subprojects/gst-plugins-good.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-plugins-good +url=git://anongit.freedesktop.org/gstreamer/gst-plugins-good +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap new file mode 100644 index 0000000000..947b142b83 --- /dev/null +++ b/subprojects/gst-plugins-ugly.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-plugins-ugly +url=git://anongit.freedesktop.org/gstreamer/gst-plugins-ugly +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap new file mode 100644 index 0000000000..3b4938b779 --- /dev/null +++ b/subprojects/gstreamer.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gstreamer +url=git://anongit.freedesktop.org/gstreamer/gstreamer +revision=master From 3cbd0a861d21114539f06b8d911545d341779c6d Mon Sep 17 00:00:00 2001 From: Saunier Thibault Date: Thu, 25 Aug 2016 22:13:40 -0300 Subject: [PATCH 002/448] Fix typos in README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4a4b51fffc..04c154d96e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # gst-all -GStreamer meson based repositories aggregrator +GStreamer [meson](http://mesonbuild.com/) based repositories aggregrator You can build GStreamer and all its component at once using meson and its "subproject" feature. @@ -11,9 +11,9 @@ gst-all also contains a special `uninstalled` target that lets you enter an uninstalled development environment where you will be able to work on GStreamer easily. -Inside that the environment you will find the GStreamer module +Inside that environment you will find the GStreamer modules in subprojects/, you can simply hack in there and to rebuild you -just need to rerun ninja. +just need to rerun `ninja`. ## Build a project based on GStreamer From 62856bcad06d127d07fdb9080e7c529f0250d236 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sun, 28 Aug 2016 20:14:36 -0300 Subject: [PATCH 003/448] Set CURRENT_GST --- gst-uninstalled.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index f4309b87f4..b4ea6ea1e4 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -53,6 +53,7 @@ def get_subprocess_env(options): prepend_env_var(env, "GST_PLUGIN_PATH", projpath) + env["CURRENT_GST"] = os.path.normpath(SCRIPTDIR + "/subprojects") env["GST_VALIDATE_SCENARIOS_PATH"] = os.path.normpath( "%s/subprojects/gst-devtools/validate/data/scenarios" % SCRIPTDIR) env["GST_VALIDATE_PLUGIN_PATH"] = os.path.normpath( From 080780c720cf8f6ad7aeb06b010544807990943c Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 29 Aug 2016 11:21:41 -0300 Subject: [PATCH 004/448] Build gst-libav if libav is on the system --- meson.build | 23 +++++++++++++++++++++++ subprojects/gst-libav.wrap | 4 ++++ 2 files changed, 27 insertions(+) create mode 100644 subprojects/gst-libav.wrap diff --git a/meson.build b/meson.build index b5c1de2e14..9709864992 100644 --- a/meson.build +++ b/meson.build @@ -15,6 +15,29 @@ subprojects = [ 'gst-editing-services' ] +# FIXME Remove that check once we have ffmpeg as a gst-libav subproject +libavfilter_dep = dependency('libavfilter', version: '>= 6.47.100', required: false) +gst_libav = [] +if libavfilter_dep.found() + cc = meson.get_compiler('c') + check_ffmpeg_src = '''#include + #if LIBAVCODEC_VERSION_MICRO >= 100 + /* FFmpeg uses 100+ as its micro version */ + #else + #error libav provider should be FFmpeg + #endif''' + if cc.compiles(check_ffmpeg_src, name : 'whether libav is provided by FFmpeg') + gst_libav = ['gst-libav'] + endif +endif + +if gst_libav.length() == 0 + message('WARNING: gst-libav not built as ffmpeg >= n3.1.2 not found on the system') +else + subprojects += gst_libav +endif + + foreach subproj: subprojects subproject(subproj, version: gst_version) endforeach diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap new file mode 100644 index 0000000000..c81501b520 --- /dev/null +++ b/subprojects/gst-libav.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-libav +url=git://anongit.freedesktop.org/gstreamer/gst-libav +revision=master From bf1aa16608a181e67869adf46fa532fc4a7ce9f6 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 5 Sep 2016 11:54:46 -0300 Subject: [PATCH 005/448] Add [gst-]python support --- gst-uninstalled.py | 32 +++++++++++++++++++++++++++++++- meson.build | 7 ++++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index b4ea6ea1e4..94a99ba22f 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -1,7 +1,9 @@ #!/usr/bin/env python3 -import os import argparse +import os +import re +import site import subprocess @@ -12,6 +14,7 @@ def prepend_env_var(env, var, value): env[var] = os.pathsep + value + os.pathsep + env.get(var, "") env[var] = env[var].replace(os.pathsep + os.pathsep, os.pathsep).strip(os.pathsep) + def set_prompt_var(options, env): ps1 = env.get("PS1") if ps1: @@ -68,6 +71,33 @@ def get_subprocess_env(options): env["GST_PTP_HELPER"] = os.path.normpath( "%s/subprojects/gstreamer/libs/gst/helpers/gst-ptp-helper" % options.builddir) env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") + prepend_env_var(env, 'PYTHONPATH', ':'.join(site.getsitepackages())) + env["PYTHONPATH"] = env["PYTHONPATH"] + ':' + os.path.normpath( + options.builddir + '/subprojects/gst-python') + + filename = "meson.build" + sharedlib_reg = re.compile(r'\.so$|\.dylib$') + typelib_reg = re.compile(r'.*\.typelib$') + for root, dirnames, filenames in os.walk(os.path.join(options.builddir, + 'subprojects')): + has_typelib = False + has_shared = False + for filename in filenames: + if typelib_reg.search(filename) and not has_typelib: + has_typelib = True + prepend_env_var(env, "GI_TYPELIB_PATH", + os.path.join(options.builddir, root)) + if has_shared: + break + elif sharedlib_reg.search(filename) and not has_shared: + has_shared = True + prepend_env_var(env, "LD_LIBRARY_PATH", + os.path.join(options.builddir, root)) + prepend_env_var(env, "DYLD_LIBRARY_PATH", + os.path.join(options.builddir, root)) + if has_typelib: + break + set_prompt_var(options, env) diff --git a/meson.build b/meson.build index 9709864992..721c7151fd 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ -project('gstreamer uninstalled', 'c', version : '1.9.1.1') +project('All GStreamer modules', 'c', version : '1.9.2.1') -gst_version = meson.project_version() +gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' glib_req = '>= 2.40.0' @@ -12,7 +12,8 @@ subprojects = [ 'gst-plugins-ugly', 'gst-plugins-bad', 'gst-devtools', - 'gst-editing-services' + 'gst-editing-services', + 'gst-python' ] # FIXME Remove that check once we have ffmpeg as a gst-libav subproject From 5903bbc0a3bb4eadb3cb4240fb7d8defcc9c9434 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 5 Sep 2016 14:47:50 -0300 Subject: [PATCH 006/448] Set GST_VALIDATE_APPS_DIR GES validate app path --- configure | 99 +++++++++++++++++++++++++++++++++++++ gst-uninstalled.py | 2 + subprojects/gst-python.wrap | 4 ++ 3 files changed, 105 insertions(+) create mode 100755 configure create mode 100644 subprojects/gst-python.wrap diff --git a/configure b/configure new file mode 100755 index 0000000000..be47955447 --- /dev/null +++ b/configure @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +"""Script for generating the Makefiles.""" + +import argparse +import os +import sys +import shutil +import subprocess + + +PROJECTNAME = "GStreamer 'all'" + +ROOTDIR = os.path.abspath(os.path.dirname(__file__)) +MAKEFILE_TMPL = """all: +%(tab)scd %(build_dir)s && %(ninja)s -k 100; %(ninja)s + +install: +%(tab)scd %(build_dir)s && DESTDIR="${DESTDIR}" %(ninja)s install + +check: +%(tab)scd %(build_dir)s && %(ninja)s test + +uninstalled: +%(tab)scd %(build_dir)s && %(ninja)s uninstalled + +clean: +%(tab)srm -Rf %(build_dir)s +%(tab)srm Makefile +""" + + +def accept_command(commands): + """Checks if @command --version works.""" + for command in commands: + try: + subprocess.check_output([command, "--version"]) + return command + except FileNotFoundError: + pass + + return None + + +def get_configs(meson): + meson_version = subprocess.check_output([meson, '--version']).decode().strip() + if meson_version <= '0.33.0': + print("Disabling the introspection as support for the introspection with subproject was introduced in 0.34") + return ['-Dgstreamer:disable_introspection=true', + '-Dgst-editing-services:disable_introspection=true', + '-Dgst-devtools:disable_introspection=true'] + + return [] + + +def configure_meson(args): + """Configures meson and generate the Makefile.""" + meson = accept_command(["meson", "meson.py"]) + if not meson: + print("Install mesonbuild to build %s: http://mesonbuild.com/\n" + "You can simply install it with:\n" + " $ sudo pip3 install meson" % PROJECTNAME) + exit(1) + + ninja = accept_command(["ninja", "ninja-build"]) + if not ninja: + print("Install ninja-build to build %s: https://ninja-build.org/" + % PROJECTNAME) + exit(1) + + build_dir = os.path.join(ROOTDIR, "build") + shutil.rmtree(build_dir, True) + os.mkdir(build_dir) + os.chdir(build_dir) + + try: + subprocess.check_call([meson, "../"] + args + get_configs(meson)) + except subprocess.CalledProcessError: + exit(1) + + with open(os.path.join(ROOTDIR, "Makefile"), "w") as makefile: + makefile.write(MAKEFILE_TMPL % + {"build_dir": build_dir, + "ninja": ninja, + "tab": " "}) + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Process some integers.') + parser.add_argument("--no-reconfigure", action='store_true', + default=False, help='Avoid removing the build dir' + ' if not necessary.') + options, args = parser.parse_known_args() + if options.no_reconfigure: + if os.path.exists( + ROOTDIR + "/build/build.ninja") and os.path.exists( + ROOTDIR + "/Makefile"): + print("Not reconfiguring") + exit(0) + + configure_meson(args) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 94a99ba22f..91b1c01b44 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -61,6 +61,8 @@ def get_subprocess_env(options): "%s/subprojects/gst-devtools/validate/data/scenarios" % SCRIPTDIR) env["GST_VALIDATE_PLUGIN_PATH"] = os.path.normpath( "%s/subprojects/gst-devtools/validate/plugins" % options.builddir) + env["GST_VALIDATE_APPS_DIR"] = os.path.normpath( + "%s/subprojects/gst-editing-services/tests/validate" % SCRIPTDIR) prepend_env_var(env, "PATH", os.path.normpath( "%s/subprojects/gst-devtools/validate/tools" % options.builddir)) env["PATH"] += os.pathsep + PATH diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap new file mode 100644 index 0000000000..167c5146cc --- /dev/null +++ b/subprojects/gst-python.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-python +url=git://anongit.freedesktop.org/gstreamer/gst-python +revision=master From 7e7caeec935f9e8e7125c3ab21fcffb9125d9b2c Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 5 Sep 2016 23:37:25 -0300 Subject: [PATCH 007/448] Add an helper to update subprojects git repos --- git-update | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 git-update diff --git a/git-update b/git-update new file mode 100755 index 0000000000..1a3d407afa --- /dev/null +++ b/git-update @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +import argparse +import os +import subprocess + + +SCRIPTDIR = os.path.dirname(__file__) + +class Colors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + + force_disable = False + + @classmethod + def disable(cls): + cls.HEADER = '' + cls.OKBLUE = '' + cls.OKGREEN = '' + cls.WARNING = '' + cls.FAIL = '' + cls.ENDC = '' + + @classmethod + def enable(cls): + if cls.force_disable: + return + + cls.HEADER = '\033[95m' + cls.OKBLUE = '\033[94m' + cls.OKGREEN = '\033[92m' + cls.WARNING = '\033[93m' + cls.FAIL = '\033[91m' + cls.ENDC = '\033[0m' + + + +def git(args, repository_path): + if not isinstance(args, list): + args = [args] + + return subprocess.check_output(["git"] + args, cwd=repository_path).decode() + + +def update_subprojects(): + subprojects_dir = os.path.join(SCRIPTDIR, "subprojects") + for repo_name in os.listdir(subprojects_dir): + repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name)) + if not os.path.exists(os.path.join(repo_dir, '.git')): + continue + + print("Updating %s..." % repo_name) + try: + git(["pull", "--rebase"], repo_dir) + except Exception as e: + print("\nCould not rebase %s, please fix and try again\nerror:\n %s" % (repo_dir, e)) + return False + + commit_message = git("show", repo_dir).split("\n") + print(u" -> %s%s%s — %s" % (Colors.HEADER, commit_message[0][7:14], Colors.ENDC, + commit_message[4].strip())) + + return True + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(prog="git-update") + + parser.add_argument("--no-color", + default=False, + action='store_true', + help="Do not output ansi colors.") + options = parser.parse_args() + if options.no_color: + Colors.disable() + + exit(not update_subprojects()) From 80e467ede8f11ed57a291a07dde8fce64eb6f08c Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 6 Sep 2016 00:00:17 -0300 Subject: [PATCH 008/448] Allow executing one process inside the uninstalled environment --- gst-uninstalled.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 91b1c01b44..4ba44939c5 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -7,7 +7,7 @@ import site import subprocess -SCRIPTDIR = os.path.dirname(__file__) +SCRIPTDIR = os.path.abspath(os.path.dirname(__file__)) def prepend_env_var(env, var, value): @@ -114,18 +114,19 @@ if __name__ == "__main__": help="The meson build directory") parser.add_argument("--gst-version", default="master", help="The meson build directory") - options = parser.parse_args() + options, args = parser.parse_known_args() if not os.path.exists(options.builddir): print("GStreamer not built in %s\n\nBuild it and try again" % options.builddir) exit(1) - shell_args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] - if shell_args[0] == "/bin/bash": - shell_args.append("--noprofile") + if not args: + args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] + if args[0] == "/bin/bash": + args.append("--noprofile") try: - exit(subprocess.run(shell_args, env=get_subprocess_env(options)).returncode) + exit(subprocess.run(args, env=get_subprocess_env(options)).returncode) except subprocess.CalledProcessError as e: exit(e.returncode) From 9bb4a1b6c958a71bbf04a9b4fbf8222aeb82247e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 9 Sep 2016 08:29:22 -0300 Subject: [PATCH 009/448] Remove .subprojects from the gitignore It is really inconvenient. --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index f74811631b..468d90c58e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ *build*/ -subprojects/ From 0b58ccccbb62f39869f8440d007109b81a94a9b6 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 14 Sep 2016 09:54:59 -0300 Subject: [PATCH 010/448] Allow passing a manifest to update subprojects repository Allowing to have reproducible builds on the CI server, and locally. --- git-update | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/git-update b/git-update index 1a3d407afa..5cc5994bd5 100755 --- a/git-update +++ b/git-update @@ -2,6 +2,7 @@ import argparse import os import subprocess +import xml.etree.ElementTree as ET SCRIPTDIR = os.path.dirname(__file__) @@ -43,10 +44,26 @@ def git(args, repository_path): if not isinstance(args, list): args = [args] - return subprocess.check_output(["git"] + args, cwd=repository_path).decode() + return subprocess.check_output(["git"] + args, cwd=repository_path, + stderr=subprocess.STDOUT).decode() -def update_subprojects(): +def manifest_get_commits(manifest): + res = {} + tree = ET.parse(manifest) + root = tree.getroot() + for child in root: + if child.tag == 'project': + res[child.attrib["name"]] = child.attrib["revision"] + return res + + +def update_subprojects(manifest): + if manifest: + repos_commits = manifest_get_commits(manifest) + else: + repos_commits = {} + subprojects_dir = os.path.join(SCRIPTDIR, "subprojects") for repo_name in os.listdir(subprojects_dir): repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name)) @@ -55,7 +72,12 @@ def update_subprojects(): print("Updating %s..." % repo_name) try: - git(["pull", "--rebase"], repo_dir) + revision = repos_commits.get(repo_name) + if revision: + git(["fetch"], repo_dir) + git(["checkout", revision], repo_dir) + else: + git(["pull", "--rebase"], repo_dir) except Exception as e: print("\nCould not rebase %s, please fix and try again\nerror:\n %s" % (repo_dir, e)) return False @@ -74,8 +96,12 @@ if __name__ == "__main__": default=False, action='store_true', help="Do not output ansi colors.") + parser.add_argument("--manifest", + default=None, + help="Use a android repo manifest to sync repositories" + " Note that it will let all repositories in detached state") options = parser.parse_args() if options.no_color: Colors.disable() - exit(not update_subprojects()) + exit(not update_subprojects(options.manifest)) From be5e8af9e2c9e3db3c93e29e41b393fe8ffe06ba Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 14 Sep 2016 10:36:28 -0300 Subject: [PATCH 011/448] Fix run_target usage --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 721c7151fd..66b4f5ade9 100644 --- a/meson.build +++ b/meson.build @@ -44,5 +44,5 @@ foreach subproj: subprojects endforeach setenv = find_program('gst-uninstalled.py') -run_target('uninstalled', setenv, '--builddir=@0@'.format(meson.current_build_dir()), - '--gst-version=@0@'.format(gst_branch)) +run_target('uninstalled', command : [setenv, '--builddir=@0@'.format(meson.current_build_dir()), + '--gst-version=@0@'.format(gst_branch)]) From f802127a1e408782391199962f98a380887b1850 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 14 Sep 2016 10:42:52 -0300 Subject: [PATCH 012/448] configure: Let user know when exit on meson error --- configure | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index be47955447..aab9e7d0d7 100755 --- a/configure +++ b/configure @@ -74,7 +74,8 @@ def configure_meson(args): try: subprocess.check_call([meson, "../"] + args + get_configs(meson)) - except subprocess.CalledProcessError: + except subprocess.CalledProcessError as e: + print("EXIT meson return %s" % e.returncode) exit(1) with open(os.path.join(ROOTDIR, "Makefile"), "w") as makefile: From 5428359c3186d45a355831e679f604a966f3d258 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 29 Sep 2016 20:25:42 -0300 Subject: [PATCH 013/448] git-update: Add a way for user to fix any rebasing issue interactively --- git-update | 65 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/git-update b/git-update index 5cc5994bd5..e0919b22d7 100755 --- a/git-update +++ b/git-update @@ -58,7 +58,7 @@ def manifest_get_commits(manifest): return res -def update_subprojects(manifest): +def update_subprojects(manifest, no_interaction=False): if manifest: repos_commits = manifest_get_commits(manifest) else: @@ -69,22 +69,50 @@ def update_subprojects(manifest): repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name)) if not os.path.exists(os.path.join(repo_dir, '.git')): continue - - print("Updating %s..." % repo_name) - try: - revision = repos_commits.get(repo_name) - if revision: - git(["fetch"], repo_dir) - git(["checkout", revision], repo_dir) - else: - git(["pull", "--rebase"], repo_dir) - except Exception as e: - print("\nCould not rebase %s, please fix and try again\nerror:\n %s" % (repo_dir, e)) + revision = repos_commits.get(repo_name) + if not update_repo(repo_name, repo_dir, revision, no_interaction): return False - commit_message = git("show", repo_dir).split("\n") - print(u" -> %s%s%s — %s" % (Colors.HEADER, commit_message[0][7:14], Colors.ENDC, - commit_message[4].strip())) + return True + + +def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): + print("Updating %s..." % repo_name) + try: + if revision: + git(["fetch"], repo_dir) + git(["checkout", revision], repo_dir) + else: + git(["pull", "--rebase"], repo_dir) + except Exception as e: + out = getattr(e, "output", b"").decode() + if not no_interaction: + print("=====================================" + "\n%sEntering a shell in %s to fix that" + " just `exit` once done`" + "\n=====================================" % ( + out, os.getcwd())) + try: + subprocess.check_call(os.environ.get("SHELL", "/bin/sh"), + cwd=repo_dir) + except: + # Result of subshell does not really matter + pass + + if recurse_i < 3: + return update_repo(repo_name, repo_dir, revision, no_interaction, + recurse_i + 1) + return False + else: + print("\nCould not rebase %s, please fix and try again." + " Error:\n\n%s %s" % (repo_dir, out, e)) + + return False + + + commit_message = git("show", repo_dir).split("\n") + print(u" -> %s%s%s — %s" % (Colors.HEADER, commit_message[0][7:14], Colors.ENDC, + commit_message[4].strip())) return True @@ -96,6 +124,10 @@ if __name__ == "__main__": default=False, action='store_true', help="Do not output ansi colors.") + parser.add_argument("--no-interaction", + default=False, + action='store_true', + help="Do not allow interaction with the user.") parser.add_argument("--manifest", default=None, help="Use a android repo manifest to sync repositories" @@ -104,4 +136,5 @@ if __name__ == "__main__": if options.no_color: Colors.disable() - exit(not update_subprojects(options.manifest)) + exit(not update_subprojects(options.manifest, + options.no_interaction)) From 449737fb4a19bf16a877cf0ddbaeac3594d937c0 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 11 Oct 2016 01:24:24 +0200 Subject: [PATCH 014/448] Compile with -Werror by default This is what we do in development version with autotools --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index aab9e7d0d7..3629804646 100755 --- a/configure +++ b/configure @@ -49,7 +49,7 @@ def get_configs(meson): '-Dgst-editing-services:disable_introspection=true', '-Dgst-devtools:disable_introspection=true'] - return [] + return ['-Dwerror=true'] def configure_meson(args): From 2f3c89b321bafd79cdc735c66b418fe9782ec42f Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Fri, 26 Aug 2016 08:40:07 +0530 Subject: [PATCH 015/448] Fix copy-pasto in gst-uninstalled argument help string --- gst-uninstalled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 4ba44939c5..84ba61e5b9 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -113,7 +113,7 @@ if __name__ == "__main__": default=os.path.join(SCRIPTDIR, "build"), help="The meson build directory") parser.add_argument("--gst-version", default="master", - help="The meson build directory") + help="The GStreamer major version") options, args = parser.parse_known_args() if not os.path.exists(options.builddir): From 76e946465f03d79568f9fe202c27ec83e1276321 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 11 Oct 2016 01:14:50 +0200 Subject: [PATCH 016/448] Add meson as a submodule for now Allowing us to control the meson version in use so that it just works. --- .gitmodules | 3 +++ README.md | 9 +++++++++ common.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ configure | 36 ++++++++++-------------------------- git-update | 43 +++---------------------------------------- gst-uninstalled.py | 1 + meson | 1 + 7 files changed, 71 insertions(+), 66 deletions(-) create mode 100644 .gitmodules create mode 100644 common.py create mode 160000 meson diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..f601ecb48b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "meson"] + path = meson + url = https://github.com/mesonbuild/meson.git diff --git a/README.md b/README.md index 04c154d96e..c7b4eaa974 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,15 @@ GStreamer [meson](http://mesonbuild.com/) based repositories aggregrator You can build GStreamer and all its component at once using meson and its "subproject" feature. +## Getting started + +We have an helper script to get started, will get the right [meson](http://mesonbuild.com/) +version and get you ready to build. You can just get all GStreamer built running: + +``` +./configure && ninja -C build/ +``` + ## GStreamer uninstalled gst-all also contains a special `uninstalled` target that lets you enter diff --git a/common.py b/common.py new file mode 100644 index 0000000000..65d5b2da75 --- /dev/null +++ b/common.py @@ -0,0 +1,44 @@ +import argparse +import subprocess + +class Colors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + + force_disable = False + + @classmethod + def disable(cls): + cls.HEADER = '' + cls.OKBLUE = '' + cls.OKGREEN = '' + cls.WARNING = '' + cls.FAIL = '' + cls.ENDC = '' + + @classmethod + def enable(cls): + if cls.force_disable: + return + + cls.HEADER = '\033[95m' + cls.OKBLUE = '\033[94m' + cls.OKGREEN = '\033[92m' + cls.WARNING = '\033[93m' + cls.FAIL = '\033[91m' + cls.ENDC = '\033[0m' + + + +def git(args, repository_path): + if not isinstance(args, list): + args = [args] + + return subprocess.check_output(["git"] + args, cwd=repository_path, + stderr=subprocess.STDOUT).decode() + + diff --git a/configure b/configure index 3629804646..9d9a7e14c9 100755 --- a/configure +++ b/configure @@ -7,26 +7,22 @@ import sys import shutil import subprocess +from common import git +from common import Colors + PROJECTNAME = "GStreamer 'all'" ROOTDIR = os.path.abspath(os.path.dirname(__file__)) -MAKEFILE_TMPL = """all: -%(tab)scd %(build_dir)s && %(ninja)s -k 100; %(ninja)s -install: -%(tab)scd %(build_dir)s && DESTDIR="${DESTDIR}" %(ninja)s install -check: -%(tab)scd %(build_dir)s && %(ninja)s test +def get_meson(): + print("Updating meson submodule...", end='') + sys.stdout.flush() + git(['submodule', 'update', '--init'], ROOTDIR) + print("DONE") -uninstalled: -%(tab)scd %(build_dir)s && %(ninja)s uninstalled - -clean: -%(tab)srm -Rf %(build_dir)s -%(tab)srm Makefile -""" + return os.path.join(ROOTDIR, 'meson', 'meson.py') def accept_command(commands): @@ -42,19 +38,12 @@ def accept_command(commands): def get_configs(meson): - meson_version = subprocess.check_output([meson, '--version']).decode().strip() - if meson_version <= '0.33.0': - print("Disabling the introspection as support for the introspection with subproject was introduced in 0.34") - return ['-Dgstreamer:disable_introspection=true', - '-Dgst-editing-services:disable_introspection=true', - '-Dgst-devtools:disable_introspection=true'] - return ['-Dwerror=true'] def configure_meson(args): """Configures meson and generate the Makefile.""" - meson = accept_command(["meson", "meson.py"]) + meson = get_meson() if not meson: print("Install mesonbuild to build %s: http://mesonbuild.com/\n" "You can simply install it with:\n" @@ -78,11 +67,6 @@ def configure_meson(args): print("EXIT meson return %s" % e.returncode) exit(1) - with open(os.path.join(ROOTDIR, "Makefile"), "w") as makefile: - makefile.write(MAKEFILE_TMPL % - {"build_dir": build_dir, - "ninja": ninja, - "tab": " "}) if __name__ == "__main__": parser = argparse.ArgumentParser(description='Process some integers.') diff --git a/git-update b/git-update index e0919b22d7..163574f570 100755 --- a/git-update +++ b/git-update @@ -4,49 +4,12 @@ import os import subprocess import xml.etree.ElementTree as ET +from common import git +from common import Colors + SCRIPTDIR = os.path.dirname(__file__) -class Colors: - HEADER = '\033[95m' - OKBLUE = '\033[94m' - OKGREEN = '\033[92m' - WARNING = '\033[93m' - FAIL = '\033[91m' - ENDC = '\033[0m' - - force_disable = False - - @classmethod - def disable(cls): - cls.HEADER = '' - cls.OKBLUE = '' - cls.OKGREEN = '' - cls.WARNING = '' - cls.FAIL = '' - cls.ENDC = '' - - @classmethod - def enable(cls): - if cls.force_disable: - return - - cls.HEADER = '\033[95m' - cls.OKBLUE = '\033[94m' - cls.OKGREEN = '\033[92m' - cls.WARNING = '\033[93m' - cls.FAIL = '\033[91m' - cls.ENDC = '\033[0m' - - - -def git(args, repository_path): - if not isinstance(args, list): - args = [args] - - return subprocess.check_output(["git"] + args, cwd=repository_path, - stderr=subprocess.STDOUT).decode() - def manifest_get_commits(manifest): res = {} diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 84ba61e5b9..17b8f11487 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -65,6 +65,7 @@ def get_subprocess_env(options): "%s/subprojects/gst-editing-services/tests/validate" % SCRIPTDIR) prepend_env_var(env, "PATH", os.path.normpath( "%s/subprojects/gst-devtools/validate/tools" % options.builddir)) + prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'meson')) env["PATH"] += os.pathsep + PATH env["GST_VERSION"] = options.gst_version env["GST_PLUGIN_SYSTEM_PATH"] = "" diff --git a/meson b/meson new file mode 160000 index 0000000000..a513bcfde6 --- /dev/null +++ b/meson @@ -0,0 +1 @@ +Subproject commit a513bcfde613f2a0403f7b0cd34d4bd62674c1d8 From 1b6d719d54ab2108c8642e51183c24b4cde2cae4 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 11 Oct 2016 01:58:05 +0200 Subject: [PATCH 017/448] Make gst-uninstalled compatible with python 3.3 --- gst-uninstalled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 17b8f11487..a6e1592e63 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -128,6 +128,6 @@ if __name__ == "__main__": args.append("--noprofile") try: - exit(subprocess.run(args, env=get_subprocess_env(options)).returncode) + exit(subprocess.call(args, env=get_subprocess_env(options))) except subprocess.CalledProcessError as e: exit(e.returncode) From 6a1d489cc57306b8d45559f4c2d9b3595b39af56 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 11 Oct 2016 02:05:39 +0200 Subject: [PATCH 018/448] Minor improvement in the git function --- common.py | 9 ++------- configure | 4 ++-- git-update | 8 ++++---- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/common.py b/common.py index 65d5b2da75..244b30ac2c 100644 --- a/common.py +++ b/common.py @@ -34,11 +34,6 @@ class Colors: -def git(args, repository_path): - if not isinstance(args, list): - args = [args] - - return subprocess.check_output(["git"] + args, cwd=repository_path, +def git(*args, repository_path='.'): + return subprocess.check_output(["git"] + list(args), cwd=repository_path, stderr=subprocess.STDOUT).decode() - - diff --git a/configure b/configure index 9d9a7e14c9..2b6d867a1c 100755 --- a/configure +++ b/configure @@ -17,9 +17,9 @@ ROOTDIR = os.path.abspath(os.path.dirname(__file__)) def get_meson(): - print("Updating meson submodule...", end='') + print("Updating meson submodule... ", end='') sys.stdout.flush() - git(['submodule', 'update', '--init'], ROOTDIR) + git('submodule', 'update', '--init', repository_path=ROOTDIR) print("DONE") return os.path.join(ROOTDIR, 'meson', 'meson.py') diff --git a/git-update b/git-update index 163574f570..ee65a2303c 100755 --- a/git-update +++ b/git-update @@ -43,10 +43,10 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): print("Updating %s..." % repo_name) try: if revision: - git(["fetch"], repo_dir) - git(["checkout", revision], repo_dir) + git("fetch", repository_path=repo_dir) + git("checkout", revision, repository_path=repo_dir) else: - git(["pull", "--rebase"], repo_dir) + git("pull", "--rebase", repository_path=repo_dir) except Exception as e: out = getattr(e, "output", b"").decode() if not no_interaction: @@ -73,7 +73,7 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): return False - commit_message = git("show", repo_dir).split("\n") + commit_message = git("show", repository_path=repo_dir).split("\n") print(u" -> %s%s%s — %s" % (Colors.HEADER, commit_message[0][7:14], Colors.ENDC, commit_message[4].strip())) From b991036624024e7a1ae9a489be1a08337d7c95a6 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 14 Oct 2016 10:31:38 +0200 Subject: [PATCH 019/448] Explain that on Fedora ninja is called ninja-build --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c7b4eaa974..0a2f9d6a35 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ meson and its "subproject" feature. We have an helper script to get started, will get the right [meson](http://mesonbuild.com/) version and get you ready to build. You can just get all GStreamer built running: +NOTE: on fedora (and maybe other distributions) replace `ninja` with `ninja-build` + ``` ./configure && ninja -C build/ ``` From 57680a0dd3dae4266a7be5ea5b1ed74def65b94e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 14 Oct 2016 11:53:21 +0200 Subject: [PATCH 020/448] Do not update meson by default and fix setting -Werror=true --- configure | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/configure b/configure index 2b6d867a1c..4d835dc4e0 100755 --- a/configure +++ b/configure @@ -16,13 +16,15 @@ PROJECTNAME = "GStreamer 'all'" ROOTDIR = os.path.abspath(os.path.dirname(__file__)) -def get_meson(): - print("Updating meson submodule... ", end='') - sys.stdout.flush() - git('submodule', 'update', '--init', repository_path=ROOTDIR) - print("DONE") +def get_meson(update_meson): + meson = os.path.join(ROOTDIR, 'meson', 'meson.py') + if update_meson or not os.path.exists(meson): + print("Updating meson submodule... ", end='') + sys.stdout.flush() + git('submodule', 'update', '--init', repository_path=ROOTDIR) + print("DONE") - return os.path.join(ROOTDIR, 'meson', 'meson.py') + return meson def accept_command(commands): @@ -38,12 +40,12 @@ def accept_command(commands): def get_configs(meson): - return ['-Dwerror=true'] + return ['-D', 'werror=true'] -def configure_meson(args): +def configure_meson(args, options): """Configures meson and generate the Makefile.""" - meson = get_meson() + meson = get_meson(options.update_meson) if not meson: print("Install mesonbuild to build %s: http://mesonbuild.com/\n" "You can simply install it with:\n" @@ -59,10 +61,11 @@ def configure_meson(args): build_dir = os.path.join(ROOTDIR, "build") shutil.rmtree(build_dir, True) os.mkdir(build_dir) - os.chdir(build_dir) try: - subprocess.check_call([meson, "../"] + args + get_configs(meson)) + subprocess.check_call([meson, "../"] + args, cwd=build_dir) + subprocess.check_call([os.path.join(ROOTDIR, 'meson', 'mesonconf.py')] + + get_configs(meson), cwd=build_dir) except subprocess.CalledProcessError as e: print("EXIT meson return %s" % e.returncode) exit(1) @@ -73,6 +76,8 @@ if __name__ == "__main__": parser.add_argument("--no-reconfigure", action='store_true', default=False, help='Avoid removing the build dir' ' if not necessary.') + parser.add_argument("-u", "--update-meson", action='store_true', + default=False, help='Do not update meson') options, args = parser.parse_known_args() if options.no_reconfigure: if os.path.exists( @@ -81,4 +86,4 @@ if __name__ == "__main__": print("Not reconfiguring") exit(0) - configure_meson(args) + configure_meson(args, options) From 3b8dc3b4d2660c9fef22af8a86cc27522cb6e4d2 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 17 Oct 2016 21:11:25 +0200 Subject: [PATCH 021/448] meson submodule: Default to the new 0.35.1 release --- meson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson b/meson index a513bcfde6..d72a5c14f8 160000 --- a/meson +++ b/meson @@ -1 +1 @@ -Subproject commit a513bcfde613f2a0403f7b0cd34d4bd62674c1d8 +Subproject commit d72a5c14f83253bafaf6b2531442d981ea1df2ed From 1f4380ac0a0cebef7e790cf50411e2ffc36dcd3a Mon Sep 17 00:00:00 2001 From: Scott D Phillips Date: Mon, 17 Oct 2016 07:42:07 -0700 Subject: [PATCH 022/448] Windows fixes for scripts subprocess.call runs programs directly when shell=False and can't take advantage of the association that makes python scripts executable in shells, so explicitly add the interpreter to the args for call. Run the windows command prompt by default in gst-uninstalled. --- configure | 4 ++-- gst-uninstalled.py | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 4d835dc4e0..66bf858dc8 100755 --- a/configure +++ b/configure @@ -63,8 +63,8 @@ def configure_meson(args, options): os.mkdir(build_dir) try: - subprocess.check_call([meson, "../"] + args, cwd=build_dir) - subprocess.check_call([os.path.join(ROOTDIR, 'meson', 'mesonconf.py')] + subprocess.check_call([sys.executable, meson, "../"] + args, cwd=build_dir) + subprocess.check_call([sys.executable, os.path.join(ROOTDIR, 'meson', 'mesonconf.py')] + get_configs(meson), cwd=build_dir) except subprocess.CalledProcessError as e: print("EXIT meson return %s" % e.returncode) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index a6e1592e63..a698bf9cf8 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -123,7 +123,10 @@ if __name__ == "__main__": exit(1) if not args: - args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] + if os.name is 'nt': + args = [os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe")] + else: + args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] if args[0] == "/bin/bash": args.append("--noprofile") From 1a36ab2c2769fe4983cbeed25ef261c5a0e5ed1d Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 20 Oct 2016 16:16:15 -0300 Subject: [PATCH 023/448] README: Do not mention building projects on top of gst-all We might enable that in the future but this is a non goal for now --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 0a2f9d6a35..9a55390d1f 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,3 @@ Inside that environment you will find the GStreamer modules in subprojects/, you can simply hack in there and to rebuild you just need to rerun `ninja`. -## Build a project based on GStreamer - -You can make your own project that uses GStreamer and all its -components depend on `gst-all` making it Meson subproject -of your own project. From b844b7229ad203bfb4afda3611373ed42988b13a Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 20 Oct 2016 17:35:34 -0300 Subject: [PATCH 024/448] Do not gst-python by default --- meson.build | 6 ++++-- meson_options.txt | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 meson_options.txt diff --git a/meson.build b/meson.build index 66b4f5ade9..3ca302a033 100644 --- a/meson.build +++ b/meson.build @@ -12,8 +12,7 @@ subprojects = [ 'gst-plugins-ugly', 'gst-plugins-bad', 'gst-devtools', - 'gst-editing-services', - 'gst-python' + 'gst-editing-services' ] # FIXME Remove that check once we have ffmpeg as a gst-libav subproject @@ -38,6 +37,9 @@ else subprojects += gst_libav endif +if get_option('enable_python') + subprojects += ['gst-python'] +endif foreach subproj: subprojects subproject(subproj, version: gst_version) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000000..a3a3ebc0c6 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1 @@ +option('enable_python', type : 'boolean', value : false) From b0bcc4002631ac6364b0f1054fe6700f90f89cb4 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 20 Oct 2016 17:41:08 -0300 Subject: [PATCH 025/448] Remove meson/ submodule But let user have a meson/ checkout that will be used by ./configure --- .gitmodules | 3 --- configure | 15 +++++---------- meson | 1 - 3 files changed, 5 insertions(+), 14 deletions(-) delete mode 160000 meson diff --git a/.gitmodules b/.gitmodules index f601ecb48b..e69de29bb2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "meson"] - path = meson - url = https://github.com/mesonbuild/meson.git diff --git a/configure b/configure index 66bf858dc8..a43bca2653 100755 --- a/configure +++ b/configure @@ -16,15 +16,12 @@ PROJECTNAME = "GStreamer 'all'" ROOTDIR = os.path.abspath(os.path.dirname(__file__)) -def get_meson(update_meson): +def get_meson(): meson = os.path.join(ROOTDIR, 'meson', 'meson.py') - if update_meson or not os.path.exists(meson): - print("Updating meson submodule... ", end='') - sys.stdout.flush() - git('submodule', 'update', '--init', repository_path=ROOTDIR) - print("DONE") + if os.path.exists(meson): + return meson - return meson + return accept_command(["meson.py", "meson"]) def accept_command(commands): @@ -45,7 +42,7 @@ def get_configs(meson): def configure_meson(args, options): """Configures meson and generate the Makefile.""" - meson = get_meson(options.update_meson) + meson = get_meson() if not meson: print("Install mesonbuild to build %s: http://mesonbuild.com/\n" "You can simply install it with:\n" @@ -76,8 +73,6 @@ if __name__ == "__main__": parser.add_argument("--no-reconfigure", action='store_true', default=False, help='Avoid removing the build dir' ' if not necessary.') - parser.add_argument("-u", "--update-meson", action='store_true', - default=False, help='Do not update meson') options, args = parser.parse_known_args() if options.no_reconfigure: if os.path.exists( diff --git a/meson b/meson deleted file mode 160000 index d72a5c14f8..0000000000 --- a/meson +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d72a5c14f83253bafaf6b2531442d981ea1df2ed From e54a4ac66c7c73d9ede871e5850753c3d5a400fe Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 20 Oct 2016 17:53:08 -0300 Subject: [PATCH 026/448] Let user know about how to build after configure is done --- configure | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure b/configure index a43bca2653..296ea69a68 100755 --- a/configure +++ b/configure @@ -63,6 +63,8 @@ def configure_meson(args, options): subprocess.check_call([sys.executable, meson, "../"] + args, cwd=build_dir) subprocess.check_call([sys.executable, os.path.join(ROOTDIR, 'meson', 'mesonconf.py')] + get_configs(meson), cwd=build_dir) + print("You can now build GStreamer and its various subprojects running:\n" + " $ ninja -C %s" % build_dir) except subprocess.CalledProcessError as e: print("EXIT meson return %s" % e.returncode) exit(1) From 85880a3a22e3effccdb6e573543926b18eeae519 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 20 Oct 2016 18:12:53 -0300 Subject: [PATCH 027/448] Create symlinks to built subprojects --- .gitignore | 21 +++++++++++++++++++++ gst-uninstalled.py | 2 +- meson.build | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 468d90c58e..5c4855fb54 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,22 @@ *build*/ +gst-devtools +gst-editing-services +gst-libav +gst-plugins-bad +gst-plugins-base +gst-plugins-good +gst-plugins-ugly +gst-python +gstreamer +__pycache__ +meson/ +subprojects/gst-devtools/ +subprojects/gst-editing-services/ +subprojects/gst-libav/ +subprojects/gst-plugins-bad/ +subprojects/gst-plugins-base/ +subprojects/gst-plugins-good/ +subprojects/gst-plugins-ugly/ +subprojects/gst-python/ +subprojects/gstreamer/ +subprojects/glib/ diff --git a/gst-uninstalled.py b/gst-uninstalled.py index a698bf9cf8..16986570fe 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -56,7 +56,7 @@ def get_subprocess_env(options): prepend_env_var(env, "GST_PLUGIN_PATH", projpath) - env["CURRENT_GST"] = os.path.normpath(SCRIPTDIR + "/subprojects") + env["CURRENT_GST"] = os.path.normpath(SCRIPTDIR) env["GST_VALIDATE_SCENARIOS_PATH"] = os.path.normpath( "%s/subprojects/gst-devtools/validate/data/scenarios" % SCRIPTDIR) env["GST_VALIDATE_PLUGIN_PATH"] = os.path.normpath( diff --git a/meson.build b/meson.build index 3ca302a033..a5bf87834b 100644 --- a/meson.build +++ b/meson.build @@ -41,8 +41,22 @@ if get_option('enable_python') subprojects += ['gst-python'] endif +python3 = find_program('python3') +symlink = ''' +import os + +os.symlink(os.path.join('@1@', 'subprojects', '@0@'), + os.path.join('@1@', '@0@')) +''' foreach subproj: subprojects subproject(subproj, version: gst_version) + + cmdres = run_command(python3, '-c', symlink.format(subproj, meson.current_source_dir())) + if cmdres.returncode() == 0 + message('Created symlink to ' + subproj) + else + message('Could not create symlink to @0@'.format(subproj)) + endif endforeach setenv = find_program('gst-uninstalled.py') From 526a5cd04ac37039ec21c0b5d4253722eacf915e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 21 Oct 2016 05:18:40 -0300 Subject: [PATCH 028/448] Rename configure to setup --- configure => setup | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename configure => setup (100%) diff --git a/configure b/setup similarity index 100% rename from configure rename to setup From aca3e8c96e773f6aa2904a4d7e4b2ef7eb5c5aec Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 21 Oct 2016 05:32:57 -0300 Subject: [PATCH 029/448] Remove some cruft leftover --- gst-uninstalled.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 16986570fe..b5c51a3d99 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -38,18 +38,6 @@ def get_subprocess_env(options): "and try again." % (proj, projpath)) exit(1) - envvars_file = os.path.join(projpath, os.path.basename(projpath) + "-uninstalled-envvars.py") - if os.path.exists(envvars_file): - envvars_env = {"envvars": {}} - with open(envvars_file) as f: - code = compile(f.read(), envvars_file, 'exec') - exec(code, None, envvars_env) - for var, value in envvars_env["envvars"].items(): - if var.startswith("+"): - prepend_env_var(env, var, value.strip("+")) - else: - env[var] = value - toolsdir = os.path.join(projpath, "tools") if os.path.exists(toolsdir): prepend_env_var(env, "PATH", toolsdir) From 3875f0c705290fca31a1e83586a25a17645c6713 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 26 Oct 2016 17:03:18 -0300 Subject: [PATCH 030/448] Add options to disable some modules --- meson.build | 24 ++++++++++++++++++++---- meson_options.txt | 5 +++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index a5bf87834b..f8bc506bd5 100644 --- a/meson.build +++ b/meson.build @@ -9,10 +9,6 @@ subprojects = [ 'gstreamer', 'gst-plugins-base', 'gst-plugins-good', - 'gst-plugins-ugly', - 'gst-plugins-bad', - 'gst-devtools', - 'gst-editing-services' ] # FIXME Remove that check once we have ffmpeg as a gst-libav subproject @@ -41,6 +37,26 @@ if get_option('enable_python') subprojects += ['gst-python'] endif +if not get_option('disable_gst_plugins_ugly') + subprojects += ['gst-plugins-ugly'] +endif + +if not get_option('disable_gst_plugins_bad') + subprojects += ['gst-plugins-bad'] +endif + +if not get_option('disable_gst_libav') + subprojects += ['gst-libav'] +endif + +if not get_option('disable_gst_devtools') + subprojects += ['gst-devtools'] +endif + +if not get_option('disable_gst_editing_services') + subprojects += ['gst-editing-services'] +endif + python3 = find_program('python3') symlink = ''' import os diff --git a/meson_options.txt b/meson_options.txt index a3a3ebc0c6..63d41bf708 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1 +1,6 @@ option('enable_python', type : 'boolean', value : false) +option('disable_gst_libav', type : 'boolean', value : false) +option('disable_gst_plugins_ugly', type : 'boolean', value : false) +option('disable_gst_plugins_bad', type : 'boolean', value : false) +option('disable_gst_devtools', type : 'boolean', value : false) +option('disable_gst_editing_services', type : 'boolean', value : false) From a2c4f6f2b00e98bf79b2d48861b4886a033883ed Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 26 Oct 2016 17:44:19 -0300 Subject: [PATCH 031/448] Rename to gst-build --- README.md | 4 ++-- setup | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9a55390d1f..d1bf0a064d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# gst-all +# gst-build GStreamer [meson](http://mesonbuild.com/) based repositories aggregrator @@ -18,7 +18,7 @@ NOTE: on fedora (and maybe other distributions) replace `ninja` with `ninja-buil ## GStreamer uninstalled -gst-all also contains a special `uninstalled` target that lets you enter +gst-build also contains a special `uninstalled` target that lets you enter an uninstalled development environment where you will be able to work on GStreamer easily. diff --git a/setup b/setup index 296ea69a68..d179b655fc 100755 --- a/setup +++ b/setup @@ -11,7 +11,7 @@ from common import git from common import Colors -PROJECTNAME = "GStreamer 'all'" +PROJECTNAME = "GStreamer build" ROOTDIR = os.path.abspath(os.path.dirname(__file__)) From b2b737dc1b99e46f5206608e4b62de759cf4435c Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 26 Oct 2016 17:58:16 -0300 Subject: [PATCH 032/448] README: Enhance and update --- README.md | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d1bf0a064d..85af59f6de 100644 --- a/README.md +++ b/README.md @@ -2,27 +2,41 @@ GStreamer [meson](http://mesonbuild.com/) based repositories aggregrator -You can build GStreamer and all its component at once using -meson and its "subproject" feature. +You can build GStreamer and all its modules at once using +meson and its [subproject](https://github.com/mesonbuild/meson/wiki/Subprojects) feature. ## Getting started -We have an helper script to get started, will get the right [meson](http://mesonbuild.com/) -version and get you ready to build. You can just get all GStreamer built running: +### Install meson and ninja + +You should get meson through your package manager or using: + + $ pip3 install --user meson + +You should get `ninja` using your package manager or downloading it from +[here](https://github.com/ninja-build/ninja/releases). + +### Build GStreamer and its modules + +You can get all GStreamer built running: + +``` +mkdir build/ && meson build && ninja -C build/ +``` NOTE: on fedora (and maybe other distributions) replace `ninja` with `ninja-build` +# Development environment + +gst-build also contains a special `uninstalled` target that lets you enter an +uninstalled development environment where you will be able to work on GStreamer easily. +You can get into that environment running: + ``` -./configure && ninja -C build/ +ninja -C build/ uninstalled ``` -## GStreamer uninstalled - -gst-build also contains a special `uninstalled` target that lets you enter -an uninstalled development environment where you will be able -to work on GStreamer easily. - -Inside that environment you will find the GStreamer modules -in subprojects/, you can simply hack in there and to rebuild you -just need to rerun `ninja`. - +If your operating system handles symlinks, built modules source code will be available +at the root of `gst-build/` for example GStreamer core will be in `gstreamer/`. Otherwise +they will be present in `subprojects/`. You can simply hack in there and to rebuild you +just need to rerun `ninja -C build/`. From 4c2f97525f42d2642b910562fc5e19c2c3168d48 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 26 Oct 2016 19:39:49 -0300 Subject: [PATCH 033/448] Get absolute path to run meson It is necessary now that we explicitly run it through the python interpreter. --- setup | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/setup b/setup index d179b655fc..5cca3c730d 100755 --- a/setup +++ b/setup @@ -19,19 +19,18 @@ ROOTDIR = os.path.abspath(os.path.dirname(__file__)) def get_meson(): meson = os.path.join(ROOTDIR, 'meson', 'meson.py') if os.path.exists(meson): - return meson + mesonconf = os.path.join(ROOTDIR, 'meson', 'mesonconf.py') + return meson, mesonconf - return accept_command(["meson.py", "meson"]) + return accept_command(["meson.py", "meson"]), accept_command(["mesonconf.py", "mesonconf"]) def accept_command(commands): - """Checks if @command --version works.""" + """Search @commands and returns the first found absolute path.""" for command in commands: - try: - subprocess.check_output([command, "--version"]) + command = shutil.which(command) + if command: return command - except FileNotFoundError: - pass return None @@ -42,7 +41,7 @@ def get_configs(meson): def configure_meson(args, options): """Configures meson and generate the Makefile.""" - meson = get_meson() + meson, mesonconf = get_meson() if not meson: print("Install mesonbuild to build %s: http://mesonbuild.com/\n" "You can simply install it with:\n" @@ -61,9 +60,8 @@ def configure_meson(args, options): try: subprocess.check_call([sys.executable, meson, "../"] + args, cwd=build_dir) - subprocess.check_call([sys.executable, os.path.join(ROOTDIR, 'meson', 'mesonconf.py')] - + get_configs(meson), cwd=build_dir) - print("You can now build GStreamer and its various subprojects running:\n" + subprocess.check_call([sys.executable, mesonconf] + get_configs(meson), cwd=build_dir) + print("\nYou can now build GStreamer and its various subprojects running:\n" " $ ninja -C %s" % build_dir) except subprocess.CalledProcessError as e: print("EXIT meson return %s" % e.returncode) From 233bdf98e8cb7da64536c32ba5a2ae858783e744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 26 Oct 2016 23:57:44 +0100 Subject: [PATCH 034/448] Require meson 0.35.1 Otherwise gst-devtools will fail to configure with UnboundLocalError: local variable 'variable' referenced before assignment --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index f8bc506bd5..b515605eb2 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('All GStreamer modules', 'c', version : '1.9.2.1') +project('All GStreamer modules', 'c', version : '1.9.2.1', meson_version : '>= 0.35.1') gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' From 73f692ddf9a064b241262afdb79e7fd41db50b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 27 Oct 2016 00:02:22 +0100 Subject: [PATCH 035/448] Bump version to match gst git master --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index b515605eb2..0ec870564d 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('All GStreamer modules', 'c', version : '1.9.2.1', meson_version : '>= 0.35.1') +project('All GStreamer modules', 'c', version : '1.9.90', meson_version : '>= 0.35.1') gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' From 9a8ab306b7d300c85358972095ae8bb2b5ce3189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 27 Oct 2016 00:05:51 +0100 Subject: [PATCH 036/448] Fix build if we can't find system ffmpeg / libavfilter dev packages It would unconditionally add gst-libav to subprojects even if the dep was not found. --- meson.build | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/meson.build b/meson.build index 0ec870564d..e93c370f67 100644 --- a/meson.build +++ b/meson.build @@ -29,8 +29,6 @@ endif if gst_libav.length() == 0 message('WARNING: gst-libav not built as ffmpeg >= n3.1.2 not found on the system') -else - subprojects += gst_libav endif if get_option('enable_python') @@ -46,7 +44,7 @@ if not get_option('disable_gst_plugins_bad') endif if not get_option('disable_gst_libav') - subprojects += ['gst-libav'] + subprojects += gst_libav endif if not get_option('disable_gst_devtools') From 0b560fb18753f6a41057e6ce8755eef99678322e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 27 Oct 2016 00:30:32 +0100 Subject: [PATCH 037/448] Add gst-rtsp-server --- .gitignore | 2 ++ meson.build | 4 ++++ meson_options.txt | 1 + subprojects/gst-rtsp-server.wrap | 4 ++++ 4 files changed, 11 insertions(+) create mode 100644 subprojects/gst-rtsp-server.wrap diff --git a/.gitignore b/.gitignore index 5c4855fb54..1494291337 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ gst-plugins-base gst-plugins-good gst-plugins-ugly gst-python +gst-rtsp-server gstreamer __pycache__ meson/ @@ -18,5 +19,6 @@ subprojects/gst-plugins-base/ subprojects/gst-plugins-good/ subprojects/gst-plugins-ugly/ subprojects/gst-python/ +subprojects/gst-rtsp-server/ subprojects/gstreamer/ subprojects/glib/ diff --git a/meson.build b/meson.build index e93c370f67..861ef7db4d 100644 --- a/meson.build +++ b/meson.build @@ -55,6 +55,10 @@ if not get_option('disable_gst_editing_services') subprojects += ['gst-editing-services'] endif +if not get_option('disable_rtsp_server') + subprojects += ['gst-rtsp-server'] +endif + python3 = find_program('python3') symlink = ''' import os diff --git a/meson_options.txt b/meson_options.txt index 63d41bf708..049ec4e352 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -4,3 +4,4 @@ option('disable_gst_plugins_ugly', type : 'boolean', value : false) option('disable_gst_plugins_bad', type : 'boolean', value : false) option('disable_gst_devtools', type : 'boolean', value : false) option('disable_gst_editing_services', type : 'boolean', value : false) +option('disable_rtsp_server', type : 'boolean', value : false) diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap new file mode 100644 index 0000000000..8d92963b13 --- /dev/null +++ b/subprojects/gst-rtsp-server.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-rtsp-server +url=git://anongit.freedesktop.org/gstreamer/gst-rtsp-server +revision=master From 33e079129461f171d7fb7e4dfc5586017e1bd3e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 27 Oct 2016 20:07:25 +0100 Subject: [PATCH 038/448] Skip gst-devtools if json-glib-1.0 is missing We shouldn't fail hard because of a gst-devtools dependency, so if json-glib-1.0 is not found, just skip the module and build the rest. --- meson.build | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/meson.build b/meson.build index 861ef7db4d..fa043ca575 100644 --- a/meson.build +++ b/meson.build @@ -48,7 +48,11 @@ if not get_option('disable_gst_libav') endif if not get_option('disable_gst_devtools') + if dependency('json-glib-1.0', required : false).found() subprojects += ['gst-devtools'] + else + message('WARNING: not building gst-devtools module, missing glib-json-1.0') + endif endif if not get_option('disable_gst_editing_services') From 0b3ba49c6c4f38893dbf402e2c912e6ea137b14e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 2 Nov 2016 15:40:54 -0300 Subject: [PATCH 039/448] Fix setting $PS1 for bash And let user know how to set prompt for zsh and powerline in our README. --- README.md | 29 +++++++++++++++++++++++++++++ gst-uninstalled.py | 29 ++++++++++++++--------------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 85af59f6de..13e67d0e88 100644 --- a/README.md +++ b/README.md @@ -40,3 +40,32 @@ If your operating system handles symlinks, built modules source code will be ava at the root of `gst-build/` for example GStreamer core will be in `gstreamer/`. Otherwise they will be present in `subprojects/`. You can simply hack in there and to rebuild you just need to rerun `ninja -C build/`. + + +## Add information about GStreamer development environment in your prompt line + +### Bash prompt + +We automatically handle `bash` and set `$PS1` accordingly + +### Zsh prompt + +In your `.zshrc`, you should add something like: + +``` +export PROMPT="$GST_ENV-$PROMPT" +``` + +### Using powerline + +In your powerline theme configuration file (by default in +`{POWERLINE INSTALLATION DIR}/config_files/themes/shell/default.json`) +you should add a new environment segment as follow: + +``` +{ + "function": "powerline.segments.common.env.environment", + "args": { "variable": "GST_ENV" }, + "priority": 50 +}, +``` diff --git a/gst-uninstalled.py b/gst-uninstalled.py index b5c51a3d99..37e48a292b 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -4,7 +4,9 @@ import argparse import os import re import site +import shutil import subprocess +import tempfile SCRIPTDIR = os.path.abspath(os.path.dirname(__file__)) @@ -15,16 +17,6 @@ def prepend_env_var(env, var, value): env[var] = env[var].replace(os.pathsep + os.pathsep, os.pathsep).strip(os.pathsep) -def set_prompt_var(options, env): - ps1 = env.get("PS1") - if ps1: - env["PS1"] = "[gst-%s] %s" % (options.gst_version, ps1) - - prompt = env.get("PROMPT") - if prompt: - env["PROMPT"] = "[gst-%s] %s" % (options.gst_version, prompt) - - def get_subprocess_env(options): env = os.environ.copy() @@ -56,6 +48,7 @@ def get_subprocess_env(options): prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'meson')) env["PATH"] += os.pathsep + PATH env["GST_VERSION"] = options.gst_version + env["GST_ENV"] = 'gst-' + options.gst_version env["GST_PLUGIN_SYSTEM_PATH"] = "" env["GST_PLUGIN_SCANNER"] = os.path.normpath( "%s/subprojects/gstreamer/libs/gst/helpers/gst-plugin-scanner" % options.builddir) @@ -89,9 +82,6 @@ def get_subprocess_env(options): if has_typelib: break - - set_prompt_var(options, env) - return env @@ -115,8 +105,17 @@ if __name__ == "__main__": args = [os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe")] else: args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] - if args[0] == "/bin/bash": - args.append("--noprofile") + if "bash" in args[0]: + bashrc = os.path.expanduser('~/.bashrc') + if os.path.exists(bashrc): + tmprc = tempfile.NamedTemporaryFile(mode='w') + with open(bashrc, 'r') as src: + shutil.copyfileobj(src, tmprc) + tmprc.write('\nexport PS1="[gst-%s] $PS1"' % options.gst_version) + tmprc.flush() + # Let the GC remove the tmp file + args.append("--rcfile") + args.append(tmprc.name) try: exit(subprocess.call(args, env=get_subprocess_env(options))) From 95a0651b2cea7ea8bfd281c59e61010891a79f7e Mon Sep 17 00:00:00 2001 From: Scott D Phillips Date: Thu, 3 Nov 2016 12:42:07 -0700 Subject: [PATCH 040/448] Include libav dependency in FFmpeg check The FFmpeg-origin check can't work if it isn't provided the dependency library. https://bugzilla.gnome.org/show_bug.cgi?id=773911 --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index fa043ca575..57cfde5d3d 100644 --- a/meson.build +++ b/meson.build @@ -22,7 +22,7 @@ if libavfilter_dep.found() #else #error libav provider should be FFmpeg #endif''' - if cc.compiles(check_ffmpeg_src, name : 'whether libav is provided by FFmpeg') + if cc.compiles(check_ffmpeg_src, dependencies : libavfilter_dep, name : 'whether libav is provided by FFmpeg') gst_libav = ['gst-libav'] endif endif From 07424d2fdfdcc46631db74892e89464f728aa9c3 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 3 Nov 2016 11:46:34 -0300 Subject: [PATCH 041/448] Properly setup environment for python development if gst-python is being built Avoiding to mess with PYTHONPATH making using python2 in the env impossible. --- gst-uninstalled.py | 57 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 37e48a292b..c399d4c346 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -36,6 +36,8 @@ def get_subprocess_env(options): prepend_env_var(env, "GST_PLUGIN_PATH", projpath) + prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(SCRIPTDIR, 'subprojects', + 'gst-python', 'plugin')) env["CURRENT_GST"] = os.path.normpath(SCRIPTDIR) env["GST_VALIDATE_SCENARIOS_PATH"] = os.path.normpath( "%s/subprojects/gst-devtools/validate/data/scenarios" % SCRIPTDIR) @@ -55,9 +57,6 @@ def get_subprocess_env(options): env["GST_PTP_HELPER"] = os.path.normpath( "%s/subprojects/gstreamer/libs/gst/helpers/gst-ptp-helper" % options.builddir) env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") - prepend_env_var(env, 'PYTHONPATH', ':'.join(site.getsitepackages())) - env["PYTHONPATH"] = env["PYTHONPATH"] + ':' + os.path.normpath( - options.builddir + '/subprojects/gst-python') filename = "meson.build" sharedlib_reg = re.compile(r'\.so$|\.dylib$') @@ -85,6 +84,53 @@ def get_subprocess_env(options): return env +def python_env(options, unset_env=False): + """ + Setup our overrides_hack.py as sitecustomize.py script in user + site-packages if unset_env=False, else unset, previously set + env. + """ + subprojects_path = os.path.join(options.builddir, "subprojects") + gst_python_path = os.path.join(SCRIPTDIR, "subprojects", "gst-python") + if not os.path.exists(os.path.join(subprojects_path, "gst-python")) or \ + not os.path.exists(gst_python_path): + return False + + sitepackages = site.getusersitepackages() + if not sitepackages: + return False + + sitecustomize = os.path.join(sitepackages, "sitecustomize.py") + overrides_hack = os.path.join(gst_python_path, "testsuite", "overrides_hack.py") + + if not unset_env: + if os.path.exists(sitecustomize): + if os.path.realpath(sitecustomize) == overrides_hack: + print("Customize user site script already linked to the GStreamer one") + return False + + old_sitecustomize = os.path.join(sitepackages, + "old.sitecustomize.gstuninstalled.py") + shutil.move(sitecustomize, old_sitecustomize) + elif not os.path.exists(sitepackages): + os.makedirs(sitepackages) + + os.symlink(overrides_hack, sitecustomize) + return os.path.realpath(sitecustomize) == overrides_hack + else: + if not os.path.realpath(sitecustomize) == overrides_hack: + return False + + os.remove(sitecustomize) + old_sitecustomize = os.path.join(sitepackages, + "old.sitecustomize.gstuninstalled.py") + + if os.path.exists(old_sitecustomize): + shutil.move(old_sitecustomize, sitecustomize) + + return True + + if __name__ == "__main__": parser = argparse.ArgumentParser(prog="gstreamer-uninstalled") @@ -116,8 +162,11 @@ if __name__ == "__main__": # Let the GC remove the tmp file args.append("--rcfile") args.append(tmprc.name) - + python_set = python_env(options) try: exit(subprocess.call(args, env=get_subprocess_env(options))) except subprocess.CalledProcessError as e: exit(e.returncode) + finally: + if python_set: + python_env(options, unset_env=True) From 6707b41d08268b7c6d0d7a4b420927003736b107 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 8 Nov 2016 23:25:26 +0530 Subject: [PATCH 042/448] git-update: Use --autosquash during pull --rebase This option has existed forever and allows people to automatically update and autosquash/pop changes in subproject git repositories. --- git-update | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-update b/git-update index ee65a2303c..a53d678e83 100755 --- a/git-update +++ b/git-update @@ -46,7 +46,7 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): git("fetch", repository_path=repo_dir) git("checkout", revision, repository_path=repo_dir) else: - git("pull", "--rebase", repository_path=repo_dir) + git("pull", "--rebase", "--autostash", repository_path=repo_dir) except Exception as e: out = getattr(e, "output", b"").decode() if not no_interaction: From a6e6feac3e71c0432e5ce54a8877d33f5e9a8056 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 7 Nov 2016 18:11:07 -0300 Subject: [PATCH 043/448] Add a way to skip updating a particular repo When entering a shell to fix the rebasing you can just `exit 255` and we concider it means 'skip update'. Also support entering shell on windows --- git-update | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/git-update b/git-update index a53d678e83..731056490f 100755 --- a/git-update +++ b/git-update @@ -52,12 +52,20 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): if not no_interaction: print("=====================================" "\n%sEntering a shell in %s to fix that" - " just `exit` once done`" + " just `exit 0` once done` or `exit 255`" + " to skip update for that repository" "\n=====================================" % ( - out, os.getcwd())) + out, repo_dir)) try: - subprocess.check_call(os.environ.get("SHELL", "/bin/sh"), - cwd=repo_dir) + if os.name is 'nt': + shell = os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe") + else: + shell = os.environ.get("SHELL", os.path.realpath("/bin/sh")) + subprocess.check_call(shell, cwd=repo_dir) + except subprocess.CalledProcessError as e: + if e.returncode == 255: + print("Skipping '%s' update" % repo_name) + return True except: # Result of subshell does not really matter pass From ac383f6b68cb2354ba7e48e5cab334ae3402b7ca Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 7 Nov 2016 18:17:21 -0300 Subject: [PATCH 044/448] git-update: Also update gst-build --- git-update | 2 ++ 1 file changed, 2 insertions(+) diff --git a/git-update b/git-update index 731056490f..8ffc2af276 100755 --- a/git-update +++ b/git-update @@ -107,5 +107,7 @@ if __name__ == "__main__": if options.no_color: Colors.disable() + if not update_repo('gst-build', SCRIPTDIR, None, options.no_interaction): + exit(1) exit(not update_subprojects(options.manifest, options.no_interaction)) From c843f487408d7468d6fb64eb581c569fca9cec01 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 7 Nov 2016 18:17:39 -0300 Subject: [PATCH 045/448] Add 'update' and `git-update` targets to update git repos --- README.md | 34 ++++++++++++++++++++++++++++------ common.py | 10 ++++++++++ git-update | 25 +++++++++++++++++++++---- meson.build | 5 +++++ setup | 11 +---------- 5 files changed, 65 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 13e67d0e88..55f508bad1 100644 --- a/README.md +++ b/README.md @@ -28,18 +28,40 @@ NOTE: on fedora (and maybe other distributions) replace `ninja` with `ninja-buil # Development environment +## Uninstalled environment + gst-build also contains a special `uninstalled` target that lets you enter an -uninstalled development environment where you will be able to work on GStreamer easily. -You can get into that environment running: +uninstalled development environment where you will be able to work on GStreamer +easily. You can get into that environment running: ``` ninja -C build/ uninstalled ``` -If your operating system handles symlinks, built modules source code will be available -at the root of `gst-build/` for example GStreamer core will be in `gstreamer/`. Otherwise -they will be present in `subprojects/`. You can simply hack in there and to rebuild you -just need to rerun `ninja -C build/`. +If your operating system handles symlinks, built modules source code will be +available at the root of `gst-build/` for example GStreamer core will be in +`gstreamer/`. Otherwise they will be present in `subprojects/`. You can simply +hack in there and to rebuild you just need to rerun `ninja -C build/`. + +## Update git subprojects + +We added a special `update` target to update subprojects (it uses `git pull +--rebase` meaning you should always make sure the branches you work on are +following the right upstream branch, you can set it with `git branch +--set-upstream-to origin/master` if you are working on `gst-build` master +branch). + +Update all GStreamer modules and rebuild: + +``` +ninja -C build/ update +``` + +Update all GStreamer modules without rebuilding: + +``` +ninja -C build/ git-update +``` ## Add information about GStreamer development environment in your prompt line diff --git a/common.py b/common.py index 244b30ac2c..40f420eb20 100644 --- a/common.py +++ b/common.py @@ -1,4 +1,5 @@ import argparse +import shutil import subprocess class Colors: @@ -37,3 +38,12 @@ class Colors: def git(*args, repository_path='.'): return subprocess.check_output(["git"] + list(args), cwd=repository_path, stderr=subprocess.STDOUT).decode() + +def accept_command(commands): + """Search @commands and returns the first found absolute path.""" + for command in commands: + command = shutil.which(command) + if command: + return command + + return None diff --git a/git-update b/git-update index 8ffc2af276..d86810e761 100755 --- a/git-update +++ b/git-update @@ -6,6 +6,7 @@ import xml.etree.ElementTree as ET from common import git from common import Colors +from common import accept_command SCRIPTDIR = os.path.dirname(__file__) @@ -51,8 +52,8 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): out = getattr(e, "output", b"").decode() if not no_interaction: print("=====================================" - "\n%sEntering a shell in %s to fix that" - " just `exit 0` once done` or `exit 255`" + "\n%s\nEntering a shell in %s to fix that" + " just `exit 0` once done, or `exit 255`" " to skip update for that repository" "\n=====================================" % ( out, repo_dir)) @@ -95,6 +96,10 @@ if __name__ == "__main__": default=False, action='store_true', help="Do not output ansi colors.") + parser.add_argument("--builddir", + default=None, + help="Specifies the build directory where to" + " invoke ninja after updating.") parser.add_argument("--no-interaction", default=False, action='store_true', @@ -109,5 +114,17 @@ if __name__ == "__main__": if not update_repo('gst-build', SCRIPTDIR, None, options.no_interaction): exit(1) - exit(not update_subprojects(options.manifest, - options.no_interaction)) + if not update_subprojects(options.manifest, options.no_interaction): + exit(1) + + if options.builddir: + ninja = accept_command(["ninja", "ninja-build"]) + if not ninja: + print("Can't find ninja, other backends are not supported for rebuilding") + exit(1) + + if not os.path.exists(os.path.join (options.builddir, 'build.ninja')): + print("Can't rebuild in %s as no build.ninja file found." % options.builddir) + + print("Rebuilding all GStreamer modules.") + exit(subprocess.call([ninja, '-C', options.builddir])) diff --git a/meson.build b/meson.build index 57cfde5d3d..0037b9e35b 100644 --- a/meson.build +++ b/meson.build @@ -84,3 +84,8 @@ endforeach setenv = find_program('gst-uninstalled.py') run_target('uninstalled', command : [setenv, '--builddir=@0@'.format(meson.current_build_dir()), '--gst-version=@0@'.format(gst_branch)]) + +update = find_program('git-update') +run_target('git-update', command : [update]) +run_target('update', command : [update, + '--builddir=@0@'.format(meson.current_build_dir())]) diff --git a/setup b/setup index 5cca3c730d..2c5d301506 100755 --- a/setup +++ b/setup @@ -9,6 +9,7 @@ import subprocess from common import git from common import Colors +from common import accept_command PROJECTNAME = "GStreamer build" @@ -25,16 +26,6 @@ def get_meson(): return accept_command(["meson.py", "meson"]), accept_command(["mesonconf.py", "mesonconf"]) -def accept_command(commands): - """Search @commands and returns the first found absolute path.""" - for command in commands: - command = shutil.which(command) - if command: - return command - - return None - - def get_configs(meson): return ['-D', 'werror=true'] From 90021b82afd830a41d35b43fd899772677fd5b26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 2 Nov 2016 11:30:06 +0000 Subject: [PATCH 046/448] Update version to match git master Use the 1.10 branch if you want to track 1.10. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 0037b9e35b..75f255b8ab 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('All GStreamer modules', 'c', version : '1.9.90', meson_version : '>= 0.35.1') +project('All GStreamer modules', 'c', version : '1.11.0.1', meson_version : '>= 0.35.1') gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' From 30a35c3d60283f5d6405578fa40457796b5e208c Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 10 Nov 2016 01:10:58 +0530 Subject: [PATCH 047/448] git-update: Use git config to set autostash The build bots don't like it; probably because the git version is ancient there. Bots should ignore the unknown config variable. --- git-update | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/git-update b/git-update index d86810e761..32a085a2fc 100755 --- a/git-update +++ b/git-update @@ -42,12 +42,13 @@ def update_subprojects(manifest, no_interaction=False): def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): print("Updating %s..." % repo_name) + git("config", "rebase.autoStash", "true", repository_path=repo_dir) try: if revision: git("fetch", repository_path=repo_dir) git("checkout", revision, repository_path=repo_dir) else: - git("pull", "--rebase", "--autostash", repository_path=repo_dir) + git("pull", "--rebase", repository_path=repo_dir) except Exception as e: out = getattr(e, "output", b"").decode() if not no_interaction: From 8ebcfad265dc9ae763c91de9c5d524071219085c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 14 Nov 2016 19:09:20 +0000 Subject: [PATCH 048/448] Require latest meson release (0.36) We'll start depending on it in other modules soon. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 75f255b8ab..c774c474ea 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('All GStreamer modules', 'c', version : '1.11.0.1', meson_version : '>= 0.35.1') +project('All GStreamer modules', 'c', version : '1.11.0.1', meson_version : '>= 0.36') gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' From b45052b60e78ff8373cdef09d8b307148653a0f3 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 14 Nov 2016 19:09:41 -0300 Subject: [PATCH 049/448] setup: Directly use --werror to set Werror Using mesonconf -Dwerror afterward is failling because of https://github.com/ninja-build/ninja/issues/371 Using meson -Dwerror=true is failing currently for some reason. --- setup | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/setup b/setup index 2c5d301506..3f768578f7 100755 --- a/setup +++ b/setup @@ -26,8 +26,8 @@ def get_meson(): return accept_command(["meson.py", "meson"]), accept_command(["mesonconf.py", "mesonconf"]) -def get_configs(meson): - return ['-D', 'werror=true'] +def get_configs(): + return ['--werror'] def configure_meson(args, options): @@ -50,8 +50,7 @@ def configure_meson(args, options): os.mkdir(build_dir) try: - subprocess.check_call([sys.executable, meson, "../"] + args, cwd=build_dir) - subprocess.check_call([sys.executable, mesonconf] + get_configs(meson), cwd=build_dir) + subprocess.check_call([sys.executable, meson, "../"] + args + get_configs(), cwd=build_dir) print("\nYou can now build GStreamer and its various subprojects running:\n" " $ ninja -C %s" % build_dir) except subprocess.CalledProcessError as e: From 978f107a0b560cdbc7cca6e53621d2c49c650d9d Mon Sep 17 00:00:00 2001 From: Scott D Phillips Date: Thu, 17 Nov 2016 10:55:44 -0800 Subject: [PATCH 050/448] git-update: fixes for running on windows when running git-update as `py git-update` (which is convenient on windows), SCRIPTDIR is '' instead of '.'. Fix that with normpath. Printing emdash (U+2014) doesn't work on windows because it isn't in cp437. Change it to hyphen. https://bugzilla.gnome.org/show_bug.cgi?id=774636 --- git-update | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/git-update b/git-update index 32a085a2fc..3a4ea2a7a5 100755 --- a/git-update +++ b/git-update @@ -9,7 +9,7 @@ from common import Colors from common import accept_command -SCRIPTDIR = os.path.dirname(__file__) +SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) def manifest_get_commits(manifest): @@ -84,7 +84,7 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): commit_message = git("show", repository_path=repo_dir).split("\n") - print(u" -> %s%s%s — %s" % (Colors.HEADER, commit_message[0][7:14], Colors.ENDC, + print(u" -> %s%s%s - %s" % (Colors.HEADER, commit_message[0][7:14], Colors.ENDC, commit_message[4].strip())) return True From e87fac1b4da6b9f1313e9674a875a2abe89cb049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 25 Nov 2016 19:55:15 +0000 Subject: [PATCH 051/448] subprojects: use https:// instead of git:// protocol https provides authentication and also works better in environments with restricted network connectivity. https://bugzilla.gnome.org/show_bug.cgi?id=775110 --- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 1b9819fa60..a7ed3bcac8 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gst-devtools -url=git://anongit.freedesktop.org/gstreamer/gst-devtools +url=https://anongit.freedesktop.org/git/gstreamer/gst-devtools.git revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 6abb135364..145fd32a4c 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gst-editing-services -url=git://anongit.freedesktop.org/gstreamer/gst-editing-services +url=https://anongit.freedesktop.org/git/gstreamer/gst-editing-services.git revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index c81501b520..25f45847c0 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gst-libav -url=git://anongit.freedesktop.org/gstreamer/gst-libav +url=https://anongit.freedesktop.org/git/gstreamer/gst-libav.git revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index bb3f01ba63..6947f8d628 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gst-plugins-bad -url=git://anongit.freedesktop.org/gstreamer/gst-plugins-bad +url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-bad.git revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index a58eecf2b1..0a8b4ce005 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gst-plugins-base -url=git://anongit.freedesktop.org/gstreamer/gst-plugins-base +url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-base.git revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 6801284a8d..fcb6f21ac8 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gst-plugins-good -url=git://anongit.freedesktop.org/gstreamer/gst-plugins-good +url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-good.git revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 947b142b83..c8ce1f62ba 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gst-plugins-ugly -url=git://anongit.freedesktop.org/gstreamer/gst-plugins-ugly +url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-ugly.git revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 167c5146cc..40c9a209bc 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gst-python -url=git://anongit.freedesktop.org/gstreamer/gst-python +url=https://anongit.freedesktop.org/git/gstreamer/gst-python.git revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index 8d92963b13..d30cdc4ecd 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gst-rtsp-server -url=git://anongit.freedesktop.org/gstreamer/gst-rtsp-server +url=https://anongit.freedesktop.org/git/gstreamer/gst-rtsp-server revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 3b4938b779..9c59fc6c1c 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=gstreamer -url=git://anongit.freedesktop.org/gstreamer/gstreamer +url=https://anongit.freedesktop.org/git/gstreamer/gstreamer.git revision=master From d3c029f102b5a96d0aeac488ac1a9c146d78388d Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sat, 19 Nov 2016 05:11:55 -0800 Subject: [PATCH 052/448] uninstalled: Properly setup uninstalled env on windows https://bugzilla.gnome.org/show_bug.cgi?id=775281 --- gst-uninstalled.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index c399d4c346..14778f71ad 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -59,8 +59,16 @@ def get_subprocess_env(options): env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") filename = "meson.build" - sharedlib_reg = re.compile(r'\.so$|\.dylib$') + sharedlib_reg = re.compile(r'\.so$|\.dylib$|\.dll$') typelib_reg = re.compile(r'.*\.typelib$') + + if os.name is 'nt': + lib_path_envvar = 'PATH' + elif platform.system() == 'Darwin': + lib_path_envvar = 'DYLD_LIBRARY_PATH' + else: + lib_path_envvar = 'LD_LIBRARY_PATH' + for root, dirnames, filenames in os.walk(os.path.join(options.builddir, 'subprojects')): has_typelib = False @@ -74,9 +82,7 @@ def get_subprocess_env(options): break elif sharedlib_reg.search(filename) and not has_shared: has_shared = True - prepend_env_var(env, "LD_LIBRARY_PATH", - os.path.join(options.builddir, root)) - prepend_env_var(env, "DYLD_LIBRARY_PATH", + prepend_env_var(env, lib_path_envvar, os.path.join(options.builddir, root)) if has_typelib: break From 2b74d4d86d7ae7af247ac80624cef2a6d7729a51 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sat, 19 Nov 2016 05:16:03 -0800 Subject: [PATCH 053/448] Work around issue using msys2 provided zlib https://bugzilla.gnome.org/show_bug.cgi?id=775281 --- meson.build | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/meson.build b/meson.build index c774c474ea..04358f6729 100644 --- a/meson.build +++ b/meson.build @@ -11,6 +11,14 @@ subprojects = [ 'gst-plugins-good', ] +cc = meson.get_compiler('c') +if not meson.is_subproject() and cc.get_id() == 'msvc' + # Make it possible to use msys2 built zlib + # which fails when not using the mingw toolchain as + # it uses unistd.h + add_global_arguments('-DZ_SOLO', language: 'c') +endif + # FIXME Remove that check once we have ffmpeg as a gst-libav subproject libavfilter_dep = dependency('libavfilter', version: '>= 6.47.100', required: false) gst_libav = [] From 954c27641d77339db7d90aa69099d6a89727e2ba Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sat, 19 Nov 2016 18:01:44 -0300 Subject: [PATCH 054/448] Use mesonintrospect to set library path this way the uninstalled target can be used before the libraries are built https://bugzilla.gnome.org/show_bug.cgi?id=775281 --- common.py | 15 +++++++++++++++ gst-uninstalled.py | 40 ++++++++++++++++++++++------------------ setup | 12 ++---------- 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/common.py b/common.py index 40f420eb20..8c8b55dfb6 100644 --- a/common.py +++ b/common.py @@ -1,7 +1,12 @@ import argparse +import os import shutil import subprocess + +ROOTDIR = os.path.abspath(os.path.dirname(__file__)) + + class Colors: HEADER = '\033[95m' OKBLUE = '\033[94m' @@ -47,3 +52,13 @@ def accept_command(commands): return command return None + +def get_meson(): + meson = os.path.join(ROOTDIR, 'meson', 'meson.py') + if os.path.exists(meson): + mesonconf = os.path.join(ROOTDIR, 'meson', 'mesonconf.py') + mesonintrospect = os.path.join(ROOTDIR, 'meson', 'mesonintrospect.py') + return meson, mesonconf, mesonintrospect + + return accept_command(["meson.py", "meson"]), accept_command(["mesonconf.py", "mesonconf"]), \ + accept_command(["mesonintrospect.py", "mesonintrospect"]) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 14778f71ad..890ab512b8 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -1,13 +1,16 @@ #!/usr/bin/env python3 import argparse +import json import os +import platform import re import site import shutil import subprocess import tempfile +from common import get_meson SCRIPTDIR = os.path.abspath(os.path.dirname(__file__)) @@ -59,7 +62,7 @@ def get_subprocess_env(options): env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") filename = "meson.build" - sharedlib_reg = re.compile(r'\.so$|\.dylib$|\.dll$') + sharedlib_reg = re.compile(r'\.so|\.dylib|\.dll') typelib_reg = re.compile(r'.*\.typelib$') if os.name is 'nt': @@ -69,23 +72,24 @@ def get_subprocess_env(options): else: lib_path_envvar = 'LD_LIBRARY_PATH' - for root, dirnames, filenames in os.walk(os.path.join(options.builddir, - 'subprojects')): - has_typelib = False - has_shared = False - for filename in filenames: - if typelib_reg.search(filename) and not has_typelib: - has_typelib = True - prepend_env_var(env, "GI_TYPELIB_PATH", - os.path.join(options.builddir, root)) - if has_shared: - break - elif sharedlib_reg.search(filename) and not has_shared: - has_shared = True - prepend_env_var(env, lib_path_envvar, - os.path.join(options.builddir, root)) - if has_typelib: - break + meson, mesonconf, mesonintrospect = get_meson() + targets_s = subprocess.check_output([mesonintrospect, options.builddir, '--targets']) + targets = json.loads(targets_s.decode()) + for target in targets: + filename = target['filename'] + root = os.path.dirname(filename) + if typelib_reg.search(filename): + prepend_env_var(env, "GI_TYPELIB_PATH", + os.path.join(options.builddir, root)) + elif sharedlib_reg.search(filename): + if target.get('type') != "shared library": + continue + + if "lib/gstreamer-1.0" in os.path.normpath(target.get('install_filename')): + continue + + prepend_env_var(env, lib_path_envvar, + os.path.join(options.builddir, root)) return env diff --git a/setup b/setup index 3f768578f7..489878e07a 100755 --- a/setup +++ b/setup @@ -8,6 +8,7 @@ import shutil import subprocess from common import git +from common import get_meson from common import Colors from common import accept_command @@ -17,22 +18,13 @@ PROJECTNAME = "GStreamer build" ROOTDIR = os.path.abspath(os.path.dirname(__file__)) -def get_meson(): - meson = os.path.join(ROOTDIR, 'meson', 'meson.py') - if os.path.exists(meson): - mesonconf = os.path.join(ROOTDIR, 'meson', 'mesonconf.py') - return meson, mesonconf - - return accept_command(["meson.py", "meson"]), accept_command(["mesonconf.py", "mesonconf"]) - - def get_configs(): return ['--werror'] def configure_meson(args, options): """Configures meson and generate the Makefile.""" - meson, mesonconf = get_meson() + meson, mesonconf, mesonintrospect = get_meson() if not meson: print("Install mesonbuild to build %s: http://mesonbuild.com/\n" "You can simply install it with:\n" From 1c46eb2751f20f933a5772d09e64a120176ea2d6 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sat, 19 Nov 2016 10:18:33 -0300 Subject: [PATCH 055/448] Add a script to setup a developement environment based on msys2 This environment is meant to be setup in a Visual Studio 'Native X64 tools' terminal, and takes for granted that msys2 has been installed, Visual Studio has C(++) support has been installed and python3 is installed and is present in PATH. https://bugzilla.gnome.org/show_bug.cgi?id=775281 --- gst-uninstalled.py | 5 +- msys2_setup.py | 172 +++++++++++++++++++++++++++++++++++++++++++++ setup | 66 ----------------- setup.py | 77 ++++++++++++++++++++ 4 files changed, 252 insertions(+), 68 deletions(-) create mode 100644 msys2_setup.py delete mode 100755 setup create mode 100755 setup.py diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 890ab512b8..d788341747 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -8,6 +8,7 @@ import re import site import shutil import subprocess +import sys import tempfile from common import get_meson @@ -73,7 +74,7 @@ def get_subprocess_env(options): lib_path_envvar = 'LD_LIBRARY_PATH' meson, mesonconf, mesonintrospect = get_meson() - targets_s = subprocess.check_output([mesonintrospect, options.builddir, '--targets']) + targets_s = subprocess.check_output([sys.executable, mesonintrospect, options.builddir, '--targets']) targets = json.loads(targets_s.decode()) for target in targets: filename = target['filename'] @@ -85,7 +86,7 @@ def get_subprocess_env(options): if target.get('type') != "shared library": continue - if "lib/gstreamer-1.0" in os.path.normpath(target.get('install_filename')): + if os.path.normpath("lib/gstreamer-1.0") in os.path.normpath(target.get('install_filename')): continue prepend_env_var(env, lib_path_envvar, diff --git a/msys2_setup.py b/msys2_setup.py new file mode 100644 index 0000000000..69ca4da753 --- /dev/null +++ b/msys2_setup.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 +"""Setup meson based GStreamer uninstalled environment based on msys2.""" + +import argparse +import itertools +import os +import re +import sys +import shutil +import subprocess +import tempfile + +from common import git +from setup import GstBuildConfigurer + + +PROJECTNAME = "GStreamer build" + +ROOTDIR = os.path.abspath(os.path.dirname(__file__)) + + +class Msys2Configurer(GstBuildConfigurer): + MESON_GIT = 'https://github.com/mesonbuild/meson.git' + DEPENDENCIES = ['git', + 'bison', + 'mingw-w64-x86_64-pkg-config', + 'mingw-w64-x86_64-ninja', + 'mingw-w64-x86_64-libxml2', + 'mingw-w64-x86_64-ffmpeg', + 'mingw-w64-x86_64-python3', + 'mingw-w64-x86_64-json-glib'] + LIBNAME_EXCEPTIONS = { + 'zlib1.lib': 'z.lib', + # Fancy, but it seems to be the correct way to do it + 'eay32.lib': 'crypto.lib', + 'ssleay32.lib': 'ssl.lib', + } + + def get_libname(self, dll_name): + lib_name = re.sub(r'(?:lib)?(.*?)(?:-\d+)?\.dll', r'\1.lib', dll_name) + + for exception_name, exception_libname in self.LIBNAME_EXCEPTIONS.items(): + if re.findall(exception_name, lib_name): + return exception_libname + return lib_name + + def make_lib(self, lib, dll, dll_name): + print('%s... ' % os.path.basename(lib), end='') + try: + os.remove(lib) + except FileNotFoundError: + pass + + dumpbin = subprocess.check_output(['dumpbin', '/exports', dll]) + lines = dumpbin.decode().splitlines() + export_start = [i for i in enumerate( + lines) if i[1].find('ordinal hint') != -1][0][0] + 2 + exports = itertools.takewhile(lambda x: x != '', lines[export_start:]) + exports = [i.split() for i in exports] + def_file = tempfile.NamedTemporaryFile( + suffix='.def', delete=False, mode='w') + def_file.write('LIBRARY ' + dll_name + '\r\n') + def_file.write('EXPORTS\r\n') + for ordinal, _, _, name in exports: + def_file.write(name + ' @' + ordinal + '\r\n') + def_file.close() + subprocess.check_output(['lib', '/def:' + def_file.name, + '/out:' + lib]) + os.remove(def_file.name) + + def make_lib_if_needed(self, dll): + if not dll.endswith('.dll'): + return + + lib_dir, dll_name = os.path.split(dll) + if lib_dir.endswith('bin'): + lib_dir = lib_dir[:-3] + 'lib' + + lib_name = self.get_libname(dll_name) + lib = os.path.join(lib_dir, lib_name) + if os.path.exists(lib) and os.stat(dll).st_mtime_ns < os.stat(lib).st_mtime_ns: + return + + print('Generating .lib file for %s ...' % os.path.basename(dll), end='') + self.make_lib(lib, dll, dll_name) + print('DONE') + + def make_libs(self): + base = os.path.join(self.options.msys2_path, 'mingw64', 'bin') + for f in os.listdir(base): + if f.endswith('.dll'): + self.make_lib_if_needed(os.path.join(base, f)) + + def get_configs(self): + return GstBuildConfigurer.get_configs(self) + [ + '-D' + m + ':disable_introspection=true' for m in [ + 'gst-devtools', 'gstreamer', 'gst-plugins-base', + 'gst-editing-services']] + + def setup(self): + if not os.path.exists(self.options.msys2_path): + print("msys2 not found in %s. Please make sure to install" + " (from http://msys2.github.io/) specify --msys2-path" + " if you did not install in the default directory.") + return False + + for path in ['mingw64/bin', 'bin', 'usr/bin']: + os.environ['PATH'] = os.environ.get( + 'PATH', '') + os.pathsep + os.path.normpath(os.path.join(self.options.msys2_path, path)) + os.environ['PATH'] = os.environ['PATH'].replace(';;', ';') + os.environ['PKG_CONFIG_PATH'] = os.environ.get( + 'PKG_CONFIG_PATH', '') + ':/mingw64/lib/pkgconfig:/mingw64/share/pkgconfig' + + subprocess.check_call( + ['pacman', '-S', '--needed'] + self.DEPENDENCIES, env=os.environ) + source_path = os.path.abspath(os.path.curdir) + + print('Making sure meson is present in root folder... ', end='') + if not os.path.isdir(os.path.join(source_path, 'meson')): + print('\nCloning meson') + git('clone', self.MESON_GIT, repository_path=source_path) + else: + print('\nDONE') + + print("Making libs") + self.make_libs() + if not os.path.exists(os.path.join(source_path, 'build', 'build.ninja')) or \ + self.options.reconfigure: + print("Done making .lib files.") + print("Running meson") + if not self.configure_meson(): + return False + + print("Getting into msys2 environment") + try: + subprocess.call([sys.executable, + os.path.join(source_path, 'gst-uninstalled.py'), + '--builddir', os.path.join(source_path, 'build')]) + except subprocess.CalledProcessError as e: + return False + + return True + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Process some integers.') + parser.add_argument("--reconfigure", action='store_true', + default=False, help='Force a full reconfiguration' + ' meaning the build/ folder is removed.' + ' You can also use `ninja reconfigure` to just' + ' make sure meson is rerun but the build folder' + ' is kept.') + if os.name != 'nt': + print("Using this script outside windows does not make sense.") + exit(1) + + parser.add_argument("-m", "--msys2-path", dest="msys2_path", + help="Where to find msys2 root directory." + "(deactivates msys if unset)", + default="C:\msys64") + options, args = parser.parse_known_args() + + if not shutil.which('cl'): + print("Can not find MSVC on windows," + " make sure you are in a 'Visual Studio" + " Native Tools Command Prompt'") + exit(1) + + configurer = Msys2Configurer(options, args) + + exit(not configurer.setup()) + diff --git a/setup b/setup deleted file mode 100755 index 489878e07a..0000000000 --- a/setup +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python3 -"""Script for generating the Makefiles.""" - -import argparse -import os -import sys -import shutil -import subprocess - -from common import git -from common import get_meson -from common import Colors -from common import accept_command - - -PROJECTNAME = "GStreamer build" - -ROOTDIR = os.path.abspath(os.path.dirname(__file__)) - - -def get_configs(): - return ['--werror'] - - -def configure_meson(args, options): - """Configures meson and generate the Makefile.""" - meson, mesonconf, mesonintrospect = get_meson() - if not meson: - print("Install mesonbuild to build %s: http://mesonbuild.com/\n" - "You can simply install it with:\n" - " $ sudo pip3 install meson" % PROJECTNAME) - exit(1) - - ninja = accept_command(["ninja", "ninja-build"]) - if not ninja: - print("Install ninja-build to build %s: https://ninja-build.org/" - % PROJECTNAME) - exit(1) - - build_dir = os.path.join(ROOTDIR, "build") - shutil.rmtree(build_dir, True) - os.mkdir(build_dir) - - try: - subprocess.check_call([sys.executable, meson, "../"] + args + get_configs(), cwd=build_dir) - print("\nYou can now build GStreamer and its various subprojects running:\n" - " $ ninja -C %s" % build_dir) - except subprocess.CalledProcessError as e: - print("EXIT meson return %s" % e.returncode) - exit(1) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Process some integers.') - parser.add_argument("--no-reconfigure", action='store_true', - default=False, help='Avoid removing the build dir' - ' if not necessary.') - options, args = parser.parse_known_args() - if options.no_reconfigure: - if os.path.exists( - ROOTDIR + "/build/build.ninja") and os.path.exists( - ROOTDIR + "/Makefile"): - print("Not reconfiguring") - exit(0) - - configure_meson(args, options) diff --git a/setup.py b/setup.py new file mode 100755 index 0000000000..a05e6ed26a --- /dev/null +++ b/setup.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +"""Script for generating the Makefiles.""" + +import argparse +import os +import sys +import shutil +import subprocess + +from common import get_meson +from common import accept_command + + +PROJECTNAME = "GStreamer build" + +ROOTDIR = os.path.abspath(os.path.dirname(__file__)) + + +class GstBuildConfigurer: + + def __init__(self, options, args): + self.options = options + self.args = args + + def get_configs(self): + return ['--werror'] + + def configure_meson(self): + if not self.options.reconfigure: + if os.path.exists(ROOTDIR + "/build/build.ninja"): + print("Not reconfiguring") + return True + + meson, mesonconf, mesonintrospect = get_meson() + if not meson: + print("Install mesonbuild to build %s: http://mesonbuild.com/\n" + "You can simply install it with:\n" + " $ sudo pip3 install meson" % PROJECTNAME) + return False + + ninja = accept_command(["ninja", "ninja-build"]) + if not ninja: + print("Install ninja-build to build %s: https://ninja-build.org/" + % PROJECTNAME) + return False + + build_dir = os.path.join(ROOTDIR, "build") + shutil.rmtree(build_dir, True) + os.mkdir(build_dir) + + try: + subprocess.check_call( + [sys.executable, meson, "../"] + self.args + self.get_configs(), cwd=build_dir) + print("\nYou can now build GStreamer and its various subprojects running:\n" + " $ ninja -C %s" % build_dir) + except subprocess.CalledProcessError: + return False + + return True + + def setup(self): + return self.configure_meson() + + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Process some integers.') + parser.add_argument("--reconfigure", action='store_true', + default=False, help='Force a full reconfiguration' + ' meaning the build/ folder is removed.' + ' You can also use `ninja reconfigure` to just' + ' make sure meson is rerun but the build folder' + ' is kept.') + + options, args = parser.parse_known_args() + configurer = GstBuildConfigurer(options, args) + exit(not configurer.setup()) From 0857e59dea4ca3cf451a46393e5ef5d2ddd39255 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 13 Dec 2016 15:22:15 -0300 Subject: [PATCH 056/448] msys2: Pass extra argument directly to uninstalled.py --- msys2_setup.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/msys2_setup.py b/msys2_setup.py index 69ca4da753..f8154d938e 100644 --- a/msys2_setup.py +++ b/msys2_setup.py @@ -6,6 +6,7 @@ import itertools import os import re import sys +import shlex import shutil import subprocess import tempfile @@ -97,7 +98,7 @@ class Msys2Configurer(GstBuildConfigurer): 'gst-devtools', 'gstreamer', 'gst-plugins-base', 'gst-editing-services']] - def setup(self): + def setup(self, args): if not os.path.exists(self.options.msys2_path): print("msys2 not found in %s. Please make sure to install" " (from http://msys2.github.io/) specify --msys2-path" @@ -111,8 +112,7 @@ class Msys2Configurer(GstBuildConfigurer): os.environ['PKG_CONFIG_PATH'] = os.environ.get( 'PKG_CONFIG_PATH', '') + ':/mingw64/lib/pkgconfig:/mingw64/share/pkgconfig' - subprocess.check_call( - ['pacman', '-S', '--needed'] + self.DEPENDENCIES, env=os.environ) + subprocess.check_call(['pacman', '-S', '--needed', '--noconfirm'] + self.DEPENDENCIES) source_path = os.path.abspath(os.path.curdir) print('Making sure meson is present in root folder... ', end='') @@ -131,11 +131,15 @@ class Msys2Configurer(GstBuildConfigurer): if not self.configure_meson(): return False - print("Getting into msys2 environment") try: - subprocess.call([sys.executable, - os.path.join(source_path, 'gst-uninstalled.py'), - '--builddir', os.path.join(source_path, 'build')]) + if not args: + print("Getting into msys2 environment", flush=True) + subprocess.check_call([sys.executable, + os.path.join(source_path, 'gst-uninstalled.py'), + '--builddir', os.path.join(source_path, 'build')]) + else: + print("Running %s" ' '.join(args), flush=True) + res = subprocess.check_call(args) except subprocess.CalledProcessError as e: return False @@ -158,6 +162,10 @@ if __name__ == "__main__": help="Where to find msys2 root directory." "(deactivates msys if unset)", default="C:\msys64") + + parser.add_argument("-c", "--command", dest="command", + help="Command to run instead of entering environment.", + default="") options, args = parser.parse_known_args() if not shutil.which('cl'): @@ -168,5 +176,4 @@ if __name__ == "__main__": configurer = Msys2Configurer(options, args) - exit(not configurer.setup()) - + exit(not configurer.setup(shlex.split(options.command))) From 1efbb1392daf69dac950321d822ceec4978f3183 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 13 Dec 2016 21:35:14 -0300 Subject: [PATCH 057/448] msys2: Fix special lib names regexes and add some necessary ones And always flush on prints (so we have understandable outputs) --- msys2_setup.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/msys2_setup.py b/msys2_setup.py index f8154d938e..7aa9e93cd4 100644 --- a/msys2_setup.py +++ b/msys2_setup.py @@ -31,10 +31,12 @@ class Msys2Configurer(GstBuildConfigurer): 'mingw-w64-x86_64-python3', 'mingw-w64-x86_64-json-glib'] LIBNAME_EXCEPTIONS = { - 'zlib1.lib': 'z.lib', + r'^zlib1.lib$': 'z.lib', + r'^nettle-.*': 'nettle.lib', + r'^hogweed-.*': 'hogweed.lib', # Fancy, but it seems to be the correct way to do it - 'eay32.lib': 'crypto.lib', - 'ssleay32.lib': 'ssl.lib', + r'^eay32.lib$': 'crypto.lib', + r'^ssleay32.lib$': 'ssl.lib', } def get_libname(self, dll_name): @@ -46,7 +48,7 @@ class Msys2Configurer(GstBuildConfigurer): return lib_name def make_lib(self, lib, dll, dll_name): - print('%s... ' % os.path.basename(lib), end='') + print('%s... ' % os.path.basename(lib), end='', flush=True) try: os.remove(lib) except FileNotFoundError: @@ -82,9 +84,9 @@ class Msys2Configurer(GstBuildConfigurer): if os.path.exists(lib) and os.stat(dll).st_mtime_ns < os.stat(lib).st_mtime_ns: return - print('Generating .lib file for %s ...' % os.path.basename(dll), end='') + print('Generating .lib file for %s ...' % os.path.basename(dll), end='', flush=True) self.make_lib(lib, dll, dll_name) - print('DONE') + print('DONE', flush=True) def make_libs(self): base = os.path.join(self.options.msys2_path, 'mingw64', 'bin') @@ -102,7 +104,7 @@ class Msys2Configurer(GstBuildConfigurer): if not os.path.exists(self.options.msys2_path): print("msys2 not found in %s. Please make sure to install" " (from http://msys2.github.io/) specify --msys2-path" - " if you did not install in the default directory.") + " if you did not install in the default directory.", flush=True) return False for path in ['mingw64/bin', 'bin', 'usr/bin']: @@ -115,19 +117,19 @@ class Msys2Configurer(GstBuildConfigurer): subprocess.check_call(['pacman', '-S', '--needed', '--noconfirm'] + self.DEPENDENCIES) source_path = os.path.abspath(os.path.curdir) - print('Making sure meson is present in root folder... ', end='') + print('Making sure meson is present in root folder... ', end='', flush=True) if not os.path.isdir(os.path.join(source_path, 'meson')): - print('\nCloning meson') + print('\nCloning meson', flush=True) git('clone', self.MESON_GIT, repository_path=source_path) else: - print('\nDONE') + print('\nDONE', flush=True) - print("Making libs") + print("Making libs", flush=True) self.make_libs() + print("Done making .lib files.", flush=True) if not os.path.exists(os.path.join(source_path, 'build', 'build.ninja')) or \ self.options.reconfigure: - print("Done making .lib files.") - print("Running meson") + print("Running meson", flush=True) if not self.configure_meson(): return False @@ -155,7 +157,7 @@ if __name__ == "__main__": ' make sure meson is rerun but the build folder' ' is kept.') if os.name != 'nt': - print("Using this script outside windows does not make sense.") + print("Using this script outside windows does not make sense.", flush=True) exit(1) parser.add_argument("-m", "--msys2-path", dest="msys2_path", @@ -171,7 +173,7 @@ if __name__ == "__main__": if not shutil.which('cl'): print("Can not find MSVC on windows," " make sure you are in a 'Visual Studio" - " Native Tools Command Prompt'") + " Native Tools Command Prompt'", flush=True) exit(1) configurer = Msys2Configurer(options, args) From d68bff3c47b2da74d67ab7c0849cf7f0f9b9d76e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 13 Dec 2016 21:36:25 -0300 Subject: [PATCH 058/448] msys2: Allow disabling failures on warning --- msys2_setup.py | 2 ++ setup.py | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/msys2_setup.py b/msys2_setup.py index 7aa9e93cd4..ce36f04307 100644 --- a/msys2_setup.py +++ b/msys2_setup.py @@ -150,6 +150,8 @@ class Msys2Configurer(GstBuildConfigurer): if __name__ == "__main__": parser = argparse.ArgumentParser(description='Process some integers.') + parser.add_argument("--no-error", action='store_true', + default=False, help="Do not error out on warnings") parser.add_argument("--reconfigure", action='store_true', default=False, help='Force a full reconfiguration' ' meaning the build/ folder is removed.' diff --git a/setup.py b/setup.py index a05e6ed26a..38d4f722d8 100755 --- a/setup.py +++ b/setup.py @@ -23,6 +23,8 @@ class GstBuildConfigurer: self.args = args def get_configs(self): + if self.options.no_error: + return [] return ['--werror'] def configure_meson(self): @@ -71,6 +73,8 @@ if __name__ == "__main__": ' You can also use `ninja reconfigure` to just' ' make sure meson is rerun but the build folder' ' is kept.') + parser.add_argument("--no-error", action='store_true', + default=False, help="Do not error out on warnings") options, args = parser.parse_known_args() configurer = GstBuildConfigurer(options, args) From 9c15b9a136a4df00c43fce70c0ad749a5b04d441 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 2 Jan 2017 13:18:37 +0100 Subject: [PATCH 059/448] README: document how to run tests https://bugzilla.gnome.org/show_bug.cgi?id=776710 --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 55f508bad1..a5d4103a7a 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,19 @@ Update all GStreamer modules without rebuilding: ninja -C build/ git-update ``` +## Run tests + +You can easily run the test of all the components: + +``` +mesontest -C build +``` + +Or to run a specific test: + +``` +mesontest -C build/ gst/gstbuffer +``` ## Add information about GStreamer development environment in your prompt line From 9a64b727bf6ad42d66f1e5f0404baca46f57167c Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 3 Jan 2017 02:06:42 +0530 Subject: [PATCH 060/448] setup.py: Use the detected Ninja and quote build_dir The build_dir is an absolute path, so quote it. We don't really need to use the absolute path to Ninja in git-update since we pass it to subprocess.call which will do an shutil.which --- common.py | 5 ++--- setup.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/common.py b/common.py index 8c8b55dfb6..67d02d52d8 100644 --- a/common.py +++ b/common.py @@ -45,10 +45,9 @@ def git(*args, repository_path='.'): stderr=subprocess.STDOUT).decode() def accept_command(commands): - """Search @commands and returns the first found absolute path.""" + """Search @commands and returns the first found command""" for command in commands: - command = shutil.which(command) - if command: + if shutil.which(command): return command return None diff --git a/setup.py b/setup.py index 38d4f722d8..1f9d1a1e2c 100755 --- a/setup.py +++ b/setup.py @@ -54,7 +54,7 @@ class GstBuildConfigurer: subprocess.check_call( [sys.executable, meson, "../"] + self.args + self.get_configs(), cwd=build_dir) print("\nYou can now build GStreamer and its various subprojects running:\n" - " $ ninja -C %s" % build_dir) + " $ {} -C {!r}".format(ninja, build_dir)) except subprocess.CalledProcessError: return False From b75903c8f8c182553873448a785c00439155999a Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 3 Jan 2017 22:53:18 +0530 Subject: [PATCH 061/448] Revert "setup.py: Use the detected Ninja and quote build_dir" This reverts commit 9a64b727bf6ad42d66f1e5f0404baca46f57167c. Closes https://bugzilla.gnome.org/show_bug.cgi?id=776801 The actual fix is in the next commit. --- common.py | 5 +++-- setup.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/common.py b/common.py index 67d02d52d8..8c8b55dfb6 100644 --- a/common.py +++ b/common.py @@ -45,9 +45,10 @@ def git(*args, repository_path='.'): stderr=subprocess.STDOUT).decode() def accept_command(commands): - """Search @commands and returns the first found command""" + """Search @commands and returns the first found absolute path.""" for command in commands: - if shutil.which(command): + command = shutil.which(command) + if command: return command return None diff --git a/setup.py b/setup.py index 1f9d1a1e2c..38d4f722d8 100755 --- a/setup.py +++ b/setup.py @@ -54,7 +54,7 @@ class GstBuildConfigurer: subprocess.check_call( [sys.executable, meson, "../"] + self.args + self.get_configs(), cwd=build_dir) print("\nYou can now build GStreamer and its various subprojects running:\n" - " $ {} -C {!r}".format(ninja, build_dir)) + " $ ninja -C %s" % build_dir) except subprocess.CalledProcessError: return False From 97262139f1f4bddf7b33562bca8b705baa32c948 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 3 Jan 2017 22:59:52 +0530 Subject: [PATCH 062/448] setup.py: Print the detected Ninja and quote build_dir The build_dir is an absolute path, so quote it. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 38d4f722d8..ec04cc195f 100755 --- a/setup.py +++ b/setup.py @@ -54,7 +54,7 @@ class GstBuildConfigurer: subprocess.check_call( [sys.executable, meson, "../"] + self.args + self.get_configs(), cwd=build_dir) print("\nYou can now build GStreamer and its various subprojects running:\n" - " $ ninja -C %s" % build_dir) + " $ {} -C {!r}".format(os.path.basename(ninja), build_dir)) except subprocess.CalledProcessError: return False From ba774df5a8421cf8e9834eb865554de265bf2a67 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 14 Dec 2016 17:13:53 -0300 Subject: [PATCH 063/448] Also use meson introspect to set PATH --- gst-uninstalled.py | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index d788341747..613c2d9654 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -24,22 +24,7 @@ def prepend_env_var(env, var, value): def get_subprocess_env(options): env = os.environ.copy() - PATH = env.get("PATH", "") - subprojects_path = os.path.join(options.builddir, "subprojects") - for proj in os.listdir(subprojects_path): - projpath = os.path.join(subprojects_path, proj) - if not os.path.exists(projpath): - print("Subproject %s does not exist in %s.,\n" - " Make sure to build everything properly " - "and try again." % (proj, projpath)) - exit(1) - - toolsdir = os.path.join(projpath, "tools") - if os.path.exists(toolsdir): - prepend_env_var(env, "PATH", toolsdir) - - prepend_env_var(env, "GST_PLUGIN_PATH", projpath) - + prepend_env_var(env, "GST_PLUGIN_PATH", options.builddir) prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(SCRIPTDIR, 'subprojects', 'gst-python', 'plugin')) env["CURRENT_GST"] = os.path.normpath(SCRIPTDIR) @@ -52,7 +37,6 @@ def get_subprocess_env(options): prepend_env_var(env, "PATH", os.path.normpath( "%s/subprojects/gst-devtools/validate/tools" % options.builddir)) prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'meson')) - env["PATH"] += os.pathsep + PATH env["GST_VERSION"] = options.gst_version env["GST_ENV"] = 'gst-' + options.gst_version env["GST_PLUGIN_SYSTEM_PATH"] = "" @@ -62,7 +46,6 @@ def get_subprocess_env(options): "%s/subprojects/gstreamer/libs/gst/helpers/gst-ptp-helper" % options.builddir) env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") - filename = "meson.build" sharedlib_reg = re.compile(r'\.so|\.dylib|\.dll') typelib_reg = re.compile(r'.*\.typelib$') @@ -76,6 +59,7 @@ def get_subprocess_env(options): meson, mesonconf, mesonintrospect = get_meson() targets_s = subprocess.check_output([sys.executable, mesonintrospect, options.builddir, '--targets']) targets = json.loads(targets_s.decode()) + paths = set() for target in targets: filename = target['filename'] root = os.path.dirname(filename) @@ -91,6 +75,11 @@ def get_subprocess_env(options): prepend_env_var(env, lib_path_envvar, os.path.join(options.builddir, root)) + elif target.get('type') == 'executable' and target.get('installed'): + paths.add(os.path.join(options.builddir, root)) + + for p in paths: + prepend_env_var(env, 'PATH', p) return env From 7655cdcc58e7897c7ceb21922fabc6c157ff513e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 19 Dec 2016 10:10:58 -0300 Subject: [PATCH 064/448] uninstalled: Also set GST_PRESET_PATH and GST_ENCODING_TARGET_PATH --- gst-uninstalled.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 613c2d9654..cd11488a2c 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -81,6 +81,23 @@ def get_subprocess_env(options): for p in paths: prepend_env_var(env, 'PATH', p) + presets = set() + encoding_targets = set() + if '--installed' in subprocess.check_output([mesonintrospect, '-h']).decode(): + installed_s = subprocess.check_output([sys.executable, mesonintrospect, + options.builddir, '--installed']) + for path, installpath in json.loads(installed_s.decode()).items(): + if path.endswith('.prs'): + presets.add(os.path.dirname(path)) + elif path.endswith('.gep'): + encoding_targets.add( + os.path.abspath(os.path.join(os.path.dirname(path), '..'))) + for p in presets: + prepend_env_var(env, 'GST_PRESET_PATH', p) + + for t in encoding_targets: + prepend_env_var(env, 'GST_ENCODING_TARGET_PATH', t) + return env From 0d2f4e136f01c75a440589001ee71085bf4af725 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 4 Jan 2017 12:10:56 +0100 Subject: [PATCH 065/448] gst-uninstalled: set PKG_CONFIG_PATH Look for -uninstalled pc files and update PKG_CONFIG_PATH with the directories containing those. This feature is useful for users building the GStreamer stack using meson and having to link it to another project which is still using the autotools. Fix a regression from the old gst-uninstalled tool. https://bugzilla.gnome.org/show_bug.cgi?id=776810 --- gst-uninstalled.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index cd11488a2c..1f5bf83740 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -83,6 +83,7 @@ def get_subprocess_env(options): presets = set() encoding_targets = set() + pkg_dirs = set() if '--installed' in subprocess.check_output([mesonintrospect, '-h']).decode(): installed_s = subprocess.check_output([sys.executable, mesonintrospect, options.builddir, '--installed']) @@ -92,12 +93,21 @@ def get_subprocess_env(options): elif path.endswith('.gep'): encoding_targets.add( os.path.abspath(os.path.join(os.path.dirname(path), '..'))) + elif path.endswith('.pc'): + # Is there a -uninstalled pc file for this file? + uninstalled = "{0}-uninstalled.pc".format(path[:-3]) + if os.path.exists(uninstalled): + pkg_dirs.add(os.path.dirname(path)) + for p in presets: prepend_env_var(env, 'GST_PRESET_PATH', p) for t in encoding_targets: prepend_env_var(env, 'GST_ENCODING_TARGET_PATH', t) + for pkg_dir in pkg_dirs: + prepend_env_var(env, "PKG_CONFIG_PATH", pkg_dir) + return env From 225419e030dfa496572fb87d8e0da33df6232956 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Wed, 11 Jan 2017 17:29:33 +0530 Subject: [PATCH 066/448] git-update: Update submodules too More correct than not doing it, and prevents careless people from mistakenly pushing changes to submodules. --- git-update | 1 + 1 file changed, 1 insertion(+) diff --git a/git-update b/git-update index 3a4ea2a7a5..97356b927c 100755 --- a/git-update +++ b/git-update @@ -49,6 +49,7 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): git("checkout", revision, repository_path=repo_dir) else: git("pull", "--rebase", repository_path=repo_dir) + git("submodule", "update", repository_path=repo_dir) except Exception as e: out = getattr(e, "output", b"").decode() if not no_interaction: From 14de71cd963c6bd7a5264a2ce7950724040834fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 13 Jan 2017 13:07:47 +0000 Subject: [PATCH 067/448] Bump version --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 04358f6729..a7742b90c8 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('All GStreamer modules', 'c', version : '1.11.0.1', meson_version : '>= 0.36') +project('All GStreamer modules', 'c', version : '1.11.1.1', meson_version : '>= 0.36') gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' From 45d7f5f3373979f8938339f18e555f78b62c8904 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Wed, 18 Jan 2017 16:25:52 +1100 Subject: [PATCH 068/448] add gst-omx as a possible subproject --- .gitignore | 2 ++ meson.build | 4 ++++ meson_options.txt | 1 + subprojects/gst-omx.wrap | 4 ++++ 4 files changed, 11 insertions(+) create mode 100644 subprojects/gst-omx.wrap diff --git a/.gitignore b/.gitignore index 1494291337..9818e66713 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ gst-devtools gst-editing-services gst-libav +gst-omx gst-plugins-bad gst-plugins-base gst-plugins-good @@ -14,6 +15,7 @@ meson/ subprojects/gst-devtools/ subprojects/gst-editing-services/ subprojects/gst-libav/ +subprojects/gst-omx/ subprojects/gst-plugins-bad/ subprojects/gst-plugins-base/ subprojects/gst-plugins-good/ diff --git a/meson.build b/meson.build index a7742b90c8..b5283ea845 100644 --- a/meson.build +++ b/meson.build @@ -55,6 +55,10 @@ if not get_option('disable_gst_libav') subprojects += gst_libav endif +if not get_option('disable_gst_omx') + subprojects += ['gst-omx'] +endif + if not get_option('disable_gst_devtools') if dependency('json-glib-1.0', required : false).found() subprojects += ['gst-devtools'] diff --git a/meson_options.txt b/meson_options.txt index 049ec4e352..2a73695a27 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -5,3 +5,4 @@ option('disable_gst_plugins_bad', type : 'boolean', value : false) option('disable_gst_devtools', type : 'boolean', value : false) option('disable_gst_editing_services', type : 'boolean', value : false) option('disable_rtsp_server', type : 'boolean', value : false) +option('disable_gst_omx', type : 'boolean', value : true) diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap new file mode 100644 index 0000000000..4a6151b946 --- /dev/null +++ b/subprojects/gst-omx.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gst-omx +url=https://anongit.freedesktop.org/git/gstreamer/gst-omx.git +revision=master From f822ffead938ed8044611b9db226827482f48ad2 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 27 Jan 2017 16:54:21 -0300 Subject: [PATCH 069/448] Add meson/ to PYTHONPATH if needed --- gst-uninstalled.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 1f5bf83740..7a2ebf8050 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -108,6 +108,11 @@ def get_subprocess_env(options): for pkg_dir in pkg_dirs: prepend_env_var(env, "PKG_CONFIG_PATH", pkg_dir) + mesonpath = os.path.join(SCRIPTDIR, "meson") + if os.path.join(mesonpath): + # Add meson/ into PYTHONPATH if we are using a local meson + prepend_env_var(env, 'PYTHONPATH', mesonpath) + return env From 5a06cf2807bcf94587ff49ad91932971bb6550d7 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 30 Jan 2017 09:08:59 +0100 Subject: [PATCH 070/448] README: update tests section - Add example to list all tests - Add example to run all tests of a specific component - Update example running one specific test to avoid test name clashes with other components. https://bugzilla.gnome.org/show_bug.cgi?id=776718 --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a5d4103a7a..2d5d73a01b 100644 --- a/README.md +++ b/README.md @@ -71,10 +71,22 @@ You can easily run the test of all the components: mesontest -C build ``` +To list all available tests: + +``` +mesontest -C build --list +``` + +To run all the tests of a specific component: + +``` +mesontest -C build --suite gst-plugins-base +``` + Or to run a specific test: ``` -mesontest -C build/ gst/gstbuffer +mesontest -C build/ --suite gstreamer gst/gstbuffer ``` ## Add information about GStreamer development environment in your prompt line From a6ae14b612f0e0133360ba0c02a55ec2508b97c3 Mon Sep 17 00:00:00 2001 From: Scott D Phillips Date: Thu, 9 Feb 2017 11:08:39 -0800 Subject: [PATCH 071/448] add gstreamer-vaapi as a possible subproject https://bugzilla.gnome.org/show_bug.cgi?id=778407 --- .gitignore | 2 ++ meson.build | 8 ++++++++ meson_options.txt | 1 + subprojects/gstreamer-vaapi.wrap | 4 ++++ 4 files changed, 15 insertions(+) create mode 100644 subprojects/gstreamer-vaapi.wrap diff --git a/.gitignore b/.gitignore index 9818e66713..3dae67b572 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ gst-plugins-ugly gst-python gst-rtsp-server gstreamer +gstreamer-vaapi __pycache__ meson/ subprojects/gst-devtools/ @@ -23,4 +24,5 @@ subprojects/gst-plugins-ugly/ subprojects/gst-python/ subprojects/gst-rtsp-server/ subprojects/gstreamer/ +subprojects/gstreamer-vaapi/ subprojects/glib/ diff --git a/meson.build b/meson.build index b5283ea845..a4ff133805 100644 --- a/meson.build +++ b/meson.build @@ -59,6 +59,14 @@ if not get_option('disable_gst_omx') subprojects += ['gst-omx'] endif +if not get_option('disable_gstreamer_vaapi') + if dependency('libva', version: '>= 0.30.4', required : false).found() + subprojects += ['gstreamer-vaapi'] + else + message('WARNING: not building gstreamer-vaapi module, missing libva') + endif +endif + if not get_option('disable_gst_devtools') if dependency('json-glib-1.0', required : false).found() subprojects += ['gst-devtools'] diff --git a/meson_options.txt b/meson_options.txt index 2a73695a27..ddcc13f50d 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -6,3 +6,4 @@ option('disable_gst_devtools', type : 'boolean', value : false) option('disable_gst_editing_services', type : 'boolean', value : false) option('disable_rtsp_server', type : 'boolean', value : false) option('disable_gst_omx', type : 'boolean', value : true) +option('disable_gstreamer_vaapi', type : 'boolean', value : false) diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap new file mode 100644 index 0000000000..7c243077bb --- /dev/null +++ b/subprojects/gstreamer-vaapi.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gstreamer-vaapi +url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-vaapi.git +revision=master From 9335ccae003ee2678e4ec7b2bd6a2894aecbcfca Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 15 Feb 2017 10:55:37 -0300 Subject: [PATCH 072/448] Add push-url to all wrap files --- subprojects/gst-devtools.wrap | 1 + subprojects/gst-editing-services.wrap | 1 + subprojects/gst-libav.wrap | 1 + subprojects/gst-omx.wrap | 1 + subprojects/gst-plugins-bad.wrap | 1 + subprojects/gst-plugins-base.wrap | 1 + subprojects/gst-plugins-good.wrap | 1 + subprojects/gst-plugins-ugly.wrap | 1 + subprojects/gst-python.wrap | 1 + subprojects/gst-rtsp-server.wrap | 1 + subprojects/gstreamer-vaapi.wrap | 1 + subprojects/gstreamer.wrap | 1 + 12 files changed, 12 insertions(+) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index a7ed3bcac8..92531806e0 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-devtools url=https://anongit.freedesktop.org/git/gstreamer/gst-devtools.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-devtools revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 145fd32a4c..9a5fbe633f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-editing-services url=https://anongit.freedesktop.org/git/gstreamer/gst-editing-services.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-editing-services revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 25f45847c0..7771b7174f 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-libav url=https://anongit.freedesktop.org/git/gstreamer/gst-libav.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-libav revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index 4a6151b946..c8023c0b3f 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-omx url=https://anongit.freedesktop.org/git/gstreamer/gst-omx.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-omx revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 6947f8d628..43bc794fc7 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-plugins-bad url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-bad.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-bad revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 0a8b4ce005..5b676edfdb 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-plugins-base url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-base.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index fcb6f21ac8..e42b672654 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-plugins-good url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-good.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-good revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index c8ce1f62ba..16f458f86f 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-plugins-ugly url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-ugly.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-ugly revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 40c9a209bc..2b6c8d92f4 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-python url=https://anongit.freedesktop.org/git/gstreamer/gst-python.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-python revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index d30cdc4ecd..b40a50e331 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gst-rtsp-server url=https://anongit.freedesktop.org/git/gstreamer/gst-rtsp-server +push-url=ssh://git.freedesktop.org/git/gstreamer/gst-rtsp-server revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 7c243077bb..8a245404df 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gstreamer-vaapi url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-vaapi.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-vaapi revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 9c59fc6c1c..9d113b9129 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=gstreamer url=https://anongit.freedesktop.org/git/gstreamer/gstreamer.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer revision=master From 95d525f43a5a729c46b07662bf7fccc15da154f7 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Wed, 8 Mar 2017 00:31:26 +0100 Subject: [PATCH 073/448] Enable custom subprojects option --- README.md | 17 +++++++++++++++++ meson.build | 8 ++++++++ meson_options.txt | 1 + 3 files changed, 26 insertions(+) diff --git a/README.md b/README.md index 2d5d73a01b..11d38d438d 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,23 @@ Update all GStreamer modules without rebuilding: ninja -C build/ git-update ``` +## Custom subprojects + +We also added a meson option, 'custom_subprojects', that allows the user +to provide a comma-separated list of subprojects that should be built +alongside the default ones. + +To use it: + +``` +cd subprojects +git clone my_subproject +cd ../build +rm -rf * && meson .. -Dcustom_subprojects=my_subproject +ninja +``` + + ## Run tests You can easily run the test of all the components: diff --git a/meson.build b/meson.build index a4ff133805..ea5d80d189 100644 --- a/meson.build +++ b/meson.build @@ -90,6 +90,14 @@ import os os.symlink(os.path.join('@1@', 'subprojects', '@0@'), os.path.join('@1@', '@0@')) ''' + +foreach custom_subproj: get_option('custom_subprojects').split(',') + if custom_subproj != '' + message ('Adding custom subproject ' + custom_subproj) + subprojects += [custom_subproj] + endif +endforeach + foreach subproj: subprojects subproject(subproj, version: gst_version) diff --git a/meson_options.txt b/meson_options.txt index ddcc13f50d..fc73eb84fc 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -7,3 +7,4 @@ option('disable_gst_editing_services', type : 'boolean', value : false) option('disable_rtsp_server', type : 'boolean', value : false) option('disable_gst_omx', type : 'boolean', value : true) option('disable_gstreamer_vaapi', type : 'boolean', value : false) +option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') From 4df327a69b9739929433f8bb7eb0c030a70d4e6d Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 28 Mar 2017 14:32:24 -0300 Subject: [PATCH 074/448] uninstalled: Take into account -good pkgconfig uninstalled file --- gst-uninstalled.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 7a2ebf8050..22cbfaeb35 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -107,6 +107,10 @@ def get_subprocess_env(options): for pkg_dir in pkg_dirs: prepend_env_var(env, "PKG_CONFIG_PATH", pkg_dir) + prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(options.builddir, + 'subprojects', + 'gst-plugins-good', + 'pkgconfig')) mesonpath = os.path.join(SCRIPTDIR, "meson") if os.path.join(mesonpath): From 12b128951920076f35e60e1b57d1132f6a2d4708 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Thu, 6 Apr 2017 00:25:31 +0200 Subject: [PATCH 075/448] uninstalled: use build and source root --- gst-uninstalled.py | 11 ++++++++++- meson.build | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 22cbfaeb35..0e34975f81 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -173,6 +173,9 @@ if __name__ == "__main__": parser.add_argument("--builddir", default=os.path.join(SCRIPTDIR, "build"), help="The meson build directory") + parser.add_argument("--srcdir", + default=SCRIPTDIR, + help="The top level source directory") parser.add_argument("--gst-version", default="master", help="The GStreamer major version") options, args = parser.parse_known_args() @@ -182,6 +185,11 @@ if __name__ == "__main__": options.builddir) exit(1) + if not os.path.exists(options.srcdir): + print("The specified source dir does not exist" % + options.srcdir) + exit(1) + if not args: if os.name is 'nt': args = [os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe")] @@ -200,7 +208,8 @@ if __name__ == "__main__": args.append(tmprc.name) python_set = python_env(options) try: - exit(subprocess.call(args, env=get_subprocess_env(options))) + exit(subprocess.call(args, cwd=options.srcdir, + env=get_subprocess_env(options))) except subprocess.CalledProcessError as e: exit(e.returncode) finally: diff --git a/meson.build b/meson.build index ea5d80d189..6193f9b504 100644 --- a/meson.build +++ b/meson.build @@ -110,7 +110,8 @@ foreach subproj: subprojects endforeach setenv = find_program('gst-uninstalled.py') -run_target('uninstalled', command : [setenv, '--builddir=@0@'.format(meson.current_build_dir()), +run_target('uninstalled', command : [setenv, '--builddir=@0@'.format(meson.build_root()), + '--srcdir=@0@'.format(meson.source_root()), '--gst-version=@0@'.format(gst_branch)]) update = find_program('git-update') From af5ee95a5b4a98458a1b3a460947102875769a1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 10 Apr 2017 00:35:18 +0100 Subject: [PATCH 076/448] Prefer MESONINTROSPECT env var to find mesonintrospect if set This is new in meson 0.40. Makes sure we find and use the mesonintrospect from the same location as our meson, and not some other meson version that just happens to be in the path. We might be using meson directly from a checkout, for example. https://bugzilla.gnome.org/show_bug.cgi?id=781110 --- common.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/common.py b/common.py index 8c8b55dfb6..d795bf3962 100644 --- a/common.py +++ b/common.py @@ -60,5 +60,18 @@ def get_meson(): mesonintrospect = os.path.join(ROOTDIR, 'meson', 'mesonintrospect.py') return meson, mesonconf, mesonintrospect - return accept_command(["meson.py", "meson"]), accept_command(["mesonconf.py", "mesonconf"]), \ - accept_command(["mesonintrospect.py", "mesonintrospect"]) + mesonintrospect = os.environ.get('MESONINTROSPECT', None) + if mesonintrospect and os.path.exists(mesonintrospect): + mesondir = os.path.dirname(mesonintrospect) + if mesonintrospect.endswith('.py'): + meson = os.path.join(mesondir, 'meson.py') + mesonconf = os.path.join(mesondir, 'mesonconf.py') + else: + meson = os.path.join(mesondir, 'meson') + mesonconf = os.path.join(mesondir, 'mesonconf') + else: + meson = accept_command(["meson.py", "meson"]) + mesonconf = accept_command(["mesonconf.py", "mesonconf"]) + mesonintrospect = accept_command(["mesonintrospect.py", "mesonintrospect"]) + + return meson, mesonconf, mesonintrospect From c071855c48f756b90aa5bfc19945b54fd8b3d40f Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 10 Apr 2017 17:36:30 -0300 Subject: [PATCH 077/448] Allow disabling introspection from toplevel gst-build https://bugzilla.gnome.org/show_bug.cgi?id=781148 --- meson.build | 6 +++++- meson_options.txt | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 6193f9b504..351bdc6d74 100644 --- a/meson.build +++ b/meson.build @@ -99,7 +99,11 @@ foreach custom_subproj: get_option('custom_subprojects').split(',') endforeach foreach subproj: subprojects - subproject(subproj, version: gst_version) + default_options = [] + if get_option('disable_introspection') + default_options += ['disable_introspection=true'] + endif + subproject(subproj, version: gst_version, default_options: default_options) cmdres = run_command(python3, '-c', symlink.format(subproj, meson.current_source_dir())) if cmdres.returncode() == 0 diff --git a/meson_options.txt b/meson_options.txt index fc73eb84fc..65ebe13a45 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -7,4 +7,7 @@ option('disable_gst_editing_services', type : 'boolean', value : false) option('disable_rtsp_server', type : 'boolean', value : false) option('disable_gst_omx', type : 'boolean', value : true) option('disable_gstreamer_vaapi', type : 'boolean', value : false) +option('disable_introspection', + type : 'boolean', value : false, + description : 'Whether to disable the introspection generation') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') From 43c107d4fe5ea0811e5019864351b1a0dad81c1c Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 14 Mar 2017 19:31:11 -0300 Subject: [PATCH 078/448] Set GST_PLUGIN_PATH only to plugin paths --- gst-uninstalled.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 0e34975f81..724f7481bc 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -24,9 +24,6 @@ def prepend_env_var(env, var, value): def get_subprocess_env(options): env = os.environ.copy() - prepend_env_var(env, "GST_PLUGIN_PATH", options.builddir) - prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(SCRIPTDIR, 'subprojects', - 'gst-python', 'plugin')) env["CURRENT_GST"] = os.path.normpath(SCRIPTDIR) env["GST_VALIDATE_SCENARIOS_PATH"] = os.path.normpath( "%s/subprojects/gst-devtools/validate/data/scenarios" % SCRIPTDIR) @@ -56,6 +53,9 @@ def get_subprocess_env(options): else: lib_path_envvar = 'LD_LIBRARY_PATH' + prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(SCRIPTDIR, 'subprojects', + 'gst-python', 'plugin')) + meson, mesonconf, mesonintrospect = get_meson() targets_s = subprocess.check_output([sys.executable, mesonintrospect, options.builddir, '--targets']) targets = json.loads(targets_s.decode()) @@ -71,6 +71,7 @@ def get_subprocess_env(options): continue if os.path.normpath("lib/gstreamer-1.0") in os.path.normpath(target.get('install_filename')): + prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(options.builddir, root)) continue prepend_env_var(env, lib_path_envvar, From 71cf22cc19a41c578a1f24721d66ce6c3a4d24cb Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 22 Apr 2017 17:58:51 +0530 Subject: [PATCH 079/448] gst-uninstalled: Match plugin path when lib64 is libdir Fixes setting of GST_PLUGIN_PATH on Fedora 64-bit --- gst-uninstalled.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 724f7481bc..acd91b39c0 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -45,6 +45,7 @@ def get_subprocess_env(options): sharedlib_reg = re.compile(r'\.so|\.dylib|\.dll') typelib_reg = re.compile(r'.*\.typelib$') + pluginpath_reg = re.compile(r'lib\w*' + os.path.normpath('/gstreamer-1.0/')) if os.name is 'nt': lib_path_envvar = 'PATH' @@ -69,8 +70,7 @@ def get_subprocess_env(options): elif sharedlib_reg.search(filename): if target.get('type') != "shared library": continue - - if os.path.normpath("lib/gstreamer-1.0") in os.path.normpath(target.get('install_filename')): + if pluginpath_reg.search(os.path.normpath(target.get('install_filename'))): prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(options.builddir, root)) continue From 60ff3d539be93668b89a578158e99ada09b5dc56 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 24 Apr 2017 15:58:07 -0300 Subject: [PATCH 080/448] uninstalled: Make the regex to look for plugin paths more generic We might end up with spurious paths but it is no big deal. --- gst-uninstalled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index acd91b39c0..d5f82b7313 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -45,7 +45,7 @@ def get_subprocess_env(options): sharedlib_reg = re.compile(r'\.so|\.dylib|\.dll') typelib_reg = re.compile(r'.*\.typelib$') - pluginpath_reg = re.compile(r'lib\w*' + os.path.normpath('/gstreamer-1.0/')) + pluginpath_reg = re.compile(r'lib.*' + os.path.normpath('/gstreamer-1.0/')) if os.name is 'nt': lib_path_envvar = 'PATH' From 4db18a66b415f794ee5500da589e719b77a39a19 Mon Sep 17 00:00:00 2001 From: Scott D Phillips Date: Thu, 27 Apr 2017 22:58:35 -0700 Subject: [PATCH 081/448] require libva < 0.99.0 for gstreamer-vaapi Version 0.99.0 of libva isn't currently supported by gstreamer-vaapi. https://bugzilla.gnome.org/show_bug.cgi?id=781866 --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 351bdc6d74..b21ea5d526 100644 --- a/meson.build +++ b/meson.build @@ -60,7 +60,7 @@ if not get_option('disable_gst_omx') endif if not get_option('disable_gstreamer_vaapi') - if dependency('libva', version: '>= 0.30.4', required : false).found() + if dependency('libva', version: ['>= 0.30.4', '< 0.99.0'], required : false).found() subprojects += ['gstreamer-vaapi'] else message('WARNING: not building gstreamer-vaapi module, missing libva') From b318a1ff26b82e84089ffbd946d022c17916d4ae Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 4 May 2017 13:55:18 -0300 Subject: [PATCH 082/448] Release 1.12.0 --- meson.build | 4 ++-- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/meson.build b/meson.build index b21ea5d526..db3ba11b18 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ -project('All GStreamer modules', 'c', version : '1.11.1.1', meson_version : '>= 0.36') +project('All GStreamer modules', 'c', version : '1.12.0', meson_version : '>= 0.36') gst_version = '>= @0@'.format(meson.project_version()) -gst_branch = 'master' +gst_branch = '1.12.0' glib_req = '>= 2.40.0' diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 92531806e0..c8345225e4 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://anongit.freedesktop.org/git/gstreamer/gst-devtools.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-devtools -revision=master +revision=4f970d6469366f3939a2dc11cfc41e35423f6d93 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 9a5fbe633f..40ea97c62f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://anongit.freedesktop.org/git/gstreamer/gst-editing-services.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-editing-services -revision=master +revision=1.12.0 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 7771b7174f..7bb782d1a8 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://anongit.freedesktop.org/git/gstreamer/gst-libav.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-libav -revision=master +revision=1.12.0 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index c8023c0b3f..0159e40882 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://anongit.freedesktop.org/git/gstreamer/gst-omx.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-omx -revision=master +revision=1.12.0 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 43bc794fc7..c2a785a4ec 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-bad.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-bad -revision=master +revision=1.12.0 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 5b676edfdb..f598f4825f 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-base.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base -revision=master +revision=1.12.0 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index e42b672654..4d6368cab1 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-good.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-good -revision=master +revision=1.12.0 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 16f458f86f..1dcc80d01a 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-ugly.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-ugly -revision=master +revision=1.12.0 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b6c8d92f4..1eb74729dd 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://anongit.freedesktop.org/git/gstreamer/gst-python.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-python -revision=master +revision=1.12.0 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index b40a50e331..e63c2531aa 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://anongit.freedesktop.org/git/gstreamer/gst-rtsp-server push-url=ssh://git.freedesktop.org/git/gstreamer/gst-rtsp-server -revision=master +revision=1.12.0 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8a245404df..edf5285269 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-vaapi.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-vaapi -revision=master +revision=1.12.0 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 9d113b9129..c2cc6b910d 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://anongit.freedesktop.org/git/gstreamer/gstreamer.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer -revision=master +revision=1.12.0 From e69935afacdee7c7b91370b992202ca4d5a39b35 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 4 May 2017 14:13:26 -0300 Subject: [PATCH 083/448] Back to development --- meson.build | 4 ++-- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/meson.build b/meson.build index db3ba11b18..0904cceb16 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ -project('All GStreamer modules', 'c', version : '1.12.0', meson_version : '>= 0.36') +project('All GStreamer modules', 'c', version : '1.13.0.1', meson_version : '>= 0.36') gst_version = '>= @0@'.format(meson.project_version()) -gst_branch = '1.12.0' +gst_branch = 'master' glib_req = '>= 2.40.0' diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index c8345225e4..92531806e0 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://anongit.freedesktop.org/git/gstreamer/gst-devtools.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-devtools -revision=4f970d6469366f3939a2dc11cfc41e35423f6d93 +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 40ea97c62f..9a5fbe633f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://anongit.freedesktop.org/git/gstreamer/gst-editing-services.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-editing-services -revision=1.12.0 +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 7bb782d1a8..7771b7174f 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://anongit.freedesktop.org/git/gstreamer/gst-libav.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-libav -revision=1.12.0 +revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index 0159e40882..c8023c0b3f 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://anongit.freedesktop.org/git/gstreamer/gst-omx.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-omx -revision=1.12.0 +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index c2a785a4ec..43bc794fc7 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-bad.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-bad -revision=1.12.0 +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index f598f4825f..5b676edfdb 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-base.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base -revision=1.12.0 +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 4d6368cab1..e42b672654 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-good.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-good -revision=1.12.0 +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 1dcc80d01a..16f458f86f 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-ugly.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-ugly -revision=1.12.0 +revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 1eb74729dd..2b6c8d92f4 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://anongit.freedesktop.org/git/gstreamer/gst-python.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-python -revision=1.12.0 +revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index e63c2531aa..b40a50e331 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://anongit.freedesktop.org/git/gstreamer/gst-rtsp-server push-url=ssh://git.freedesktop.org/git/gstreamer/gst-rtsp-server -revision=1.12.0 +revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index edf5285269..8a245404df 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-vaapi.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-vaapi -revision=1.12.0 +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index c2cc6b910d..9d113b9129 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://anongit.freedesktop.org/git/gstreamer/gstreamer.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer -revision=1.12.0 +revision=master From 13db445e11590f555184cf030f3cc43137c35327 Mon Sep 17 00:00:00 2001 From: Scott D Phillips Date: Mon, 1 May 2017 13:17:12 -0700 Subject: [PATCH 084/448] uninstalled: fixes for windows usage Fix a couple small breakages with windows usage, (1) Add sys.executable to a subprocess invocation and (2) escape a path fragment that gets used in a regex. https://bugzilla.gnome.org/show_bug.cgi?id=782026 --- gst-uninstalled.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index d5f82b7313..b35783831f 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -45,7 +45,7 @@ def get_subprocess_env(options): sharedlib_reg = re.compile(r'\.so|\.dylib|\.dll') typelib_reg = re.compile(r'.*\.typelib$') - pluginpath_reg = re.compile(r'lib.*' + os.path.normpath('/gstreamer-1.0/')) + pluginpath_reg = re.compile(r'lib.*' + re.escape(os.path.normpath('/gstreamer-1.0/'))) if os.name is 'nt': lib_path_envvar = 'PATH' @@ -85,7 +85,7 @@ def get_subprocess_env(options): presets = set() encoding_targets = set() pkg_dirs = set() - if '--installed' in subprocess.check_output([mesonintrospect, '-h']).decode(): + if '--installed' in subprocess.check_output([sys.executable, mesonintrospect, '-h']).decode(): installed_s = subprocess.check_output([sys.executable, mesonintrospect, options.builddir, '--installed']) for path, installpath in json.loads(installed_s.decode()).items(): From 4b29870a5d8ca51651344e33ffe2c87d1c990620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 26 May 2017 14:05:12 +0100 Subject: [PATCH 085/448] Bump meson version requirement to >= 0.40.1 Which matches that of GStreamer core. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 0904cceb16..f89db0eda7 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('All GStreamer modules', 'c', version : '1.13.0.1', meson_version : '>= 0.36') +project('All GStreamer modules', 'c', version : '1.13.0.1', meson_version : '>= 0.40.1') gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' From e94d5163ac90648a15ef8c734aca75b3924d596e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 7 Jun 2017 17:38:59 -0400 Subject: [PATCH 086/448] uninstalled: Do not concider not installed dynamic libs as possible plugins --- gst-uninstalled.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index b35783831f..ed6fb2affe 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -70,7 +70,8 @@ def get_subprocess_env(options): elif sharedlib_reg.search(filename): if target.get('type') != "shared library": continue - if pluginpath_reg.search(os.path.normpath(target.get('install_filename'))): + + if target.get('installed') and pluginpath_reg.search(os.path.normpath(target.get('install_filename'))): prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(options.builddir, root)) continue From 4a52d1a03405b73d8fffba1c744975d5a5f3e8db Mon Sep 17 00:00:00 2001 From: Alessandro Decina Date: Wed, 12 Jul 2017 23:08:45 +1000 Subject: [PATCH 087/448] Check out glib from git://git.gnome.org/glib --- subprojects/glib.wrap | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index 9ef1e6ca19..f564b6d3b3 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=glib -url=https://github.com/centricular/glib.git -revision=meson +url=git://git.gnome.org/glib +push-url=ssh://git.gnome.org/git/glib +revision=wip/meson From dfa64559a69011a0906731a23fedf9714d59b865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 17 Jul 2017 22:39:15 +0100 Subject: [PATCH 088/448] glib.wrap: meson support has been merged into master branch So use this until we can point to a release that contains it. --- subprojects/glib.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index f564b6d3b3..2ba08bdf86 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -2,4 +2,4 @@ directory=glib url=git://git.gnome.org/glib push-url=ssh://git.gnome.org/git/glib -revision=wip/meson +revision=origin/master From 5b801e2f0ed73d073a7b44403bc5a7722e0f36c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 3 Aug 2017 23:45:52 +0100 Subject: [PATCH 089/448] Don't try to build ges if required dep isn't found We shouldn't error out all of gst-build by default if one of ges's required deps is not there. --- meson.build | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/meson.build b/meson.build index f89db0eda7..7d263ca392 100644 --- a/meson.build +++ b/meson.build @@ -76,7 +76,11 @@ if not get_option('disable_gst_devtools') endif if not get_option('disable_gst_editing_services') + if dependency('libxml-2.0').found() subprojects += ['gst-editing-services'] + else + message('WARNING: not building gst-editing-services module, missing libxml-2.0') + endif endif if not get_option('disable_rtsp_server') From f7c192a44072de99137802d6e0a53aa410dd97d5 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 22 Aug 2017 16:29:58 -0300 Subject: [PATCH 090/448] Add csharp/gstreamer-sharp support --- gst-uninstalled.py | 7 +++++++ meson.build | 13 +++++++++++++ meson_options.txt | 1 + subprojects/gstreamer-sharp.wrap | 5 +++++ subprojects/gtk-sharp.wrap | 4 ++++ 5 files changed, 30 insertions(+) create mode 100644 subprojects/gstreamer-sharp.wrap create mode 100644 subprojects/gtk-sharp.wrap diff --git a/gst-uninstalled.py b/gst-uninstalled.py index ed6fb2affe..a773801ad7 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -61,9 +61,12 @@ def get_subprocess_env(options): targets_s = subprocess.check_output([sys.executable, mesonintrospect, options.builddir, '--targets']) targets = json.loads(targets_s.decode()) paths = set() + mono_paths = set() for target in targets: filename = target['filename'] root = os.path.dirname(filename) + if filename.endswith('.dll'): + mono_paths.add(os.path.join(options.builddir, root)) if typelib_reg.search(filename): prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(options.builddir, root)) @@ -83,6 +86,10 @@ def get_subprocess_env(options): for p in paths: prepend_env_var(env, 'PATH', p) + if os.name != 'nt': + for p in mono_paths: + prepend_env_var(env, "MONO_PATH", p) + presets = set() encoding_targets = set() pkg_dirs = set() diff --git a/meson.build b/meson.build index 7d263ca392..fb20ebfcee 100644 --- a/meson.build +++ b/meson.build @@ -87,6 +87,18 @@ if not get_option('disable_rtsp_server') subprojects += ['gst-rtsp-server'] endif +if not get_option('disable_gstreamer_sharp') + if add_languages('cs') + if meson.version().version_compare('>=0.43') + subprojects += ['gstreamer-sharp'] + else + message('WARNING: Not building gstramer-sharp as meson >=0.43 not found.') + endif + else + message('WARNING: Not building gstramer-sharp as no CS compiler found.') + endif +endif + python3 = find_program('python3') symlink = ''' import os @@ -102,6 +114,7 @@ foreach custom_subproj: get_option('custom_subprojects').split(',') endif endforeach +message('Building subprojects: ' + ', '.join(subprojects)) foreach subproj: subprojects default_options = [] if get_option('disable_introspection') diff --git a/meson_options.txt b/meson_options.txt index 65ebe13a45..95acaad1b4 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -7,6 +7,7 @@ option('disable_gst_editing_services', type : 'boolean', value : false) option('disable_rtsp_server', type : 'boolean', value : false) option('disable_gst_omx', type : 'boolean', value : true) option('disable_gstreamer_vaapi', type : 'boolean', value : false) +option('disable_gstreamer_sharp', type : 'boolean', value : false) option('disable_introspection', type : 'boolean', value : false, description : 'Whether to disable the introspection generation') diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap new file mode 100644 index 0000000000..dbf9eaac64 --- /dev/null +++ b/subprojects/gstreamer-sharp.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gstreamer-sharp +url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-sharp.git +push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-sharp +revision=master diff --git a/subprojects/gtk-sharp.wrap b/subprojects/gtk-sharp.wrap new file mode 100644 index 0000000000..e589619293 --- /dev/null +++ b/subprojects/gtk-sharp.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=gtk-sharp +url=https://github.com/gtk-sharp/gtk-sharp.git +revision=master From 6bb7528a48d7955eecabcfb0d9aaa01471b05d29 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 6 Sep 2017 15:34:27 -0300 Subject: [PATCH 091/448] Make the cs compiler optional --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index fb20ebfcee..d46b3d4bee 100644 --- a/meson.build +++ b/meson.build @@ -88,7 +88,7 @@ if not get_option('disable_rtsp_server') endif if not get_option('disable_gstreamer_sharp') - if add_languages('cs') + if add_languages('cs', required : false) if meson.version().version_compare('>=0.43') subprojects += ['gstreamer-sharp'] else From 60585d28126f61fc13be2079227ce926550cdce4 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 21 Aug 2017 11:57:29 -0300 Subject: [PATCH 092/448] Handle a prefix in prefix/ This is usefull to use external libs and tool not buildable with meson inside our environment --- .gitignore | 1 + README.md | 3 +++ gst-uninstalled.py | 9 +++++++++ 3 files changed, 13 insertions(+) diff --git a/.gitignore b/.gitignore index 3dae67b572..7120f9a6c2 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ subprojects/gst-rtsp-server/ subprojects/gstreamer/ subprojects/gstreamer-vaapi/ subprojects/glib/ +prefix/ diff --git a/README.md b/README.md index 11d38d438d..0a0f9d93fe 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,9 @@ available at the root of `gst-build/` for example GStreamer core will be in `gstreamer/`. Otherwise they will be present in `subprojects/`. You can simply hack in there and to rebuild you just need to rerun `ninja -C build/`. +NOTE: In the uninstalled environment, a fully usable prefix is also configured +in `gst-build/prefix` where you can install any extra dependency/project. + ## Update git subprojects We added a special `update` target to update subprojects (it uses `git pull diff --git a/gst-uninstalled.py b/gst-uninstalled.py index a773801ad7..7823cf6271 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -14,6 +14,7 @@ import tempfile from common import get_meson SCRIPTDIR = os.path.abspath(os.path.dirname(__file__)) +PREFIX_DIR = os.path.join(SCRIPTDIR, 'prefix') def prepend_env_var(env, var, value): @@ -56,6 +57,14 @@ def get_subprocess_env(options): prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(SCRIPTDIR, 'subprojects', 'gst-python', 'plugin')) + prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(PREFIX_DIR, 'lib', + 'gstreamer-1.0')) + prepend_env_var(env, "PATH", os.path.join(PREFIX_DIR, 'bin')) + prepend_env_var(env, lib_path_envvar, os.path.join(PREFIX_DIR, 'lib')) + prepend_env_var(env, "GST_VALIDATE_SCENARIOS_PATH", os.path.join( + PREFIX_DIR, 'share', 'gstreamer-1.0', 'validate', 'scenarios')) + prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(PREFIX_DIR, 'lib', + 'lib', 'girepository-1.0')) meson, mesonconf, mesonintrospect = get_meson() targets_s = subprocess.check_output([sys.executable, mesonintrospect, options.builddir, '--targets']) From c79e252c53a7023a6b6db1acf99dc4ef985a0100 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Fri, 15 Sep 2017 13:24:54 +0100 Subject: [PATCH 093/448] uninstalled: Symbolic link support for the script file This allows the user to invoke the uninstalled shell using a symbolic link to gst-uninstalled.py. --- gst-uninstalled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 7823cf6271..d8087014a7 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -13,7 +13,7 @@ import tempfile from common import get_meson -SCRIPTDIR = os.path.abspath(os.path.dirname(__file__)) +SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) PREFIX_DIR = os.path.join(SCRIPTDIR, 'prefix') From 20cca3f10b29a425035c3813a1d3c732abffd167 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 25 Sep 2017 14:14:53 -0300 Subject: [PATCH 094/448] msys2: Handle aliased functions when generating the .lib files --- msys2_setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/msys2_setup.py b/msys2_setup.py index ce36f04307..8153f07724 100644 --- a/msys2_setup.py +++ b/msys2_setup.py @@ -64,7 +64,8 @@ class Msys2Configurer(GstBuildConfigurer): suffix='.def', delete=False, mode='w') def_file.write('LIBRARY ' + dll_name + '\r\n') def_file.write('EXPORTS\r\n') - for ordinal, _, _, name in exports: + for tmp in exports: + ordinal, name = tmp[0], tmp[3] def_file.write(name + ' @' + ordinal + '\r\n') def_file.close() subprocess.check_output(['lib', '/def:' + def_file.name, From 1f847ffbf47e5dd229673e2957182261c8eeb0fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 7 Oct 2017 15:42:59 +0100 Subject: [PATCH 095/448] Fix checking for libxml2, it's not required --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index d46b3d4bee..f661c6f888 100644 --- a/meson.build +++ b/meson.build @@ -76,7 +76,7 @@ if not get_option('disable_gst_devtools') endif if not get_option('disable_gst_editing_services') - if dependency('libxml-2.0').found() + if dependency('libxml-2.0', required : false).found() subprojects += ['gst-editing-services'] else message('WARNING: not building gst-editing-services module, missing libxml-2.0') From 13996d524467c06e8d5593e2143e5a1c65807127 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 20 Oct 2017 12:22:57 +0200 Subject: [PATCH 096/448] git-update: Close stdin if non-interactive To be 100% certain that any usage of stdin will actually fail instead of silently waiting for input. --- git-update | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/git-update b/git-update index 97356b927c..59777403a1 100755 --- a/git-update +++ b/git-update @@ -3,6 +3,7 @@ import argparse import os import subprocess import xml.etree.ElementTree as ET +import sys from common import git from common import Colors @@ -114,6 +115,9 @@ if __name__ == "__main__": if options.no_color: Colors.disable() + if options.no_interaction: + sys.stdin.close() + if not update_repo('gst-build', SCRIPTDIR, None, options.no_interaction): exit(1) if not update_subprojects(options.manifest, options.no_interaction): From ccedfe74727d7a44dfcdbcfd93efc9abcab1a991 Mon Sep 17 00:00:00 2001 From: Sreerenj Balachandran Date: Wed, 1 Nov 2017 10:32:55 -0700 Subject: [PATCH 097/448] meson.build: blacklist only libva 0.99.0 This is the same fix we used in gstreaemr-vaapi to blacklist the notoroious libva version 0.99.0 Intel's MSDK uses libva 0.99.0, meanwhile open source libva bumped its API version to 1.0.0. Thus we have to blacklist only the MSDK's libva (0.99.0) https://bugzilla.gnome.org/show_bug.cgi?id=789744 --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index f661c6f888..adac07075b 100644 --- a/meson.build +++ b/meson.build @@ -60,7 +60,7 @@ if not get_option('disable_gst_omx') endif if not get_option('disable_gstreamer_vaapi') - if dependency('libva', version: ['>= 0.30.4', '< 0.99.0'], required : false).found() + if dependency('libva', version: ['>= 0.30.4', '!= 0.99.0'], required : false).found() subprojects += ['gstreamer-vaapi'] else message('WARNING: not building gstreamer-vaapi module, missing libva') From c23be22adcacbc6a455476a09d1c28def705211a Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Fri, 1 Dec 2017 14:16:34 +0000 Subject: [PATCH 098/448] README: Document fish shell prompt customization --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 0a0f9d93fe..80585904b0 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,16 @@ In your `.zshrc`, you should add something like: export PROMPT="$GST_ENV-$PROMPT" ``` +### Fish prompt + +In your `~/.config/fish/functions/fish_prompt.fish`, you should add something like this at the end of the fish_prompt function body: + +``` +if set -q GST_ENV + echo -n -s (set_color -b blue white) "(" (basename "$GST_ENV") ")" (set_color normal) " " +end +``` + ### Using powerline In your powerline theme configuration file (by default in From 8ff8df21121985d95a51585525cdfde5c8196871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 6 Dec 2017 10:58:23 +0000 Subject: [PATCH 099/448] Build with buildtype debugoptimized by default https://bugzilla.gnome.org/show_bug.cgi?id=790989 --- meson.build | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index adac07075b..859d49e290 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,7 @@ -project('All GStreamer modules', 'c', version : '1.13.0.1', meson_version : '>= 0.40.1') +project('All GStreamer modules', 'c', + version : '1.13.0.1', + meson_version : '>= 0.40.1', + default_options : ['buildtype=debugoptimized']) gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' From 61ece08debfb9c0733e2d9e41f277c3cd3c6ab60 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 14 Dec 2017 04:28:20 +0530 Subject: [PATCH 100/448] meson.build: Fix typo in gstreamer-sharp message Reported by @jeandet on IRC. --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 859d49e290..65426855fe 100644 --- a/meson.build +++ b/meson.build @@ -95,10 +95,10 @@ if not get_option('disable_gstreamer_sharp') if meson.version().version_compare('>=0.43') subprojects += ['gstreamer-sharp'] else - message('WARNING: Not building gstramer-sharp as meson >=0.43 not found.') + message('WARNING: Not building gstreamer-sharp as meson >=0.43 not found.') endif else - message('WARNING: Not building gstramer-sharp as no CS compiler found.') + message('WARNING: Not building gstreamer-sharp as no CS compiler found.') endif endif From 834a66ec9a568e05f8bcebae67acbdd1bca0feae Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Mon, 18 Dec 2017 16:54:26 +0100 Subject: [PATCH 101/448] meson.build: bump up required meson to 0.42.0 In order to use meson introspect, meson conf --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 65426855fe..527eb9b292 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('All GStreamer modules', 'c', version : '1.13.0.1', - meson_version : '>= 0.40.1', + meson_version : '>= 0.42.0', default_options : ['buildtype=debugoptimized']) gst_version = '>= @0@'.format(meson.project_version()) From c6c09b73170ddbdbcc742e9a82edd8377e91aa5d Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Mon, 18 Dec 2017 16:55:11 +0100 Subject: [PATCH 102/448] Stop using now deprecated mesonintrospect executable --- common.py | 20 +++----------------- gst-uninstalled.py | 8 ++++---- setup.py | 2 +- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/common.py b/common.py index d795bf3962..e9b2745e1f 100644 --- a/common.py +++ b/common.py @@ -56,22 +56,8 @@ def accept_command(commands): def get_meson(): meson = os.path.join(ROOTDIR, 'meson', 'meson.py') if os.path.exists(meson): - mesonconf = os.path.join(ROOTDIR, 'meson', 'mesonconf.py') - mesonintrospect = os.path.join(ROOTDIR, 'meson', 'mesonintrospect.py') - return meson, mesonconf, mesonintrospect + return meson - mesonintrospect = os.environ.get('MESONINTROSPECT', None) - if mesonintrospect and os.path.exists(mesonintrospect): - mesondir = os.path.dirname(mesonintrospect) - if mesonintrospect.endswith('.py'): - meson = os.path.join(mesondir, 'meson.py') - mesonconf = os.path.join(mesondir, 'mesonconf.py') - else: - meson = os.path.join(mesondir, 'meson') - mesonconf = os.path.join(mesondir, 'mesonconf') - else: - meson = accept_command(["meson.py", "meson"]) - mesonconf = accept_command(["mesonconf.py", "mesonconf"]) - mesonintrospect = accept_command(["mesonintrospect.py", "mesonintrospect"]) + meson = accept_command(["meson.py", "meson"]) - return meson, mesonconf, mesonintrospect + return meson diff --git a/gst-uninstalled.py b/gst-uninstalled.py index d8087014a7..15c116d835 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -66,8 +66,8 @@ def get_subprocess_env(options): prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(PREFIX_DIR, 'lib', 'lib', 'girepository-1.0')) - meson, mesonconf, mesonintrospect = get_meson() - targets_s = subprocess.check_output([sys.executable, mesonintrospect, options.builddir, '--targets']) + meson = get_meson() + targets_s = subprocess.check_output([sys.executable, meson, 'introspect', options.builddir, '--targets']) targets = json.loads(targets_s.decode()) paths = set() mono_paths = set() @@ -102,8 +102,8 @@ def get_subprocess_env(options): presets = set() encoding_targets = set() pkg_dirs = set() - if '--installed' in subprocess.check_output([sys.executable, mesonintrospect, '-h']).decode(): - installed_s = subprocess.check_output([sys.executable, mesonintrospect, + if '--installed' in subprocess.check_output([sys.executable, meson, 'introspect', '-h']).decode(): + installed_s = subprocess.check_output([sys.executable, meson, 'introspect', options.builddir, '--installed']) for path, installpath in json.loads(installed_s.decode()).items(): if path.endswith('.prs'): diff --git a/setup.py b/setup.py index ec04cc195f..b42a247b0f 100755 --- a/setup.py +++ b/setup.py @@ -33,7 +33,7 @@ class GstBuildConfigurer: print("Not reconfiguring") return True - meson, mesonconf, mesonintrospect = get_meson() + meson = get_meson() if not meson: print("Install mesonbuild to build %s: http://mesonbuild.com/\n" "You can simply install it with:\n" From d106c2f8dfdf465c0583bfc50aca4d7d74fefbfc Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Mon, 18 Dec 2017 18:46:14 +0100 Subject: [PATCH 103/448] common.get_meson(): use MESONINTROSPECT if present If meson has set this, it takes priority over whatever we may find in PATH. --- common.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/common.py b/common.py index e9b2745e1f..f88b65ffa0 100644 --- a/common.py +++ b/common.py @@ -2,6 +2,7 @@ import argparse import os import shutil import subprocess +import shlex ROOTDIR = os.path.abspath(os.path.dirname(__file__)) @@ -58,6 +59,21 @@ def get_meson(): if os.path.exists(meson): return meson + mesonintrospect = os.environ.get('MESONINTROSPECT', '') + for comp in shlex.split (mesonintrospect): + # mesonintrospect might look like "/usr/bin/python /somewhere/meson introspect", + # let's not get tricked + if 'python' in os.path.basename (comp): + continue + if os.path.exists (comp): + mesondir = os.path.dirname(comp) + if mesonintrospect.endswith('.py'): + meson = os.path.join(mesondir, 'meson.py') + else: + meson = os.path.join(mesondir, 'meson') + if os.path.exists (meson): + return meson + meson = accept_command(["meson.py", "meson"]) return meson From dfc24cc612bd6c2325ad6865392028fabc661192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 25 Dec 2017 23:00:46 +0100 Subject: [PATCH 104/448] Fix check for python3 Use the python3 module to find the right binary. It might not be called 'python3', but could just be plain 'python' for example (e.g. on windows). --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 527eb9b292..998427b211 100644 --- a/meson.build +++ b/meson.build @@ -102,7 +102,7 @@ if not get_option('disable_gstreamer_sharp') endif endif -python3 = find_program('python3') +python3 = import('python3').find_python() symlink = ''' import os From a5ed8944e31583c3d499b720a2e3b3461716f98d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alicia=20Boya=20Garc=C3=ADa?= Date: Thu, 14 Dec 2017 15:35:23 +0100 Subject: [PATCH 105/448] gst-uninstalled.py: Don't close parent file descriptors https://bugzilla.gnome.org/show_bug.cgi?id=791616 --- gst-uninstalled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 15c116d835..2853deff2b 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -226,7 +226,7 @@ if __name__ == "__main__": args.append(tmprc.name) python_set = python_env(options) try: - exit(subprocess.call(args, cwd=options.srcdir, + exit(subprocess.call(args, cwd=options.srcdir, close_fds=False, env=get_subprocess_env(options))) except subprocess.CalledProcessError as e: exit(e.returncode) From a484ed4124123dd7f2d5d7877e4b527ac07e4992 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Fri, 19 Jan 2018 21:04:09 +0100 Subject: [PATCH 106/448] gst-uninstalled: make override hacks work in virtualenv virtualenv ships its own version of site.py, which does not expose a getusersitepackages function. An alternative method is thus used when we detect that we are running in a virtualenv. --- gst-uninstalled.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 2853deff2b..07832d734b 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -11,6 +11,8 @@ import subprocess import sys import tempfile +from distutils.sysconfig import get_python_lib + from common import get_meson SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) @@ -137,6 +139,10 @@ def get_subprocess_env(options): return env +# https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv +def in_venv(): + return (hasattr(sys, 'real_prefix') or + (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix)) def python_env(options, unset_env=False): """ @@ -150,7 +156,11 @@ def python_env(options, unset_env=False): not os.path.exists(gst_python_path): return False - sitepackages = site.getusersitepackages() + if in_venv (): + sitepackages = get_python_lib() + else: + sitepackages = site.getusersitepackages() + if not sitepackages: return False From c938c7591612b511cabfcf0b1788b10021186bf1 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Mon, 15 Jan 2018 05:18:34 +0100 Subject: [PATCH 107/448] gst-uninstalled: symlink mesonconfig in site-packages This is still incredibly ugly, but at least now mesonconfig gets found, unlike before where the path where it was looked for was the path of the sitecustomize symlink, not of its target (https://bugs.python.org/issue6386) --- gst-uninstalled.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 07832d734b..befceef300 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -166,6 +166,8 @@ def python_env(options, unset_env=False): sitecustomize = os.path.join(sitepackages, "sitecustomize.py") overrides_hack = os.path.join(gst_python_path, "testsuite", "overrides_hack.py") + mesonconfig = os.path.join(gst_python_path, "testsuite", "mesonconfig.py") + mesonconfig_link = os.path.join(sitepackages, "mesonconfig.py") if not unset_env: if os.path.exists(sitecustomize): @@ -180,12 +182,14 @@ def python_env(options, unset_env=False): os.makedirs(sitepackages) os.symlink(overrides_hack, sitecustomize) + os.symlink(mesonconfig, mesonconfig_link) return os.path.realpath(sitecustomize) == overrides_hack else: if not os.path.realpath(sitecustomize) == overrides_hack: return False os.remove(sitecustomize) + os.remove (mesonconfig_link) old_sitecustomize = os.path.join(sitepackages, "old.sitecustomize.gstuninstalled.py") From eb6e8460230b62f5bc9231371a75666bfb4486c7 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 5 Feb 2018 16:44:40 +0100 Subject: [PATCH 108/448] README.md: use 'meson test' instead of 'mesontest' The latter has been deprecated. https://bugzilla.gnome.org/show_bug.cgi?id=793190 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 80585904b0..e27e2c1d67 100644 --- a/README.md +++ b/README.md @@ -88,25 +88,25 @@ ninja You can easily run the test of all the components: ``` -mesontest -C build +meson test -C build ``` To list all available tests: ``` -mesontest -C build --list +meson test -C build --list ``` To run all the tests of a specific component: ``` -mesontest -C build --suite gst-plugins-base +meson test -C build --suite gst-plugins-base ``` Or to run a specific test: ``` -mesontest -C build/ --suite gstreamer gst/gstbuffer +meson test -C build/ --suite gstreamer gst/gstbuffer ``` ## Add information about GStreamer development environment in your prompt line From 54f73bc84769525fb4e848be26393721f2c56948 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 5 Feb 2018 16:46:00 +0100 Subject: [PATCH 109/448] README.md: update specific test example Tests naming scheme has changed. https://bugzilla.gnome.org/show_bug.cgi?id=793190 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e27e2c1d67..46f9e054d6 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ meson test -C build --suite gst-plugins-base Or to run a specific test: ``` -meson test -C build/ --suite gstreamer gst/gstbuffer +meson test -C build/ --suite gstreamer gst_gstbuffer ``` ## Add information about GStreamer development environment in your prompt line From bff76895656dac8c35c471a2e2a60f0f66b4bde2 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 5 Feb 2018 16:48:41 +0100 Subject: [PATCH 110/448] README.md: explain how to run a specific test from a specific file https://bugzilla.gnome.org/show_bug.cgi?id=793190 --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 46f9e054d6..0719aca819 100644 --- a/README.md +++ b/README.md @@ -103,12 +103,18 @@ To run all the tests of a specific component: meson test -C build --suite gst-plugins-base ``` -Or to run a specific test: +Or to run a specific test file: ``` meson test -C build/ --suite gstreamer gst_gstbuffer ``` +Run a specific test from a specific test file: + +``` +GST_CHECKS=test_subbuffer meson test -C build/ --suite gstreamer gst_gstbuffer +``` + ## Add information about GStreamer development environment in your prompt line ### Bash prompt From 9051db22902f490cbe12c89d488861e5703a5e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 20 Mar 2018 00:45:32 +0000 Subject: [PATCH 111/448] Build 1.14.0 --- meson.build | 4 ++-- subprojects/glib.wrap | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/meson.build b/meson.build index 998427b211..c348d31015 100644 --- a/meson.build +++ b/meson.build @@ -1,10 +1,10 @@ project('All GStreamer modules', 'c', - version : '1.13.0.1', + version : '1.14.0', meson_version : '>= 0.42.0', default_options : ['buildtype=debugoptimized']) gst_version = '>= @0@'.format(meson.project_version()) -gst_branch = 'master' +gst_branch = '1.14.0' glib_req = '>= 2.40.0' diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index 2ba08bdf86..7dd4f435ad 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -2,4 +2,4 @@ directory=glib url=git://git.gnome.org/glib push-url=ssh://git.gnome.org/git/glib -revision=origin/master +revision=987bf5bbeb25e846617d7bc1ee9b78f049dc0d60 diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 92531806e0..3393641020 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://anongit.freedesktop.org/git/gstreamer/gst-devtools.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-devtools -revision=master +revision=1.14.0 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 9a5fbe633f..d069019b63 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://anongit.freedesktop.org/git/gstreamer/gst-editing-services.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-editing-services -revision=master +revision=1.14.0 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 7771b7174f..391ca5c05a 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://anongit.freedesktop.org/git/gstreamer/gst-libav.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-libav -revision=master +revision=1.14.0 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index c8023c0b3f..7592054c58 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://anongit.freedesktop.org/git/gstreamer/gst-omx.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-omx -revision=master +revision=1.14.0 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 43bc794fc7..eb984fddde 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-bad.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-bad -revision=master +revision=1.14.0 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 5b676edfdb..78757fb066 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-base.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base -revision=master +revision=1.14.0 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index e42b672654..d012495067 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-good.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-good -revision=master +revision=1.14.0 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 16f458f86f..2820a2568a 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-ugly.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-ugly -revision=master +revision=1.14.0 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b6c8d92f4..3b28bf4c93 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://anongit.freedesktop.org/git/gstreamer/gst-python.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-python -revision=master +revision=1.14.0 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index b40a50e331..99d8a0f660 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://anongit.freedesktop.org/git/gstreamer/gst-rtsp-server push-url=ssh://git.freedesktop.org/git/gstreamer/gst-rtsp-server -revision=master +revision=1.14.0 diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index dbf9eaac64..4c407c0f3e 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-sharp.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-sharp -revision=master +revision=1.14.0 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8a245404df..32a04270ce 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-vaapi.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-vaapi -revision=master +revision=1.14.0 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 9d113b9129..9c77d2a33d 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://anongit.freedesktop.org/git/gstreamer/gstreamer.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer -revision=master +revision=1.14.0 From 2136763eb47b306b1268c3381af654c588d11ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 20 Mar 2018 01:08:23 +0000 Subject: [PATCH 112/448] Build master --- meson.build | 4 ++-- subprojects/glib.wrap | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/meson.build b/meson.build index c348d31015..b1ca55dee4 100644 --- a/meson.build +++ b/meson.build @@ -1,10 +1,10 @@ project('All GStreamer modules', 'c', - version : '1.14.0', + version : '1.15.0.1', meson_version : '>= 0.42.0', default_options : ['buildtype=debugoptimized']) gst_version = '>= @0@'.format(meson.project_version()) -gst_branch = '1.14.0' +gst_branch = 'master' glib_req = '>= 2.40.0' diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index 7dd4f435ad..c86fea722b 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -2,4 +2,4 @@ directory=glib url=git://git.gnome.org/glib push-url=ssh://git.gnome.org/git/glib -revision=987bf5bbeb25e846617d7bc1ee9b78f049dc0d60 +revision=master diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 3393641020..92531806e0 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://anongit.freedesktop.org/git/gstreamer/gst-devtools.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-devtools -revision=1.14.0 +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index d069019b63..9a5fbe633f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://anongit.freedesktop.org/git/gstreamer/gst-editing-services.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-editing-services -revision=1.14.0 +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 391ca5c05a..7771b7174f 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://anongit.freedesktop.org/git/gstreamer/gst-libav.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-libav -revision=1.14.0 +revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index 7592054c58..c8023c0b3f 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://anongit.freedesktop.org/git/gstreamer/gst-omx.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-omx -revision=1.14.0 +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index eb984fddde..43bc794fc7 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-bad.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-bad -revision=1.14.0 +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 78757fb066..5b676edfdb 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-base.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base -revision=1.14.0 +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index d012495067..e42b672654 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-good.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-good -revision=1.14.0 +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 2820a2568a..16f458f86f 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-ugly.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-ugly -revision=1.14.0 +revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 3b28bf4c93..2b6c8d92f4 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://anongit.freedesktop.org/git/gstreamer/gst-python.git push-url=ssh://git.freedesktop.org/git/gstreamer/gst-python -revision=1.14.0 +revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index 99d8a0f660..b40a50e331 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://anongit.freedesktop.org/git/gstreamer/gst-rtsp-server push-url=ssh://git.freedesktop.org/git/gstreamer/gst-rtsp-server -revision=1.14.0 +revision=master diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index 4c407c0f3e..dbf9eaac64 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-sharp.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-sharp -revision=1.14.0 +revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 32a04270ce..8a245404df 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-vaapi.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-vaapi -revision=1.14.0 +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 9c77d2a33d..9d113b9129 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://anongit.freedesktop.org/git/gstreamer/gstreamer.git push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer -revision=1.14.0 +revision=master From 8f5533c1e1c9ee49c99f2d877a2d721d7a165f61 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 22 Feb 2018 09:14:26 -0300 Subject: [PATCH 113/448] Add a script to checkout a worktree of gst-build and its subprojects https://bugzilla.gnome.org/show_bug.cgi?id=794519 --- README.md | 14 +++++++ checkout-branch-worktree | 89 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100755 checkout-branch-worktree diff --git a/README.md b/README.md index 0719aca819..ae28e1d7cc 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,20 @@ Run a specific test from a specific test file: GST_CHECKS=test_subbuffer meson test -C build/ --suite gstreamer gst_gstbuffer ``` +## Checkout another branch using worktrees + +If you need to have several versions of GStreamer coexisting (eg. `master` and `1.14`), +you can use the `checkout-branch-worktree` script provided by `gst-build`. It allows you +to create a new `gst-build` environment with new checkout of all the GStreamer modules as +[git worktrees](https://git-scm.com/docs/git-worktree). + +For example to get a fresh checkout of `gst-1.14` from a `gst-build` in master already +built in a `build` directory you can simply run: + +``` +./checkout-branch-worktree ../gst-1.14 1.14 -C build/ +``` + ## Add information about GStreamer development environment in your prompt line ### Bash prompt diff --git a/checkout-branch-worktree b/checkout-branch-worktree new file mode 100755 index 0000000000..1a7124150c --- /dev/null +++ b/checkout-branch-worktree @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 + +import argparse +import json +import os +import subprocess +import xml.etree.ElementTree as ET +import sys + +from common import git +from common import Colors +from common import get_meson +from common import accept_command + + +SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) + + +def checkout_subprojects(worktree_dir, branch): + subprojects_dir = os.path.join(SCRIPTDIR, "subprojects") + worktree_subdir = os.path.join(worktree_dir, "subprojects") + + meson = get_meson() + installed_s = subprocess.check_output([sys.executable, meson, 'introspect', + options.builddir, '--projectinfo']) + for subproj in json.loads(installed_s.decode())["subprojects"]: + repo_name = subproj["name"] + if not repo_name.startswith("gst"): + continue + + repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name)) + if not os.path.exists(os.path.join(repo_dir, '.git')): + continue + + workdir = os.path.normpath(os.path.join(worktree_subdir, repo_name)) + if not checkout_worktree(repo_name, repo_dir, workdir, branch): + return False + + return True + + +def checkout_worktree(repo_name, repo_dir, worktree_dir, branch): + print("Checking out worktree %s in %s (branch %s)" % (repo_name, worktree_dir, branch)) + try: + git("worktree", "add", worktree_dir, branch, repository_path=repo_dir) + except Exception as e: + out = getattr(e, "output", b"").decode() + print("\nCould not checkout worktree %s, please fix and try again." + " Error:\n\n%s %s" % (repo_dir, out, e)) + + return False + + commit_message = git("show", repository_path=repo_dir).split("\n") + print(u" -> %s%s%s - %s" % (Colors.HEADER, repo_dir, Colors.ENDC, + commit_message[4].strip())) + + return True + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(prog="git-update") + + + parser.add_argument('worktree_dir', metavar='worktree_dir', type=str, + help='The directory where to checkout the new worktree') + parser.add_argument('branch', metavar='branch', type=str, + help='The branch to checkout') + parser.add_argument("--no-color", + default=False, + action='store_true', + help="Do not output ansi colors.") + parser.add_argument("--builddir", '-C', + default=os.path.join(SCRIPTDIR, "build"), + help="The meson build directory") + options = parser.parse_args() + + if options.no_color: + Colors.disable() + + if not os.path.exists(options.builddir): + print("GStreamer not built in %s\n\nBuild it and try again" % + options.builddir) + exit(1) + + options.worktree_dir = os.path.abspath(options.worktree_dir) + if not checkout_worktree('gst-build', SCRIPTDIR, options.worktree_dir, options.branch): + exit(1) + if not checkout_subprojects(options.worktree_dir, options.branch): + exit(1) From 40f97fe186d80648b2a9e8a31c522474a4d73756 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 13 Apr 2018 14:56:33 +0530 Subject: [PATCH 114/448] Only pass -DZ_SOLO on MSVC if using MSYS2 zlib This fixes the build when we're building our own zlib as a subproject. --- meson.build | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index b1ca55dee4..5ad62e4b7a 100644 --- a/meson.build +++ b/meson.build @@ -15,11 +15,22 @@ subprojects = [ ] cc = meson.get_compiler('c') + +# Make it possible to use msys2 built zlib which fails +# when not using the mingw toolchain as it uses unistd.h if not meson.is_subproject() and cc.get_id() == 'msvc' - # Make it possible to use msys2 built zlib - # which fails when not using the mingw toolchain as - # it uses unistd.h - add_global_arguments('-DZ_SOLO', language: 'c') + uname = find_program('uname') + ret = run_command(uname, '-o') + if ret.returncode() == 0 and ret.stdout().lower() == 'msys' + ret = run_command(uname, '-r') + # The kernel version returned by uname is actually the msys version + if ret.returncode() == 0 and ret.stdout().startswith('2') + # If a system zlib is found, disable UNIX features in zlib.h and zconf.h + if cc.find_library('z').found() + add_global_arguments('-DZ_SOLO', language: 'c') + endif + endif + endif endif # FIXME Remove that check once we have ffmpeg as a gst-libav subproject From 8708f6a60685f8b3ff487b4f596291a8d77ba553 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 21 Apr 2018 12:59:04 +0530 Subject: [PATCH 115/448] meson: Fix typo, lower() -> to_lower() --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 5ad62e4b7a..82f7e34383 100644 --- a/meson.build +++ b/meson.build @@ -21,7 +21,7 @@ cc = meson.get_compiler('c') if not meson.is_subproject() and cc.get_id() == 'msvc' uname = find_program('uname') ret = run_command(uname, '-o') - if ret.returncode() == 0 and ret.stdout().lower() == 'msys' + if ret.returncode() == 0 and ret.stdout().to_lower() == 'msys' ret = run_command(uname, '-r') # The kernel version returned by uname is actually the msys version if ret.returncode() == 0 and ret.stdout().startswith('2') From 47844b2771eb0673258238fd22613bb4b39ba403 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Sat, 21 Apr 2018 17:50:06 -0700 Subject: [PATCH 116/448] uname does not exist everywhere --- meson.build | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/meson.build b/meson.build index 82f7e34383..11c585a0b3 100644 --- a/meson.build +++ b/meson.build @@ -19,15 +19,17 @@ cc = meson.get_compiler('c') # Make it possible to use msys2 built zlib which fails # when not using the mingw toolchain as it uses unistd.h if not meson.is_subproject() and cc.get_id() == 'msvc' - uname = find_program('uname') - ret = run_command(uname, '-o') - if ret.returncode() == 0 and ret.stdout().to_lower() == 'msys' - ret = run_command(uname, '-r') - # The kernel version returned by uname is actually the msys version - if ret.returncode() == 0 and ret.stdout().startswith('2') - # If a system zlib is found, disable UNIX features in zlib.h and zconf.h - if cc.find_library('z').found() - add_global_arguments('-DZ_SOLO', language: 'c') + uname = find_program('uname', required: false) + if uname.found() + ret = run_command(uname, '-o') + if ret.returncode() == 0 and ret.stdout().to_lower() == 'msys' + ret = run_command(uname, '-r') + # The kernel version returned by uname is actually the msys version + if ret.returncode() == 0 and ret.stdout().startswith('2') + # If a system zlib is found, disable UNIX features in zlib.h and zconf.h + if cc.find_library('z').found() + add_global_arguments('-DZ_SOLO', language: 'c') + endif endif endif endif From b6593ed835de93b8dbe7cf2f857906c4e0911d02 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Sat, 21 Apr 2018 17:51:20 -0700 Subject: [PATCH 117/448] subprojects: add some missing wraps --- subprojects/libffi.wrap | 4 ++++ subprojects/proxy-libintl.wrap | 4 ++++ subprojects/zlib.wrap | 4 ++++ 3 files changed, 12 insertions(+) create mode 100644 subprojects/libffi.wrap create mode 100644 subprojects/proxy-libintl.wrap create mode 100644 subprojects/zlib.wrap diff --git a/subprojects/libffi.wrap b/subprojects/libffi.wrap new file mode 100644 index 0000000000..3d15e2a8a5 --- /dev/null +++ b/subprojects/libffi.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=libffi +url=https://github.com/centricular/libffi.git +revision=meson diff --git a/subprojects/proxy-libintl.wrap b/subprojects/proxy-libintl.wrap new file mode 100644 index 0000000000..f32522ee66 --- /dev/null +++ b/subprojects/proxy-libintl.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=proxy-libintl +url=https://github.com/centricular/proxy-libintl.git +revision=master diff --git a/subprojects/zlib.wrap b/subprojects/zlib.wrap new file mode 100644 index 0000000000..de1e861e1e --- /dev/null +++ b/subprojects/zlib.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=zlib +url=https://github.com/centricular/zlib.git +revision=meson From 14bf7c9990f211ec809b1047e43d4050f9b208cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 25 Apr 2018 01:06:27 +0100 Subject: [PATCH 118/448] Bump Meson requirement to 0.46 Which matches GStreamer core's (and soon the other modules). --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 11c585a0b3..21d1820863 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('All GStreamer modules', 'c', version : '1.15.0.1', - meson_version : '>= 0.42.0', + meson_version : '>= 0.46.0', default_options : ['buildtype=debugoptimized']) gst_version = '>= @0@'.format(meson.project_version()) From 184259f281b7089c2402ebaa4a64ba032720c3c3 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 2 May 2018 22:50:22 +0200 Subject: [PATCH 119/448] Add a wrap for dssim --- subprojects/dssim.wrap | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 subprojects/dssim.wrap diff --git a/subprojects/dssim.wrap b/subprojects/dssim.wrap new file mode 100644 index 0000000000..b6aff1ae1b --- /dev/null +++ b/subprojects/dssim.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=dssim +url=git@github.com:kornelski/dssim.git +revision=dssim1-c From d7b86636f9aa3cddd0175e16a8bfbd3c08228996 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 5 May 2018 18:38:00 +0530 Subject: [PATCH 120/448] gst-uninstalled: Use absolute path to custom builddir --- gst-uninstalled.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index befceef300..a702290889 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -216,6 +216,7 @@ if __name__ == "__main__": print("GStreamer not built in %s\n\nBuild it and try again" % options.builddir) exit(1) + options.builddir = os.path.abspath(options.builddir) if not os.path.exists(options.srcdir): print("The specified source dir does not exist" % From f164b8d93f89e7cfc59e6359238c2588e6569126 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 5 May 2018 20:25:52 +0530 Subject: [PATCH 121/448] meson: Update option names to omit prefixes Also, common options are now consistent across all gstreamer modules, and are inherited automatically. --- meson.build | 32 ++++++++++++++------------------ meson_options.txt | 29 ++++++++++++++++------------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/meson.build b/meson.build index 21d1820863..5c423cb7cd 100644 --- a/meson.build +++ b/meson.build @@ -55,27 +55,27 @@ if gst_libav.length() == 0 message('WARNING: gst-libav not built as ffmpeg >= n3.1.2 not found on the system') endif -if get_option('enable_python') +if get_option('python') subprojects += ['gst-python'] endif -if not get_option('disable_gst_plugins_ugly') - subprojects += ['gst-plugins-ugly'] -endif - -if not get_option('disable_gst_plugins_bad') +if get_option('bad') subprojects += ['gst-plugins-bad'] endif -if not get_option('disable_gst_libav') +if get_option('ugly') + subprojects += ['gst-plugins-ugly'] +endif + +if get_option('libav') subprojects += gst_libav endif -if not get_option('disable_gst_omx') +if get_option('omx') subprojects += ['gst-omx'] endif -if not get_option('disable_gstreamer_vaapi') +if get_option('vaapi') if dependency('libva', version: ['>= 0.30.4', '!= 0.99.0'], required : false).found() subprojects += ['gstreamer-vaapi'] else @@ -83,7 +83,7 @@ if not get_option('disable_gstreamer_vaapi') endif endif -if not get_option('disable_gst_devtools') +if get_option('devtools') if dependency('json-glib-1.0', required : false).found() subprojects += ['gst-devtools'] else @@ -91,7 +91,7 @@ if not get_option('disable_gst_devtools') endif endif -if not get_option('disable_gst_editing_services') +if get_option('ges') if dependency('libxml-2.0', required : false).found() subprojects += ['gst-editing-services'] else @@ -99,11 +99,11 @@ if not get_option('disable_gst_editing_services') endif endif -if not get_option('disable_rtsp_server') +if get_option('rtsp_server') subprojects += ['gst-rtsp-server'] endif -if not get_option('disable_gstreamer_sharp') +if get_option('sharp') if add_languages('cs', required : false) if meson.version().version_compare('>=0.43') subprojects += ['gstreamer-sharp'] @@ -132,11 +132,7 @@ endforeach message('Building subprojects: ' + ', '.join(subprojects)) foreach subproj: subprojects - default_options = [] - if get_option('disable_introspection') - default_options += ['disable_introspection=true'] - endif - subproject(subproj, version: gst_version, default_options: default_options) + subproject(subproj, version: gst_version) cmdres = run_command(python3, '-c', symlink.format(subproj, meson.current_source_dir())) if cmdres.returncode() == 0 diff --git a/meson_options.txt b/meson_options.txt index 95acaad1b4..9c1d732e7d 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,14 +1,17 @@ -option('enable_python', type : 'boolean', value : false) -option('disable_gst_libav', type : 'boolean', value : false) -option('disable_gst_plugins_ugly', type : 'boolean', value : false) -option('disable_gst_plugins_bad', type : 'boolean', value : false) -option('disable_gst_devtools', type : 'boolean', value : false) -option('disable_gst_editing_services', type : 'boolean', value : false) -option('disable_rtsp_server', type : 'boolean', value : false) -option('disable_gst_omx', type : 'boolean', value : true) -option('disable_gstreamer_vaapi', type : 'boolean', value : false) -option('disable_gstreamer_sharp', type : 'boolean', value : false) -option('disable_introspection', - type : 'boolean', value : false, - description : 'Whether to disable the introspection generation') +option('python', type : 'boolean', value : true) +option('libav', type : 'boolean', value : true) +option('ugly', type : 'boolean', value : true) +option('bad', type : 'boolean', value : true) +option('devtools', type : 'boolean', value : true) +option('ges', type : 'boolean', value : true) +option('rtsp_server', type : 'boolean', value : true) +option('omx', type : 'boolean', value : false) +option('vaapi', type : 'boolean', value : true) +option('sharp', type : 'boolean', value : true) option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') + +# Common options, automatically inherited by subprojects +option('gtkdoc', type : 'boolean', value : true, + description : 'Generate API documentation with gtk-doc') +option('introspection', type : 'boolean', value : true, + description : 'Whether to disable the introspection generation') From a57019296b4aecdcb79353f3e6626e844fc7a6c6 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 5 May 2018 20:35:12 +0530 Subject: [PATCH 122/448] gst-uninstalled.py: Look for both 'build' and '_build' for builddir --- gst-uninstalled.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index a702290889..56e84898aa 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -17,6 +17,10 @@ from common import get_meson SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) PREFIX_DIR = os.path.join(SCRIPTDIR, 'prefix') +# Use '_build' as the builddir instead of 'build' +DEFAULT_BUILDDIR = os.path.join(SCRIPTDIR, 'build') +if not os.path.exists(DEFAULT_BUILDDIR): + DEFAULT_BUILDDIR = os.path.join(SCRIPTDIR, '_build') def prepend_env_var(env, var, value): @@ -203,7 +207,7 @@ if __name__ == "__main__": parser = argparse.ArgumentParser(prog="gstreamer-uninstalled") parser.add_argument("--builddir", - default=os.path.join(SCRIPTDIR, "build"), + default=DEFAULT_BUILDDIR, help="The meson build directory") parser.add_argument("--srcdir", default=SCRIPTDIR, From ffa072ec90063ff24bdaee4b2132c4b56ad4de9a Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 17 May 2018 13:55:43 +0530 Subject: [PATCH 123/448] Add a wrap file for libnice.wrap Temporarily pointing to Centricular's git repository till upstream libnice accepts the port (poke ocrete on IRC!). --- subprojects/libnice.wrap | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 subprojects/libnice.wrap diff --git a/subprojects/libnice.wrap b/subprojects/libnice.wrap new file mode 100644 index 0000000000..3625a8ffee --- /dev/null +++ b/subprojects/libnice.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=libnice +url=https://github.com/centricular/libnice.git +revision=meson From d22add782be0fde0bb8e7a02a69c621d9d884502 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 17 May 2018 13:55:43 +0530 Subject: [PATCH 124/448] Update git repos for glib and proxy-libintl The proxy-libintl meson build files have been upstreamed, so we do not need to use Centricular's git repository anymore. Glib has moved to GNOME's Gitlab instance, and we use a specific branch on it to get override_find_program for glib tools. --- subprojects/glib.wrap | 6 +++--- subprojects/proxy-libintl.wrap | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index c86fea722b..04fa8a6864 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=glib -url=git://git.gnome.org/glib -push-url=ssh://git.gnome.org/git/glib -revision=master +url=https://gitlab.gnome.org/GNOME/glib.git +push-url=git@gitlab.gnome.org:GNOME/glib.git +revision=wip/nirbheek/override-glib-tools diff --git a/subprojects/proxy-libintl.wrap b/subprojects/proxy-libintl.wrap index f32522ee66..b049c3106e 100644 --- a/subprojects/proxy-libintl.wrap +++ b/subprojects/proxy-libintl.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=proxy-libintl -url=https://github.com/centricular/proxy-libintl.git -revision=master +url=https://github.com/frida/proxy-libintl.git +push-url=git@github.com:friday/proxy-libintl.git +revision=0.1 From 85e49c19d40f963af83b12795dea4b14e65ab950 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 17 May 2018 13:55:43 +0530 Subject: [PATCH 125/448] Add a new subproject 'win-flex-bison-binaries' This subproject will download and provide win32 binaries for flex and/or bison if they aren't found at configure time on Windows. --- meson.build | 8 +++ .../win-flex-bison-binaries/.gitignore | 9 ++++ .../download-binary.py | 50 +++++++++++++++++++ .../win-flex-bison-binaries/meson.build | 25 ++++++++++ 4 files changed, 92 insertions(+) create mode 100644 subprojects/win-flex-bison-binaries/.gitignore create mode 100644 subprojects/win-flex-bison-binaries/download-binary.py create mode 100644 subprojects/win-flex-bison-binaries/meson.build diff --git a/meson.build b/meson.build index 5c423cb7cd..9134abff02 100644 --- a/meson.build +++ b/meson.build @@ -14,6 +14,7 @@ subprojects = [ 'gst-plugins-good', ] +build_system = build_machine.system() cc = meson.get_compiler('c') # Make it possible to use msys2 built zlib which fails @@ -130,6 +131,13 @@ foreach custom_subproj: get_option('custom_subprojects').split(',') endif endforeach +# On Windows, if flex/bison aren't found, we use a subproject to get them +flex = find_program('flex', 'win_flex', required : build_system != 'windows') +bison = find_program('bison', 'win_bison', required : build_system != 'windows') +if not flex.found() or not bison.found() + subproject('win-flex-bison-binaries') +endif + message('Building subprojects: ' + ', '.join(subprojects)) foreach subproj: subprojects subproject(subproj, version: gst_version) diff --git a/subprojects/win-flex-bison-binaries/.gitignore b/subprojects/win-flex-bison-binaries/.gitignore new file mode 100644 index 0000000000..dd180b4d63 --- /dev/null +++ b/subprojects/win-flex-bison-binaries/.gitignore @@ -0,0 +1,9 @@ +*.sw[op] +*~ +custom_build_rules +data/ +FlexLexer.h +README.txt +UNISTD_ERROR.readme +*.exe +*.zip diff --git a/subprojects/win-flex-bison-binaries/download-binary.py b/subprojects/win-flex-bison-binaries/download-binary.py new file mode 100644 index 0000000000..16f69c95f1 --- /dev/null +++ b/subprojects/win-flex-bison-binaries/download-binary.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 + +import os +import sys +import ssl +import zipfile +import hashlib +import urllib.request + +# Disable certificate checking because it always fails on Windows +# We verify the checksum anyway. +ctx = ssl.create_default_context() +ctx.check_hostname = False +ctx.verify_mode = ssl.CERT_NONE + +base_url = 'https://sourceforge.net/projects/winflexbison/files/win_flex_bison-{}.zip' +url = base_url.format(sys.argv[1]) +zip_sha256 = sys.argv[2] +source_dir = os.path.join(os.environ['MESON_SOURCE_ROOT'], os.environ['MESON_SUBDIR']) +dest = os.path.basename(url) +dest_path = os.path.join(source_dir, dest) + +def get_sha256(zipf): + hasher = hashlib.sha256() + with open(zipf, 'rb') as f: + hasher.update(f.read()) + return hasher.hexdigest() + +if os.path.isfile(dest_path): + found_sha256 = get_sha256(dest_path) + if found_sha256 == zip_sha256: + print('{} already downloaded'.format(dest)) + sys.exit(0) + else: + print('{} checksum mismatch, redownloading'.format(dest)) + +print('Downloading {} to {}'.format(url, dest)) +with open(dest_path, 'wb') as d: + f = urllib.request.urlopen(url, context=ctx) + d.write(f.read()) + +found_sha256 = get_sha256(dest_path) +if found_sha256 != zip_sha256: + print('SHA256 of downloaded file {} was {} instead of {}' + ''.format(dest, found_sha256, zip_sha256)) + sys.exit(1) + +print('Extracting {}'.format(dest)) +zf = zipfile.ZipFile(dest_path, "r") +zf.extractall(path=source_dir) diff --git a/subprojects/win-flex-bison-binaries/meson.build b/subprojects/win-flex-bison-binaries/meson.build new file mode 100644 index 0000000000..e56fea73c6 --- /dev/null +++ b/subprojects/win-flex-bison-binaries/meson.build @@ -0,0 +1,25 @@ +project('win-flex-bison-binary', version : '2.5.14') + +provide_flex = not find_program('flex', required : false).found() +provide_bison = not find_program('bison', required : false).found() + +if provide_flex or provide_bison + py3 = import('python3').find_python() + + message('Downloading and extracting win-flex-bison binaries...') + + zip_hash = '354c9aae02aca421c52abfda7fe3ce6c32ad07e25ff3f66e31da9437a0b906cf' + + ret = run_command(py3, files('download-binary.py'), meson.project_version(), zip_hash) + if ret.returncode() != 0 + message(ret.stdout()) + error(ret.stderr()) + endif + + if provide_flex + meson.override_find_program('flex', find_program('win_flex')) + endif + if provide_bison + meson.override_find_program('bison', find_program('win_bison')) + endif +endif From 3544675ad1754bf5104bc9eb83199dd7631d67e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 21 May 2018 23:08:43 +0100 Subject: [PATCH 126/448] meson: rename gtkdoc option to gtk_doc --- meson_options.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson_options.txt b/meson_options.txt index 9c1d732e7d..8e703fad06 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -11,7 +11,7 @@ option('sharp', type : 'boolean', value : true) option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') # Common options, automatically inherited by subprojects -option('gtkdoc', type : 'boolean', value : true, +option('gtk_doc', type : 'boolean', value : true, description : 'Generate API documentation with gtk-doc') option('introspection', type : 'boolean', value : true, description : 'Whether to disable the introspection generation') From 369cf4ecd02409ad74e0988ea76e5e2a2eb42786 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 5 Jun 2018 10:41:07 -0400 Subject: [PATCH 127/448] Add bindinator wrap file --- subprojects/bindinator.wrap | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 subprojects/bindinator.wrap diff --git a/subprojects/bindinator.wrap b/subprojects/bindinator.wrap new file mode 100644 index 0000000000..c407526ba8 --- /dev/null +++ b/subprojects/bindinator.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=bindinator +url=https://github.com/GLibSharp/bindinator.git +revision=master From 35079f67ac2c832bc1043a5054dde6a0d6ddf700 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 6 Jun 2018 07:55:20 -0400 Subject: [PATCH 128/448] uninstalled: Set PKG_CONFIG_PATH to point to prefix/lib/pkgconfig --- gst-uninstalled.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 56e84898aa..e28f3c7140 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -71,6 +71,7 @@ def get_subprocess_env(options): PREFIX_DIR, 'share', 'gstreamer-1.0', 'validate', 'scenarios')) prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(PREFIX_DIR, 'lib', 'lib', 'girepository-1.0')) + prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(PREFIX_DIR, 'lib', 'pkgconfig')) meson = get_meson() targets_s = subprocess.check_output([sys.executable, meson, 'introspect', options.builddir, '--targets']) From 13ff7f43ec18128ec1dc8abeeae57d236e70a3a0 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Thu, 7 Jun 2018 14:13:03 +1000 Subject: [PATCH 129/448] add gl-headers subproject for necessary OpenGL headers At least for windows. --- .gitignore | 1 + subprojects/gl-headers.wrap | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 subprojects/gl-headers.wrap diff --git a/.gitignore b/.gitignore index 7120f9a6c2..d828fd46ec 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,5 @@ subprojects/gst-rtsp-server/ subprojects/gstreamer/ subprojects/gstreamer-vaapi/ subprojects/glib/ +subprojects/gl-headers/ prefix/ diff --git a/subprojects/gl-headers.wrap b/subprojects/gl-headers.wrap new file mode 100644 index 0000000000..4d4d50212f --- /dev/null +++ b/subprojects/gl-headers.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gl-headers +url=https://github.com/centricular/gl-headers.git +push-url=git@github.com:centricular/gl-headers.git +revision=master From 3942dc262badcfeab9ad78389d6a49832f669f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 7 Jun 2018 19:25:22 +0100 Subject: [PATCH 130/448] Don't build gst-python if required deps aren't available --- meson.build | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/meson.build b/meson.build index 9134abff02..17157ab4a9 100644 --- a/meson.build +++ b/meson.build @@ -57,7 +57,11 @@ if gst_libav.length() == 0 endif if get_option('python') + if dependency('pygobject-3.0', required : false).found() subprojects += ['gst-python'] + else + message('WARNING: not building gst-python module, missing pygobject-3.0') + endif endif if get_option('bad') From 62f173913341f5e42917ac9277a001c0b2f33528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 12 Jun 2018 15:03:03 +0100 Subject: [PATCH 131/448] uninstalled: Fix meson detection when using meson from a git checkout This would not trigger on the build bot because there is special casing in the code for a meson checkout underneath gst-build. Fix needed as mesonintrospect.py was changed into 'meson.py introspect' in recent meson versions. When using meson from git to configure the build the uninstalled script would pick up a system meson instead which then would then error out parsing the coredata from the newer meson. --- common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.py b/common.py index f88b65ffa0..b3ee7c5547 100644 --- a/common.py +++ b/common.py @@ -67,7 +67,7 @@ def get_meson(): continue if os.path.exists (comp): mesondir = os.path.dirname(comp) - if mesonintrospect.endswith('.py'): + if mesonintrospect.endswith('.py') or mesonintrospect.endswith('.py introspect'): meson = os.path.join(mesondir, 'meson.py') else: meson = os.path.join(mesondir, 'meson') From 9e4c1dc693a51f5bf8990a6689f9749b1d4c3a16 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 28 Jun 2018 15:20:25 -0400 Subject: [PATCH 132/448] Add a wrap for openh264 --- subprojects/openh264.wrap | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 subprojects/openh264.wrap diff --git a/subprojects/openh264.wrap b/subprojects/openh264.wrap new file mode 100644 index 0000000000..7d0efc0340 --- /dev/null +++ b/subprojects/openh264.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=openh264 +url=https://github.com/cisco/openh264.git +revision=a1b3f07c5271f312997fcc3451237031444c4475 # 1.8.0 + fix for gcc 8. From 3d471639194dea07834b0edbfc77baf238de017d Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 12 Jul 2018 10:14:33 -0400 Subject: [PATCH 133/448] Use new 'feature' option and dictionnary Simplifying the build definition, making its options more flexible and it is now simpler to read. On a side not we want https://github.com/mesonbuild/meson/issues/3880 to simplify that again. https://bugzilla.gnome.org/show_bug.cgi?id=796798 --- meson.build | 180 ++++++++++++++++++++-------------------------- meson_options.txt | 20 +++--- 2 files changed, 89 insertions(+), 111 deletions(-) diff --git a/meson.build b/meson.build index 17157ab4a9..9889b6767d 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('All GStreamer modules', 'c', version : '1.15.0.1', - meson_version : '>= 0.46.0', + meson_version : '>= 0.47.0', default_options : ['buildtype=debugoptimized']) gst_version = '>= @0@'.format(meson.project_version()) @@ -8,12 +8,6 @@ gst_branch = 'master' glib_req = '>= 2.40.0' -subprojects = [ - 'gstreamer', - 'gst-plugins-base', - 'gst-plugins-good', -] - build_system = build_machine.system() cc = meson.get_compiler('c') @@ -37,104 +31,65 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif # FIXME Remove that check once we have ffmpeg as a gst-libav subproject -libavfilter_dep = dependency('libavfilter', version: '>= 6.47.100', required: false) -gst_libav = [] -if libavfilter_dep.found() - cc = meson.get_compiler('c') - check_ffmpeg_src = '''#include - #if LIBAVCODEC_VERSION_MICRO >= 100 - /* FFmpeg uses 100+ as its micro version */ - #else - #error libav provider should be FFmpeg - #endif''' - if cc.compiles(check_ffmpeg_src, dependencies : libavfilter_dep, name : 'whether libav is provided by FFmpeg') - gst_libav = ['gst-libav'] - endif -endif - -if gst_libav.length() == 0 - message('WARNING: gst-libav not built as ffmpeg >= n3.1.2 not found on the system') -endif - -if get_option('python') - if dependency('pygobject-3.0', required : false).found() - subprojects += ['gst-python'] - else - message('WARNING: not building gst-python module, missing pygobject-3.0') - endif -endif - -if get_option('bad') - subprojects += ['gst-plugins-bad'] -endif - -if get_option('ugly') - subprojects += ['gst-plugins-ugly'] -endif - -if get_option('libav') - subprojects += gst_libav -endif - -if get_option('omx') - subprojects += ['gst-omx'] -endif - -if get_option('vaapi') - if dependency('libva', version: ['>= 0.30.4', '!= 0.99.0'], required : false).found() - subprojects += ['gstreamer-vaapi'] - else - message('WARNING: not building gstreamer-vaapi module, missing libva') - endif -endif - -if get_option('devtools') - if dependency('json-glib-1.0', required : false).found() - subprojects += ['gst-devtools'] - else - message('WARNING: not building gst-devtools module, missing glib-json-1.0') - endif -endif - -if get_option('ges') - if dependency('libxml-2.0', required : false).found() - subprojects += ['gst-editing-services'] - else - message('WARNING: not building gst-editing-services module, missing libxml-2.0') - endif -endif - -if get_option('rtsp_server') - subprojects += ['gst-rtsp-server'] -endif - -if get_option('sharp') - if add_languages('cs', required : false) - if meson.version().version_compare('>=0.43') - subprojects += ['gstreamer-sharp'] +libav_opt = get_option('libav') +libav_deps = [dependency('libavfilter', version: '>= 6.47.100', required: libav_opt)] +if libav_deps[0].found() + cc = meson.get_compiler('c') + check_ffmpeg_src = '''#include + #if LIBAVCODEC_VERSION_MICRO >= 100 + /* FFmpeg uses 100+ as its micro version */ + #else + #error libav provider should be FFmpeg + #endif''' + if cc.compiles(check_ffmpeg_src, dependencies : libav_deps, name : 'whether libav is provided by FFmpeg') == false + if libav_opt.enabled() + error('gst-libav is enabled but can\'t be built') else - message('WARNING: Not building gstreamer-sharp as meson >=0.43 not found.') + message('WARNING: gst-libav not built as ffmpeg n3.1.2 not found on the system') + libav_deps += [disabler()] endif - else - message('WARNING: Not building gstreamer-sharp as no CS compiler found.') endif endif +if add_languages('cs', required : get_option('sharp')) + sharp_deps = [] +else + sharp_deps = [disabler()] +endif + +python_opt = get_option('python') +vaapi_opt = get_option('vaapi') +devtools_opt = get_option('devtools') +ges_opt = get_option('ges') +subprojects = { + 'gstreamer': {}, + 'gst-plugins-base': {}, + 'gst-plugins-good': {}, + 'gst-plugins-bad': { 'option': get_option('bad') }, + 'gst-plugins-ugly': { 'option': get_option('ugly') }, + 'gst-python': { 'option': python_opt, 'dependencies': [dependency('pygobject-3.0', required : python_opt)] }, + 'gst-omx': { 'option': get_option('omx'), }, + 'gstreamer-vaapi': { + 'option': vaapi_opt, + 'dependencies': [dependency('libva', version: ['>= 0.30.4', '!= 0.99.0'], required : vaapi_opt)] + }, + 'gst-devtools': { + 'option': devtools_opt, + 'dependencies': [dependency('json-glib-1.0', required: devtools_opt)], + }, + 'gst-editing-services': { 'option': ges_opt, 'dependencies': [dependency('libxml-2.0', required : ges_opt)] }, + 'gst-rtsp-server': { 'option': get_option('rtsp_server') }, + 'gstreamer-sharp': { 'option': get_option('sharp'), 'dependencies': sharp_deps }, +} + python3 = import('python3').find_python() symlink = ''' import os os.symlink(os.path.join('@1@', 'subprojects', '@0@'), - os.path.join('@1@', '@0@')) + os.path.join('@1@', '@0@')) ''' -foreach custom_subproj: get_option('custom_subprojects').split(',') - if custom_subproj != '' - message ('Adding custom subproject ' + custom_subproj) - subprojects += [custom_subproj] - endif -endforeach - # On Windows, if flex/bison aren't found, we use a subproject to get them flex = find_program('flex', 'win_flex', required : build_system != 'windows') bison = find_program('bison', 'win_bison', required : build_system != 'windows') @@ -142,18 +97,41 @@ if not flex.found() or not bison.found() subproject('win-flex-bison-binaries') endif -message('Building subprojects: ' + ', '.join(subprojects)) -foreach subproj: subprojects - subproject(subproj, version: gst_version) +subprojects_names = [] +foreach project_name, build_infos: subprojects + build = true + if build_infos.has_key('option') + build = not build_infos.get('option').disabled() + if build + foreach dep: build_infos.get('dependencies', []) + if dep.found() == false + warning('@0@ dependency @1@ not found - NOT BUILDING'.format(project_name, dep)) + build = false + endif + endforeach + endif + endif - cmdres = run_command(python3, '-c', symlink.format(subproj, meson.current_source_dir())) - if cmdres.returncode() == 0 - message('Created symlink to ' + subproj) - else - message('Could not create symlink to @0@'.format(subproj)) + if build + subprojects_names += [project_name] + subproject(project_name, version: gst_version) + cmdres = run_command(python3, '-c', symlink.format(project_name, meson.current_source_dir())) + if cmdres.returncode() == 0 + message('Created symlink to ' + project_name) + endif endif endforeach +foreach custom_subproj: get_option('custom_subprojects').split(',') + if custom_subproj != '' + message ('Adding custom subproject ' + custom_subproj) + subproject(custom_subproj) + subprojects_names += [custom_subproj] + endif +endforeach + +message('Building subprojects: ' + ', '.join(subprojects_names)) + setenv = find_program('gst-uninstalled.py') run_target('uninstalled', command : [setenv, '--builddir=@0@'.format(meson.build_root()), '--srcdir=@0@'.format(meson.source_root()), diff --git a/meson_options.txt b/meson_options.txt index 8e703fad06..bf55972861 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,13 +1,13 @@ -option('python', type : 'boolean', value : true) -option('libav', type : 'boolean', value : true) -option('ugly', type : 'boolean', value : true) -option('bad', type : 'boolean', value : true) -option('devtools', type : 'boolean', value : true) -option('ges', type : 'boolean', value : true) -option('rtsp_server', type : 'boolean', value : true) -option('omx', type : 'boolean', value : false) -option('vaapi', type : 'boolean', value : true) -option('sharp', type : 'boolean', value : true) +option('python', type : 'feature', value : 'auto') +option('libav', type : 'feature', value : 'auto') +option('ugly', type : 'feature', value : 'auto') +option('bad', type : 'feature', value : 'auto') +option('devtools', type : 'feature', value : 'auto') +option('ges', type : 'feature', value : 'auto') +option('rtsp_server', type : 'feature', value : 'auto') +option('omx', type : 'feature', value : 'disabled') +option('vaapi', type : 'feature', value : 'auto') +option('sharp', type : 'feature', value : 'auto') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') # Common options, automatically inherited by subprojects From 52859fba5c81e47548b350d09a614b131107d918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 13 Jul 2018 00:11:41 +0100 Subject: [PATCH 134/448] Disable gst-sharp by default, as it is not guaranteed to build Can be re-enabled again if we check for all direct and indirect hard deps before including it. subprojects\gtk-sharp\Source\meson.build:40:0: ERROR: Program(s) ['gacutil'] not found or not executable --- meson_options.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson_options.txt b/meson_options.txt index bf55972861..3e5d35de92 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -7,7 +7,7 @@ option('ges', type : 'feature', value : 'auto') option('rtsp_server', type : 'feature', value : 'auto') option('omx', type : 'feature', value : 'disabled') option('vaapi', type : 'feature', value : 'auto') -option('sharp', type : 'feature', value : 'auto') +option('sharp', type : 'feature', value : 'disabled') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') # Common options, automatically inherited by subprojects From a0bfbe1f8dd6b23a2ddafd1f33dbac3413ec7e70 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 13 Jul 2018 11:45:28 -0400 Subject: [PATCH 135/448] Add back gst-libav It slipped through in the previous refactoring --- meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/meson.build b/meson.build index 9889b6767d..28fd04f3a8 100644 --- a/meson.build +++ b/meson.build @@ -69,6 +69,7 @@ subprojects = { 'gst-plugins-ugly': { 'option': get_option('ugly') }, 'gst-python': { 'option': python_opt, 'dependencies': [dependency('pygobject-3.0', required : python_opt)] }, 'gst-omx': { 'option': get_option('omx'), }, + 'gst-libav': { 'option': get_option('libav'), 'dependencies': libav_deps}, 'gstreamer-vaapi': { 'option': vaapi_opt, 'dependencies': [dependency('libva', version: ['>= 0.30.4', '!= 0.99.0'], required : vaapi_opt)] From f8f510e50b4699e7c95fdd982990454aa4ae8dae Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 13 Jul 2018 12:11:48 -0400 Subject: [PATCH 136/448] Update libav dependency version check. --- meson.build | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index 28fd04f3a8..cea26e8f49 100644 --- a/meson.build +++ b/meson.build @@ -30,10 +30,9 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif endif -# FIXME Remove that check once we have ffmpeg as a gst-libav subproject libav_opt = get_option('libav') -libav_deps = [dependency('libavfilter', version: '>= 6.47.100', required: libav_opt)] -if libav_deps[0].found() +libav_deps = [dependency('libavfilter', version: '>= 7.16.100', fallback: ['FFmpeg', 'libavfilter_dep'])] +if libav_deps[0].found() and libav_deps[0].type_name() != 'internal' cc = meson.get_compiler('c') check_ffmpeg_src = '''#include #if LIBAVCODEC_VERSION_MICRO >= 100 From 0682b1743322778a808b5f844ef41394ae290036 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 13 Jul 2018 18:54:34 -0400 Subject: [PATCH 137/448] dssim: Use http:// git repo --- subprojects/dssim.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/dssim.wrap b/subprojects/dssim.wrap index b6aff1ae1b..ddcb59fbf5 100644 --- a/subprojects/dssim.wrap +++ b/subprojects/dssim.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=dssim -url=git@github.com:kornelski/dssim.git +url=https://github.com/kornelski/dssim.git revision=dssim1-c From e88cd3628a3d7351d1d763c1634f24af7bfb400e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 19 Jul 2018 16:22:03 -0400 Subject: [PATCH 138/448] Mark ffmpeg as not required As it was supposed to be. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index cea26e8f49..adff81dd99 100644 --- a/meson.build +++ b/meson.build @@ -31,7 +31,7 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif libav_opt = get_option('libav') -libav_deps = [dependency('libavfilter', version: '>= 7.16.100', fallback: ['FFmpeg', 'libavfilter_dep'])] +libav_deps = [dependency('libavfilter', version: '>= 7.16.100', fallback: ['FFmpeg', 'libavfilter_dep'], required: false)] if libav_deps[0].found() and libav_deps[0].type_name() != 'internal' cc = meson.get_compiler('c') check_ffmpeg_src = '''#include From 5fd196b3d13438b02a51f6fa97337cbfd43a03a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sun, 22 Jul 2018 23:31:16 +0100 Subject: [PATCH 139/448] subprojects: glib: point back at upstream master branch instead of wip branch, the required tools override patches are now upstream. https://gitlab.gnome.org/GNOME/glib/merge_requests/188 --- subprojects/glib.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index 04fa8a6864..87021ae4d9 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -2,4 +2,4 @@ directory=glib url=https://gitlab.gnome.org/GNOME/glib.git push-url=git@gitlab.gnome.org:GNOME/glib.git -revision=wip/nirbheek/override-glib-tools +revision=master From 4ef0584295cb84e69b67ea8adb0dbb0f60b36895 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 23 Jul 2018 11:11:03 -0400 Subject: [PATCH 140/448] uninstalled: Avoid failling while setting up PyGObject env hack files --- gst-uninstalled.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index e28f3c7140..a62eac6bd0 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import argparse +import contextlib import json import os import platform @@ -186,6 +187,9 @@ def python_env(options, unset_env=False): elif not os.path.exists(sitepackages): os.makedirs(sitepackages) + with contextlib.suppress(FileNotFoundError): + os.remove(sitecustomize) + os.remove(mesonconfig_link) os.symlink(overrides_hack, sitecustomize) os.symlink(mesonconfig, mesonconfig_link) return os.path.realpath(sitecustomize) == overrides_hack From 63e743def640a8d6ab14be3f1853e594c91c65a7 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 23 Jul 2018 13:39:19 -0400 Subject: [PATCH 141/448] uninstalled: Simplify our python environment setup Not changing the main usersitepackage env but creating our own, similarly to what a venv would do. --- gst-uninstalled.py | 54 ++++++++++------------------------------------ 1 file changed, 11 insertions(+), 43 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index a62eac6bd0..88acee0abf 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -73,6 +73,7 @@ def get_subprocess_env(options): prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(PREFIX_DIR, 'lib', 'lib', 'girepository-1.0')) prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(PREFIX_DIR, 'lib', 'pkgconfig')) + setup_python_env(options, env) meson = get_meson() targets_s = subprocess.check_output([sys.executable, meson, 'introspect', options.builddir, '--targets']) @@ -150,12 +151,7 @@ def in_venv(): return (hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix)) -def python_env(options, unset_env=False): - """ - Setup our overrides_hack.py as sitecustomize.py script in user - site-packages if unset_env=False, else unset, previously set - env. - """ +def setup_python_env(options, env): subprojects_path = os.path.join(options.builddir, "subprojects") gst_python_path = os.path.join(SCRIPTDIR, "subprojects", "gst-python") if not os.path.exists(os.path.join(subprojects_path, "gst-python")) or \ @@ -167,46 +163,22 @@ def python_env(options, unset_env=False): else: sitepackages = site.getusersitepackages() - if not sitepackages: - return False - - sitecustomize = os.path.join(sitepackages, "sitecustomize.py") + sitecustomize = os.path.join( + subprocess.check_output([sys.executable, '-c', 'import site; print(site.USER_SITE)'], + env={"PYTHONUSERBASE": PREFIX_DIR}).decode().strip("\n"), "sitecustomize.py") overrides_hack = os.path.join(gst_python_path, "testsuite", "overrides_hack.py") mesonconfig = os.path.join(gst_python_path, "testsuite", "mesonconfig.py") mesonconfig_link = os.path.join(sitepackages, "mesonconfig.py") - if not unset_env: - if os.path.exists(sitecustomize): - if os.path.realpath(sitecustomize) == overrides_hack: - print("Customize user site script already linked to the GStreamer one") - return False - - old_sitecustomize = os.path.join(sitepackages, - "old.sitecustomize.gstuninstalled.py") - shutil.move(sitecustomize, old_sitecustomize) - elif not os.path.exists(sitepackages): - os.makedirs(sitepackages) - - with contextlib.suppress(FileNotFoundError): - os.remove(sitecustomize) - os.remove(mesonconfig_link) + os.makedirs(os.path.dirname(sitecustomize), exist_ok=True) + with contextlib.suppress(FileExistsError): os.symlink(overrides_hack, sitecustomize) + with contextlib.suppress(FileExistsError): os.symlink(mesonconfig, mesonconfig_link) - return os.path.realpath(sitecustomize) == overrides_hack - else: - if not os.path.realpath(sitecustomize) == overrides_hack: - return False - - os.remove(sitecustomize) - os.remove (mesonconfig_link) - old_sitecustomize = os.path.join(sitepackages, - "old.sitecustomize.gstuninstalled.py") - - if os.path.exists(old_sitecustomize): - shutil.move(old_sitecustomize, sitecustomize) - - return True + env["PYTHONUSERBASE"] = PREFIX_DIR + if sitepackages: + prepend_env_var(env, "PYTHONPATH", sitepackages) if __name__ == "__main__": parser = argparse.ArgumentParser(prog="gstreamer-uninstalled") @@ -248,12 +220,8 @@ if __name__ == "__main__": # Let the GC remove the tmp file args.append("--rcfile") args.append(tmprc.name) - python_set = python_env(options) try: exit(subprocess.call(args, cwd=options.srcdir, close_fds=False, env=get_subprocess_env(options))) except subprocess.CalledProcessError as e: exit(e.returncode) - finally: - if python_set: - python_env(options, unset_env=True) From 6a0c4b3771fd1dbc83a900e029cf25c17e3d8250 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 24 Jul 2018 12:11:52 -0400 Subject: [PATCH 142/448] Fix previous commit putting mesonconfig.py in our custom sitecustomize directory --- gst-uninstalled.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 88acee0abf..4cb7956602 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -166,11 +166,13 @@ def setup_python_env(options, env): sitecustomize = os.path.join( subprocess.check_output([sys.executable, '-c', 'import site; print(site.USER_SITE)'], env={"PYTHONUSERBASE": PREFIX_DIR}).decode().strip("\n"), "sitecustomize.py") + + custom_sitecustomize = os.path.dirname(sitecustomize) overrides_hack = os.path.join(gst_python_path, "testsuite", "overrides_hack.py") mesonconfig = os.path.join(gst_python_path, "testsuite", "mesonconfig.py") - mesonconfig_link = os.path.join(sitepackages, "mesonconfig.py") + mesonconfig_link = os.path.join(custom_sitecustomize, "mesonconfig.py") - os.makedirs(os.path.dirname(sitecustomize), exist_ok=True) + os.makedirs(custom_sitecustomize, exist_ok=True) with contextlib.suppress(FileExistsError): os.symlink(overrides_hack, sitecustomize) with contextlib.suppress(FileExistsError): From 7ec215b509b27ab87fa60f4cff5d93f8c642839b Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 24 Jul 2018 12:28:48 -0400 Subject: [PATCH 143/448] uninstalled: Also support GES overrides Simplifying one step further too --- gst-uninstalled.py | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 4cb7956602..43e81c922f 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -152,11 +152,19 @@ def in_venv(): (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix)) def setup_python_env(options, env): - subprojects_path = os.path.join(options.builddir, "subprojects") - gst_python_path = os.path.join(SCRIPTDIR, "subprojects", "gst-python") - if not os.path.exists(os.path.join(subprojects_path, "gst-python")) or \ - not os.path.exists(gst_python_path): - return False + some_overrides_built = False + for override_path in [os.path.join("subprojects", "gst-editing-services", "bindings", "python", "gi", "overrides"), + os.path.join("subprojects", "gst-python", "gi", "overrides")]: + if os.path.exists(os.path.join(SCRIPTDIR, override_path)): + some_overrides_built = True + else: + continue + + prepend_env_var(env, "PYGOBJECT_OVERRIDES_PATH", os.path.join(SCRIPTDIR, override_path)) + prepend_env_var(env, "PYGOBJECT_OVERRIDES_PATH", os.path.join(options.builddir, override_path)) + + if not some_overrides_built: + return if in_venv (): sitepackages = get_python_lib() @@ -167,16 +175,15 @@ def setup_python_env(options, env): subprocess.check_output([sys.executable, '-c', 'import site; print(site.USER_SITE)'], env={"PYTHONUSERBASE": PREFIX_DIR}).decode().strip("\n"), "sitecustomize.py") - custom_sitecustomize = os.path.dirname(sitecustomize) - overrides_hack = os.path.join(gst_python_path, "testsuite", "overrides_hack.py") - mesonconfig = os.path.join(gst_python_path, "testsuite", "mesonconfig.py") - mesonconfig_link = os.path.join(custom_sitecustomize, "mesonconfig.py") + custom_user_sitepackage = os.path.dirname(sitecustomize) + os.makedirs(custom_user_sitepackage, exist_ok=True) + with open(sitecustomize, "w") as f: + f.write("""import os +import gi.overrides - os.makedirs(custom_sitecustomize, exist_ok=True) - with contextlib.suppress(FileExistsError): - os.symlink(overrides_hack, sitecustomize) - with contextlib.suppress(FileExistsError): - os.symlink(mesonconfig, mesonconfig_link) +for override_path in os.environ.get("PYGOBJECT_OVERRIDES_PATH", "").split(os.pathsep): + gi.overrides.__path__.insert(0, override_path) +""") env["PYTHONUSERBASE"] = PREFIX_DIR if sitepackages: From eaf17bfff444adc5ec5b00f201e596d374ff074f Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 25 Jul 2018 19:36:20 +0530 Subject: [PATCH 144/448] Convert common meson options to feature options These changes have been mirrored in all subproject repositories. https://bugzilla.gnome.org/show_bug.cgi?id=795107 --- meson_options.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/meson_options.txt b/meson_options.txt index 3e5d35de92..be891a3b62 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -11,7 +11,6 @@ option('sharp', type : 'feature', value : 'disabled') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') # Common options, automatically inherited by subprojects -option('gtk_doc', type : 'boolean', value : true, - description : 'Generate API documentation with gtk-doc') -option('introspection', type : 'boolean', value : true, - description : 'Whether to disable the introspection generation') +option('examples', type : 'feature', value : 'auto', description : 'Build examples') +option('gtk_doc', type : 'feature', value : 'auto', description : 'Generate API documentation with gtk-doc') +option('introspection', type : 'feature', value : 'auto', description : 'Generate introspection data') From 2a675954c48d4141f421b9d757600cd56041f570 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 27 Jul 2018 18:50:01 +0530 Subject: [PATCH 145/448] Update .gitignore and add more subprojects --- .gitignore | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.gitignore b/.gitignore index d828fd46ec..6cd8b9a602 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ gst-plugins-ugly gst-python gst-rtsp-server gstreamer +gstreamer-sharp gstreamer-vaapi __pycache__ meson/ @@ -24,7 +25,16 @@ subprojects/gst-plugins-ugly/ subprojects/gst-python/ subprojects/gst-rtsp-server/ subprojects/gstreamer/ +subprojects/gstreamer-sharp/ subprojects/gstreamer-vaapi/ subprojects/glib/ subprojects/gl-headers/ +subprojects/bindinator/ +subprojects/dssim/ +subprojects/gtk-sharp/ +subprojects/libffi/ +subprojects/libnice/ +subprojects/libunwind/ +subprojects/proxy-libintl/ +subprojects/zlib/ prefix/ From 1e21d789aed2664261500b40a3f24d97ca12b8ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 7 Aug 2018 00:41:51 +0100 Subject: [PATCH 146/448] subprojects: fix openh264 wrap commit Meson was literally trying to check out tag/revision 'a1b3f07c5271f312997fcc3451237031444c4475 # 1.8.0 + fix for gcc 8.' which doesn't exist of course. --- subprojects/openh264.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/openh264.wrap b/subprojects/openh264.wrap index 7d0efc0340..5d72543e80 100644 --- a/subprojects/openh264.wrap +++ b/subprojects/openh264.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=openh264 url=https://github.com/cisco/openh264.git -revision=a1b3f07c5271f312997fcc3451237031444c4475 # 1.8.0 + fix for gcc 8. +revision=a1b3f07c5271f312997fcc3451237031444c4475 From 783e6a226d55bab1e3c4eb8bd29a898a2784686e Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 11 Aug 2018 02:50:14 +0530 Subject: [PATCH 147/448] scripts: Fix fetching of meson command to run Don't assume that meson is always a python script, on Windows it can be (and soon will almost always be) an executable. See: Meson MSI installer and https://github.com/mesonbuild/meson/pull/4004 --- checkout-branch-worktree | 3 +-- common.py | 24 ++++++++++++------------ gst-uninstalled.py | 7 +++---- setup.py | 9 +++++---- 4 files changed, 21 insertions(+), 22 deletions(-) diff --git a/checkout-branch-worktree b/checkout-branch-worktree index 1a7124150c..9c4d3b4d84 100755 --- a/checkout-branch-worktree +++ b/checkout-branch-worktree @@ -21,8 +21,7 @@ def checkout_subprojects(worktree_dir, branch): worktree_subdir = os.path.join(worktree_dir, "subprojects") meson = get_meson() - installed_s = subprocess.check_output([sys.executable, meson, 'introspect', - options.builddir, '--projectinfo']) + installed_s = subprocess.check_output(meson + ['introspect', options.builddir, '--projectinfo']) for subproj in json.loads(installed_s.decode())["subprojects"]: repo_name = subproj["name"] if not repo_name.startswith("gst"): diff --git a/common.py b/common.py index b3ee7c5547..dee8b1f7da 100644 --- a/common.py +++ b/common.py @@ -51,13 +51,12 @@ def accept_command(commands): command = shutil.which(command) if command: return command - return None def get_meson(): meson = os.path.join(ROOTDIR, 'meson', 'meson.py') if os.path.exists(meson): - return meson + return [sys.executable, meson] mesonintrospect = os.environ.get('MESONINTROSPECT', '') for comp in shlex.split (mesonintrospect): @@ -65,15 +64,16 @@ def get_meson(): # let's not get tricked if 'python' in os.path.basename (comp): continue - if os.path.exists (comp): - mesondir = os.path.dirname(comp) - if mesonintrospect.endswith('.py') or mesonintrospect.endswith('.py introspect'): - meson = os.path.join(mesondir, 'meson.py') + if os.path.exists(comp): + if comp.endswith('.py'): + return [sys.executable, comp] else: - meson = os.path.join(mesondir, 'meson') - if os.path.exists (meson): - return meson + return [comp] - meson = accept_command(["meson.py", "meson"]) - - return meson + meson = accept_command(['meson.py']) + if meson: + return [sys.executable, meson] + meson = accept_command(['meson']) + if meson: + return [meson] + raise RuntimeError('Could not find Meson') diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 43e81c922f..0ddeea15e9 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -76,7 +76,7 @@ def get_subprocess_env(options): setup_python_env(options, env) meson = get_meson() - targets_s = subprocess.check_output([sys.executable, meson, 'introspect', options.builddir, '--targets']) + targets_s = subprocess.check_output(meson + ['introspect', options.builddir, '--targets']) targets = json.loads(targets_s.decode()) paths = set() mono_paths = set() @@ -111,9 +111,8 @@ def get_subprocess_env(options): presets = set() encoding_targets = set() pkg_dirs = set() - if '--installed' in subprocess.check_output([sys.executable, meson, 'introspect', '-h']).decode(): - installed_s = subprocess.check_output([sys.executable, meson, 'introspect', - options.builddir, '--installed']) + if '--installed' in subprocess.check_output(meson + ['introspect', '-h']).decode(): + installed_s = subprocess.check_output(meson + ['introspect', options.builddir, '--installed']) for path, installpath in json.loads(installed_s.decode()).items(): if path.endswith('.prs'): presets.add(os.path.dirname(path)) diff --git a/setup.py b/setup.py index b42a247b0f..5f286b9c5e 100755 --- a/setup.py +++ b/setup.py @@ -33,8 +33,9 @@ class GstBuildConfigurer: print("Not reconfiguring") return True - meson = get_meson() - if not meson: + try: + meson = get_meson() + except RuntimeError: print("Install mesonbuild to build %s: http://mesonbuild.com/\n" "You can simply install it with:\n" " $ sudo pip3 install meson" % PROJECTNAME) @@ -51,8 +52,8 @@ class GstBuildConfigurer: os.mkdir(build_dir) try: - subprocess.check_call( - [sys.executable, meson, "../"] + self.args + self.get_configs(), cwd=build_dir) + subprocess.check_call(meson + ["../"] + self.args + self.get_configs(), + cwd=build_dir) print("\nYou can now build GStreamer and its various subprojects running:\n" " $ {} -C {!r}".format(os.path.basename(ninja), build_dir)) except subprocess.CalledProcessError: From b4015f7bbed7592d1d6268cac5760a998bba733f Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 11 Aug 2018 18:41:04 +0530 Subject: [PATCH 148/448] scripts: Fix missing import in common.py This was causing a build failure on the CI. --- common.py | 1 + 1 file changed, 1 insertion(+) diff --git a/common.py b/common.py index dee8b1f7da..5478622986 100644 --- a/common.py +++ b/common.py @@ -1,5 +1,6 @@ import argparse import os +import sys import shutil import subprocess import shlex From d3ea533b208478cd73129001a67317035705b820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Sat, 23 Jun 2018 22:01:16 +0200 Subject: [PATCH 149/448] Don't process the whole commit https://bugzilla.gnome.org/show_bug.cgi?id=796655 --- checkout-branch-worktree | 2 +- git-update | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/checkout-branch-worktree b/checkout-branch-worktree index 9c4d3b4d84..3b29e73771 100755 --- a/checkout-branch-worktree +++ b/checkout-branch-worktree @@ -49,7 +49,7 @@ def checkout_worktree(repo_name, repo_dir, worktree_dir, branch): return False - commit_message = git("show", repository_path=repo_dir).split("\n") + commit_message = git("show", "--shortstat", repository_path=repo_dir).split("\n") print(u" -> %s%s%s - %s" % (Colors.HEADER, repo_dir, Colors.ENDC, commit_message[4].strip())) diff --git a/git-update b/git-update index 59777403a1..a3875d2a97 100755 --- a/git-update +++ b/git-update @@ -85,7 +85,7 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): return False - commit_message = git("show", repository_path=repo_dir).split("\n") + commit_message = git("show", "--shortstat", repository_path=repo_dir).split("\n") print(u" -> %s%s%s - %s" % (Colors.HEADER, commit_message[0][7:14], Colors.ENDC, commit_message[4].strip())) From c78f0ef2229925f48b0ffabc410c2ca35dcb0df9 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Fri, 17 Aug 2018 15:33:09 +0100 Subject: [PATCH 150/448] gst-uninstalled: Display current git branch name in the shell prompt This is really useful when using multiple git worktrees. https://bugzilla.gnome.org/show_bug.cgi?id=796989 --- common.py | 2 +- gst-uninstalled.py | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/common.py b/common.py index 5478622986..7f16391511 100644 --- a/common.py +++ b/common.py @@ -44,7 +44,7 @@ class Colors: def git(*args, repository_path='.'): return subprocess.check_output(["git"] + list(args), cwd=repository_path, - stderr=subprocess.STDOUT).decode() + ).decode() def accept_command(commands): """Search @commands and returns the first found absolute path.""" diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 0ddeea15e9..8e2edf2aa1 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -15,6 +15,7 @@ import tempfile from distutils.sysconfig import get_python_lib from common import get_meson +from common import git SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) PREFIX_DIR = os.path.join(SCRIPTDIR, 'prefix') @@ -29,7 +30,7 @@ def prepend_env_var(env, var, value): env[var] = env[var].replace(os.pathsep + os.pathsep, os.pathsep).strip(os.pathsep) -def get_subprocess_env(options): +def get_subprocess_env(options, gst_version): env = os.environ.copy() env["CURRENT_GST"] = os.path.normpath(SCRIPTDIR) @@ -42,8 +43,8 @@ def get_subprocess_env(options): prepend_env_var(env, "PATH", os.path.normpath( "%s/subprojects/gst-devtools/validate/tools" % options.builddir)) prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'meson')) - env["GST_VERSION"] = options.gst_version - env["GST_ENV"] = 'gst-' + options.gst_version + env["GST_VERSION"] = gst_version + env["GST_ENV"] = 'gst-' + gst_version env["GST_PLUGIN_SYSTEM_PATH"] = "" env["GST_PLUGIN_SCANNER"] = os.path.normpath( "%s/subprojects/gstreamer/libs/gst/helpers/gst-plugin-scanner" % options.builddir) @@ -197,8 +198,6 @@ if __name__ == "__main__": parser.add_argument("--srcdir", default=SCRIPTDIR, help="The top level source directory") - parser.add_argument("--gst-version", default="master", - help="The GStreamer major version") options, args = parser.parse_known_args() if not os.path.exists(options.builddir): @@ -212,6 +211,9 @@ if __name__ == "__main__": options.srcdir) exit(1) + # The following incantation will retrieve the current branch name. + gst_version = git("rev-parse", "--symbolic-full-name", "--abbrev-ref", "HEAD", repository_path=options.srcdir) + if not args: if os.name is 'nt': args = [os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe")] @@ -223,13 +225,13 @@ if __name__ == "__main__": tmprc = tempfile.NamedTemporaryFile(mode='w') with open(bashrc, 'r') as src: shutil.copyfileobj(src, tmprc) - tmprc.write('\nexport PS1="[gst-%s] $PS1"' % options.gst_version) + tmprc.write('\nexport PS1="[gst-%s] $PS1"' % gst_version) tmprc.flush() # Let the GC remove the tmp file args.append("--rcfile") args.append(tmprc.name) try: exit(subprocess.call(args, cwd=options.srcdir, close_fds=False, - env=get_subprocess_env(options))) + env=get_subprocess_env(options, gst_version))) except subprocess.CalledProcessError as e: exit(e.returncode) From 51759df370a608c795d8277ec69bfadfae623992 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Fri, 31 Aug 2018 11:44:17 +0100 Subject: [PATCH 151/448] meson: Follow-up fix for ninja uninstalled The --gst-version was removed in c78f0ef2229925f48b0ffabc410c2ca35dcb0df9 so remove it from the meson.build file as well. https://bugzilla.gnome.org/show_bug.cgi?id=796989 --- meson.build | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/meson.build b/meson.build index adff81dd99..568b75a15a 100644 --- a/meson.build +++ b/meson.build @@ -134,8 +134,7 @@ message('Building subprojects: ' + ', '.join(subprojects_names)) setenv = find_program('gst-uninstalled.py') run_target('uninstalled', command : [setenv, '--builddir=@0@'.format(meson.build_root()), - '--srcdir=@0@'.format(meson.source_root()), - '--gst-version=@0@'.format(gst_branch)]) + '--srcdir=@0@'.format(meson.source_root())]) update = find_program('git-update') run_target('git-update', command : [update]) From 13131122b7d2de1e55d305bbc494874a564dbc48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Fri, 31 Aug 2018 13:31:24 +0200 Subject: [PATCH 152/448] meson: strip branch name when uninstalled Remove ending newlines characters on branch's name. https://bugzilla.gnome.org/show_bug.cgi?id=796989 --- gst-uninstalled.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 8e2edf2aa1..d4509ce727 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -212,7 +212,8 @@ if __name__ == "__main__": exit(1) # The following incantation will retrieve the current branch name. - gst_version = git("rev-parse", "--symbolic-full-name", "--abbrev-ref", "HEAD", repository_path=options.srcdir) + gst_version = git("rev-parse", "--symbolic-full-name", "--abbrev-ref", "HEAD", + repository_path=options.srcdir).strip('\n') if not args: if os.name is 'nt': From 3e714d0bae0cf52ceebf105dab1f96a5b9622228 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 3 Sep 2018 21:22:25 +0530 Subject: [PATCH 153/448] meson: Fix libav checks to use feature options correctly --- meson.build | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/meson.build b/meson.build index 568b75a15a..d050996da9 100644 --- a/meson.build +++ b/meson.build @@ -31,7 +31,8 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif libav_opt = get_option('libav') -libav_deps = [dependency('libavfilter', version: '>= 7.16.100', fallback: ['FFmpeg', 'libavfilter_dep'], required: false)] +libav_deps = [dependency('libavfilter', version: '>= 7.16.100', + fallback: ['FFmpeg', 'libavfilter_dep'], required: libav_opt)] if libav_deps[0].found() and libav_deps[0].type_name() != 'internal' cc = meson.get_compiler('c') check_ffmpeg_src = '''#include @@ -40,13 +41,9 @@ if libav_deps[0].found() and libav_deps[0].type_name() != 'internal' #else #error libav provider should be FFmpeg #endif''' - if cc.compiles(check_ffmpeg_src, dependencies : libav_deps, name : 'whether libav is provided by FFmpeg') == false - if libav_opt.enabled() - error('gst-libav is enabled but can\'t be built') - else - message('WARNING: gst-libav not built as ffmpeg n3.1.2 not found on the system') - libav_deps += [disabler()] - endif + if not cc.compiles(check_ffmpeg_src, dependencies : libav_deps, name : 'whether libav is provided by FFmpeg') + message('WARNING: gst-libav not built as ffmpeg n3.1.2 not found on the system') + libav_deps += [disabler()] endif endif From 56130b0edd1b05601ed79590859c4112ff2ee235 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 5 Sep 2018 17:30:27 +0530 Subject: [PATCH 154/448] Rename --no-error to --werror and flip default We should not default to -Werror because that's not what we default to anywhere in gstreamer, and it's bad for releases anyway. The CI will be fixed to pass --werror manually. --- setup.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 5f286b9c5e..fccf416f5c 100755 --- a/setup.py +++ b/setup.py @@ -23,9 +23,9 @@ class GstBuildConfigurer: self.args = args def get_configs(self): - if self.options.no_error: - return [] - return ['--werror'] + if self.options.werror: + return ['--werror'] + return [] def configure_meson(self): if not self.options.reconfigure: @@ -74,7 +74,7 @@ if __name__ == "__main__": ' You can also use `ninja reconfigure` to just' ' make sure meson is rerun but the build folder' ' is kept.') - parser.add_argument("--no-error", action='store_true', + parser.add_argument("--werror", action='store_true', default=False, help="Do not error out on warnings") options, args = parser.parse_known_args() From 4525078098781c36bd0974e365b66399afe4d77e Mon Sep 17 00:00:00 2001 From: Martin Kelly Date: Wed, 22 Aug 2018 09:11:47 -0700 Subject: [PATCH 155/448] uninstalled: use usercustomize, not sitecustomize Currently, gst-uninstalled is using sitecustomize.py for adding gi override tweaks. However, if the standard Python libraries come before this file in sys.path, then sitecustomize.py will never be run because the "import sitecustomize" done in site.py will use the standard Python libraries instead. This can be seen by running "import sitecustomize; print(sitecustomize.__file__)" inside the uninstalled environment, as well as by checking gi.override.__path__ and seeing that the tweaks are missing (and the overrides are misbehaving). Switch to using usercustomize.py, which has no match in the standard libraries and thus will be correctly imported. https://bugzilla.gnome.org/show_bug.cgi?id=797011 --- gst-uninstalled.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index d4509ce727..dfcf8b53c3 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -171,13 +171,13 @@ def setup_python_env(options, env): else: sitepackages = site.getusersitepackages() - sitecustomize = os.path.join( + usercustomize = os.path.join( subprocess.check_output([sys.executable, '-c', 'import site; print(site.USER_SITE)'], - env={"PYTHONUSERBASE": PREFIX_DIR}).decode().strip("\n"), "sitecustomize.py") + env={"PYTHONUSERBASE": PREFIX_DIR}).decode().strip("\n"), "usercustomize.py") - custom_user_sitepackage = os.path.dirname(sitecustomize) + custom_user_sitepackage = os.path.dirname(usercustomize) os.makedirs(custom_user_sitepackage, exist_ok=True) - with open(sitecustomize, "w") as f: + with open(usercustomize, "w") as f: f.write("""import os import gi.overrides From 0f21cf47402703d27019d24797191faf2c009fd9 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 2 Oct 2018 09:51:11 +0530 Subject: [PATCH 156/448] git-update: Don't try to pull --rebase repos that are not on master This fixes updating of repos that are at a specific commit and a detached HEAD, such as openh264. --- git-update | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/git-update b/git-update index a3875d2a97..7285dfbfb4 100755 --- a/git-update +++ b/git-update @@ -35,6 +35,13 @@ def update_subprojects(manifest, no_interaction=False): if not os.path.exists(os.path.join(repo_dir, '.git')): continue revision = repos_commits.get(repo_name) + if not revision: + # If we're on a detached head because the revision= value in the + # wrap file is a commit, don't try to git pull --rebase because + # that will always fail. + ret = git('-C', repo_dir, 'rev-parse', '--symbolic-full-name', 'HEAD') + if ret.strip() == 'HEAD': + revision = git('rev-parse', 'HEAD').strip() if not update_repo(repo_name, repo_dir, revision, no_interaction): return False From 839acd5bd653adae3e9aeadd2e8af297299012e7 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 2 Oct 2018 09:53:09 +0530 Subject: [PATCH 157/448] gitignore: Ignore the subprojects openh264 git repo --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6cd8b9a602..f29aa9ae8f 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,5 @@ subprojects/libnice/ subprojects/libunwind/ subprojects/proxy-libintl/ subprojects/zlib/ +subprojects/openh264/ prefix/ From 1a75371b8b727ab91d4e966ecce6cc4cf32cf944 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 2 Oct 2018 13:39:49 +0530 Subject: [PATCH 158/448] git-update: Get the revision of the right repository Typo, should fix the gst-build CI failures. --- git-update | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-update b/git-update index 7285dfbfb4..c949ffd3c7 100755 --- a/git-update +++ b/git-update @@ -41,7 +41,7 @@ def update_subprojects(manifest, no_interaction=False): # that will always fail. ret = git('-C', repo_dir, 'rev-parse', '--symbolic-full-name', 'HEAD') if ret.strip() == 'HEAD': - revision = git('rev-parse', 'HEAD').strip() + revision = git('-C', repo_dir, 'rev-parse', 'HEAD').strip() if not update_repo(repo_name, repo_dir, revision, no_interaction): return False From 81b7a024c493078d4ce0428a0b51b0aff0245c2b Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 23 Oct 2018 14:08:34 +0200 Subject: [PATCH 159/448] Add wrap file for json-glib --- meson.build | 3 +-- subprojects/json-glib.wrap | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 subprojects/json-glib.wrap diff --git a/meson.build b/meson.build index d050996da9..dbfa0fa3e1 100644 --- a/meson.build +++ b/meson.build @@ -71,8 +71,7 @@ subprojects = { 'dependencies': [dependency('libva', version: ['>= 0.30.4', '!= 0.99.0'], required : vaapi_opt)] }, 'gst-devtools': { - 'option': devtools_opt, - 'dependencies': [dependency('json-glib-1.0', required: devtools_opt)], + 'option': devtools_opt }, 'gst-editing-services': { 'option': ges_opt, 'dependencies': [dependency('libxml-2.0', required : ges_opt)] }, 'gst-rtsp-server': { 'option': get_option('rtsp_server') }, diff --git a/subprojects/json-glib.wrap b/subprojects/json-glib.wrap new file mode 100644 index 0000000000..c6a942728a --- /dev/null +++ b/subprojects/json-glib.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=json-glib +url=https://gitlab.gnome.org/GNOME/json-glib.git +revision=master \ No newline at end of file From c42ec82de60c822871af7e9bd63e72c71cc0290e Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Sat, 27 Oct 2018 17:58:44 +0200 Subject: [PATCH 160/448] Add pygobject and pycairo as subprojects --- .gitignore | 2 ++ meson.build | 5 ++++- subprojects/pycairo.wrap | 4 ++++ subprojects/pygobject.wrap | 5 +++++ 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 subprojects/pycairo.wrap create mode 100644 subprojects/pygobject.wrap diff --git a/.gitignore b/.gitignore index f29aa9ae8f..f90d69f333 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,6 @@ subprojects/libunwind/ subprojects/proxy-libintl/ subprojects/zlib/ subprojects/openh264/ +subprojects/pygobject/ +subprojects/pycairo/ prefix/ diff --git a/meson.build b/meson.build index dbfa0fa3e1..59c5bc78cd 100644 --- a/meson.build +++ b/meson.build @@ -63,7 +63,10 @@ subprojects = { 'gst-plugins-good': {}, 'gst-plugins-bad': { 'option': get_option('bad') }, 'gst-plugins-ugly': { 'option': get_option('ugly') }, - 'gst-python': { 'option': python_opt, 'dependencies': [dependency('pygobject-3.0', required : python_opt)] }, + 'gst-python': { + 'option': python_opt, + 'dependencies': [dependency('pygobject-3.0', fallback: ['pygobject', 'pygobject_dep'], required : python_opt)] + }, 'gst-omx': { 'option': get_option('omx'), }, 'gst-libav': { 'option': get_option('libav'), 'dependencies': libav_deps}, 'gstreamer-vaapi': { diff --git a/subprojects/pycairo.wrap b/subprojects/pycairo.wrap new file mode 100644 index 0000000000..87eac571ed --- /dev/null +++ b/subprojects/pycairo.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=pycairo +url=https://github.com/pygobject/pycairo.git +revision=master diff --git a/subprojects/pygobject.wrap b/subprojects/pygobject.wrap new file mode 100644 index 0000000000..1a4e7bedf8 --- /dev/null +++ b/subprojects/pygobject.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=pygobject +url=https://gitlab.gnome.org/GNOME/pygobject.git +push-url=git@gitlab.gnome.org:GNOME/pygobject.git +revision=master From 72c43ce73fdb601e5e58b9cfc6ef87a706539bad Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Sat, 27 Oct 2018 17:59:29 +0200 Subject: [PATCH 161/448] uninstalled: build and set PYTHONPATH --- gst-uninstalled.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index dfcf8b53c3..4871a7dca9 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -11,6 +11,7 @@ import shutil import subprocess import sys import tempfile +import pathlib from distutils.sysconfig import get_python_lib @@ -112,9 +113,29 @@ def get_subprocess_env(options, gst_version): presets = set() encoding_targets = set() pkg_dirs = set() + python_dirs = set() if '--installed' in subprocess.check_output(meson + ['introspect', '-h']).decode(): installed_s = subprocess.check_output(meson + ['introspect', options.builddir, '--installed']) for path, installpath in json.loads(installed_s.decode()).items(): + installpath_parts = pathlib.Path(installpath).parts + path_parts = pathlib.Path(path).parts + + # We want to add all python modules to the PYTHONPATH + # in a manner consistent with the way they would be imported: + # For example if the source path /home/meh/foo/bar.py + # is to be installed in /usr/lib/python/site-packages/foo/bar.py, + # we want to add /home/meh to the PYTHONPATH. + # This will only work for projects where the paths to be installed + # mirror the installed directory layout, for example if the path + # is /home/meh/baz/bar.py and the install path is + # /usr/lib/site-packages/foo/bar.py , we will not add anything + # to PYTHONPATH, but the current approach works with pygobject + # and gst-python at least. + if 'site-packages' in installpath_parts: + install_subpath = os.path.join(*installpath_parts[installpath_parts.index('site-packages') + 1:]) + if path.endswith(install_subpath): + python_dirs.add(path[:len (install_subpath) * -1]) + if path.endswith('.prs'): presets.add(os.path.dirname(path)) elif path.endswith('.gep'): @@ -139,6 +160,9 @@ def get_subprocess_env(options, gst_version): 'gst-plugins-good', 'pkgconfig')) + for python_dir in python_dirs: + prepend_env_var(env, 'PYTHONPATH', python_dir) + mesonpath = os.path.join(SCRIPTDIR, "meson") if os.path.join(mesonpath): # Add meson/ into PYTHONPATH if we are using a local meson From 8eaf74d816f0b0853a687a442e791192b6217a4a Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sat, 20 Oct 2018 19:04:25 -0300 Subject: [PATCH 162/448] Use subproject 'required' argument Making the whole logic much simpler, and end result more accurate --- .gitignore | 1 + meson.build | 75 ++++++++++------------------------------------------- 2 files changed, 15 insertions(+), 61 deletions(-) diff --git a/.gitignore b/.gitignore index f90d69f333..9f6cec5a2a 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,5 @@ subprojects/zlib/ subprojects/openh264/ subprojects/pygobject/ subprojects/pycairo/ +subprojects/json-glib/ prefix/ diff --git a/meson.build b/meson.build index 59c5bc78cd..441fab5905 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('All GStreamer modules', 'c', version : '1.15.0.1', - meson_version : '>= 0.47.0', + meson_version : '>= 0.48.0', default_options : ['buildtype=debugoptimized']) gst_version = '>= @0@'.format(meson.project_version()) @@ -30,55 +30,20 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif endif -libav_opt = get_option('libav') -libav_deps = [dependency('libavfilter', version: '>= 7.16.100', - fallback: ['FFmpeg', 'libavfilter_dep'], required: libav_opt)] -if libav_deps[0].found() and libav_deps[0].type_name() != 'internal' - cc = meson.get_compiler('c') - check_ffmpeg_src = '''#include - #if LIBAVCODEC_VERSION_MICRO >= 100 - /* FFmpeg uses 100+ as its micro version */ - #else - #error libav provider should be FFmpeg - #endif''' - if not cc.compiles(check_ffmpeg_src, dependencies : libav_deps, name : 'whether libav is provided by FFmpeg') - message('WARNING: gst-libav not built as ffmpeg n3.1.2 not found on the system') - libav_deps += [disabler()] - endif -endif - -if add_languages('cs', required : get_option('sharp')) - sharp_deps = [] -else - sharp_deps = [disabler()] -endif - -python_opt = get_option('python') -vaapi_opt = get_option('vaapi') -devtools_opt = get_option('devtools') -ges_opt = get_option('ges') subprojects = { 'gstreamer': {}, 'gst-plugins-base': {}, 'gst-plugins-good': {}, 'gst-plugins-bad': { 'option': get_option('bad') }, 'gst-plugins-ugly': { 'option': get_option('ugly') }, - 'gst-python': { - 'option': python_opt, - 'dependencies': [dependency('pygobject-3.0', fallback: ['pygobject', 'pygobject_dep'], required : python_opt)] - }, + 'gst-python': { 'option': get_option('python') }, 'gst-omx': { 'option': get_option('omx'), }, - 'gst-libav': { 'option': get_option('libav'), 'dependencies': libav_deps}, - 'gstreamer-vaapi': { - 'option': vaapi_opt, - 'dependencies': [dependency('libva', version: ['>= 0.30.4', '!= 0.99.0'], required : vaapi_opt)] - }, - 'gst-devtools': { - 'option': devtools_opt - }, - 'gst-editing-services': { 'option': ges_opt, 'dependencies': [dependency('libxml-2.0', required : ges_opt)] }, + 'gst-libav': { 'option': get_option('libav') }, + 'gstreamer-vaapi': { 'option': get_option('vaapi') }, + 'gst-devtools': { 'option': get_option('devtools') }, + 'gst-editing-services': { 'option': get_option('ges') }, 'gst-rtsp-server': { 'option': get_option('rtsp_server') }, - 'gstreamer-sharp': { 'option': get_option('sharp'), 'dependencies': sharp_deps }, + 'gstreamer-sharp': { 'option': get_option('sharp') }, } python3 = import('python3').find_python() @@ -98,27 +63,15 @@ endif subprojects_names = [] foreach project_name, build_infos: subprojects - build = true - if build_infos.has_key('option') - build = not build_infos.get('option').disabled() - if build - foreach dep: build_infos.get('dependencies', []) - if dep.found() == false - warning('@0@ dependency @1@ not found - NOT BUILDING'.format(project_name, dep)) - build = false - endif - endforeach - endif - endif - - if build - subprojects_names += [project_name] - subproject(project_name, version: gst_version) - cmdres = run_command(python3, '-c', symlink.format(project_name, meson.current_source_dir())) - if cmdres.returncode() == 0 + is_required = build_infos.get('option', true) + subproj = subproject(project_name, version: gst_version, required: is_required) + if subproj.found() + subprojects_names += [project_name] + cmdres = run_command(python3, '-c', symlink.format(project_name, meson.current_source_dir())) + if cmdres.returncode() == 0 message('Created symlink to ' + project_name) - endif endif + endif endforeach foreach custom_subproj: get_option('custom_subprojects').split(',') From 5feafc66cee7d839dd088c0961d013ef5a25d6ee Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Sun, 28 Oct 2018 14:15:31 +0100 Subject: [PATCH 163/448] uninstalled: remove setup_python_env We now use a different approach to setting up our uninstalled python environment: We add the gst-python folder to PYTHONPATH, and it no longer contains __init__.py files. This means that import gi.overrides correctly loads pygobject's __init__ module, but import gi.overrides.Gst also works, as __init__ files are no longer required by python. --- gst-uninstalled.py | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 4871a7dca9..4fc58f4277 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -75,7 +75,6 @@ def get_subprocess_env(options, gst_version): prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(PREFIX_DIR, 'lib', 'lib', 'girepository-1.0')) prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(PREFIX_DIR, 'lib', 'pkgconfig')) - setup_python_env(options, env) meson = get_meson() targets_s = subprocess.check_output(meson + ['introspect', options.builddir, '--targets']) @@ -175,44 +174,6 @@ def in_venv(): return (hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix)) -def setup_python_env(options, env): - some_overrides_built = False - for override_path in [os.path.join("subprojects", "gst-editing-services", "bindings", "python", "gi", "overrides"), - os.path.join("subprojects", "gst-python", "gi", "overrides")]: - if os.path.exists(os.path.join(SCRIPTDIR, override_path)): - some_overrides_built = True - else: - continue - - prepend_env_var(env, "PYGOBJECT_OVERRIDES_PATH", os.path.join(SCRIPTDIR, override_path)) - prepend_env_var(env, "PYGOBJECT_OVERRIDES_PATH", os.path.join(options.builddir, override_path)) - - if not some_overrides_built: - return - - if in_venv (): - sitepackages = get_python_lib() - else: - sitepackages = site.getusersitepackages() - - usercustomize = os.path.join( - subprocess.check_output([sys.executable, '-c', 'import site; print(site.USER_SITE)'], - env={"PYTHONUSERBASE": PREFIX_DIR}).decode().strip("\n"), "usercustomize.py") - - custom_user_sitepackage = os.path.dirname(usercustomize) - os.makedirs(custom_user_sitepackage, exist_ok=True) - with open(usercustomize, "w") as f: - f.write("""import os -import gi.overrides - -for override_path in os.environ.get("PYGOBJECT_OVERRIDES_PATH", "").split(os.pathsep): - gi.overrides.__path__.insert(0, override_path) -""") - - env["PYTHONUSERBASE"] = PREFIX_DIR - if sitepackages: - prepend_env_var(env, "PYTHONPATH", sitepackages) - if __name__ == "__main__": parser = argparse.ArgumentParser(prog="gstreamer-uninstalled") From 0c4456fb1351fabb02b0ea35c2d83007bdcb60fb Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sun, 28 Oct 2018 16:05:23 +0000 Subject: [PATCH 164/448] README: Warn about not using the Meson MSI --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ae28e1d7cc..5ccc9ef18f 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,11 @@ You should get meson through your package manager or using: $ pip3 install --user meson -You should get `ninja` using your package manager or downloading it from -[here](https://github.com/ninja-build/ninja/releases). +If you are building on Windows, do not use the Meson MSI installer since it is +experimental and will likely not work. + +You should get `ninja` using your package manager or download the [official +release](https://github.com/ninja-build/ninja/releases) and put it in your PATH. ### Build GStreamer and its modules From 2758a637147380b9ebd092190289ecd901ba2f7a Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Wed, 31 Oct 2018 00:46:31 +0100 Subject: [PATCH 165/448] pygobject: add as a subproject when python is enabled This should make our awkward interactions with a system-wide install of pygobject in our uninstalled setup go away. --- meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/meson.build b/meson.build index 441fab5905..66dec30328 100644 --- a/meson.build +++ b/meson.build @@ -36,6 +36,7 @@ subprojects = { 'gst-plugins-good': {}, 'gst-plugins-bad': { 'option': get_option('bad') }, 'gst-plugins-ugly': { 'option': get_option('ugly') }, + 'pygobject': { 'option': get_option('python') }, 'gst-python': { 'option': get_option('python') }, 'gst-omx': { 'option': get_option('omx'), }, 'gst-libav': { 'option': get_option('libav') }, From 7db3c6b0ce259bc482c3bb085720d7ee8ff5d6a3 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 6 Aug 2018 00:33:08 -0400 Subject: [PATCH 166/448] gst-update: Handle specified remotes in manifest --- git-update | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/git-update b/git-update index c949ffd3c7..a9259c5ad3 100755 --- a/git-update +++ b/git-update @@ -17,24 +17,30 @@ def manifest_get_commits(manifest): res = {} tree = ET.parse(manifest) root = tree.getroot() + remotes = {} for child in root: + if child.tag == 'remote': + remotes[child.attrib['name']] = child.attrib['fetch'] if child.tag == 'project': - res[child.attrib["name"]] = child.attrib["revision"] + name = child.attrib['name'] + + remote = child.attrib.get('remote') + if remote: + res[name] = ['FETCH_HEAD', [os.path.join(remotes[remote], name), child.attrib['revision']]] + else: + res[name] = child.attrib["revision"] + return res -def update_subprojects(manifest, no_interaction=False): - if manifest: - repos_commits = manifest_get_commits(manifest) - else: - repos_commits = {} - +def update_subprojects(repos_commits, no_interaction=False): subprojects_dir = os.path.join(SCRIPTDIR, "subprojects") for repo_name in os.listdir(subprojects_dir): repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name)) if not os.path.exists(os.path.join(repo_dir, '.git')): continue - revision = repos_commits.get(repo_name) + + revision, args = repos_commits.get(repo_name, [None, []]) if not revision: # If we're on a detached head because the revision= value in the # wrap file is a commit, don't try to git pull --rebase because @@ -42,18 +48,18 @@ def update_subprojects(manifest, no_interaction=False): ret = git('-C', repo_dir, 'rev-parse', '--symbolic-full-name', 'HEAD') if ret.strip() == 'HEAD': revision = git('-C', repo_dir, 'rev-parse', 'HEAD').strip() - if not update_repo(repo_name, repo_dir, revision, no_interaction): + if not update_repo(repo_name, repo_dir, revision, no_interaction, args): return False return True -def update_repo(repo_name, repo_dir, revision, no_interaction, recurse_i=0): +def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0): print("Updating %s..." % repo_name) git("config", "rebase.autoStash", "true", repository_path=repo_dir) try: if revision: - git("fetch", repository_path=repo_dir) + git("fetch", *fetch_args, repository_path=repo_dir) git("checkout", revision, repository_path=repo_dir) else: git("pull", "--rebase", repository_path=repo_dir) @@ -125,9 +131,16 @@ if __name__ == "__main__": if options.no_interaction: sys.stdin.close() - if not update_repo('gst-build', SCRIPTDIR, None, options.no_interaction): + if options.manifest: + repos_commits = manifest_get_commits(options.manifest) + else: + repos_commits = {} + + revision, args = repos_commits.get('gst-build', [None, []]) + if not update_repo('gst-build', SCRIPTDIR, revision, options.no_interaction, args): exit(1) - if not update_subprojects(options.manifest, options.no_interaction): + + if not update_subprojects(repos_commits, options.no_interaction): exit(1) if options.builddir: From 859e613edb5e4a39da12fa2cf495012576db9088 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Sat, 3 Nov 2018 21:38:33 -0400 Subject: [PATCH 167/448] Change wrap URLs to gitlab --- subprojects/gst-devtools.wrap | 4 ++-- subprojects/gst-editing-services.wrap | 4 ++-- subprojects/gst-libav.wrap | 4 ++-- subprojects/gst-omx.wrap | 4 ++-- subprojects/gst-plugins-bad.wrap | 4 ++-- subprojects/gst-plugins-base.wrap | 4 ++-- subprojects/gst-plugins-good.wrap | 4 ++-- subprojects/gst-plugins-ugly.wrap | 4 ++-- subprojects/gst-python.wrap | 4 ++-- subprojects/gst-rtsp-server.wrap | 4 ++-- subprojects/gstreamer-sharp.wrap | 4 ++-- subprojects/gstreamer-vaapi.wrap | 4 ++-- subprojects/gstreamer.wrap | 4 ++-- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 92531806e0..3ad4f0fce3 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-devtools -url=https://anongit.freedesktop.org/git/gstreamer/gst-devtools.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-devtools +url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 9a5fbe633f..0e3510a56f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-editing-services -url=https://anongit.freedesktop.org/git/gstreamer/gst-editing-services.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-editing-services +url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 7771b7174f..d01154348a 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-libav -url=https://anongit.freedesktop.org/git/gstreamer/gst-libav.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-libav +url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index c8023c0b3f..d5ba267d17 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-omx -url=https://anongit.freedesktop.org/git/gstreamer/gst-omx.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-omx +url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 43bc794fc7..7d3a04af64 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-plugins-bad -url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-bad.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-bad +url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 5b676edfdb..705662d731 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-plugins-base -url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-base.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base +url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index e42b672654..7ed12291ce 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-plugins-good -url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-good.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-good +url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 16f458f86f..bab6ef61be 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-plugins-ugly -url=https://anongit.freedesktop.org/git/gstreamer/gst-plugins-ugly.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-plugins-ugly +url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b6c8d92f4..2b3e87a738 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-python -url=https://anongit.freedesktop.org/git/gstreamer/gst-python.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-python +url=https://gitlab.freedesktop.org/gstreamer/gst-python.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index b40a50e331..c7b473b3b2 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gst-rtsp-server -url=https://anongit.freedesktop.org/git/gstreamer/gst-rtsp-server -push-url=ssh://git.freedesktop.org/git/gstreamer/gst-rtsp-server +url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git revision=master diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index dbf9eaac64..a14dab93a9 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gstreamer-sharp -url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-sharp.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-sharp +url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git +push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8a245404df..8765f69928 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gstreamer-vaapi -url=https://anongit.freedesktop.org/git/gstreamer/gstreamer-vaapi.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer-vaapi +url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git +push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 9d113b9129..85aa7f483a 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gstreamer -url=https://anongit.freedesktop.org/git/gstreamer/gstreamer.git -push-url=ssh://git.freedesktop.org/git/gstreamer/gstreamer +url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git +push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git revision=master From 52c0086c5a92568291a92fe1bce6cdbffb25ac85 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 5 Nov 2018 09:42:29 -0300 Subject: [PATCH 168/448] update: Fix the manifest commit dictionnary format The structure was changed in last commit but a code path was not properly updated --- git-update | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-update b/git-update index a9259c5ad3..87e6f7c585 100755 --- a/git-update +++ b/git-update @@ -28,7 +28,7 @@ def manifest_get_commits(manifest): if remote: res[name] = ['FETCH_HEAD', [os.path.join(remotes[remote], name), child.attrib['revision']]] else: - res[name] = child.attrib["revision"] + res[name] = [child.attrib["revision"], []] return res From 57f884495823dc64405528640d3d4794c11250dc Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 5 Nov 2018 09:43:50 -0300 Subject: [PATCH 169/448] update: Ensure that a revision is used when updating a detached repo For the case it was not guaranteed --- git-update | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/git-update b/git-update index 87e6f7c585..83d2006060 100755 --- a/git-update +++ b/git-update @@ -33,6 +33,18 @@ def manifest_get_commits(manifest): return res +def ensure_revision_if_necessary(repo_dir, revision): + """ + Makes sure that @revision is set if the current repo is detached. + """ + if not revision: + ret = git('-C', repo_dir, 'rev-parse', '--symbolic-full-name', 'HEAD') + if ret.strip() == 'HEAD': + revision = git('-C', repo_dir, 'rev-parse', 'HEAD').strip() + + return revision + + def update_subprojects(repos_commits, no_interaction=False): subprojects_dir = os.path.join(SCRIPTDIR, "subprojects") for repo_name in os.listdir(subprojects_dir): @@ -41,13 +53,6 @@ def update_subprojects(repos_commits, no_interaction=False): continue revision, args = repos_commits.get(repo_name, [None, []]) - if not revision: - # If we're on a detached head because the revision= value in the - # wrap file is a commit, don't try to git pull --rebase because - # that will always fail. - ret = git('-C', repo_dir, 'rev-parse', '--symbolic-full-name', 'HEAD') - if ret.strip() == 'HEAD': - revision = git('-C', repo_dir, 'rev-parse', 'HEAD').strip() if not update_repo(repo_name, repo_dir, revision, no_interaction, args): return False @@ -55,7 +60,7 @@ def update_subprojects(repos_commits, no_interaction=False): def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0): - print("Updating %s..." % repo_name) + revision = ensure_revision_if_necessary(repo_dir, revision) git("config", "rebase.autoStash", "true", repository_path=repo_dir) try: if revision: From acb77ccb0a334a4beb07c0ae0f72f355bf45102f Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 5 Nov 2018 09:52:41 -0300 Subject: [PATCH 170/448] update: Enhance logging about what kind of update is happening --- git-update | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/git-update b/git-update index 83d2006060..6a4b46b0ed 100755 --- a/git-update +++ b/git-update @@ -33,13 +33,16 @@ def manifest_get_commits(manifest): return res +def get_branch_name(repo_dir): + return git('-C', repo_dir, 'rev-parse', '--symbolic-full-name', 'HEAD').strip() + + def ensure_revision_if_necessary(repo_dir, revision): """ Makes sure that @revision is set if the current repo is detached. """ if not revision: - ret = git('-C', repo_dir, 'rev-parse', '--symbolic-full-name', 'HEAD') - if ret.strip() == 'HEAD': + if get_branch_name(repo_dir) == 'HEAD': revision = git('-C', repo_dir, 'rev-parse', 'HEAD').strip() return revision @@ -64,9 +67,11 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], re git("config", "rebase.autoStash", "true", repository_path=repo_dir) try: if revision: + print("Checking out %s in %s" % (revision, repo_name)) git("fetch", *fetch_args, repository_path=repo_dir) git("checkout", revision, repository_path=repo_dir) else: + print("Updating branch %s in %s" % (get_branch_name(repo_dir), repo_name)) git("pull", "--rebase", repository_path=repo_dir) git("submodule", "update", repository_path=repo_dir) except Exception as e: From d027bf74011381a699ae59e3e95df3630cc73cfb Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Tue, 6 Nov 2018 05:34:52 -0500 Subject: [PATCH 171/448] Updated after gst-libav got moved to gst-ffmpeg --- .gitignore | 4 ++-- meson.build | 2 +- meson_options.txt | 2 +- subprojects/gst-ffmpeg.wrap | 5 +++++ subprojects/gst-libav.wrap | 5 ----- 5 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 subprojects/gst-ffmpeg.wrap delete mode 100644 subprojects/gst-libav.wrap diff --git a/.gitignore b/.gitignore index 9f6cec5a2a..3d8dc276bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ *build*/ gst-devtools gst-editing-services -gst-libav +gst-ffpeg gst-omx gst-plugins-bad gst-plugins-base @@ -16,7 +16,7 @@ __pycache__ meson/ subprojects/gst-devtools/ subprojects/gst-editing-services/ -subprojects/gst-libav/ +subprojects/gst-ffmpeg/ subprojects/gst-omx/ subprojects/gst-plugins-bad/ subprojects/gst-plugins-base/ diff --git a/meson.build b/meson.build index 66dec30328..a1e16dfc3f 100644 --- a/meson.build +++ b/meson.build @@ -39,7 +39,7 @@ subprojects = { 'pygobject': { 'option': get_option('python') }, 'gst-python': { 'option': get_option('python') }, 'gst-omx': { 'option': get_option('omx'), }, - 'gst-libav': { 'option': get_option('libav') }, + 'gst-ffmpeg': { 'option': get_option('ffmpeg') }, 'gstreamer-vaapi': { 'option': get_option('vaapi') }, 'gst-devtools': { 'option': get_option('devtools') }, 'gst-editing-services': { 'option': get_option('ges') }, diff --git a/meson_options.txt b/meson_options.txt index be891a3b62..63b04a27b3 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,5 +1,5 @@ option('python', type : 'feature', value : 'auto') -option('libav', type : 'feature', value : 'auto') +option('ffmpeg', type : 'feature', value : 'auto') option('ugly', type : 'feature', value : 'auto') option('bad', type : 'feature', value : 'auto') option('devtools', type : 'feature', value : 'auto') diff --git a/subprojects/gst-ffmpeg.wrap b/subprojects/gst-ffmpeg.wrap new file mode 100644 index 0000000000..92db8ea529 --- /dev/null +++ b/subprojects/gst-ffmpeg.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gst-ffmpeg +url=https://gitlab.freedesktop.org/gstreamer/gst-ffmpeg.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-ffmpeg.git +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap deleted file mode 100644 index d01154348a..0000000000 --- a/subprojects/gst-libav.wrap +++ /dev/null @@ -1,5 +0,0 @@ -[wrap-git] -directory=gst-libav -url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git -push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=master From 6bb5408f1b70ea0ccf003396ba0702bdc9c102b5 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Tue, 6 Nov 2018 06:02:34 -0500 Subject: [PATCH 172/448] Revert "Updated after gst-libav got moved to gst-ffmpeg" This reverts commit d027bf74011381a699ae59e3e95df3630cc73cfb. --- .gitignore | 4 ++-- meson.build | 2 +- meson_options.txt | 2 +- subprojects/gst-ffmpeg.wrap | 5 ----- subprojects/gst-libav.wrap | 5 +++++ 5 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 subprojects/gst-ffmpeg.wrap create mode 100644 subprojects/gst-libav.wrap diff --git a/.gitignore b/.gitignore index 3d8dc276bd..9f6cec5a2a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ *build*/ gst-devtools gst-editing-services -gst-ffpeg +gst-libav gst-omx gst-plugins-bad gst-plugins-base @@ -16,7 +16,7 @@ __pycache__ meson/ subprojects/gst-devtools/ subprojects/gst-editing-services/ -subprojects/gst-ffmpeg/ +subprojects/gst-libav/ subprojects/gst-omx/ subprojects/gst-plugins-bad/ subprojects/gst-plugins-base/ diff --git a/meson.build b/meson.build index a1e16dfc3f..66dec30328 100644 --- a/meson.build +++ b/meson.build @@ -39,7 +39,7 @@ subprojects = { 'pygobject': { 'option': get_option('python') }, 'gst-python': { 'option': get_option('python') }, 'gst-omx': { 'option': get_option('omx'), }, - 'gst-ffmpeg': { 'option': get_option('ffmpeg') }, + 'gst-libav': { 'option': get_option('libav') }, 'gstreamer-vaapi': { 'option': get_option('vaapi') }, 'gst-devtools': { 'option': get_option('devtools') }, 'gst-editing-services': { 'option': get_option('ges') }, diff --git a/meson_options.txt b/meson_options.txt index 63b04a27b3..be891a3b62 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,5 +1,5 @@ option('python', type : 'feature', value : 'auto') -option('ffmpeg', type : 'feature', value : 'auto') +option('libav', type : 'feature', value : 'auto') option('ugly', type : 'feature', value : 'auto') option('bad', type : 'feature', value : 'auto') option('devtools', type : 'feature', value : 'auto') diff --git a/subprojects/gst-ffmpeg.wrap b/subprojects/gst-ffmpeg.wrap deleted file mode 100644 index 92db8ea529..0000000000 --- a/subprojects/gst-ffmpeg.wrap +++ /dev/null @@ -1,5 +0,0 @@ -[wrap-git] -directory=gst-ffmpeg -url=https://gitlab.freedesktop.org/gstreamer/gst-ffmpeg.git -push-url=git@gitlab.freedesktop.org:gstreamer/gst-ffmpeg.git -revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap new file mode 100644 index 0000000000..d01154348a --- /dev/null +++ b/subprojects/gst-libav.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gst-libav +url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git +revision=master From 0b36fc55c75439faf4d5b240d6fed8e3bf980204 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 8 Nov 2018 11:51:27 -0300 Subject: [PATCH 173/448] update: Make sure to detach branch when checking out a specific revision Avoiding to get spammed about the fact that the branch is detached --- git-update | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-update b/git-update index 6a4b46b0ed..307bda3d6a 100755 --- a/git-update +++ b/git-update @@ -69,7 +69,7 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], re if revision: print("Checking out %s in %s" % (revision, repo_name)) git("fetch", *fetch_args, repository_path=repo_dir) - git("checkout", revision, repository_path=repo_dir) + git("checkout", "--detach", revision, repository_path=repo_dir) else: print("Updating branch %s in %s" % (get_branch_name(repo_dir), repo_name)) git("pull", "--rebase", repository_path=repo_dir) From df235d4f6c30c7c9a05de8c05bd7ecbeb74b3491 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 8 Nov 2018 11:52:03 -0300 Subject: [PATCH 174/448] uninstalled: Make sure that the new gdb python macros are usable directly from the uninstalled env --- gst-uninstalled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 4fc58f4277..48ae015ffc 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -112,7 +112,7 @@ def get_subprocess_env(options, gst_version): presets = set() encoding_targets = set() pkg_dirs = set() - python_dirs = set() + python_dirs = set(["%s/subprojects/gstreamer/libs/gst/helpers/" % options.srcdir]) if '--installed' in subprocess.check_output(meson + ['introspect', '-h']).decode(): installed_s = subprocess.check_output(meson + ['introspect', options.builddir, '--installed']) for path, installpath in json.loads(installed_s.decode()).items(): From ab47fccaece18740ea05d22ddab6914e77be572c Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Fri, 9 Nov 2018 18:54:03 +0200 Subject: [PATCH 175/448] Add Gitlab CI configuration This commit adds a .gitlab-ci.yml file, which uses a feature to fetch the config from a centralized repository. The intent is to have all the gstreamer modules use the same configuration. The configuration is currently hosted at the gst-ci repository under the gitlab/ci_template.yml path. --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000..1fa28f4eab --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1 @@ +include: 'https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/master/gitlab/ci_template.yml' From bc5bc17667331117c6693444da6346bf47bd5852 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Sun, 4 Nov 2018 01:50:30 +0900 Subject: [PATCH 176/448] Support *nix like development prompt on Windows CMD on windows could support customized prompt like $PS1 on bash --- gst-uninstalled.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 48ae015ffc..48f66372db 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -203,6 +203,7 @@ if __name__ == "__main__": if not args: if os.name is 'nt': args = [os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe")] + args += ['/k', 'prompt [gst-{}] $P$G'.format(gst_version)] else: args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] if "bash" in args[0]: From b174f7a9a1816314219274dae2f5d295c84941ee Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 21 Nov 2018 20:29:28 -0300 Subject: [PATCH 177/448] update: Take into account the path attribute of projects --- git-update | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/git-update b/git-update index 307bda3d6a..b2e4cb1226 100755 --- a/git-update +++ b/git-update @@ -23,12 +23,13 @@ def manifest_get_commits(manifest): remotes[child.attrib['name']] = child.attrib['fetch'] if child.tag == 'project': name = child.attrib['name'] + path = child.attrib.get('path', name) remote = child.attrib.get('remote') if remote: - res[name] = ['FETCH_HEAD', [os.path.join(remotes[remote], name), child.attrib['revision']]] + res[path] = ['FETCH_HEAD', [os.path.join(remotes[remote], name), child.attrib['revision']]] else: - res[name] = [child.attrib["revision"], []] + res[path] = [child.attrib["revision"], []] return res From 96a1384af94f9412bba110b4523c3e9cce31e204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alicia=20Boya=20Garc=C3=ADa?= Date: Fri, 23 Nov 2018 15:42:03 +0100 Subject: [PATCH 178/448] gst-uninstalled: Don't add validate plugins to GST_PLUGIN_PATH Validate plugins are automatically scanned from GST_VALIDATE_PLUGIN_PATH instead. Adding them to GST_PLUGIN_PATH causes race conditions as the plugins may be loaded before validate itself. --- gst-uninstalled.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 48f66372db..059653530a 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -81,9 +81,12 @@ def get_subprocess_env(options, gst_version): targets = json.loads(targets_s.decode()) paths = set() mono_paths = set() + srcdir_path = pathlib.Path(options.srcdir) for target in targets: filename = target['filename'] root = os.path.dirname(filename) + if srcdir_path / "subprojects/gst-devtools/validate/plugins" in (srcdir_path / root).parents: + continue if filename.endswith('.dll'): mono_paths.add(os.path.join(options.builddir, root)) if typelib_reg.search(filename): From 0b6c960ca70764deffff84b5835502294ddf3f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alicia=20Boya=20Garc=C3=ADa?= Date: Fri, 23 Nov 2018 19:13:49 +0100 Subject: [PATCH 179/448] gst-uninstalled: Don't change current working directory Currently gst-uninstalled.py changes the current directory to the root of the gst-build before executing execute the command passed as arguments. This is unnecessary, it creates confusion and makes scripting more cumbersome. This patch fixes that. --- gst-uninstalled.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 059653530a..0c230a0405 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -221,7 +221,7 @@ if __name__ == "__main__": args.append("--rcfile") args.append(tmprc.name) try: - exit(subprocess.call(args, cwd=options.srcdir, close_fds=False, + exit(subprocess.call(args, close_fds=False, env=get_subprocess_env(options, gst_version))) except subprocess.CalledProcessError as e: exit(e.returncode) From 03214bccc7903b8ed0f6793c32ccb88e5a174fa7 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 26 Nov 2018 14:48:18 -0300 Subject: [PATCH 180/448] Add a libxml2 wrap to be used by GES --- subprojects/libxml2.wrap | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 subprojects/libxml2.wrap diff --git a/subprojects/libxml2.wrap b/subprojects/libxml2.wrap new file mode 100644 index 0000000000..9abcf6133e --- /dev/null +++ b/subprojects/libxml2.wrap @@ -0,0 +1,9 @@ +[wrap-file] +directory = libxml2-2.9.7 + +source_url = ftp://xmlsoft.org/libxml2/libxml2-2.9.7.tar.gz +source_filename = libxml2-2.9.7.tar.gz +source_hash = f63c5e7d30362ed28b38bfa1ac6313f9a80230720b7fb6c80575eeab3ff5900c +patch_url = https://wrapdb.mesonbuild.com/v1/projects/libxml2/2.9.7/4/get_zip +patch_filename = libxml2-2.9.7-4-wrap.zip +patch_hash = e516d7727cc2bee7529556b29b774a0cd975cdc12ddf940772af1cf924b44f9f From 1c8085d9fb52edd765c7e1219feb1dd008b1dc15 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 26 Nov 2018 15:55:26 -0300 Subject: [PATCH 181/448] Download libxml from http and not ftp --- subprojects/libxml2.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libxml2.wrap b/subprojects/libxml2.wrap index 9abcf6133e..007a461f84 100644 --- a/subprojects/libxml2.wrap +++ b/subprojects/libxml2.wrap @@ -1,7 +1,7 @@ [wrap-file] directory = libxml2-2.9.7 -source_url = ftp://xmlsoft.org/libxml2/libxml2-2.9.7.tar.gz +source_url = http://xmlsoft.org/sources/libxml2-2.9.7.tar.gz source_filename = libxml2-2.9.7.tar.gz source_hash = f63c5e7d30362ed28b38bfa1ac6313f9a80230720b7fb6c80575eeab3ff5900c patch_url = https://wrapdb.mesonbuild.com/v1/projects/libxml2/2.9.7/4/get_zip From 636abc351be7811981e40675adabc0761ffbdbdd Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Thu, 22 Nov 2018 10:16:48 -0500 Subject: [PATCH 182/448] Add 'nls' common option --- meson_options.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/meson_options.txt b/meson_options.txt index be891a3b62..7614c782e3 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -14,3 +14,4 @@ option('custom_subprojects', type : 'string', value : '', description : 'Comma-s option('examples', type : 'feature', value : 'auto', description : 'Build examples') option('gtk_doc', type : 'feature', value : 'auto', description : 'Generate API documentation with gtk-doc') option('introspection', type : 'feature', value : 'auto', description : 'Generate introspection data') +option('nls', type : 'feature', value : 'auto', description : 'Enable native language support (translations)') From d1425b0307b7cc18050b1681864cb067c41c258a Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 6 Dec 2018 07:48:23 -0300 Subject: [PATCH 183/448] update: Fetch the refname before checking out the specified sha Working around freedesktop/freedesktop#95 --- git-update | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-update b/git-update index b2e4cb1226..9af245d90b 100755 --- a/git-update +++ b/git-update @@ -27,7 +27,7 @@ def manifest_get_commits(manifest): remote = child.attrib.get('remote') if remote: - res[path] = ['FETCH_HEAD', [os.path.join(remotes[remote], name), child.attrib['revision']]] + res[path] = [child.attrib["revision"], [os.path.join(remotes[remote], name), child.attrib['refname']]] else: res[path] = [child.attrib["revision"], []] From 9689fa0a45cdf753648be08e040cbb1c5668c547 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 6 Dec 2018 10:47:04 -0300 Subject: [PATCH 184/448] update: Re add support for manifests without a refname --- git-update | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-update b/git-update index 9af245d90b..ce1a1099ad 100755 --- a/git-update +++ b/git-update @@ -27,7 +27,7 @@ def manifest_get_commits(manifest): remote = child.attrib.get('remote') if remote: - res[path] = [child.attrib["revision"], [os.path.join(remotes[remote], name), child.attrib['refname']]] + res[path] = [child.attrib["revision"], [os.path.join(remotes[remote], name), child.attrib.get('refname', child.attrib["revision"])]] else: res[path] = [child.attrib["revision"], []] From 81d8a8c78c72917f8d3960dd2eded2f21d1eefc5 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Mon, 3 Dec 2018 09:16:14 -0500 Subject: [PATCH 185/448] Add example cross files These are example cross files that will be used by the CI. They could require manual editing to change hardcoded paths to toolchains when used on different environment. --- cross-files/README.md | 40 +++++++++++++++++++++++++++++ cross-files/android_arm64_api28.txt | 16 ++++++++++++ cross-files/mingw_w64_x86-64.txt | 17 ++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 cross-files/README.md create mode 100644 cross-files/android_arm64_api28.txt create mode 100644 cross-files/mingw_w64_x86-64.txt diff --git a/cross-files/README.md b/cross-files/README.md new file mode 100644 index 0000000000..469ef12f8d --- /dev/null +++ b/cross-files/README.md @@ -0,0 +1,40 @@ +# Cross compiling GStreamer with gst-build + +GStreamer can be cross compiled for various platforms using gst-build. However, +only dependencies that are ported to the Meson build system will be built. It is +recommended to use Cerbero to cross compile GStreamer when other external +dependencies are required. + +Once the toolchain is installed and a Meson cross file is created, to build +GStreamer simply run for example: `meson --cross-file cross-files/mingw_w64_x86-64.txt builddir`. + +## Android + +Requires Android API level >= 28, previous versions are missing *iconv* dependency. + +- Download and extract the [NDK](https://developer.android.com/ndk/) +- Create a standalone toolchain targeting your arch and API level: +`./build/tools/make_standalone_toolchain.py --arch $arch --api $api --install-dir $toolchain_path` +- Create a Meson cross file, you can use `android_arm64_api28.txt` as example + and change CPU architectures and toolchain path. + +Notes: +- On fedora the Android NDK requires the `ncurses-compat-libs` package. + +## Windows + +GStreamer can be cross compiled for Windows using mingw packaged in most +distribution. + +The Meson cross file `mingw_w64_x86-64.txt` can be used when targeting amd64 +architecture, or adapted for i686 arch. + +### Fedora + +- Install the toolchain packages: `mingw64-gcc`, `mingw64-gcc-c++`. Fedora + provides many other optional dependencies that could be installed as well. + For example: `mingw64-gettext`, `mingw64-libffi`, `mingw64-zlib`. + +### Ubuntu + +- Install the toolchain package: `gcc-mingw-w64`. diff --git a/cross-files/android_arm64_api28.txt b/cross-files/android_arm64_api28.txt new file mode 100644 index 0000000000..27b803d821 --- /dev/null +++ b/cross-files/android_arm64_api28.txt @@ -0,0 +1,16 @@ +[host_machine] +system = 'android' +cpu_family = 'aarch64' +cpu = 'arm64' +endian = 'little' + +[properties] +c_args = ['--sysroot', '/opt/android-arm64-api28/sysroot'] +cpp_args = ['--sysroot', '/opt/android-arm64-api28/sysroot'] + +[binaries] +c = '/opt/android-arm64-api28/bin/aarch64-linux-android-clang' +cpp = '/opt/android-arm64-api28/bin/aarch64-linux-android-clang++' +ar = '/opt/android-arm64-api28/bin/aarch64-linux-android-ar' +strip = '/opt/android-arm64-api28/bin/aarch64-linux-android-strip' +pkgconfig = 'false' diff --git a/cross-files/mingw_w64_x86-64.txt b/cross-files/mingw_w64_x86-64.txt new file mode 100644 index 0000000000..1897b686a0 --- /dev/null +++ b/cross-files/mingw_w64_x86-64.txt @@ -0,0 +1,17 @@ +[host_machine] +system = 'windows' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' + +[properties] +c_args = [] +c_link_args = [] + +[binaries] +c = 'x86_64-w64-mingw32-gcc' +cpp = 'x86_64-w64-mingw32-g++' +ar = 'x86_64-w64-mingw32-ar' +strip = 'x86_64-w64-mingw32-strip' +pkgconfig = 'x86_64-w64-mingw32-pkg-config' +windres = 'x86_64-w64-mingw32-windres' From 4d09d9cf9ec7e5fd81e783ebe5212e8675389030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 14 Dec 2018 21:35:17 +0000 Subject: [PATCH 186/448] subprojects: update libxml2 wrap to revision 5 Fixes build with MSVC. --- subprojects/libxml2.wrap | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subprojects/libxml2.wrap b/subprojects/libxml2.wrap index 007a461f84..5b3a3f5e4d 100644 --- a/subprojects/libxml2.wrap +++ b/subprojects/libxml2.wrap @@ -4,6 +4,6 @@ directory = libxml2-2.9.7 source_url = http://xmlsoft.org/sources/libxml2-2.9.7.tar.gz source_filename = libxml2-2.9.7.tar.gz source_hash = f63c5e7d30362ed28b38bfa1ac6313f9a80230720b7fb6c80575eeab3ff5900c -patch_url = https://wrapdb.mesonbuild.com/v1/projects/libxml2/2.9.7/4/get_zip -patch_filename = libxml2-2.9.7-4-wrap.zip -patch_hash = e516d7727cc2bee7529556b29b774a0cd975cdc12ddf940772af1cf924b44f9f +patch_url = https://wrapdb.mesonbuild.com/v1/projects/libxml2/2.9.7/5/get_zip +patch_filename = libxml2-2.9.7-5-wrap.zip +patch_hash = aed5d6719eb96da0fb3cf284d88c4af486fd6b7754aec40b2be9a5ffd9ecadab From bac218756ce01e31828a3d0488be7ff074ae83c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 15 Dec 2018 15:39:03 +0000 Subject: [PATCH 187/448] subprojects: use upstream libnice Meson port is upstream now. --- subprojects/libnice.wrap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subprojects/libnice.wrap b/subprojects/libnice.wrap index 3625a8ffee..788097ae85 100644 --- a/subprojects/libnice.wrap +++ b/subprojects/libnice.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=libnice -url=https://github.com/centricular/libnice.git -revision=meson +url=https://gitlab.freedesktop.org/libnice/libnice.git +revision=master From 35829b825ff426d0579fee0231a0e33a6c477a0a Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Sat, 29 Dec 2018 12:43:30 +0530 Subject: [PATCH 188/448] gitignore: Add top-level pygobject symlink --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9f6cec5a2a..25fd46ac89 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ subprojects/pygobject/ subprojects/pycairo/ subprojects/json-glib/ prefix/ +pygobject From 95960969075edbb3d96f3cfdc6cdbd29886bff1c Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Sat, 29 Dec 2018 12:44:20 +0530 Subject: [PATCH 189/448] gitignore: Add cscope files Ignores top-level cscope files that might be used for a cross-project cscope index. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 25fd46ac89..ed679e59c2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ *build*/ +cscope.in.out +cscope.out +cscope.po.out gst-devtools gst-editing-services gst-libav From db09aaf9a38fdd54b464d01b13f49b9dc3d8ed8f Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Fri, 4 Jan 2019 12:58:37 +0100 Subject: [PATCH 190/448] gst-uninstalled: define GST_OMX_CONFIG_DIR GST_OMX_CONFIG_DIR is used by gst-omx to load the gstomx.conf associated with the selected OMX target. --- gst-uninstalled.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 0c230a0405..99bf4876f7 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -149,6 +149,9 @@ def get_subprocess_env(options, gst_version): if os.path.exists(uninstalled): pkg_dirs.add(os.path.dirname(path)) + if path.endswith('gstomx.conf'): + prepend_env_var(env, 'GST_OMX_CONFIG_DIR', os.path.dirname(path)) + for p in presets: prepend_env_var(env, 'GST_PRESET_PATH', p) From 8c04a523ee9c1033ae69ee713d4512c48ffa5c57 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Wed, 23 Jan 2019 16:06:02 -0500 Subject: [PATCH 191/448] Add wrap file for libsoup and libpsl libpsl is a dependency if libsoup that has an upstream Meson build system (in master only). libsoup also needs libxml2 but we already have a wrap file for it. The only remaining dependency that must come from the system is sqlite3. --- subprojects/libpsl.wrap | 5 +++++ subprojects/libsoup.wrap | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 subprojects/libpsl.wrap create mode 100644 subprojects/libsoup.wrap diff --git a/subprojects/libpsl.wrap b/subprojects/libpsl.wrap new file mode 100644 index 0000000000..350e22e317 --- /dev/null +++ b/subprojects/libpsl.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=libpsl +url=https://github.com/rockdaboot/libpsl.git +revision=master +clone-recursive=true diff --git a/subprojects/libsoup.wrap b/subprojects/libsoup.wrap new file mode 100644 index 0000000000..812076d1c3 --- /dev/null +++ b/subprojects/libsoup.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=libsoup +url=https://gitlab.gnome.org/gnome/libsoup.git +revision=master From 2ffe372bddf028bd5eccc164854d4d2e86d4b14a Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Thu, 24 Jan 2019 17:11:59 +0100 Subject: [PATCH 192/448] windows: unconditionally use flex / bison binaries This to simplify the checks made when for example a flex binary is available system wide: the build process was failing when that system wide binary didn't have the required version. Instead of adding more checks and making things more complex, let's just always use our binary subproject. --- meson.build | 5 +--- .../win-flex-bison-binaries/meson.build | 29 +++++++------------ 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/meson.build b/meson.build index 66dec30328..02af00aa31 100644 --- a/meson.build +++ b/meson.build @@ -55,10 +55,7 @@ os.symlink(os.path.join('@1@', 'subprojects', '@0@'), os.path.join('@1@', '@0@')) ''' -# On Windows, if flex/bison aren't found, we use a subproject to get them -flex = find_program('flex', 'win_flex', required : build_system != 'windows') -bison = find_program('bison', 'win_bison', required : build_system != 'windows') -if not flex.found() or not bison.found() +if build_system == 'windows' subproject('win-flex-bison-binaries') endif diff --git a/subprojects/win-flex-bison-binaries/meson.build b/subprojects/win-flex-bison-binaries/meson.build index e56fea73c6..4179265c7f 100644 --- a/subprojects/win-flex-bison-binaries/meson.build +++ b/subprojects/win-flex-bison-binaries/meson.build @@ -1,25 +1,16 @@ project('win-flex-bison-binary', version : '2.5.14') -provide_flex = not find_program('flex', required : false).found() -provide_bison = not find_program('bison', required : false).found() +py3 = import('python3').find_python() -if provide_flex or provide_bison - py3 = import('python3').find_python() +message('Downloading and extracting win-flex-bison binaries...') - message('Downloading and extracting win-flex-bison binaries...') +zip_hash = '354c9aae02aca421c52abfda7fe3ce6c32ad07e25ff3f66e31da9437a0b906cf' - zip_hash = '354c9aae02aca421c52abfda7fe3ce6c32ad07e25ff3f66e31da9437a0b906cf' - - ret = run_command(py3, files('download-binary.py'), meson.project_version(), zip_hash) - if ret.returncode() != 0 - message(ret.stdout()) - error(ret.stderr()) - endif - - if provide_flex - meson.override_find_program('flex', find_program('win_flex')) - endif - if provide_bison - meson.override_find_program('bison', find_program('win_bison')) - endif +ret = run_command(py3, files('download-binary.py'), meson.project_version(), zip_hash) +if ret.returncode() != 0 + message(ret.stdout()) + error(ret.stderr()) endif + +meson.override_find_program('flex', find_program('win_flex')) +meson.override_find_program('bison', find_program('win_bison')) From 33a3686995840adeec304e7be34d56833a6d62be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 21 Jan 2019 17:38:07 +0000 Subject: [PATCH 193/448] Configure gst-rtsp-server before gst-devtools Since gst-devtools checks for gst-rtsp-server and will happily pick up an external dep which isn't what we want if we configure it as subproject afterwards. This assumes meson dicts are always stable, which may not necessarily be the case, but it seems to work in practice for now. See #16 --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 02af00aa31..585041569d 100644 --- a/meson.build +++ b/meson.build @@ -41,9 +41,9 @@ subprojects = { 'gst-omx': { 'option': get_option('omx'), }, 'gst-libav': { 'option': get_option('libav') }, 'gstreamer-vaapi': { 'option': get_option('vaapi') }, + 'gst-rtsp-server': { 'option': get_option('rtsp_server') }, 'gst-devtools': { 'option': get_option('devtools') }, 'gst-editing-services': { 'option': get_option('ges') }, - 'gst-rtsp-server': { 'option': get_option('rtsp_server') }, 'gstreamer-sharp': { 'option': get_option('sharp') }, } From 987067c39c9a453a1571cec73c56f221d81c420a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 28 Jan 2019 23:19:19 +0100 Subject: [PATCH 194/448] subprojects: use libffi and gl-headers from gstreamer gitlab repos https://gitlab.freedesktop.org/gstreamer/gstreamer-project/issues/28 --- subprojects/gl-headers.wrap | 4 ++-- subprojects/libffi.wrap | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/subprojects/gl-headers.wrap b/subprojects/gl-headers.wrap index 4d4d50212f..f5a9fa4f2b 100644 --- a/subprojects/gl-headers.wrap +++ b/subprojects/gl-headers.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=gl-headers -url=https://github.com/centricular/gl-headers.git -push-url=git@github.com:centricular/gl-headers.git +url=https://gitlab.freedesktop.org/gstreamer/meson-ports/gl-headers.git +push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/gl-headers.git revision=master diff --git a/subprojects/libffi.wrap b/subprojects/libffi.wrap index 3d15e2a8a5..0b9fc582d9 100644 --- a/subprojects/libffi.wrap +++ b/subprojects/libffi.wrap @@ -1,4 +1,5 @@ [wrap-git] directory=libffi -url=https://github.com/centricular/libffi.git +url=https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git +push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/libffi.git revision=meson From 50037dd1eb373b9773bca22ef05139d389d83665 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Tue, 29 Jan 2019 10:58:21 +0900 Subject: [PATCH 195/448] Add an orc wrap file for using orc subproject Depending on the newly added 'orc' meson option, this make possible to use orc subproject on gst-build. --- meson.build | 2 ++ meson_options.txt | 1 + subprojects/orc.wrap | 5 +++++ 3 files changed, 8 insertions(+) create mode 100644 subprojects/orc.wrap diff --git a/meson.build b/meson.build index 585041569d..e5a4d16eac 100644 --- a/meson.build +++ b/meson.build @@ -59,6 +59,8 @@ if build_system == 'windows' subproject('win-flex-bison-binaries') endif +subproject('orc', required: get_option('orc')) + subprojects_names = [] foreach project_name, build_infos: subprojects is_required = build_infos.get('option', true) diff --git a/meson_options.txt b/meson_options.txt index 7614c782e3..0d36f6ebb5 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -15,3 +15,4 @@ option('examples', type : 'feature', value : 'auto', description : 'Build exampl option('gtk_doc', type : 'feature', value : 'auto', description : 'Generate API documentation with gtk-doc') option('introspection', type : 'feature', value : 'auto', description : 'Generate introspection data') option('nls', type : 'feature', value : 'auto', description : 'Enable native language support (translations)') +option('orc', type : 'feature', value : 'auto', description : 'Enable Optimized Inner Loop Runtime Compiler') diff --git a/subprojects/orc.wrap b/subprojects/orc.wrap new file mode 100644 index 0000000000..40fb220cbe --- /dev/null +++ b/subprojects/orc.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=orc +url=https://gitlab.freedesktop.org/gstreamer/orc.git +push-url=git@gitlab.freedesktop.org:gstreamer/orc.git +revision=master From 124098adc43bb04cf7adb74f0c736752d7e43c62 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 5 Feb 2019 17:23:49 +0530 Subject: [PATCH 196/448] scripts: Auto-detect whether we can enable colors Also do the setup necessary on Windows to enable ANSI colours on the console (if available). That code is copied from Meson and is Apache2 licensed. --- checkout-branch-worktree | 2 +- common.py | 31 +++++++++++++++++++++++++++---- git-update | 2 +- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/checkout-branch-worktree b/checkout-branch-worktree index 3b29e73771..7f2dbd5185 100755 --- a/checkout-branch-worktree +++ b/checkout-branch-worktree @@ -73,7 +73,7 @@ if __name__ == "__main__": help="The meson build directory") options = parser.parse_args() - if options.no_color: + if options.no_color or not Colors.can_enable(): Colors.disable() if not os.path.exists(options.builddir): diff --git a/common.py b/common.py index 7f16391511..a9eca335b1 100644 --- a/common.py +++ b/common.py @@ -1,9 +1,10 @@ -import argparse import os import sys -import shutil -import subprocess import shlex +import shutil +import argparse +import platform +import subprocess ROOTDIR = os.path.abspath(os.path.dirname(__file__)) @@ -19,6 +20,27 @@ class Colors: force_disable = False + def _windows_ansi(): + from ctypes import windll, byref + from ctypes.wintypes import DWORD + + kernel = windll.kernel32 + stdout = kernel.GetStdHandle(-11) + mode = DWORD() + if not kernel.GetConsoleMode(stdout, byref(mode)): + return False + # Try setting ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x4) + # If that fails (returns 0), we disable colors + return kernel.SetConsoleMode(stdout, mode.value | 0x4) or os.environ.get('ANSICON') + + @classmethod + def can_enable(cls): + if not os.isatty(sys.stdout.fileno()): + return False + if platform.system().lower() == 'windows': + return cls._windows_ansi() + return os.environ.get('TERM') != 'dumb' + @classmethod def disable(cls): cls.HEADER = '' @@ -44,7 +66,8 @@ class Colors: def git(*args, repository_path='.'): return subprocess.check_output(["git"] + list(args), cwd=repository_path, - ).decode() + stdin=subprocess.DEVNULL, + stderr=subprocess.STDOUT).decode() def accept_command(commands): """Search @commands and returns the first found absolute path.""" diff --git a/git-update b/git-update index ce1a1099ad..71c6d038a1 100755 --- a/git-update +++ b/git-update @@ -136,7 +136,7 @@ if __name__ == "__main__": help="Use a android repo manifest to sync repositories" " Note that it will let all repositories in detached state") options = parser.parse_args() - if options.no_color: + if options.no_color or not Colors.can_enable(): Colors.disable() if options.no_interaction: From 62c85c49e65837c5cd5dccede82a65e836be43a7 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 5 Feb 2019 17:53:10 +0530 Subject: [PATCH 197/448] Add orc to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ed679e59c2..f9c4f631da 100644 --- a/.gitignore +++ b/.gitignore @@ -44,5 +44,6 @@ subprojects/openh264/ subprojects/pygobject/ subprojects/pycairo/ subprojects/json-glib/ +subprojects/orc/ prefix/ pygobject From 530307ed47ad14ff944e7366340e0b860ff04b64 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 5 Feb 2019 22:43:30 +0530 Subject: [PATCH 198/448] New subproject win-nasm to provide nasm on Windows This is needed for building openh264 as a subproject. Currently it's downloaded unconditionally since the download is very small. --- meson.build | 1 + subprojects/win-nasm/.gitignore | 2 + subprojects/win-nasm/download-binary.py | 51 +++++++++++++++++++++++++ subprojects/win-nasm/meson.build | 20 ++++++++++ 4 files changed, 74 insertions(+) create mode 100644 subprojects/win-nasm/.gitignore create mode 100644 subprojects/win-nasm/download-binary.py create mode 100644 subprojects/win-nasm/meson.build diff --git a/meson.build b/meson.build index e5a4d16eac..8131d45522 100644 --- a/meson.build +++ b/meson.build @@ -57,6 +57,7 @@ os.symlink(os.path.join('@1@', 'subprojects', '@0@'), if build_system == 'windows' subproject('win-flex-bison-binaries') + subproject('win-nasm') endif subproject('orc', required: get_option('orc')) diff --git a/subprojects/win-nasm/.gitignore b/subprojects/win-nasm/.gitignore new file mode 100644 index 0000000000..12f2372377 --- /dev/null +++ b/subprojects/win-nasm/.gitignore @@ -0,0 +1,2 @@ +nasm-*/ +nasm-*.zip diff --git a/subprojects/win-nasm/download-binary.py b/subprojects/win-nasm/download-binary.py new file mode 100644 index 0000000000..26ad64ba1e --- /dev/null +++ b/subprojects/win-nasm/download-binary.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 + +import os +import sys +import ssl +import zipfile +import hashlib +import urllib.request + +# Disable certificate checking because it always fails on Windows +# We verify the checksum anyway. +ctx = ssl.create_default_context() +ctx.check_hostname = False +ctx.verify_mode = ssl.CERT_NONE + +base_url = 'https://www.nasm.us/pub/nasm/releasebuilds/{0}/{1}/nasm-{0}-{1}.zip' +arch = 'win64' if sys.argv[2] == 'x86_64' else 'win32' +url = base_url.format(sys.argv[1], arch) +zip_sha256 = sys.argv[3] +source_dir = os.path.join(os.environ['MESON_SOURCE_ROOT'], os.environ['MESON_SUBDIR']) +dest = os.path.basename(url) +dest_path = os.path.join(source_dir, dest) + +def get_sha256(zipf): + hasher = hashlib.sha256() + with open(zipf, 'rb') as f: + hasher.update(f.read()) + return hasher.hexdigest() + +if os.path.isfile(dest_path): + found_sha256 = get_sha256(dest_path) + if found_sha256 == zip_sha256: + print('{} already downloaded'.format(dest)) + sys.exit(0) + else: + print('{} checksum mismatch, redownloading'.format(dest)) + +print('Downloading {} to {}'.format(url, dest)) +with open(dest_path, 'wb') as d: + f = urllib.request.urlopen(url, context=ctx) + d.write(f.read()) + +found_sha256 = get_sha256(dest_path) +if found_sha256 != zip_sha256: + print('SHA256 of downloaded file {} was {} instead of {}' + ''.format(dest, found_sha256, zip_sha256)) + sys.exit(1) + +print('Extracting {}'.format(dest)) +zf = zipfile.ZipFile(dest_path, "r") +zf.extractall(path=source_dir) diff --git a/subprojects/win-nasm/meson.build b/subprojects/win-nasm/meson.build new file mode 100644 index 0000000000..d7775f56fb --- /dev/null +++ b/subprojects/win-nasm/meson.build @@ -0,0 +1,20 @@ +project('win-nasm', version : '2.14.02') + +py3 = import('python3').find_python() + +message('Downloading and extracting nasm binaries for Windows...') + +arch = host_machine.cpu_family() +if arch == 'x86_64' + zip_hash = '18918ac906e29417b936466e7a2517068206c8db8c04b9762a5befa18bfea5f0' +else + zip_hash = '250f9b5eeb2111e8c7b494a977490985b8604fe7518a6f5041cde37cc727a067' +endif + +ret = run_command(py3, files('download-binary.py'), meson.project_version(), arch, zip_hash) +if ret.returncode() != 0 + message(ret.stdout()) + error(ret.stderr()) +endif + +meson.override_find_program('nasm', find_program(join_paths('nasm-@0@'.format(meson.project_version()), 'nasm'))) From f256d118f03e68b54ddb9dc87c838916b2b8d6ce Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 6 Feb 2019 15:44:11 +0530 Subject: [PATCH 199/448] openh264.wrap: Update the upstream commit Needed for building on Windows with MSVC. --- subprojects/openh264.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/openh264.wrap b/subprojects/openh264.wrap index 5d72543e80..2b71eade76 100644 --- a/subprojects/openh264.wrap +++ b/subprojects/openh264.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=openh264 url=https://github.com/cisco/openh264.git -revision=a1b3f07c5271f312997fcc3451237031444c4475 +revision=894eb0c6e1e0f5f96df7a18e1eaf13d65c8eec81 From 6f33955af42d91b50720b8a4a425f45ca0598d1e Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 8 Feb 2019 16:25:29 +0530 Subject: [PATCH 200/448] Add subprojects/libsoup/ to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f9c4f631da..102872b15f 100644 --- a/.gitignore +++ b/.gitignore @@ -45,5 +45,6 @@ subprojects/pygobject/ subprojects/pycairo/ subprojects/json-glib/ subprojects/orc/ +subprojects/libsoup/ prefix/ pygobject From a9bcc8f0ee6a8fc91bf32beaa84c1803997f289b Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 14 Feb 2019 14:01:52 +0530 Subject: [PATCH 201/448] gst-uninstalled: Fix compatibility with meson 0.50 Starting with Meson 0.50, meson instrospect --targets uses a list for the filename and install_filenames of each target. Handle both lists and strings. --- gst-uninstalled.py | 55 ++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 99bf4876f7..01b40fe244 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -26,6 +26,22 @@ if not os.path.exists(DEFAULT_BUILDDIR): DEFAULT_BUILDDIR = os.path.join(SCRIPTDIR, '_build') +def listify(o): + if isinstance(o, str): + return [o] + if isinstance(o, list): + return o + raise AssertionError('Object {!r} must be a string or a list'.format(o)) + +def stringify(o): + if isinstance(o, str): + return o + if isinstance(o, list): + if len(o) == 1: + return o[0] + raise AssertionError('Did not expect object {!r} to have more than one element'.format(o)) + raise AssertionError('Object {!r} must be a string or a list'.format(o)) + def prepend_env_var(env, var, value): env[var] = os.pathsep + value + os.pathsep + env.get(var, "") env[var] = env[var].replace(os.pathsep + os.pathsep, os.pathsep).strip(os.pathsep) @@ -83,27 +99,28 @@ def get_subprocess_env(options, gst_version): mono_paths = set() srcdir_path = pathlib.Path(options.srcdir) for target in targets: - filename = target['filename'] - root = os.path.dirname(filename) - if srcdir_path / "subprojects/gst-devtools/validate/plugins" in (srcdir_path / root).parents: - continue - if filename.endswith('.dll'): - mono_paths.add(os.path.join(options.builddir, root)) - if typelib_reg.search(filename): - prepend_env_var(env, "GI_TYPELIB_PATH", - os.path.join(options.builddir, root)) - elif sharedlib_reg.search(filename): - if target.get('type') != "shared library": + filenames = listify(target['filename']) + for filename in filenames: + root = os.path.dirname(filename) + if srcdir_path / "subprojects/gst-devtools/validate/plugins" in (srcdir_path / root).parents: continue + if filename.endswith('.dll'): + mono_paths.add(os.path.join(options.builddir, root)) + if typelib_reg.search(filename): + prepend_env_var(env, "GI_TYPELIB_PATH", + os.path.join(options.builddir, root)) + elif sharedlib_reg.search(filename): + if not target['type'].startswith('shared'): + continue + if target['installed']: + if pluginpath_reg.search(os.path.normpath(stringify(target['install_filename']))): + prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(options.builddir, root)) + continue - if target.get('installed') and pluginpath_reg.search(os.path.normpath(target.get('install_filename'))): - prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(options.builddir, root)) - continue - - prepend_env_var(env, lib_path_envvar, - os.path.join(options.builddir, root)) - elif target.get('type') == 'executable' and target.get('installed'): - paths.add(os.path.join(options.builddir, root)) + prepend_env_var(env, lib_path_envvar, + os.path.join(options.builddir, root)) + elif target['type'] == 'executable' and target['installed']: + paths.add(os.path.join(options.builddir, root)) for p in paths: prepend_env_var(env, 'PATH', p) From 7ea556d034c63a293d0579d6553eb6d43ebbbfb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 18 Feb 2019 16:13:07 +0000 Subject: [PATCH 202/448] Configure subprojects in the right order Use an array instead of a dict to make sure we iterate over the list of subprojects in the right order, which is first GStreamer core, then gst-plugins-base, then other things. Without this subprojects might get configured in random order, in which case gstreamer or gst-plugins-base libs might get picked up via pkg-config if they are also available installed, instead of being picked up from the subproject. This breaks all kinds of assumptions in gst-build and will likely have strange effects and/or lead to build failures such as subprojects/gst-plugins-good/tests/check/meson.build:144:2: ERROR: 'gstreamer-plugins-base-1.0' is not a pkgconfig dependency --- meson.build | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index 8131d45522..b5cabc2aae 100644 --- a/meson.build +++ b/meson.build @@ -30,22 +30,23 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif endif -subprojects = { - 'gstreamer': {}, - 'gst-plugins-base': {}, - 'gst-plugins-good': {}, - 'gst-plugins-bad': { 'option': get_option('bad') }, - 'gst-plugins-ugly': { 'option': get_option('ugly') }, - 'pygobject': { 'option': get_option('python') }, - 'gst-python': { 'option': get_option('python') }, - 'gst-omx': { 'option': get_option('omx'), }, - 'gst-libav': { 'option': get_option('libav') }, - 'gstreamer-vaapi': { 'option': get_option('vaapi') }, - 'gst-rtsp-server': { 'option': get_option('rtsp_server') }, - 'gst-devtools': { 'option': get_option('devtools') }, - 'gst-editing-services': { 'option': get_option('ges') }, - 'gstreamer-sharp': { 'option': get_option('sharp') }, -} +# Ordered list of subprojects (dict has no ordering guarantees) +subprojects = [ + ['gstreamer', {}], + ['gst-plugins-base', {}], + ['gst-plugins-good', {}], + ['gst-plugins-bad', { 'option': get_option('bad') }], + ['gst-plugins-ugly', { 'option': get_option('ugly') }], + ['gst-libav', { 'option': get_option('libav') }], + ['gst-rtsp-server', { 'option': get_option('rtsp_server') }], + ['gst-devtools', { 'option': get_option('devtools') }], + ['gst-editing-services', { 'option': get_option('ges') }], + ['gstreamer-vaapi', { 'option': get_option('vaapi') }], + ['gst-omx', { 'option': get_option('omx'), }], + ['gstreamer-sharp', { 'option': get_option('sharp') }], + ['pygobject', { 'option': get_option('python') }], + ['gst-python', { 'option': get_option('python') }], +] python3 = import('python3').find_python() symlink = ''' @@ -63,7 +64,9 @@ endif subproject('orc', required: get_option('orc')) subprojects_names = [] -foreach project_name, build_infos: subprojects +foreach sp : subprojects + project_name = sp[0] + build_infos = sp[1] is_required = build_infos.get('option', true) subproj = subproject(project_name, version: gst_version, required: is_required) if subproj.found() From cb21aed7dc128b260a945d30d52f890625ed3af7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 18 Feb 2019 16:53:07 +0000 Subject: [PATCH 203/448] meson: use new 'python' module instead of deprecated 'python3' one https://github.com/mesonbuild/meson/pull/4169 --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index b5cabc2aae..00fc9b5ede 100644 --- a/meson.build +++ b/meson.build @@ -48,7 +48,7 @@ subprojects = [ ['gst-python', { 'option': get_option('python') }], ] -python3 = import('python3').find_python() +python3 = import('python').find_installation() symlink = ''' import os From a603acf512bc22c385eb0d4bbcd2bf6572cf5ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sun, 3 Mar 2019 20:58:38 +0000 Subject: [PATCH 204/448] Build 1.15.2 release --- meson.build | 2 +- subprojects/gl-headers.wrap | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/meson.build b/meson.build index 00fc9b5ede..34967a70fd 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.15.0.1', + version : '1.15.2', meson_version : '>= 0.48.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gl-headers.wrap b/subprojects/gl-headers.wrap index f5a9fa4f2b..37848b624f 100644 --- a/subprojects/gl-headers.wrap +++ b/subprojects/gl-headers.wrap @@ -2,4 +2,4 @@ directory=gl-headers url=https://gitlab.freedesktop.org/gstreamer/meson-ports/gl-headers.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/gl-headers.git -revision=master +revision=1f8083d8f23de174552fe8a7bf9fbe513f76696b diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 3ad4f0fce3..63c7043e97 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=master +revision=1.15.2 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 0e3510a56f..352d498388 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=master +revision=1.15.2 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index d01154348a..d251c856d4 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=master +revision=1.15.2 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index d5ba267d17..edf234c6f0 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=master +revision=1.15.2 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 7d3a04af64..1a1cee10cd 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=master +revision=1.15.2 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 705662d731..424aad9e92 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=master +revision=1.15.2 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 7ed12291ce..f6eb93d917 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=master +revision=1.15.2 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index bab6ef61be..cea3c89147 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=master +revision=1.15.2 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b3e87a738..b6b201f927 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=master +revision=1.15.2 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index c7b473b3b2..859306d6fc 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=master +revision=1.15.2 diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index a14dab93a9..04c137351b 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=master +revision=1.15.2 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8765f69928..54231b133a 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=master +revision=1.15.2 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 85aa7f483a..389fcbf278 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=master +revision=1.15.2 From 406caf378d956c587b522d14e9d12fc45d51fc90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sun, 3 Mar 2019 21:00:32 +0000 Subject: [PATCH 205/448] Back to development --- meson.build | 2 +- subprojects/gl-headers.wrap | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/meson.build b/meson.build index 34967a70fd..776626eb0c 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.15.2', + version : '1.15.2.1', meson_version : '>= 0.48.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gl-headers.wrap b/subprojects/gl-headers.wrap index 37848b624f..f5a9fa4f2b 100644 --- a/subprojects/gl-headers.wrap +++ b/subprojects/gl-headers.wrap @@ -2,4 +2,4 @@ directory=gl-headers url=https://gitlab.freedesktop.org/gstreamer/meson-ports/gl-headers.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/gl-headers.git -revision=1f8083d8f23de174552fe8a7bf9fbe513f76696b +revision=master diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 63c7043e97..3ad4f0fce3 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=1.15.2 +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 352d498388..0e3510a56f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=1.15.2 +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index d251c856d4..d01154348a 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=1.15.2 +revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index edf234c6f0..d5ba267d17 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=1.15.2 +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 1a1cee10cd..7d3a04af64 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=1.15.2 +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 424aad9e92..705662d731 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=1.15.2 +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index f6eb93d917..7ed12291ce 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=1.15.2 +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index cea3c89147..bab6ef61be 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=1.15.2 +revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index b6b201f927..2b3e87a738 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=1.15.2 +revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index 859306d6fc..c7b473b3b2 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=1.15.2 +revision=master diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index 04c137351b..a14dab93a9 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=1.15.2 +revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 54231b133a..8765f69928 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=1.15.2 +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 389fcbf278..85aa7f483a 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=1.15.2 +revision=master From 887da9a04b68ef240f59f4ce32fd102ae618e833 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 13 Mar 2019 19:08:59 -0300 Subject: [PATCH 206/448] Add gst-integration-testsuites as a subproject --- meson.build | 3 ++- subprojects/gst-integration-testsuites.wrap | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 subprojects/gst-integration-testsuites.wrap diff --git a/meson.build b/meson.build index 776626eb0c..426e8edff7 100644 --- a/meson.build +++ b/meson.build @@ -39,7 +39,8 @@ subprojects = [ ['gst-plugins-ugly', { 'option': get_option('ugly') }], ['gst-libav', { 'option': get_option('libav') }], ['gst-rtsp-server', { 'option': get_option('rtsp_server') }], - ['gst-devtools', { 'option': get_option('devtools') }], + ['gst-devtools', { 'option': get_option('devtools')}], + ['gst-integration-testsuites', { 'option': get_option('devtools') }], ['gst-editing-services', { 'option': get_option('ges') }], ['gstreamer-vaapi', { 'option': get_option('vaapi') }], ['gst-omx', { 'option': get_option('omx'), }], diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap new file mode 100644 index 0000000000..357edc2d9f --- /dev/null +++ b/subprojects/gst-integration-testsuites.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gst-integration-testsuites +url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git +revision=master From 8af2376bc0cf366019fc0212f2b441439ada1609 Mon Sep 17 00:00:00 2001 From: Antonio Ospite Date: Fri, 8 Mar 2019 17:38:43 +0100 Subject: [PATCH 207/448] gst-uninstalled: make the bash prompt override optional When using a custom prompt the automatic override may not look good, so provide a mechanism to disable it. Document that the user will have to use GST_ENV manually when setting the prompt to have a visual indicator of the gst-uninstalled environment. --- README.md | 14 +++++++++++++- gst-uninstalled.py | 3 ++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5ccc9ef18f..8e1ac7a1ca 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,19 @@ built in a `build` directory you can simply run: ### Bash prompt -We automatically handle `bash` and set `$PS1` accordingly +We automatically handle `bash` and set `$PS1` accordingly. + +If the automatic `$PS1` override is not desired (maybe you have a fancy custom prompt), set the `$GST_BUILD_DISABLE_PS1_OVERRIDE` environment variable to `TRUE` and use `$GST_ENV` when setting the custom prompt, for example with a snippet like the following: + +```bash +... +if [[ -n "${GST_ENV-}" ]]; +then + PS1+="[ ${GST_ENV} ]" +fi +... + +``` ### Zsh prompt diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 01b40fe244..1e5adabcde 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -14,6 +14,7 @@ import tempfile import pathlib from distutils.sysconfig import get_python_lib +from distutils.util import strtobool from common import get_meson from common import git @@ -229,7 +230,7 @@ if __name__ == "__main__": args += ['/k', 'prompt [gst-{}] $P$G'.format(gst_version)] else: args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] - if "bash" in args[0]: + if "bash" in args[0] and not strtobool(os.environ.get("GST_BUILD_DISABLE_PS1_OVERRIDE", r"FALSE")): bashrc = os.path.expanduser('~/.bashrc') if os.path.exists(bashrc): tmprc = tempfile.NamedTemporaryFile(mode='w') From fa32c47022acc0516358d2f293e65e270b1f1f87 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 23 Mar 2019 00:40:43 +0530 Subject: [PATCH 208/448] Add FFmpeg.wrap and update .gitignore Tested on Linux and Windows (MSVC) --- .gitignore | 3 +++ subprojects/FFmpeg.wrap | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 subprojects/FFmpeg.wrap diff --git a/.gitignore b/.gitignore index 102872b15f..37ee5c2c1f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ cscope.out cscope.po.out gst-devtools gst-editing-services +gst-integration-testsuites gst-libav gst-omx gst-plugins-bad @@ -17,6 +18,7 @@ gstreamer-sharp gstreamer-vaapi __pycache__ meson/ +subprojects/gst-integration-testsuites/ subprojects/gst-devtools/ subprojects/gst-editing-services/ subprojects/gst-libav/ @@ -46,5 +48,6 @@ subprojects/pycairo/ subprojects/json-glib/ subprojects/orc/ subprojects/libsoup/ +subprojects/FFmpeg/ prefix/ pygobject diff --git a/subprojects/FFmpeg.wrap b/subprojects/FFmpeg.wrap new file mode 100644 index 0000000000..a050d5caa3 --- /dev/null +++ b/subprojects/FFmpeg.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=FFmpeg +url=https://gitlab.freedesktop.org/gstreamer/meson-ports/ffmpeg.git +push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/ffmpeg.git +revision=meson-4.1.1 From b0eea913a492faf30cc700daf1f9c3cc804abcc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 29 Mar 2019 13:23:51 +0000 Subject: [PATCH 209/448] README: small updates --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 8e1ac7a1ca..24b5f11dac 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,20 @@ meson and its [subproject](https://github.com/mesonbuild/meson/wiki/Subprojects) ### Install meson and ninja +Meson 0.48 or newer is required. + You should get meson through your package manager or using: $ pip3 install --user meson +This will install meson into ~/.local/bin which may or may not be included +automatically in your PATH by default. + If you are building on Windows, do not use the Meson MSI installer since it is experimental and will likely not work. +You can also run meson directly from a meson git checkout if you like. + You should get `ninja` using your package manager or download the [official release](https://github.com/ninja-build/ninja/releases) and put it in your PATH. From f42544cb6b1a55d0d4abe17710b673aa44008f1d Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Fri, 25 Jan 2019 02:13:08 +0900 Subject: [PATCH 210/448] uninstalled: Add support PowerShell on Windows ... depending on detected shell program. For instance, if the nearest ancestor process is PowerShell, run uninstalled environment via PowerShell. Otherwise, $COMSPEC (most likely cmd.exe) will be used. --- cmd_or_ps.ps1 | 19 +++++++++++++++++++ gst-uninstalled.py | 16 ++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 cmd_or_ps.ps1 diff --git a/cmd_or_ps.ps1 b/cmd_or_ps.ps1 new file mode 100644 index 0000000000..b134006517 --- /dev/null +++ b/cmd_or_ps.ps1 @@ -0,0 +1,19 @@ +$i=1 +$ppid=(gwmi win32_process -Filter "processid='$pid'").parentprocessid +$pname=(Get-Process -id $ppid).Name +While($true) { + if($pname -eq "cmd" -Or $pname -eq "powershell") { + Write-Host ("{0}.exe" -f $pname) + Break + } + + # 10 times iteration seems to be sufficient + if($i -gt 10) { + Break + } + + # not found yet, find grand parant + $ppid=(gwmi win32_process -Filter "processid='$ppid'").parentprocessid + $pname=(Get-Process -id $ppid).Name + $i++ +} diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 1e5adabcde..211c60ad53 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -193,6 +193,11 @@ def get_subprocess_env(options, gst_version): return env +def get_windows_shell(): + command = ['powershell.exe' ,'-noprofile', '-executionpolicy', 'bypass', '-file', 'cmd_or_ps.ps1'] + result = subprocess.check_output(command) + return result.decode().strip() + # https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv def in_venv(): return (hasattr(sys, 'real_prefix') or @@ -226,8 +231,15 @@ if __name__ == "__main__": if not args: if os.name is 'nt': - args = [os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe")] - args += ['/k', 'prompt [gst-{}] $P$G'.format(gst_version)] + shell = get_windows_shell() + if shell == 'powershell.exe': + args = ['powershell.exe'] + args += ['-NoLogo', '-NoExit'] + prompt = 'function global:prompt { "[gst-' + gst_version + '"+"] PS " + $PWD + "> "}' + args += ['-Command', prompt] + else: + args = [os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe")] + args += ['/k', 'prompt [gst-{}] $P$G'.format(gst_version)] else: args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] if "bash" in args[0] and not strtobool(os.environ.get("GST_BUILD_DISABLE_PS1_OVERRIDE", r"FALSE")): From 0f55b18c8c2be76c068ffd9592391bb68d515e9a Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 1 Apr 2019 23:36:33 +0530 Subject: [PATCH 211/448] meson: Add a subproject wrap file for x264 This allows building x264enc from -ugly on all platforms. --- .gitignore | 1 + subprojects/x264.wrap | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 subprojects/x264.wrap diff --git a/.gitignore b/.gitignore index 37ee5c2c1f..5a8d92ab70 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,6 @@ subprojects/json-glib/ subprojects/orc/ subprojects/libsoup/ subprojects/FFmpeg/ +subprojects/x264/ prefix/ pygobject diff --git a/subprojects/x264.wrap b/subprojects/x264.wrap new file mode 100644 index 0000000000..46978d39f2 --- /dev/null +++ b/subprojects/x264.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=x264 +url=https://gitlab.freedesktop.org/gstreamer/meson-ports/x264.git +push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/x264.git +revision=157.2945-meson From f46066011f804a4a1bcc0b820ac898811e627d9f Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 1 Apr 2019 23:55:14 +0530 Subject: [PATCH 212/448] gst-uninstalled: Add qt5 DLLs to PATH on Windows This is needed for using the qmlgl out of the box inside gst-uninstalled. Of course this won't work if the user is using a native file to specify the path to `qmake`. --- gst-uninstalled.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 211c60ad53..982988a010 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -85,14 +85,20 @@ def get_subprocess_env(options, gst_version): 'gst-python', 'plugin')) prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(PREFIX_DIR, 'lib', 'gstreamer-1.0')) - prepend_env_var(env, "PATH", os.path.join(PREFIX_DIR, 'bin')) - prepend_env_var(env, lib_path_envvar, os.path.join(PREFIX_DIR, 'lib')) prepend_env_var(env, "GST_VALIDATE_SCENARIOS_PATH", os.path.join( PREFIX_DIR, 'share', 'gstreamer-1.0', 'validate', 'scenarios')) prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(PREFIX_DIR, 'lib', 'lib', 'girepository-1.0')) prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(PREFIX_DIR, 'lib', 'pkgconfig')) + # Library and binary search paths + prepend_env_var(env, "PATH", os.path.join(PREFIX_DIR, 'bin')) + if lib_path_envvar != 'PATH': + prepend_env_var(env, lib_path_envvar, os.path.join(PREFIX_DIR, 'lib')) + elif 'QMAKE' in os.environ: + # There's no RPATH on Windows, so we need to set PATH for the qt5 DLLs + prepend_env_var(env, 'PATH', os.path.dirname(os.environ['QMAKE'])) + meson = get_meson() targets_s = subprocess.check_output(meson + ['introspect', options.builddir, '--targets']) targets = json.loads(targets_s.decode()) From acf83f17c2d8abfc579fddd5b628bf1a35e4f883 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 2 Apr 2019 00:00:10 +0530 Subject: [PATCH 213/448] README.md: Document how to build the qt5 plugin --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 24b5f11dac..33f4a2ac70 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,17 @@ NOTE: on fedora (and maybe other distributions) replace `ninja` with `ninja-buil # Development environment +## Building the Qt5 QML plugin + +If `qmake` is not in `PATH` and pkgconfig files are not available, you can +point the `QMAKE` env var to the Qt5 installation of your choosing before +running `meson` as shown above. + +The plugin will be automatically enabled if possible, but you can ensure that +it is built by passing `-Dgst-plugins-good:qt5=enabled` to `meson`. This will +cause Meson to error out if the plugin could not be enabled. This also works +for all plugins in all GStreamer repositories. + ## Uninstalled environment gst-build also contains a special `uninstalled` target that lets you enter an From d3029ec0d606016f4d0ba15ea64812a12b607087 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Fri, 5 Apr 2019 15:27:37 +0200 Subject: [PATCH 214/448] add libnice as a top-level subproject. When relying on a system-wide libnice, we end up not building the nice elements, which means we can't use them, and by extension webrtcbin, in the uninstalled environment. This also introduces a way to avoid checking the version of a given subproject, and makes use of it for libnice and pygobject, which only passed the version check by chance, as its current major version is 3. --- meson.build | 12 ++++++++++-- meson_options.txt | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 426e8edff7..f0c7c410dd 100644 --- a/meson.build +++ b/meson.build @@ -35,6 +35,7 @@ subprojects = [ ['gstreamer', {}], ['gst-plugins-base', {}], ['gst-plugins-good', {}], + ['libnice', { 'option': get_option('libnice'), 'match_gst_version': false}], ['gst-plugins-bad', { 'option': get_option('bad') }], ['gst-plugins-ugly', { 'option': get_option('ugly') }], ['gst-libav', { 'option': get_option('libav') }], @@ -45,7 +46,7 @@ subprojects = [ ['gstreamer-vaapi', { 'option': get_option('vaapi') }], ['gst-omx', { 'option': get_option('omx'), }], ['gstreamer-sharp', { 'option': get_option('sharp') }], - ['pygobject', { 'option': get_option('python') }], + ['pygobject', { 'option': get_option('python'), 'match_gst_version': false }], ['gst-python', { 'option': get_option('python') }], ] @@ -69,7 +70,14 @@ foreach sp : subprojects project_name = sp[0] build_infos = sp[1] is_required = build_infos.get('option', true) - subproj = subproject(project_name, version: gst_version, required: is_required) + match_gst_version = build_infos.get('match_gst_version', true) + + if match_gst_version + subproj = subproject(project_name, version: gst_version, required: is_required) + else + subproj = subproject(project_name, required: is_required) + endif + if subproj.found() subprojects_names += [project_name] cmdres = run_command(python3, '-c', symlink.format(project_name, meson.current_source_dir())) diff --git a/meson_options.txt b/meson_options.txt index 0d36f6ebb5..624979b621 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,5 +1,6 @@ option('python', type : 'feature', value : 'auto') option('libav', type : 'feature', value : 'auto') +option('libnice', type : 'feature', value : 'auto') option('ugly', type : 'feature', value : 'auto') option('bad', type : 'feature', value : 'auto') option('devtools', type : 'feature', value : 'auto') From 35e6c8b160af4cb80fd2a730c99d33bd1dabeaa6 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 12 Apr 2019 10:52:37 +0530 Subject: [PATCH 215/448] glib.wrap: Use the glib-2-60 stable branch instead of master This fixes https://gitlab.freedesktop.org/gstreamer/gst-build/issues/21 --- subprojects/glib.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index 87021ae4d9..e30b0f2763 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -2,4 +2,4 @@ directory=glib url=https://gitlab.gnome.org/GNOME/glib.git push-url=git@gitlab.gnome.org:GNOME/glib.git -revision=master +revision=glib-2-60 From c786776f270581c2853abffd20d0debc43ef1544 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 15 Apr 2019 15:32:36 +0530 Subject: [PATCH 216/448] gst-uninstalled: De-dedup before prepending to an env var Helps us avoid breaching the maximum length limit for env var values on Windows. --- gst-uninstalled.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 982988a010..03b9416f96 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -44,7 +44,12 @@ def stringify(o): raise AssertionError('Object {!r} must be a string or a list'.format(o)) def prepend_env_var(env, var, value): - env[var] = os.pathsep + value + os.pathsep + env.get(var, "") + env_val = env.get(var, '') + val = os.pathsep + value + os.pathsep + # Don't add the same value twice + if val in env_val or env_val.startswith(value + os.pathsep): + return + env[var] = val + env_val env[var] = env[var].replace(os.pathsep + os.pathsep, os.pathsep).strip(os.pathsep) From d422c2b79112e061782d938cc0890e2bdd5854eb Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 15 Apr 2019 15:34:44 +0530 Subject: [PATCH 217/448] gst-uninstalled: Try to use short names for env vars on Windows Try even harder to not hit the maximum length limit for env var values on Windows. Reduces the size by ~1000 characters on my machine. --- common.py | 21 +++++++++++++++++++++ gst-uninstalled.py | 4 ++++ 2 files changed, 25 insertions(+) diff --git a/common.py b/common.py index a9eca335b1..5cea742027 100644 --- a/common.py +++ b/common.py @@ -10,6 +10,27 @@ import subprocess ROOTDIR = os.path.abspath(os.path.dirname(__file__)) +if os.name is 'nt': + import ctypes + from ctypes import wintypes + _GetShortPathNameW = ctypes.windll.kernel32.GetShortPathNameW + _GetShortPathNameW.argtypes = [wintypes.LPCWSTR, wintypes.LPWSTR, wintypes.DWORD] + _GetShortPathNameW.restype = wintypes.DWORD + +def win32_get_short_path_name(long_name): + """ + Gets the short path name of a given long path. + http://stackoverflow.com/a/23598461/200291 + """ + output_buf_size = 0 + while True: + output_buf = ctypes.create_unicode_buffer(output_buf_size) + needed = _GetShortPathNameW(long_name, output_buf, output_buf_size) + if output_buf_size >= needed: + return output_buf.value + else: + output_buf_size = needed + class Colors: HEADER = '\033[95m' OKBLUE = '\033[94m' diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 03b9416f96..78c5ec1188 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -18,6 +18,7 @@ from distutils.util import strtobool from common import get_meson from common import git +from common import win32_get_short_path_name SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) PREFIX_DIR = os.path.join(SCRIPTDIR, 'prefix') @@ -44,6 +45,9 @@ def stringify(o): raise AssertionError('Object {!r} must be a string or a list'.format(o)) def prepend_env_var(env, var, value): + # Try not to exceed maximum length limits for env vars on Windows + if os.name is 'nt': + value = win32_get_short_path_name(value) env_val = env.get(var, '') val = os.pathsep + value + os.pathsep # Don't add the same value twice From 6a3a7760f2ceabe7f7645bf8e5d01c4da5fc32d6 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 15 Apr 2019 15:46:27 +0530 Subject: [PATCH 218/448] ffmpeg.wrap: Bump to 4.1.3 Tested on Windows. --- subprojects/FFmpeg.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/FFmpeg.wrap b/subprojects/FFmpeg.wrap index a050d5caa3..b29dce6c2f 100644 --- a/subprojects/FFmpeg.wrap +++ b/subprojects/FFmpeg.wrap @@ -2,4 +2,4 @@ directory=FFmpeg url=https://gitlab.freedesktop.org/gstreamer/meson-ports/ffmpeg.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/ffmpeg.git -revision=meson-4.1.1 +revision=meson-4.1.3 From be1eae5df3f9b98410e3af890f412f527d70dec1 Mon Sep 17 00:00:00 2001 From: Mart Raudsepp Date: Tue, 16 Apr 2019 16:00:45 +0300 Subject: [PATCH 219/448] gitignore: Add top-level libnice symlink Missed adjustment from commit d3029ec0d606016. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5a8d92ab70..86e5b17c31 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ gst-rtsp-server gstreamer gstreamer-sharp gstreamer-vaapi +libnice __pycache__ meson/ subprojects/gst-integration-testsuites/ From 8a2ac5c668e9cf65dbd905be9b9aa996ed420429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 15 Apr 2019 09:49:10 +0100 Subject: [PATCH 220/448] subprojects: orc: pin to 0.4.29 release --- subprojects/orc.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/orc.wrap b/subprojects/orc.wrap index 40fb220cbe..aa184d467b 100644 --- a/subprojects/orc.wrap +++ b/subprojects/orc.wrap @@ -2,4 +2,4 @@ directory=orc url=https://gitlab.freedesktop.org/gstreamer/orc.git push-url=git@gitlab.freedesktop.org:gstreamer/orc.git -revision=master +revision=0.4.29 From 462a2089ef648cf0927d710ac9b1bc75000b8e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 15 Apr 2019 09:49:34 +0100 Subject: [PATCH 221/448] subprojects: libsoup: pin to latest release --- subprojects/libsoup.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libsoup.wrap b/subprojects/libsoup.wrap index 812076d1c3..b4310d0b25 100644 --- a/subprojects/libsoup.wrap +++ b/subprojects/libsoup.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=libsoup url=https://gitlab.gnome.org/gnome/libsoup.git -revision=master +revision=2.66.1 From c0a8dd04b52d3f020fdb93ee9b3790217b01d26f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sun, 3 Mar 2019 20:58:38 +0000 Subject: [PATCH 222/448] Build 1.15.90 release --- meson.build | 2 +- subprojects/gl-headers.wrap | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/meson.build b/meson.build index f0c7c410dd..6b2407fc50 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.15.2.1', + version : '1.15.90', meson_version : '>= 0.48.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gl-headers.wrap b/subprojects/gl-headers.wrap index f5a9fa4f2b..0c9d533ff6 100644 --- a/subprojects/gl-headers.wrap +++ b/subprojects/gl-headers.wrap @@ -2,4 +2,4 @@ directory=gl-headers url=https://gitlab.freedesktop.org/gstreamer/meson-ports/gl-headers.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/gl-headers.git -revision=master +revision=5c8c7c0d3ca1f0b783272dac0b95e09414e49bc8 diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 3ad4f0fce3..b743936657 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=master +revision=1.15.90 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 0e3510a56f..7c0357fe86 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=master +revision=1.15.90 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index d01154348a..578b9a0d92 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=master +revision=1.15.90 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index d5ba267d17..2d3c4d5cb5 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=master +revision=1.15.90 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 7d3a04af64..072a002372 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=master +revision=1.15.90 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 705662d731..11f675ed50 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=master +revision=1.15.90 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 7ed12291ce..34de856ff6 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=master +revision=1.15.90 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index bab6ef61be..6abee215d6 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=master +revision=1.15.90 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b3e87a738..3ffa86a2a3 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=master +revision=1.15.90 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index c7b473b3b2..7e07574b89 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=master +revision=1.15.90 diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index a14dab93a9..28e6462b8b 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=master +revision=1.15.90 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8765f69928..918c35d0db 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=master +revision=1.15.90 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 85aa7f483a..30a8c50929 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=master +revision=1.15.90 From 273d95a18d5b4893ef2848569aa4c1a1549ff765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 16 Apr 2019 16:48:58 +0100 Subject: [PATCH 223/448] Build master again --- subprojects/gl-headers.wrap | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/subprojects/gl-headers.wrap b/subprojects/gl-headers.wrap index 0c9d533ff6..f5a9fa4f2b 100644 --- a/subprojects/gl-headers.wrap +++ b/subprojects/gl-headers.wrap @@ -2,4 +2,4 @@ directory=gl-headers url=https://gitlab.freedesktop.org/gstreamer/meson-ports/gl-headers.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/gl-headers.git -revision=5c8c7c0d3ca1f0b783272dac0b95e09414e49bc8 +revision=master diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index b743936657..3ad4f0fce3 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=1.15.90 +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 7c0357fe86..0e3510a56f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=1.15.90 +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 578b9a0d92..d01154348a 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=1.15.90 +revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index 2d3c4d5cb5..d5ba267d17 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=1.15.90 +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 072a002372..7d3a04af64 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=1.15.90 +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 11f675ed50..705662d731 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=1.15.90 +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 34de856ff6..7ed12291ce 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=1.15.90 +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 6abee215d6..bab6ef61be 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=1.15.90 +revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 3ffa86a2a3..2b3e87a738 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=1.15.90 +revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index 7e07574b89..c7b473b3b2 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=1.15.90 +revision=master diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index 28e6462b8b..a14dab93a9 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=1.15.90 +revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 918c35d0db..8765f69928 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=1.15.90 +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 30a8c50929..85aa7f483a 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=1.15.90 +revision=master From cb3db265fe71e2a4e980a6aa4e6befb65bd84b7b Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 17 Apr 2019 16:44:28 +0530 Subject: [PATCH 224/448] gitignore: Also ignore subproject symlinks These subproject dirs are only ignored if they are directories if you use a trailing slash. --- .gitignore | 64 +++++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 86e5b17c31..ed69abde09 100644 --- a/.gitignore +++ b/.gitignore @@ -19,37 +19,37 @@ gstreamer-vaapi libnice __pycache__ meson/ -subprojects/gst-integration-testsuites/ -subprojects/gst-devtools/ -subprojects/gst-editing-services/ -subprojects/gst-libav/ -subprojects/gst-omx/ -subprojects/gst-plugins-bad/ -subprojects/gst-plugins-base/ -subprojects/gst-plugins-good/ -subprojects/gst-plugins-ugly/ -subprojects/gst-python/ -subprojects/gst-rtsp-server/ -subprojects/gstreamer/ -subprojects/gstreamer-sharp/ -subprojects/gstreamer-vaapi/ -subprojects/glib/ -subprojects/gl-headers/ -subprojects/bindinator/ -subprojects/dssim/ -subprojects/gtk-sharp/ -subprojects/libffi/ -subprojects/libnice/ -subprojects/libunwind/ -subprojects/proxy-libintl/ -subprojects/zlib/ -subprojects/openh264/ -subprojects/pygobject/ -subprojects/pycairo/ -subprojects/json-glib/ -subprojects/orc/ -subprojects/libsoup/ -subprojects/FFmpeg/ -subprojects/x264/ +subprojects/gst-integration-testsuites +subprojects/gst-devtools +subprojects/gst-editing-services +subprojects/gst-libav +subprojects/gst-omx +subprojects/gst-plugins-bad +subprojects/gst-plugins-base +subprojects/gst-plugins-good +subprojects/gst-plugins-ugly +subprojects/gst-python +subprojects/gst-rtsp-server +subprojects/gstreamer +subprojects/gstreamer-sharp +subprojects/gstreamer-vaapi +subprojects/glib +subprojects/gl-headers +subprojects/bindinator +subprojects/dssim +subprojects/gtk-sharp +subprojects/libffi +subprojects/libnice +subprojects/libunwind +subprojects/proxy-libintl +subprojects/zlib +subprojects/openh264 +subprojects/pygobject +subprojects/pycairo +subprojects/json-glib +subprojects/orc +subprojects/libsoup +subprojects/FFmpeg +subprojects/x264 prefix/ pygobject From d4cc75ec1b8cc36fa796bd470d520e051cb6196c Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 17 Apr 2019 17:08:39 +0530 Subject: [PATCH 225/448] Move cross-files to the data subdirectory We will add more data soon. --- {cross-files => data/cross-files}/README.md | 0 {cross-files => data/cross-files}/android_arm64_api28.txt | 0 {cross-files => data/cross-files}/mingw_w64_x86-64.txt | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {cross-files => data/cross-files}/README.md (100%) rename {cross-files => data/cross-files}/android_arm64_api28.txt (100%) rename {cross-files => data/cross-files}/mingw_w64_x86-64.txt (100%) diff --git a/cross-files/README.md b/data/cross-files/README.md similarity index 100% rename from cross-files/README.md rename to data/cross-files/README.md diff --git a/cross-files/android_arm64_api28.txt b/data/cross-files/android_arm64_api28.txt similarity index 100% rename from cross-files/android_arm64_api28.txt rename to data/cross-files/android_arm64_api28.txt diff --git a/cross-files/mingw_w64_x86-64.txt b/data/cross-files/mingw_w64_x86-64.txt similarity index 100% rename from cross-files/mingw_w64_x86-64.txt rename to data/cross-files/mingw_w64_x86-64.txt From 57e876e3396fd3a37d8d9f7ac7f1e933353e58dd Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 17 Apr 2019 17:28:43 +0530 Subject: [PATCH 226/448] README: Add instructions for Windows with screenshots Also add a note about installation --- README.md | 100 +++++++++++++++++++++++++---- data/images/git-installer-PATH.png | Bin 0 -> 19749 bytes data/images/py-installer-page1.png | Bin 0 -> 77294 bytes 3 files changed, 88 insertions(+), 12 deletions(-) create mode 100644 data/images/git-installer-PATH.png create mode 100644 data/images/py-installer-page1.png diff --git a/README.md b/README.md index 33f4a2ac70..0ecff06067 100644 --- a/README.md +++ b/README.md @@ -7,34 +7,44 @@ meson and its [subproject](https://github.com/mesonbuild/meson/wiki/Subprojects) ## Getting started +### Install git and python 3.5+ + +If you're on Linux, you probably already have these. On macOS, you can use the +[official Python installer](https://www.python.org/downloads/mac-osx/). + +You can find [instructions for Windows below](#windows-prerequisites-setup). + ### Install meson and ninja Meson 0.48 or newer is required. -You should get meson through your package manager or using: +On Linux and macOS you can get meson through your package manager or using: $ pip3 install --user meson -This will install meson into ~/.local/bin which may or may not be included +This will install meson into `~/.local/bin` which may or may not be included automatically in your PATH by default. -If you are building on Windows, do not use the Meson MSI installer since it is -experimental and will likely not work. - -You can also run meson directly from a meson git checkout if you like. - You should get `ninja` using your package manager or download the [official -release](https://github.com/ninja-build/ninja/releases) and put it in your PATH. +release](https://github.com/ninja-build/ninja/releases) and put the `ninja` +binary in your PATH. + +You can find [instructions for Windows below](#windows-prerequisites-setup). ### Build GStreamer and its modules You can get all GStreamer built running: ``` -mkdir build/ && meson build && ninja -C build/ +meson build/ +ninja -C build/ ``` -NOTE: on fedora (and maybe other distributions) replace `ninja` with `ninja-build` +This will automatically create the `build` directory and build everything +inside it. + +NOTE: On Windows, you *must* run this from inside the Visual Studio command +prompt of the appropriate architecture and version. # Development environment @@ -89,7 +99,7 @@ ninja -C build/ git-update ## Custom subprojects -We also added a meson option, 'custom_subprojects', that allows the user +We also added a meson option, `custom_subprojects`, that allows the user to provide a comma-separated list of subprojects that should be built alongside the default ones. @@ -103,7 +113,6 @@ rm -rf * && meson .. -Dcustom_subprojects=my_subproject ninja ``` - ## Run tests You can easily run the test of all the components: @@ -136,6 +145,21 @@ Run a specific test from a specific test file: GST_CHECKS=test_subbuffer meson test -C build/ --suite gstreamer gst_gstbuffer ``` +## Optional Installation + +`gst-build` has been created primarily for [uninstalled usage](#uninstalled-environment), +but you can also install everything that is built into a predetermined prefix like so: + +``` +meson --prefix=/path/to/install/prefix build/ +ninja -C build/ +meson install -C build/ +``` + +Note that the installed files have `RPATH` stripped, so you will need to set +`LD_LIBRARY_PATH`, `DYLD_LIBRARY_PATH`, or `PATH` as appropriate for your +platform for things to work. + ## Checkout another branch using worktrees If you need to have several versions of GStreamer coexisting (eg. `master` and `1.14`), @@ -199,3 +223,55 @@ you should add a new environment segment as follow: "priority": 50 }, ``` + +## Windows Prerequisites Setup + +On Windows, some of the components may require special care. + +### Git for Windows + +Use the [Git for Windows](https://gitforwindows.org/) installer. It will +install a `bash` prompt with basic shell utils and up-to-date git binaries. + +During installation, when prompted about `PATH`, you should select the +following option: + +![Select "Git from the command line and also from 3rd-party software"](/data/images/git-installer-PATH.png) + +### Python 3.5+ on Windows + +Use the [official Python installer](https://www.python.org/downloads/windows/). +You must ensure that Python is installed into `PATH`: + +![Enable Add Python to PATH, then click Customize Installation](/data/images/py-installer-page1.png) + +You may also want to customize the installation and install it into +a system-wide location such as `C:\PythonXY`, but this is not required. + +### Ninja on Windows + +The easiest way to install Ninja on Windows is with `pip3`, which will download +the compiled binary and place it into the `Scripts` directory inside your +Python installation: + +``` +pip3 install ninja +``` + +You can also download the [official release](https://github.com/ninja-build/ninja/releases) +and place it into `PATH`. + +### Meson on Windows + +**IMPORTANT**: Do not use the Meson MSI installer since it is experimental and known to not +work with `gst-build`. + +You can use `pip3` to install Meson, same as Ninja above: + +``` +pip3 install meson +``` + +Note that Meson is written entirely in Python, so you can also run it as-is +from the [git repository](https://github.com/mesonbuild/meson/) if you want to +use the latest master branch for some reason. diff --git a/data/images/git-installer-PATH.png b/data/images/git-installer-PATH.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe3f448eae5b89f1de157c51c9c9fee2461c0e8 GIT binary patch literal 19749 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 literal 0 HcmV?d00001 From 5114d2291129d51184d88d563fe9f11d37f0a67b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 19 Apr 2019 02:23:51 +0100 Subject: [PATCH 227/448] Build 1.16.0 release --- meson.build | 2 +- subprojects/gl-headers.wrap | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/meson.build b/meson.build index 6b2407fc50..3e13d12070 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.15.90', + version : '1.16.0', meson_version : '>= 0.48.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gl-headers.wrap b/subprojects/gl-headers.wrap index f5a9fa4f2b..0c9d533ff6 100644 --- a/subprojects/gl-headers.wrap +++ b/subprojects/gl-headers.wrap @@ -2,4 +2,4 @@ directory=gl-headers url=https://gitlab.freedesktop.org/gstreamer/meson-ports/gl-headers.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/gl-headers.git -revision=master +revision=5c8c7c0d3ca1f0b783272dac0b95e09414e49bc8 diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 3ad4f0fce3..5be2027b14 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=master +revision=1.16.0 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 0e3510a56f..bb346ba792 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=master +revision=1.16.0 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index d01154348a..2d8c212001 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=master +revision=1.16.0 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index d5ba267d17..47cef44cd1 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=master +revision=1.16.0 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 7d3a04af64..453a4a4191 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=master +revision=1.16.0 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 705662d731..647e59fdf5 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=master +revision=1.16.0 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 7ed12291ce..8089e61903 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=master +revision=1.16.0 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index bab6ef61be..380df6c105 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=master +revision=1.16.0 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b3e87a738..c137df2b8f 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=master +revision=1.16.0 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index c7b473b3b2..07290f1c6e 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=master +revision=1.16.0 diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index a14dab93a9..3b8afdecc7 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=master +revision=1.16.0 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8765f69928..d91468c953 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=master +revision=1.16.0 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 85aa7f483a..bdd8d07bf5 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=master +revision=1.16.0 From 96dd9f409341230ea78c12b89ad1cac21aed74bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 19 Apr 2019 02:34:33 +0100 Subject: [PATCH 228/448] Build master again --- meson.build | 2 +- subprojects/gl-headers.wrap | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/meson.build b/meson.build index 3e13d12070..2fa3f26877 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.16.0', + version : '1.17.0.1', meson_version : '>= 0.48.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gl-headers.wrap b/subprojects/gl-headers.wrap index 0c9d533ff6..f5a9fa4f2b 100644 --- a/subprojects/gl-headers.wrap +++ b/subprojects/gl-headers.wrap @@ -2,4 +2,4 @@ directory=gl-headers url=https://gitlab.freedesktop.org/gstreamer/meson-ports/gl-headers.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/gl-headers.git -revision=5c8c7c0d3ca1f0b783272dac0b95e09414e49bc8 +revision=master diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 5be2027b14..3ad4f0fce3 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=1.16.0 +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index bb346ba792..0e3510a56f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=1.16.0 +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 2d8c212001..d01154348a 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=1.16.0 +revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index 47cef44cd1..d5ba267d17 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=1.16.0 +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 453a4a4191..7d3a04af64 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=1.16.0 +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 647e59fdf5..705662d731 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=1.16.0 +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 8089e61903..7ed12291ce 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=1.16.0 +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 380df6c105..bab6ef61be 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=1.16.0 +revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index c137df2b8f..2b3e87a738 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=1.16.0 +revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index 07290f1c6e..c7b473b3b2 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=1.16.0 +revision=master diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index 3b8afdecc7..a14dab93a9 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=1.16.0 +revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index d91468c953..8765f69928 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=1.16.0 +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index bdd8d07bf5..85aa7f483a 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=1.16.0 +revision=master From f0a550eac9a791b99c79bf749f5c1e718e82fb94 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 19 Apr 2019 16:33:54 -0400 Subject: [PATCH 229/448] subprojects: Add a wrap for gst-docs Preparing for building API documentation with hotdoc --- subprojects/gst-docs.wrap | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 subprojects/gst-docs.wrap diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap new file mode 100644 index 0000000000..60609394f9 --- /dev/null +++ b/subprojects/gst-docs.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gst-docs +url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git +revision=master From f21a06f5d2a6e7321b73c38d82a0188a77d6e1ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 25 Apr 2019 17:21:02 +0100 Subject: [PATCH 230/448] README: minor clarification Fixes #30. --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0ecff06067..b89939eede 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,13 @@ # gst-build -GStreamer [meson](http://mesonbuild.com/) based repositories aggregrator +GStreamer [meson](http://mesonbuild.com/) based repositories aggregrator. -You can build GStreamer and all its modules at once using -meson and its [subproject](https://github.com/mesonbuild/meson/wiki/Subprojects) feature. +Check out this module and run meson on it, and it will git clone the other +GStreamer modules as [meson subprojects](https://github.com/mesonbuild/meson/wiki/Subprojects) +and build everything in one go. Once that is done you can switch into an +uninstalled environment which allows you to easily develop and test the latest +version of GStreamer without the need to install anything or touch an existing +GStreamer system installation. ## Getting started From 7fb7739337eb1cb05a925b268c1381423654068e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 25 Apr 2019 17:29:19 +0000 Subject: [PATCH 231/448] Fix link to meson "subprojects" documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b89939eede..20f37ab589 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ GStreamer [meson](http://mesonbuild.com/) based repositories aggregrator. Check out this module and run meson on it, and it will git clone the other -GStreamer modules as [meson subprojects](https://github.com/mesonbuild/meson/wiki/Subprojects) +GStreamer modules as [meson subprojects](http://mesonbuild.com/Subprojects.html) and build everything in one go. Once that is done you can switch into an uninstalled environment which allows you to easily develop and test the latest version of GStreamer without the need to install anything or touch an existing From a769bf6c6e974bae804bcbb2ffa45b2e7ea668ca Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Mon, 6 May 2019 16:07:28 -0400 Subject: [PATCH 232/448] uninstalled: Add an option to strip off the sysroot path As the data from meson is no longer relative path, it is not longer possible to move gst-build around and run gst-uninstalled.py. This broke cross-compilation usage, where you build on a host and run over NFS on target. This adds an option to tell the script to strip off the host path to the sysroot. --- gst-uninstalled.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 78c5ec1188..5b6003973d 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -117,6 +117,8 @@ def get_subprocess_env(options, gst_version): for target in targets: filenames = listify(target['filename']) for filename in filenames: + if filename.startswith(options.sysroot): + filename = filename[len(options.sysroot):] root = os.path.dirname(filename) if srcdir_path / "subprojects/gst-devtools/validate/plugins" in (srcdir_path / root).parents: continue @@ -227,6 +229,9 @@ if __name__ == "__main__": parser.add_argument("--srcdir", default=SCRIPTDIR, help="The top level source directory") + parser.add_argument("--sysroot", + default='', + help="The sysroot path used during cross-compilation") options, args = parser.parse_known_args() if not os.path.exists(options.builddir): From dde1b6ef3c3a9241d3e2fa4e42b7819cbae594a0 Mon Sep 17 00:00:00 2001 From: Vivia Nikolaidou Date: Sat, 11 May 2019 12:03:18 +0300 Subject: [PATCH 233/448] gst-uninstalled: Add gst-indent directory to $PATH --- gst-uninstalled.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 5b6003973d..11fa5dd0de 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -100,6 +100,9 @@ def get_subprocess_env(options, gst_version): 'lib', 'girepository-1.0')) prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(PREFIX_DIR, 'lib', 'pkgconfig')) + # gst-indent + prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'gstreamer', 'tools')) + # Library and binary search paths prepend_env_var(env, "PATH", os.path.join(PREFIX_DIR, 'bin')) if lib_path_envvar != 'PATH': From 3d24de2f2477dca3608ee14c66230c913290f114 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sun, 28 Oct 2018 14:06:35 +0000 Subject: [PATCH 234/448] Build documentation with hotdoc --- meson.build | 53 +++++++++++++++++++++++++++++++++++------------ meson_options.txt | 2 +- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/meson.build b/meson.build index 2fa3f26877..5d8070a4a6 100644 --- a/meson.build +++ b/meson.build @@ -11,6 +11,7 @@ glib_req = '>= 2.40.0' build_system = build_machine.system() cc = meson.get_compiler('c') +documented_projects = '' # Make it possible to use msys2 built zlib which fails # when not using the mingw toolchain as it uses unistd.h if not meson.is_subproject() and cc.get_id() == 'msvc' @@ -32,19 +33,19 @@ endif # Ordered list of subprojects (dict has no ordering guarantees) subprojects = [ - ['gstreamer', {}], - ['gst-plugins-base', {}], - ['gst-plugins-good', {}], + ['gstreamer', {'build-hotdoc': true}], + ['gst-plugins-base', {'build-hotdoc': true}], + ['gst-plugins-good', {'build-hotdoc': true}], ['libnice', { 'option': get_option('libnice'), 'match_gst_version': false}], - ['gst-plugins-bad', { 'option': get_option('bad') }], - ['gst-plugins-ugly', { 'option': get_option('ugly') }], - ['gst-libav', { 'option': get_option('libav') }], - ['gst-rtsp-server', { 'option': get_option('rtsp_server') }], - ['gst-devtools', { 'option': get_option('devtools')}], + ['gst-plugins-bad', { 'option': get_option('bad'), 'build-hotdoc': true }], + ['gst-plugins-ugly', { 'option': get_option('ugly'), 'build-hotdoc': true }], + ['gst-libav', { 'option': get_option('libav'), 'build-hotdoc': true }], + ['gst-rtsp-server', { 'option': get_option('rtsp_server'), 'build-hotdoc': true }], + ['gst-devtools', { 'option': get_option('devtools'), 'build-hotdoc': true }], ['gst-integration-testsuites', { 'option': get_option('devtools') }], - ['gst-editing-services', { 'option': get_option('ges') }], - ['gstreamer-vaapi', { 'option': get_option('vaapi') }], - ['gst-omx', { 'option': get_option('omx'), }], + ['gst-editing-services', { 'option': get_option('ges'), 'build-hotdoc': true }], + ['gstreamer-vaapi', { 'option': get_option('vaapi'), 'build-hotdoc': true }], + ['gst-omx', { 'option': get_option('omx'), 'build-hotdoc': true, }], ['gstreamer-sharp', { 'option': get_option('sharp') }], ['pygobject', { 'option': get_option('python'), 'match_gst_version': false }], ['gst-python', { 'option': get_option('python') }], @@ -66,6 +67,7 @@ endif subproject('orc', required: get_option('orc')) subprojects_names = [] +all_plugins = [] foreach sp : subprojects project_name = sp[0] build_infos = sp[1] @@ -79,10 +81,22 @@ foreach sp : subprojects endif if subproj.found() + if build_infos.has_key('build-hotdoc', default: false) + foreach plugin: subproj.get_variable('plugins') + all_plugins += plugin.full_path() + endforeach + if documented_projects != '' + documented_projects += ',' + endif + + documented_projects += project_name + endif + documented_projects += project_name + subprojects_names += [project_name] cmdres = run_command(python3, '-c', symlink.format(project_name, meson.current_source_dir())) if cmdres.returncode() == 0 - message('Created symlink to ' + project_name) + message('Created symlink to ' + project_name) endif endif endforeach @@ -95,8 +109,21 @@ foreach custom_subproj: get_option('custom_subprojects').split(',') endif endforeach -message('Building subprojects: ' + ', '.join(subprojects_names)) +if build_machine.system() == 'windows' + message('Disabling hotdoc while building on Windows') +else + hotdoc_p = find_program('hotdoc', required : get_option('doc')) + if hotdoc_p.found() + if documented_projects != '' + subproject('gst-docs', default_options: 'built_subprojects=' + documented_projects) + message('Gst docs subprojects: ' + documented_projects) + endif + else + message('Not building documentation as hotdoc was not found') + endif +endif +message('Building subprojects: ' + ', '.join(subprojects_names)) setenv = find_program('gst-uninstalled.py') run_target('uninstalled', command : [setenv, '--builddir=@0@'.format(meson.build_root()), '--srcdir=@0@'.format(meson.source_root())]) diff --git a/meson_options.txt b/meson_options.txt index 624979b621..6e565bcf76 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -13,7 +13,7 @@ option('custom_subprojects', type : 'string', value : '', description : 'Comma-s # Common options, automatically inherited by subprojects option('examples', type : 'feature', value : 'auto', description : 'Build examples') -option('gtk_doc', type : 'feature', value : 'auto', description : 'Generate API documentation with gtk-doc') option('introspection', type : 'feature', value : 'auto', description : 'Generate introspection data') option('nls', type : 'feature', value : 'auto', description : 'Enable native language support (translations)') option('orc', type : 'feature', value : 'auto', description : 'Enable Optimized Inner Loop Runtime Compiler') +option('doc', type : 'feature', value : 'auto', description : 'Generate API documentation with hotdoc') From fbb81c6c78e098550687fd3758e9a6e515c5e00e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sun, 11 Nov 2018 20:06:04 -0300 Subject: [PATCH 235/448] Generate the GST_PLUGIN_PATH using the `plugins` variable in subprojects To build the documentation, we are maintaining a 'standardise' `plugins` variable accross all modules to list all plugins and generate documentation for them. This is also used to get the right plugin path when inspecting plugins for the documentation. --- gst-uninstalled.py | 9 ++++----- meson.build | 20 ++++++++++---------- scripts/generate_plugins_path.py | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 scripts/generate_plugins_path.py diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 11fa5dd0de..bb9143da3a 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -81,7 +81,6 @@ def get_subprocess_env(options, gst_version): sharedlib_reg = re.compile(r'\.so|\.dylib|\.dll') typelib_reg = re.compile(r'.*\.typelib$') - pluginpath_reg = re.compile(r'lib.*' + re.escape(os.path.normpath('/gstreamer-1.0/'))) if os.name is 'nt': lib_path_envvar = 'PATH' @@ -133,16 +132,16 @@ def get_subprocess_env(options, gst_version): elif sharedlib_reg.search(filename): if not target['type'].startswith('shared'): continue - if target['installed']: - if pluginpath_reg.search(os.path.normpath(stringify(target['install_filename']))): - prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(options.builddir, root)) - continue prepend_env_var(env, lib_path_envvar, os.path.join(options.builddir, root)) elif target['type'] == 'executable' and target['installed']: paths.add(os.path.join(options.builddir, root)) + with open(os.path.join(options.builddir, 'GstPluginsPath.json')) as f: + for plugin_path in json.load(f): + prepend_env_var(env, 'GST_PLUGIN_PATH', plugin_path) + for p in paths: prepend_env_var(env, 'PATH', p) diff --git a/meson.build b/meson.build index 5d8070a4a6..c007e42341 100644 --- a/meson.build +++ b/meson.build @@ -80,16 +80,12 @@ foreach sp : subprojects subproj = subproject(project_name, required: is_required) endif - if subproj.found() - if build_infos.has_key('build-hotdoc', default: false) - foreach plugin: subproj.get_variable('plugins') - all_plugins += plugin.full_path() - endforeach - if documented_projects != '' - documented_projects += ',' - endif - - documented_projects += project_name + if subproj.found() and build_infos.has_key('build-hotdoc', default: false) + foreach plugin: subproj.get_variable('plugins') + all_plugins += plugin.full_path() + endforeach + if documented_projects != '' + documented_projects += ',' endif documented_projects += project_name @@ -123,6 +119,10 @@ else endif endif +cmdres = run_command(python3, find_program('scripts/generate_plugins_path.py'), '--builddir', + meson.build_root(), all_plugins) +assert(cmdres.returncode() == 0, 'Could not create plugins path: @0@'.format(cmdres.stderr())) + message('Building subprojects: ' + ', '.join(subprojects_names)) setenv = find_program('gst-uninstalled.py') run_target('uninstalled', command : [setenv, '--builddir=@0@'.format(meson.build_root()), diff --git a/scripts/generate_plugins_path.py b/scripts/generate_plugins_path.py new file mode 100644 index 0000000000..89288244c3 --- /dev/null +++ b/scripts/generate_plugins_path.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +import argparse +import os +import json + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--builddir", help="The meson build directory") + parser.add_argument(dest="plugins", help="The list of plugins", nargs="+") + + options = parser.parse_args() + + all_paths = set() + for plugin in options.plugins: + all_paths.add(os.path.dirname(plugin)) + + with open(os.path.join(options.builddir, 'GstPluginsPath.json'), "w") as f: + json.dump(list(all_paths), f, indent=4, sort_keys=True) From fda837941179fc384489883a8492aaf15c4ab609 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 12 Nov 2018 20:23:14 -0300 Subject: [PATCH 236/448] scripts: Add a script to check that all repos are clean This is useful to check that a build didn't result in changes in the code/generated files This will be used to check that the plugins documentation cache file is properly commited, and that necessary workaround for particular case are adopted. --- checkout-branch-worktree | 8 ++++---- git-update | 6 +++--- gst-uninstalled.py | 6 +++--- meson.build | 9 +++++++-- msys2_setup.py | 2 +- scripts/__init__.py | 0 scripts/check-clean-repos.py | 27 +++++++++++++++++++++++++++ common.py => scripts/common.py | 0 setup.py | 4 ++-- 9 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 scripts/__init__.py create mode 100755 scripts/check-clean-repos.py rename common.py => scripts/common.py (100%) diff --git a/checkout-branch-worktree b/checkout-branch-worktree index 7f2dbd5185..8afb39333f 100755 --- a/checkout-branch-worktree +++ b/checkout-branch-worktree @@ -7,10 +7,10 @@ import subprocess import xml.etree.ElementTree as ET import sys -from common import git -from common import Colors -from common import get_meson -from common import accept_command +from scripts.common import git +from scripts.common import Colors +from scripts.common import get_meson +from scripts.common import accept_command SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) diff --git a/git-update b/git-update index 71c6d038a1..ae90567d45 100755 --- a/git-update +++ b/git-update @@ -5,9 +5,9 @@ import subprocess import xml.etree.ElementTree as ET import sys -from common import git -from common import Colors -from common import accept_command +from scripts.common import git +from scripts.common import Colors +from scripts.common import accept_command SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index bb9143da3a..59fecaecd2 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -16,9 +16,9 @@ import pathlib from distutils.sysconfig import get_python_lib from distutils.util import strtobool -from common import get_meson -from common import git -from common import win32_get_short_path_name +from scripts.common import get_meson +from scripts.common import git +from scripts.common import win32_get_short_path_name SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) PREFIX_DIR = os.path.join(SCRIPTDIR, 'prefix') diff --git a/meson.build b/meson.build index c007e42341..a2156b4c24 100644 --- a/meson.build +++ b/meson.build @@ -105,8 +105,13 @@ foreach custom_subproj: get_option('custom_subprojects').split(',') endif endforeach -if build_machine.system() == 'windows' - message('Disabling hotdoc while building on Windows') +if meson.is_cross_build() or build_machine.system() == 'windows' + if get_option('doc').enabled() + error('Documentation enabled but building the doc while cross building or building on windows is not supported yet.') + endif + + message('Documentation not built as building the docmentation while cross building or building on windows is not supported yet.') + subdir_done() else hotdoc_p = find_program('hotdoc', required : get_option('doc')) if hotdoc_p.found() diff --git a/msys2_setup.py b/msys2_setup.py index 8153f07724..0ea17e5a37 100644 --- a/msys2_setup.py +++ b/msys2_setup.py @@ -11,7 +11,7 @@ import shutil import subprocess import tempfile -from common import git +from scripts.common import git from setup import GstBuildConfigurer diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/check-clean-repos.py b/scripts/check-clean-repos.py new file mode 100755 index 0000000000..2b50fd938b --- /dev/null +++ b/scripts/check-clean-repos.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +import os +import subprocess +import sys +from common import git + + +SCRIPTDIR = os.path.realpath(os.path.dirname(__file__)) + + +if __name__ == "__main__": + subprojects_dir = os.path.join(SCRIPTDIR, "..", "subprojects") + exitcode = 0 + for repo_name in os.listdir(subprojects_dir): + repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name)) + if not os.path.exists(os.path.join(repo_dir, '.git')): + continue + + diff = git('diff', repository_path=repo_dir).strip('\n') + if diff: + print('ERROR: Repository %s is not clean' % repo_dir) + print('NOTE: Make sure to commit necessary changes in the gst_plugins_cache.json files') + print(diff) + exitcode += 1 + + sys.exit(exitcode) \ No newline at end of file diff --git a/common.py b/scripts/common.py similarity index 100% rename from common.py rename to scripts/common.py diff --git a/setup.py b/setup.py index fccf416f5c..27766781db 100755 --- a/setup.py +++ b/setup.py @@ -7,8 +7,8 @@ import sys import shutil import subprocess -from common import get_meson -from common import accept_command +from scripts.common import get_meson +from scripts.common import accept_command PROJECTNAME = "GStreamer build" From b46c29525f04077775e19ae1006f226c9e186eee Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 19 Apr 2019 16:38:24 -0400 Subject: [PATCH 237/448] git-update: Make sure to download all subproject before applying manifest Otherwise we might be missing some subprojects update --- git-update | 3 +++ 1 file changed, 3 insertions(+) diff --git a/git-update b/git-update index ae90567d45..19f27ef5f3 100755 --- a/git-update +++ b/git-update @@ -8,6 +8,7 @@ import sys from scripts.common import git from scripts.common import Colors from scripts.common import accept_command +from scripts.common import get_meson SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) @@ -143,6 +144,8 @@ if __name__ == "__main__": sys.stdin.close() if options.manifest: + meson = get_meson() + targets_s = subprocess.check_output(meson + ['subprojects', 'download']) repos_commits = manifest_get_commits(options.manifest) else: repos_commits = {} From 4736387c1b831b0f9c950d7775f2b9520ac6e76d Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 14 May 2019 17:51:38 -0400 Subject: [PATCH 238/448] meson: Remove spurious subdir_done --- meson.build | 1 - 1 file changed, 1 deletion(-) diff --git a/meson.build b/meson.build index a2156b4c24..eb18223c2e 100644 --- a/meson.build +++ b/meson.build @@ -111,7 +111,6 @@ if meson.is_cross_build() or build_machine.system() == 'windows' endif message('Documentation not built as building the docmentation while cross building or building on windows is not supported yet.') - subdir_done() else hotdoc_p = find_program('hotdoc', required : get_option('doc')) if hotdoc_p.found() From 54ce8e882bd5b945d0f2c25c1a583b43848bd150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 14 May 2019 23:21:54 +0100 Subject: [PATCH 239/448] meson.build: Fix typo in log message --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index eb18223c2e..ca7826cfdf 100644 --- a/meson.build +++ b/meson.build @@ -110,7 +110,7 @@ if meson.is_cross_build() or build_machine.system() == 'windows' error('Documentation enabled but building the doc while cross building or building on windows is not supported yet.') endif - message('Documentation not built as building the docmentation while cross building or building on windows is not supported yet.') + message('Documentation not built as building the documentation while cross building or building on windows is not supported yet.') else hotdoc_p = find_program('hotdoc', required : get_option('doc')) if hotdoc_p.found() From 802e18519b7e02179ed69a3819eda779d3be211d Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 15 May 2019 21:14:16 -0400 Subject: [PATCH 240/448] Avoid making a dependency between plugins and the build.ninja file Basically meson detects that we pass file paths to run_command to regenerate the build.ninja file when those change --- meson.build | 6 ++++-- scripts/generate_plugins_path.py | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index ca7826cfdf..632ee13fbf 100644 --- a/meson.build +++ b/meson.build @@ -64,10 +64,12 @@ if build_system == 'windows' subproject('win-nasm') endif +pathsep = host_machine.system() == 'windows' ? ';' : ':' + subproject('orc', required: get_option('orc')) subprojects_names = [] -all_plugins = [] +all_plugins = '' foreach sp : subprojects project_name = sp[0] build_infos = sp[1] @@ -82,7 +84,7 @@ foreach sp : subprojects if subproj.found() and build_infos.has_key('build-hotdoc', default: false) foreach plugin: subproj.get_variable('plugins') - all_plugins += plugin.full_path() + all_plugins += pathsep + plugin.full_path() endforeach if documented_projects != '' documented_projects += ',' diff --git a/scripts/generate_plugins_path.py b/scripts/generate_plugins_path.py index 89288244c3..d57c60c2fe 100644 --- a/scripts/generate_plugins_path.py +++ b/scripts/generate_plugins_path.py @@ -7,12 +7,12 @@ import json if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--builddir", help="The meson build directory") - parser.add_argument(dest="plugins", help="The list of plugins", nargs="+") + parser.add_argument(dest="plugins", help="The list of plugins") options = parser.parse_args() all_paths = set() - for plugin in options.plugins: + for plugin in options.plugins.split(os.pathsep): all_paths.add(os.path.dirname(plugin)) with open(os.path.join(options.builddir, 'GstPluginsPath.json'), "w") as f: From 2c50c067d52a7b0b922a161eecf85eda1bf796c9 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 16 May 2019 09:26:47 -0400 Subject: [PATCH 241/448] meson: Add a target to regenerate doc caches for all subprojects Fixes https://gitlab.freedesktop.org/gstreamer/gst-docs/issues/36 --- meson.build | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 632ee13fbf..06c06d3d9d 100644 --- a/meson.build +++ b/meson.build @@ -69,6 +69,7 @@ pathsep = host_machine.system() == 'windows' ? ';' : ':' subproject('orc', required: get_option('orc')) subprojects_names = [] +plugins_doc_caches = [] all_plugins = '' foreach sp : subprojects project_name = sp[0] @@ -83,7 +84,11 @@ foreach sp : subprojects endif if subproj.found() and build_infos.has_key('build-hotdoc', default: false) - foreach plugin: subproj.get_variable('plugins') + plugins = subproj.get_variable('plugins') + if plugins.length() > 0 + plugins_doc_caches += [subproj.get_variable('plugins_doc_dep')] + endif + foreach plugin: plugins all_plugins += pathsep + plugin.full_path() endforeach if documented_projects != '' @@ -99,6 +104,13 @@ foreach sp : subprojects endif endforeach +plugins_doc_dep = custom_target('plugins-doc-cache', + command: [python3, '-c', 'print("Built all doc caches")'], + input: plugins_doc_caches, + output: 'plugins_doc_caches', + capture: true, +) + foreach custom_subproj: get_option('custom_subprojects').split(',') if custom_subproj != '' message ('Adding custom subproject ' + custom_subproj) From 4c6b301fa03c3b90f00e636e6e0035fa4e929d2d Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 16 May 2019 16:12:05 -0400 Subject: [PATCH 242/448] uninstalled: Add libnice plugin to GST_PLUGIN_PATH --- gst-uninstalled.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 59fecaecd2..6b422eaaa2 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -93,6 +93,8 @@ def get_subprocess_env(options, gst_version): 'gst-python', 'plugin')) prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(PREFIX_DIR, 'lib', 'gstreamer-1.0')) + prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(options.builddir, 'subprojects', + 'libnice', 'gst')) prepend_env_var(env, "GST_VALIDATE_SCENARIOS_PATH", os.path.join( PREFIX_DIR, 'share', 'gstreamer-1.0', 'validate', 'scenarios')) prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(PREFIX_DIR, 'lib', From 227c35b5d3eeda58c38b0391fbd83781b5509196 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Sun, 26 May 2019 15:49:21 +0200 Subject: [PATCH 243/448] meson: fix GstPluginsPath.json generation The refactored code was only adding paths to plugins in projects that build hotdoc, which is not the case of gst-python for example --- meson.build | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/meson.build b/meson.build index 06c06d3d9d..51f094b499 100644 --- a/meson.build +++ b/meson.build @@ -33,22 +33,22 @@ endif # Ordered list of subprojects (dict has no ordering guarantees) subprojects = [ - ['gstreamer', {'build-hotdoc': true}], - ['gst-plugins-base', {'build-hotdoc': true}], - ['gst-plugins-good', {'build-hotdoc': true}], + ['gstreamer', {'build-hotdoc': true, 'has-plugins': true}], + ['gst-plugins-base', {'build-hotdoc': true, 'has-plugins': true}], + ['gst-plugins-good', {'build-hotdoc': true, 'has-plugins': true}], ['libnice', { 'option': get_option('libnice'), 'match_gst_version': false}], - ['gst-plugins-bad', { 'option': get_option('bad'), 'build-hotdoc': true }], - ['gst-plugins-ugly', { 'option': get_option('ugly'), 'build-hotdoc': true }], - ['gst-libav', { 'option': get_option('libav'), 'build-hotdoc': true }], + ['gst-plugins-bad', { 'option': get_option('bad'), 'build-hotdoc': true, 'has-plugins': true}], + ['gst-plugins-ugly', { 'option': get_option('ugly'), 'build-hotdoc': true, 'has-plugins': true}], + ['gst-libav', { 'option': get_option('libav'), 'build-hotdoc': true, 'has-plugins': true}], ['gst-rtsp-server', { 'option': get_option('rtsp_server'), 'build-hotdoc': true }], ['gst-devtools', { 'option': get_option('devtools'), 'build-hotdoc': true }], ['gst-integration-testsuites', { 'option': get_option('devtools') }], - ['gst-editing-services', { 'option': get_option('ges'), 'build-hotdoc': true }], - ['gstreamer-vaapi', { 'option': get_option('vaapi'), 'build-hotdoc': true }], - ['gst-omx', { 'option': get_option('omx'), 'build-hotdoc': true, }], + ['gst-editing-services', { 'option': get_option('ges'), 'build-hotdoc': true, 'has-plugins': true}], + ['gstreamer-vaapi', { 'option': get_option('vaapi'), 'build-hotdoc': true, 'has-plugins': true}], + ['gst-omx', { 'option': get_option('omx'), 'build-hotdoc': true, 'has-plugins': true}], ['gstreamer-sharp', { 'option': get_option('sharp') }], ['pygobject', { 'option': get_option('python'), 'match_gst_version': false }], - ['gst-python', { 'option': get_option('python') }], + ['gst-python', { 'option': get_option('python'), 'has-plugins': true}], ] python3 = import('python').find_installation() @@ -83,24 +83,35 @@ foreach sp : subprojects subproj = subproject(project_name, required: is_required) endif - if subproj.found() and build_infos.has_key('build-hotdoc', default: false) - plugins = subproj.get_variable('plugins') - if plugins.length() > 0 - plugins_doc_caches += [subproj.get_variable('plugins_doc_dep')] + if subproj.found() + # Replace by using subproject.get_variable('plugins', []) + # when https://github.com/mesonbuild/meson/pull/5426/files + # is merged and released + if build_infos.has_key('has-plugins', default: false) + plugins = subproj.get_variable('plugins') + else + plugins = [] endif + foreach plugin: plugins all_plugins += pathsep + plugin.full_path() endforeach - if documented_projects != '' - documented_projects += ',' - endif - documented_projects += project_name subprojects_names += [project_name] cmdres = run_command(python3, '-c', symlink.format(project_name, meson.current_source_dir())) if cmdres.returncode() == 0 message('Created symlink to ' + project_name) endif + + if build_infos.has_key('build-hotdoc', default: false) + if plugins.length() > 0 + plugins_doc_caches += [subproj.get_variable('plugins_doc_dep')] + endif + if documented_projects != '' + documented_projects += ',' + endif + documented_projects += project_name + endif endif endforeach From dc325b42f59a3ab87234a7bb5a9a59d02780197f Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Sat, 25 May 2019 12:02:37 +0200 Subject: [PATCH 244/448] uninstalled: update XDG_DATA_DIRS to point to our devhelp index When using hotdoc, one can build the documentation for a single subproject (eg. the GL plugins). In that case, hotdoc will look up links in devhelp indexes available in standard locations. To make sure this case works, we thus need to add the path to our devhelp index to XDG_DATA_DIRS. This also means when running devhelp from inside the environment, the devhelp books produced by hotdoc will now show up. --- gst-uninstalled.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 6b422eaaa2..f9366f16f6 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -212,6 +212,16 @@ def get_subprocess_env(options, gst_version): # Add meson/ into PYTHONPATH if we are using a local meson prepend_env_var(env, 'PYTHONPATH', mesonpath) + # For devhelp books + if not 'XDG_DATA_DIRS' in env or not env['XDG_DATA_DIRS']: + # Preserve default paths when empty + prepend_env_var(env, 'XDG_DATA_DIRS', '/usr/local/share/:/usr/share/') + + prepend_env_var (env, 'XDG_DATA_DIRS', os.path.join(options.builddir, + 'subprojects', + 'gst-docs', + 'GStreamer-doc')) + return env def get_windows_shell(): From 6bd73861ca40abc60c876101fcfa16232977a492 Mon Sep 17 00:00:00 2001 From: Niels De Graef Date: Fri, 31 May 2019 23:43:46 +0200 Subject: [PATCH 245/448] meson: Bump minimal GLib version to 2.44 This means we can use some newer features and get rid of some boilerplate code using the G_DECLARE_* macros. As discussed on IRC, 2.44 is old enough by now to start depending on it. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 51f094b499..383154477d 100644 --- a/meson.build +++ b/meson.build @@ -6,7 +6,7 @@ project('All GStreamer modules', 'c', gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' -glib_req = '>= 2.40.0' +glib_req = '>= 2.44.0' build_system = build_machine.system() cc = meson.get_compiler('c') From bb9c37dcf0ef83dd568bdb289864600e795b5f3e Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Tue, 4 Jun 2019 15:30:43 -0400 Subject: [PATCH 246/448] cross: Fix cross compilation meson error The doc is not currently built in cross-compilation, but we still had some meson code that eneded up being called and failed. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 383154477d..22551d213f 100644 --- a/meson.build +++ b/meson.build @@ -103,7 +103,7 @@ foreach sp : subprojects message('Created symlink to ' + project_name) endif - if build_infos.has_key('build-hotdoc', default: false) + if not meson.is_cross_build() and build_infos.has_key('build-hotdoc', default: false) if plugins.length() > 0 plugins_doc_caches += [subproj.get_variable('plugins_doc_dep')] endif From 9c4cb201d0028d038f3346f8b436c439c0d3827c Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Tue, 4 Jun 2019 21:04:45 -0400 Subject: [PATCH 247/448] uninstalled: Fix --sysroot implementation This option was added so we could remove the sysroot path from the env when cross-build is used over NFS. Though, the implementation wasn't complete and went unnoticed. This moves the sysroot path removal into the helper that prepends env so that no more env get forgotten. This notably fixes the PATH environment. --- gst-uninstalled.py | 79 ++++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 30 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index f9366f16f6..2bfaddb9b7 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -44,7 +44,9 @@ def stringify(o): raise AssertionError('Did not expect object {!r} to have more than one element'.format(o)) raise AssertionError('Object {!r} must be a string or a list'.format(o)) -def prepend_env_var(env, var, value): +def prepend_env_var(env, var, value, sysroot): + if value.startswith(sysroot): + value = value[len(sysroot):] # Try not to exceed maximum length limits for env vars on Windows if os.name is 'nt': value = win32_get_short_path_name(value) @@ -68,8 +70,10 @@ def get_subprocess_env(options, gst_version): env["GST_VALIDATE_APPS_DIR"] = os.path.normpath( "%s/subprojects/gst-editing-services/tests/validate" % SCRIPTDIR) prepend_env_var(env, "PATH", os.path.normpath( - "%s/subprojects/gst-devtools/validate/tools" % options.builddir)) - prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'meson')) + "%s/subprojects/gst-devtools/validate/tools" % options.builddir), + options.sysroot) + prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'meson'), + options.sysroot) env["GST_VERSION"] = gst_version env["GST_ENV"] = 'gst-' + gst_version env["GST_PLUGIN_SYSTEM_PATH"] = "" @@ -90,27 +94,38 @@ def get_subprocess_env(options, gst_version): lib_path_envvar = 'LD_LIBRARY_PATH' prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(SCRIPTDIR, 'subprojects', - 'gst-python', 'plugin')) + 'gst-python', 'plugin'), + options.sysroot) prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(PREFIX_DIR, 'lib', - 'gstreamer-1.0')) + 'gstreamer-1.0'), + options.sysroot) prepend_env_var(env, "GST_PLUGIN_PATH", os.path.join(options.builddir, 'subprojects', - 'libnice', 'gst')) - prepend_env_var(env, "GST_VALIDATE_SCENARIOS_PATH", os.path.join( - PREFIX_DIR, 'share', 'gstreamer-1.0', 'validate', 'scenarios')) + 'libnice', 'gst'), + options.sysroot) + prepend_env_var(env, "GST_VALIDATE_SCENARIOS_PATH", + os.path.join(PREFIX_DIR, 'share', 'gstreamer-1.0', + 'validate', 'scenarios'), + options.sysroot) prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(PREFIX_DIR, 'lib', - 'lib', 'girepository-1.0')) - prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(PREFIX_DIR, 'lib', 'pkgconfig')) + 'lib', 'girepository-1.0'), + options.sysroot) + prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(PREFIX_DIR, 'lib', 'pkgconfig'), + options.sysroot) # gst-indent - prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'gstreamer', 'tools')) + prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'gstreamer', 'tools'), + options.sysroot) # Library and binary search paths - prepend_env_var(env, "PATH", os.path.join(PREFIX_DIR, 'bin')) + prepend_env_var(env, "PATH", os.path.join(PREFIX_DIR, 'bin'), + options.sysroot) if lib_path_envvar != 'PATH': - prepend_env_var(env, lib_path_envvar, os.path.join(PREFIX_DIR, 'lib')) + prepend_env_var(env, lib_path_envvar, os.path.join(PREFIX_DIR, 'lib'), + options.sysroot) elif 'QMAKE' in os.environ: # There's no RPATH on Windows, so we need to set PATH for the qt5 DLLs - prepend_env_var(env, 'PATH', os.path.dirname(os.environ['QMAKE'])) + prepend_env_var(env, 'PATH', os.path.dirname(os.environ['QMAKE']), + options.sysroot) meson = get_meson() targets_s = subprocess.check_output(meson + ['introspect', options.builddir, '--targets']) @@ -121,8 +136,6 @@ def get_subprocess_env(options, gst_version): for target in targets: filenames = listify(target['filename']) for filename in filenames: - if filename.startswith(options.sysroot): - filename = filename[len(options.sysroot):] root = os.path.dirname(filename) if srcdir_path / "subprojects/gst-devtools/validate/plugins" in (srcdir_path / root).parents: continue @@ -130,26 +143,29 @@ def get_subprocess_env(options, gst_version): mono_paths.add(os.path.join(options.builddir, root)) if typelib_reg.search(filename): prepend_env_var(env, "GI_TYPELIB_PATH", - os.path.join(options.builddir, root)) + os.path.join(options.builddir, root), + options.sysroot) elif sharedlib_reg.search(filename): if not target['type'].startswith('shared'): continue prepend_env_var(env, lib_path_envvar, - os.path.join(options.builddir, root)) + os.path.join(options.builddir, root), + options.sysroot) elif target['type'] == 'executable' and target['installed']: paths.add(os.path.join(options.builddir, root)) with open(os.path.join(options.builddir, 'GstPluginsPath.json')) as f: for plugin_path in json.load(f): - prepend_env_var(env, 'GST_PLUGIN_PATH', plugin_path) + prepend_env_var(env, 'GST_PLUGIN_PATH', plugin_path, + options.sysroot) for p in paths: - prepend_env_var(env, 'PATH', p) + prepend_env_var(env, 'PATH', p, options.sysroot) if os.name != 'nt': for p in mono_paths: - prepend_env_var(env, "MONO_PATH", p) + prepend_env_var(env, "MONO_PATH", p, options.sysroot) presets = set() encoding_targets = set() @@ -189,38 +205,41 @@ def get_subprocess_env(options, gst_version): pkg_dirs.add(os.path.dirname(path)) if path.endswith('gstomx.conf'): - prepend_env_var(env, 'GST_OMX_CONFIG_DIR', os.path.dirname(path)) + prepend_env_var(env, 'GST_OMX_CONFIG_DIR', os.path.dirname(path), + options.sysroot) for p in presets: - prepend_env_var(env, 'GST_PRESET_PATH', p) + prepend_env_var(env, 'GST_PRESET_PATH', p, options.sysroot) for t in encoding_targets: - prepend_env_var(env, 'GST_ENCODING_TARGET_PATH', t) + prepend_env_var(env, 'GST_ENCODING_TARGET_PATH', t, options.sysroot) for pkg_dir in pkg_dirs: - prepend_env_var(env, "PKG_CONFIG_PATH", pkg_dir) + prepend_env_var(env, "PKG_CONFIG_PATH", pkg_dir, options.sysroot) prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(options.builddir, 'subprojects', 'gst-plugins-good', - 'pkgconfig')) + 'pkgconfig'), + options.sysroot) for python_dir in python_dirs: - prepend_env_var(env, 'PYTHONPATH', python_dir) + prepend_env_var(env, 'PYTHONPATH', python_dir, options.sysroot) mesonpath = os.path.join(SCRIPTDIR, "meson") if os.path.join(mesonpath): # Add meson/ into PYTHONPATH if we are using a local meson - prepend_env_var(env, 'PYTHONPATH', mesonpath) + prepend_env_var(env, 'PYTHONPATH', mesonpath, options.sysroot) # For devhelp books if not 'XDG_DATA_DIRS' in env or not env['XDG_DATA_DIRS']: # Preserve default paths when empty - prepend_env_var(env, 'XDG_DATA_DIRS', '/usr/local/share/:/usr/share/') + prepend_env_var(env, 'XDG_DATA_DIRS', '/usr/local/share/:/usr/share/', '') prepend_env_var (env, 'XDG_DATA_DIRS', os.path.join(options.builddir, 'subprojects', 'gst-docs', - 'GStreamer-doc')) + 'GStreamer-doc'), + options.sysroot) return env From 01eb252f6782fa63dc657180aee31cd89bf13134 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 25 Jun 2019 20:55:36 +0530 Subject: [PATCH 248/448] Don't allow people to run meson inside the uninstalled env People should not run `meson` on gst-build inside the uninstalled env. It will cause problems because meson will detect the already-built libraries and pkg-config files. This is not obvious to people, and they often make this mistake. --- meson.build | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 22551d213f..a59980642f 100644 --- a/meson.build +++ b/meson.build @@ -11,6 +11,20 @@ glib_req = '>= 2.44.0' build_system = build_machine.system() cc = meson.get_compiler('c') +python3 = import('python').find_installation() +# Ensure that we're not being run from inside the gst-uninstalled env +# because that will confuse meson, and it might find the already-built +# gstreamer. It's fine if people run `ninja` as long as it doesn't run +# reconfigure because ninja doesn't care about the env. +ensure_not_uninstalled = ''' +import os +assert('GST_ENV' not in os.environ) +''' +cmdres = run_command(python3, '-c', ensure_not_uninstalled) +if cmdres.returncode() != 0 + error('Do not run `ninja` or `meson` for gst-build inside the uninstalled environment, you will run into problems') +endif + documented_projects = '' # Make it possible to use msys2 built zlib which fails # when not using the mingw toolchain as it uses unistd.h @@ -51,7 +65,6 @@ subprojects = [ ['gst-python', { 'option': get_option('python'), 'has-plugins': true}], ] -python3 = import('python').find_installation() symlink = ''' import os From 5d803bda10b037360b2c3baa219c25d9823b4049 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 19 Jul 2019 21:30:54 +0530 Subject: [PATCH 249/448] gst-uninstalled: Fix loading of prefix libraries on Fedora 30 On Fedora 64-bit, libdir is 'lib64'. Just add it unconditionally everywhere because we have no reliable way of detecting which distros or OSes will use that. --- gst-uninstalled.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 2bfaddb9b7..7db8be6988 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -122,6 +122,8 @@ def get_subprocess_env(options, gst_version): if lib_path_envvar != 'PATH': prepend_env_var(env, lib_path_envvar, os.path.join(PREFIX_DIR, 'lib'), options.sysroot) + prepend_env_var(env, lib_path_envvar, os.path.join(PREFIX_DIR, 'lib64'), + options.sysroot) elif 'QMAKE' in os.environ: # There's no RPATH on Windows, so we need to set PATH for the qt5 DLLs prepend_env_var(env, 'PATH', os.path.dirname(os.environ['QMAKE']), From d0acfc2bf73c087dec44a3250a6a9538c1c2b36b Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Tue, 11 Jun 2019 14:45:04 +1000 Subject: [PATCH 250/448] add gst-examples repository to subproject list --- .gitignore | 1 + meson.build | 1 + subprojects/gst-examples.wrap | 5 +++++ 3 files changed, 7 insertions(+) create mode 100644 subprojects/gst-examples.wrap diff --git a/.gitignore b/.gitignore index ed69abde09..5ddf02b483 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ meson/ subprojects/gst-integration-testsuites subprojects/gst-devtools subprojects/gst-editing-services +subprojects/gst-examples subprojects/gst-libav subprojects/gst-omx subprojects/gst-plugins-bad diff --git a/meson.build b/meson.build index a59980642f..5078a579fc 100644 --- a/meson.build +++ b/meson.build @@ -63,6 +63,7 @@ subprojects = [ ['gstreamer-sharp', { 'option': get_option('sharp') }], ['pygobject', { 'option': get_option('python'), 'match_gst_version': false }], ['gst-python', { 'option': get_option('python'), 'has-plugins': true}], + ['gst-examples', { 'option': get_option('examples'), 'match_gst_versions': false}], ] symlink = ''' diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap new file mode 100644 index 0000000000..50624b4393 --- /dev/null +++ b/subprojects/gst-examples.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gst-examples +url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git +revision=master From 8568e471fa5a3c7e874eed66519642cdd97304bd Mon Sep 17 00:00:00 2001 From: Yeongjin Jeong Date: Mon, 29 Jul 2019 12:22:55 +0900 Subject: [PATCH 251/448] uninstalled: Ensure bash prompt override even if bash script file does not exist If automatic bash prompt override is enabled via the 'GST_BUILD_DISABLE_PS1_OVERRIDE', We should set the bash prompt to have a visual indicator of the "gst-uninstalled" environment even if bash script file does not exist. --- gst-uninstalled.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index 7db8be6988..eb275f3f79 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -298,16 +298,16 @@ if __name__ == "__main__": else: args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] if "bash" in args[0] and not strtobool(os.environ.get("GST_BUILD_DISABLE_PS1_OVERRIDE", r"FALSE")): + tmprc = tempfile.NamedTemporaryFile(mode='w') bashrc = os.path.expanduser('~/.bashrc') if os.path.exists(bashrc): - tmprc = tempfile.NamedTemporaryFile(mode='w') with open(bashrc, 'r') as src: shutil.copyfileobj(src, tmprc) - tmprc.write('\nexport PS1="[gst-%s] $PS1"' % gst_version) - tmprc.flush() - # Let the GC remove the tmp file - args.append("--rcfile") - args.append(tmprc.name) + tmprc.write('\nexport PS1="[gst-%s] $PS1"' % gst_version) + tmprc.flush() + # Let the GC remove the tmp file + args.append("--rcfile") + args.append(tmprc.name) try: exit(subprocess.call(args, close_fds=False, env=get_subprocess_env(options, gst_version))) From 9e7855866a3b3185c0f5e6609f4fc9fcea360661 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Mon, 29 Jul 2019 18:55:51 +0300 Subject: [PATCH 252/448] Update the flexmeson windows binary version The old binary/url is no longer available, and the layout of the sourceforge archvie seems to have changed to include a new old_versions/ directory where the previous binary is relocated. https://sourceforge.net/projects/winflexbison/files/old_versions/ While we could use that, it seem better to invest the effort to adapt the scipt afterwards to use the github archives instead https://github.com/lexxmark/winflexbison/releases So for now bump the version to get the subproject building till we switch to github releases. --- subprojects/win-flex-bison-binaries/meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subprojects/win-flex-bison-binaries/meson.build b/subprojects/win-flex-bison-binaries/meson.build index 4179265c7f..6b8f9e8d3c 100644 --- a/subprojects/win-flex-bison-binaries/meson.build +++ b/subprojects/win-flex-bison-binaries/meson.build @@ -1,10 +1,10 @@ -project('win-flex-bison-binary', version : '2.5.14') +project('win-flex-bison-binary', version : '2.5.18') py3 = import('python3').find_python() message('Downloading and extracting win-flex-bison binaries...') -zip_hash = '354c9aae02aca421c52abfda7fe3ce6c32ad07e25ff3f66e31da9437a0b906cf' +zip_hash = '095cf65cb3f12ee5888022f93109acbe6264e5f18f6ffce0bda77feb31b65bd8' ret = run_command(py3, files('download-binary.py'), meson.project_version(), zip_hash) if ret.returncode() != 0 From 5291f7b2a1352781bba2a533f16f1c61dc334d01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 14 Aug 2019 18:51:43 +0100 Subject: [PATCH 253/448] subprojects: proxy-libintl: fix push-url --- subprojects/proxy-libintl.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/proxy-libintl.wrap b/subprojects/proxy-libintl.wrap index b049c3106e..f55013b787 100644 --- a/subprojects/proxy-libintl.wrap +++ b/subprojects/proxy-libintl.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=proxy-libintl url=https://github.com/frida/proxy-libintl.git -push-url=git@github.com:friday/proxy-libintl.git +push-url=git@github.com:frida/proxy-libintl.git revision=0.1 From 3c1b25465b5ac12ceff868be0f953ca284141ae6 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sun, 15 Sep 2019 08:05:29 +0530 Subject: [PATCH 254/448] Move to using GitHub binary releases Can't update to 2.5.19 because of https://github.com/lexxmark/winflexbison/issues/48 Fixes https://gitlab.freedesktop.org/gstreamer/gst-build/issues/43 --- subprojects/win-flex-bison-binaries/download-binary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/win-flex-bison-binaries/download-binary.py b/subprojects/win-flex-bison-binaries/download-binary.py index 16f69c95f1..855a1fa41e 100644 --- a/subprojects/win-flex-bison-binaries/download-binary.py +++ b/subprojects/win-flex-bison-binaries/download-binary.py @@ -13,7 +13,7 @@ ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE -base_url = 'https://sourceforge.net/projects/winflexbison/files/win_flex_bison-{}.zip' +base_url = 'https://github.com/lexxmark/winflexbison/releases/download/v{0}/win_flex_bison-{0}.zip' url = base_url.format(sys.argv[1]) zip_sha256 = sys.argv[2] source_dir = os.path.join(os.environ['MESON_SOURCE_ROOT'], os.environ['MESON_SUBDIR']) From 78c971df618c9e34f7341af4ab5884e62b54435b Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sun, 15 Sep 2019 08:06:10 +0530 Subject: [PATCH 255/448] Update .gitignore --- subprojects/win-flex-bison-binaries/.gitignore | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/subprojects/win-flex-bison-binaries/.gitignore b/subprojects/win-flex-bison-binaries/.gitignore index dd180b4d63..6e28064317 100644 --- a/subprojects/win-flex-bison-binaries/.gitignore +++ b/subprojects/win-flex-bison-binaries/.gitignore @@ -1,9 +1,10 @@ *.sw[op] *~ -custom_build_rules -data/ -FlexLexer.h -README.txt -UNISTD_ERROR.readme +/custom_build_rules/ +/data/ +/FlexLexer.h +/README.md +/changelog.md +/UNISTD_ERROR.readme *.exe *.zip From 0633b417f7f4a191ac288ca8a64b65e2561e6dd3 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Wed, 18 Sep 2019 11:22:19 -0400 Subject: [PATCH 256/448] Add back gtk_doc option This is needed to disable gtk_doc in subprojects that have that option yielding. --- meson_options.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/meson_options.txt b/meson_options.txt index 6e565bcf76..de4243c341 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -17,3 +17,4 @@ option('introspection', type : 'feature', value : 'auto', description : 'Generat option('nls', type : 'feature', value : 'auto', description : 'Enable native language support (translations)') option('orc', type : 'feature', value : 'auto', description : 'Enable Optimized Inner Loop Runtime Compiler') option('doc', type : 'feature', value : 'auto', description : 'Generate API documentation with hotdoc') +option('gtk_doc', type : 'feature', value : 'auto', description : 'Generate API documentation with gtk-doc') From c6613d8da2191aaf2bd7d1ddd4130a289b02e1ba Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 19 Sep 2019 16:15:03 +0530 Subject: [PATCH 257/448] gst-uninstalled: Don't add plugin paths to PATH or LD_LIBRARY_PATH We don't need to do that, and adding it causes us to exceed the PATH length limit on Windows, which makes the terminal completely unusable. --- gst-uninstalled.py | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/gst-uninstalled.py b/gst-uninstalled.py index eb275f3f79..799e7a46fd 100755 --- a/gst-uninstalled.py +++ b/gst-uninstalled.py @@ -27,6 +27,10 @@ DEFAULT_BUILDDIR = os.path.join(SCRIPTDIR, 'build') if not os.path.exists(DEFAULT_BUILDDIR): DEFAULT_BUILDDIR = os.path.join(SCRIPTDIR, '_build') +TYPELIB_REG = re.compile(r'.*\.typelib$') +SHAREDLIB_REG = re.compile(r'\.so|\.dylib|\.dll') +GSTPLUGIN_FILEPATH_REG = re.compile(r'.*/lib[^/]*/gstreamer-1.0/[^/]+$') + def listify(o): if isinstance(o, str): @@ -58,6 +62,31 @@ def prepend_env_var(env, var, value, sysroot): env[var] = val + env_val env[var] = env[var].replace(os.pathsep + os.pathsep, os.pathsep).strip(os.pathsep) +def is_library_target_and_not_plugin(target, filename): + ''' + Don't add plugins to PATH/LD_LIBRARY_PATH because: + 1. We don't need to + 2. It causes us to exceed the PATH length limit on Windows and Wine + ''' + if not target['type'].startswith('shared'): + return False + if not target['installed']: + return False + # Check if this output of that target is a shared library + if not SHAREDLIB_REG.search(filename): + return False + # Check if it's installed to the gstreamer plugin location + for install_filename in target['install_filename']: + if install_filename.endswith(os.path.basename(filename)): + break + else: + # None of the installed files in the target correspond to the built + # filename, so skip + return False + if GSTPLUGIN_FILEPATH_REG.search(install_filename.replace('\\', '/')): + return False + return True + def get_subprocess_env(options, gst_version): env = os.environ.copy() @@ -83,9 +112,6 @@ def get_subprocess_env(options, gst_version): "%s/subprojects/gstreamer/libs/gst/helpers/gst-ptp-helper" % options.builddir) env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") - sharedlib_reg = re.compile(r'\.so|\.dylib|\.dll') - typelib_reg = re.compile(r'.*\.typelib$') - if os.name is 'nt': lib_path_envvar = 'PATH' elif platform.system() == 'Darwin': @@ -143,14 +169,11 @@ def get_subprocess_env(options, gst_version): continue if filename.endswith('.dll'): mono_paths.add(os.path.join(options.builddir, root)) - if typelib_reg.search(filename): + if TYPELIB_REG.search(filename): prepend_env_var(env, "GI_TYPELIB_PATH", os.path.join(options.builddir, root), options.sysroot) - elif sharedlib_reg.search(filename): - if not target['type'].startswith('shared'): - continue - + elif is_library_target_and_not_plugin(target, filename): prepend_env_var(env, lib_path_envvar, os.path.join(options.builddir, root), options.sysroot) From da86dcfee27e3b7f663334bb39c59fd859351af3 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 2 Aug 2019 17:47:41 -0700 Subject: [PATCH 258/448] Remove msys2_setup as it is not used, not tested, not documentated --- msys2_setup.py | 184 ------------------------------------------------- 1 file changed, 184 deletions(-) delete mode 100644 msys2_setup.py diff --git a/msys2_setup.py b/msys2_setup.py deleted file mode 100644 index 0ea17e5a37..0000000000 --- a/msys2_setup.py +++ /dev/null @@ -1,184 +0,0 @@ -#!/usr/bin/env python3 -"""Setup meson based GStreamer uninstalled environment based on msys2.""" - -import argparse -import itertools -import os -import re -import sys -import shlex -import shutil -import subprocess -import tempfile - -from scripts.common import git -from setup import GstBuildConfigurer - - -PROJECTNAME = "GStreamer build" - -ROOTDIR = os.path.abspath(os.path.dirname(__file__)) - - -class Msys2Configurer(GstBuildConfigurer): - MESON_GIT = 'https://github.com/mesonbuild/meson.git' - DEPENDENCIES = ['git', - 'bison', - 'mingw-w64-x86_64-pkg-config', - 'mingw-w64-x86_64-ninja', - 'mingw-w64-x86_64-libxml2', - 'mingw-w64-x86_64-ffmpeg', - 'mingw-w64-x86_64-python3', - 'mingw-w64-x86_64-json-glib'] - LIBNAME_EXCEPTIONS = { - r'^zlib1.lib$': 'z.lib', - r'^nettle-.*': 'nettle.lib', - r'^hogweed-.*': 'hogweed.lib', - # Fancy, but it seems to be the correct way to do it - r'^eay32.lib$': 'crypto.lib', - r'^ssleay32.lib$': 'ssl.lib', - } - - def get_libname(self, dll_name): - lib_name = re.sub(r'(?:lib)?(.*?)(?:-\d+)?\.dll', r'\1.lib', dll_name) - - for exception_name, exception_libname in self.LIBNAME_EXCEPTIONS.items(): - if re.findall(exception_name, lib_name): - return exception_libname - return lib_name - - def make_lib(self, lib, dll, dll_name): - print('%s... ' % os.path.basename(lib), end='', flush=True) - try: - os.remove(lib) - except FileNotFoundError: - pass - - dumpbin = subprocess.check_output(['dumpbin', '/exports', dll]) - lines = dumpbin.decode().splitlines() - export_start = [i for i in enumerate( - lines) if i[1].find('ordinal hint') != -1][0][0] + 2 - exports = itertools.takewhile(lambda x: x != '', lines[export_start:]) - exports = [i.split() for i in exports] - def_file = tempfile.NamedTemporaryFile( - suffix='.def', delete=False, mode='w') - def_file.write('LIBRARY ' + dll_name + '\r\n') - def_file.write('EXPORTS\r\n') - for tmp in exports: - ordinal, name = tmp[0], tmp[3] - def_file.write(name + ' @' + ordinal + '\r\n') - def_file.close() - subprocess.check_output(['lib', '/def:' + def_file.name, - '/out:' + lib]) - os.remove(def_file.name) - - def make_lib_if_needed(self, dll): - if not dll.endswith('.dll'): - return - - lib_dir, dll_name = os.path.split(dll) - if lib_dir.endswith('bin'): - lib_dir = lib_dir[:-3] + 'lib' - - lib_name = self.get_libname(dll_name) - lib = os.path.join(lib_dir, lib_name) - if os.path.exists(lib) and os.stat(dll).st_mtime_ns < os.stat(lib).st_mtime_ns: - return - - print('Generating .lib file for %s ...' % os.path.basename(dll), end='', flush=True) - self.make_lib(lib, dll, dll_name) - print('DONE', flush=True) - - def make_libs(self): - base = os.path.join(self.options.msys2_path, 'mingw64', 'bin') - for f in os.listdir(base): - if f.endswith('.dll'): - self.make_lib_if_needed(os.path.join(base, f)) - - def get_configs(self): - return GstBuildConfigurer.get_configs(self) + [ - '-D' + m + ':disable_introspection=true' for m in [ - 'gst-devtools', 'gstreamer', 'gst-plugins-base', - 'gst-editing-services']] - - def setup(self, args): - if not os.path.exists(self.options.msys2_path): - print("msys2 not found in %s. Please make sure to install" - " (from http://msys2.github.io/) specify --msys2-path" - " if you did not install in the default directory.", flush=True) - return False - - for path in ['mingw64/bin', 'bin', 'usr/bin']: - os.environ['PATH'] = os.environ.get( - 'PATH', '') + os.pathsep + os.path.normpath(os.path.join(self.options.msys2_path, path)) - os.environ['PATH'] = os.environ['PATH'].replace(';;', ';') - os.environ['PKG_CONFIG_PATH'] = os.environ.get( - 'PKG_CONFIG_PATH', '') + ':/mingw64/lib/pkgconfig:/mingw64/share/pkgconfig' - - subprocess.check_call(['pacman', '-S', '--needed', '--noconfirm'] + self.DEPENDENCIES) - source_path = os.path.abspath(os.path.curdir) - - print('Making sure meson is present in root folder... ', end='', flush=True) - if not os.path.isdir(os.path.join(source_path, 'meson')): - print('\nCloning meson', flush=True) - git('clone', self.MESON_GIT, repository_path=source_path) - else: - print('\nDONE', flush=True) - - print("Making libs", flush=True) - self.make_libs() - print("Done making .lib files.", flush=True) - if not os.path.exists(os.path.join(source_path, 'build', 'build.ninja')) or \ - self.options.reconfigure: - print("Running meson", flush=True) - if not self.configure_meson(): - return False - - try: - if not args: - print("Getting into msys2 environment", flush=True) - subprocess.check_call([sys.executable, - os.path.join(source_path, 'gst-uninstalled.py'), - '--builddir', os.path.join(source_path, 'build')]) - else: - print("Running %s" ' '.join(args), flush=True) - res = subprocess.check_call(args) - except subprocess.CalledProcessError as e: - return False - - return True - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Process some integers.') - parser.add_argument("--no-error", action='store_true', - default=False, help="Do not error out on warnings") - parser.add_argument("--reconfigure", action='store_true', - default=False, help='Force a full reconfiguration' - ' meaning the build/ folder is removed.' - ' You can also use `ninja reconfigure` to just' - ' make sure meson is rerun but the build folder' - ' is kept.') - if os.name != 'nt': - print("Using this script outside windows does not make sense.", flush=True) - exit(1) - - parser.add_argument("-m", "--msys2-path", dest="msys2_path", - help="Where to find msys2 root directory." - "(deactivates msys if unset)", - default="C:\msys64") - - parser.add_argument("-c", "--command", dest="command", - help="Command to run instead of entering environment.", - default="") - options, args = parser.parse_known_args() - - if not shutil.which('cl'): - print("Can not find MSVC on windows," - " make sure you are in a 'Visual Studio" - " Native Tools Command Prompt'", flush=True) - exit(1) - - configurer = Msys2Configurer(options, args) - - exit(not configurer.setup(shlex.split(options.command))) From fe39bd302779d30c876ef028ab321b4565d15b10 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 2 Aug 2019 19:19:04 -0700 Subject: [PATCH 259/448] Rename 'uninstalled' to development environment In the case of wine, the env can not be uninstalled, also developers do not necessiraly care about the fact that it is "uninstalled", the important thing is that it is a development environment, meaning that they can work on GStreamer or with GStreamer in the environment. I still keep the `uninstalled` target to avoid changing people's habits for now. --- README.md | 14 +++++++------- gst-uninstalled.py => gst-env.py | 5 ----- meson.build | 10 +++++++--- 3 files changed, 14 insertions(+), 15 deletions(-) rename gst-uninstalled.py => gst-env.py (98%) diff --git a/README.md b/README.md index 20f37ab589..ba5c8dec94 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ GStreamer [meson](http://mesonbuild.com/) based repositories aggregrator. Check out this module and run meson on it, and it will git clone the other GStreamer modules as [meson subprojects](http://mesonbuild.com/Subprojects.html) and build everything in one go. Once that is done you can switch into an -uninstalled environment which allows you to easily develop and test the latest +development environment which allows you to easily develop and test the latest version of GStreamer without the need to install anything or touch an existing GStreamer system installation. @@ -63,14 +63,14 @@ it is built by passing `-Dgst-plugins-good:qt5=enabled` to `meson`. This will cause Meson to error out if the plugin could not be enabled. This also works for all plugins in all GStreamer repositories. -## Uninstalled environment +## Development environment target -gst-build also contains a special `uninstalled` target that lets you enter an -uninstalled development environment where you will be able to work on GStreamer +gst-build also contains a special `devenv` target that lets you enter an +development environment where you will be able to work on GStreamer easily. You can get into that environment running: ``` -ninja -C build/ uninstalled +ninja -C build/ devenv ``` If your operating system handles symlinks, built modules source code will be @@ -78,7 +78,7 @@ available at the root of `gst-build/` for example GStreamer core will be in `gstreamer/`. Otherwise they will be present in `subprojects/`. You can simply hack in there and to rebuild you just need to rerun `ninja -C build/`. -NOTE: In the uninstalled environment, a fully usable prefix is also configured +NOTE: In the development environment, a fully usable prefix is also configured in `gst-build/prefix` where you can install any extra dependency/project. ## Update git subprojects @@ -151,7 +151,7 @@ GST_CHECKS=test_subbuffer meson test -C build/ --suite gstreamer gst_gstbuffer ## Optional Installation -`gst-build` has been created primarily for [uninstalled usage](#uninstalled-environment), +`gst-build` has been created primarily for [development usage](#development-environment-target), but you can also install everything that is built into a predetermined prefix like so: ``` diff --git a/gst-uninstalled.py b/gst-env.py similarity index 98% rename from gst-uninstalled.py rename to gst-env.py index 799e7a46fd..8668973efb 100755 --- a/gst-uninstalled.py +++ b/gst-env.py @@ -273,11 +273,6 @@ def get_windows_shell(): result = subprocess.check_output(command) return result.decode().strip() -# https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv -def in_venv(): - return (hasattr(sys, 'real_prefix') or - (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix)) - if __name__ == "__main__": parser = argparse.ArgumentParser(prog="gstreamer-uninstalled") diff --git a/meson.build b/meson.build index 5078a579fc..4b75b41434 100644 --- a/meson.build +++ b/meson.build @@ -167,9 +167,13 @@ cmdres = run_command(python3, find_program('scripts/generate_plugins_path.py'), assert(cmdres.returncode() == 0, 'Could not create plugins path: @0@'.format(cmdres.stderr())) message('Building subprojects: ' + ', '.join(subprojects_names)) -setenv = find_program('gst-uninstalled.py') -run_target('uninstalled', command : [setenv, '--builddir=@0@'.format(meson.build_root()), - '--srcdir=@0@'.format(meson.source_root())]) +setenv = find_program('gst-env.py') + +devenv_cmd = [setenv, '--builddir=@0@'.format(meson.build_root()), + '--srcdir=@0@'.format(meson.source_root())] + +run_target('uninstalled', command : devenv_cmd) +run_target('devenv', command : devenv_cmd) update = find_program('git-update') run_target('git-update', command : [update]) From 3d8662ebfe778c85319c473b16ecd4d60cb6d137 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 2 Aug 2019 19:22:16 -0700 Subject: [PATCH 260/448] Add support for wine+mingw environments --- README.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++ gst-env.py | 40 ++++++++++++++++++++++++++++++++--- gst-uninstalled.py | 1 + meson.build | 10 +++++++++ scripts/common.py | 28 +++++++++++++++++++++++++ 5 files changed, 128 insertions(+), 3 deletions(-) create mode 120000 gst-uninstalled.py diff --git a/README.md b/README.md index ba5c8dec94..7fc75e84ae 100644 --- a/README.md +++ b/README.md @@ -279,3 +279,55 @@ pip3 install meson Note that Meson is written entirely in Python, so you can also run it as-is from the [git repository](https://github.com/mesonbuild/meson/) if you want to use the latest master branch for some reason. + + +### Setup a mingw/wine based development environment on linux + +#### Install wine and mingw + +##### On fedora x64 + +``` sh +sudo dnf install mingw64-gcc mingw64-gcc-c++ mingw64-pkg-config mingw64-winpthreads wine +``` + +FIXME: Figure out what needs to be installed on other distros + +#### Get meson from git + +This simplifies the process and allows us to use the cross files +defined in meson itself. + +``` sh +git clone https://github.com/mesonbuild/meson.git +``` + +#### Build and install + +``` +BUILDDIR=$PWD/winebuild/ +export WINEPREFIX=$BUILDDIR/wine-prefix/ && mkdir -p $WINEPREFIX +# Setting the prefix is mandatory as it is used to setup symlinks during uninstalled development +meson/meson.py $BUILDDIR --cross-file meson/cross/linux-mingw-w64-64bit.txt -Dgst-plugins-bad:vulkan=disabled -Dorc:gtk_doc=disabled --prefix=$BUILDDIR/wininstall/ -Djson-glib:gtk_doc=disabled +meson/meson.py install -C $BUILDDIR/ +``` + +> __NOTE__: You should use `meson install -C $BUILDDIR` each time you make a change +> instead of the usual `ninja -C build` as the environment is not uninstalled. + +#### The development environment + +You can get into the development environment the usual way: + +``` +ninja -C $BUILDDIR/ devenv +``` + +After setting up [binfmt] to use wine for windows binaries, +you can run GStreamer tools under wine by running: + +``` +gst-launch-1.0.exe videotestsrc ! glimagesink +``` + +[binfmt]: http://man7.org/linux/man-pages/man5/binfmt.d.5.html \ No newline at end of file diff --git a/gst-env.py b/gst-env.py index 8668973efb..06f04ae0d5 100755 --- a/gst-env.py +++ b/gst-env.py @@ -19,6 +19,7 @@ from distutils.util import strtobool from scripts.common import get_meson from scripts.common import git from scripts.common import win32_get_short_path_name +from scripts.common import get_wine_shortpath SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) PREFIX_DIR = os.path.join(SCRIPTDIR, 'prefix') @@ -88,29 +89,53 @@ def is_library_target_and_not_plugin(target, filename): return True +def get_wine_subprocess_env(options, env): + with open(os.path.join(options.builddir, 'meson-info', 'intro-buildoptions.json')) as f: + buildoptions = json.load(f) + + prefix, = [o for o in buildoptions if o['name'] == 'prefix'] + path = os.path.normpath(os.path.join(prefix['value'], 'bin')) + prepend_env_var(env, "PATH", path, options.sysroot) + wine_path = get_wine_shortpath( + options.wine.split(' '), + [path] + env.get('WINEPATH', '').split(';') + ) + if options.winepath: + wine_path += ';' + options.winepath + env['WINEPATH'] = wine_path + env['WINEDEBUG'] = 'fixme-all' + + return env + + def get_subprocess_env(options, gst_version): env = os.environ.copy() env["CURRENT_GST"] = os.path.normpath(SCRIPTDIR) + env["GST_VERSION"] = gst_version env["GST_VALIDATE_SCENARIOS_PATH"] = os.path.normpath( "%s/subprojects/gst-devtools/validate/data/scenarios" % SCRIPTDIR) env["GST_VALIDATE_PLUGIN_PATH"] = os.path.normpath( "%s/subprojects/gst-devtools/validate/plugins" % options.builddir) env["GST_VALIDATE_APPS_DIR"] = os.path.normpath( "%s/subprojects/gst-editing-services/tests/validate" % SCRIPTDIR) + env["GST_ENV"] = 'gst-' + gst_version + env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") prepend_env_var(env, "PATH", os.path.normpath( "%s/subprojects/gst-devtools/validate/tools" % options.builddir), options.sysroot) + + if options.wine: + return get_wine_subprocess_env(options, env) + prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'meson'), options.sysroot) - env["GST_VERSION"] = gst_version - env["GST_ENV"] = 'gst-' + gst_version + env["GST_PLUGIN_SYSTEM_PATH"] = "" env["GST_PLUGIN_SCANNER"] = os.path.normpath( "%s/subprojects/gstreamer/libs/gst/helpers/gst-plugin-scanner" % options.builddir) env["GST_PTP_HELPER"] = os.path.normpath( "%s/subprojects/gstreamer/libs/gst/helpers/gst-ptp-helper" % options.builddir) - env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") if os.name is 'nt': lib_path_envvar = 'PATH' @@ -285,6 +310,12 @@ if __name__ == "__main__": parser.add_argument("--sysroot", default='', help="The sysroot path used during cross-compilation") + parser.add_argument("--wine", + default='', + help="Build a wine env based on specified wine command") + parser.add_argument("--winepath", + default='', + help="Exra path to set to WINEPATH.") options, args = parser.parse_known_args() if not os.path.exists(options.builddir): @@ -302,6 +333,9 @@ if __name__ == "__main__": gst_version = git("rev-parse", "--symbolic-full-name", "--abbrev-ref", "HEAD", repository_path=options.srcdir).strip('\n') + if options.wine: + gst_version += '-' + os.path.basename(options.wine) + if not args: if os.name is 'nt': shell = get_windows_shell() diff --git a/gst-uninstalled.py b/gst-uninstalled.py new file mode 120000 index 0000000000..2025ace645 --- /dev/null +++ b/gst-uninstalled.py @@ -0,0 +1 @@ +gst-env.py \ No newline at end of file diff --git a/meson.build b/meson.build index 4b75b41434..e64c5b0a3e 100644 --- a/meson.build +++ b/meson.build @@ -172,6 +172,16 @@ setenv = find_program('gst-env.py') devenv_cmd = [setenv, '--builddir=@0@'.format(meson.build_root()), '--srcdir=@0@'.format(meson.source_root())] +if meson.has_exe_wrapper() and build_machine.system() == 'linux' and host_machine.system() == 'windows' + # FIXME: Ideally we could get the wrapper directly from meson + devenv_cmd += ['--wine', host_machine.cpu_family() == 'x86_64' ? 'wine64' : 'wine32'] + sysroot = meson.get_cross_property('sys_root') + if sysroot != '' + # Logic from meson + devenv_cmd += ['--winepath', 'Z:' + join_paths(sysroot, 'bin')] + endif +endif + run_target('uninstalled', command : devenv_cmd) run_target('devenv', command : devenv_cmd) diff --git a/scripts/common.py b/scripts/common.py index 5cea742027..4fea527359 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -5,6 +5,7 @@ import shutil import argparse import platform import subprocess +import uuid ROOTDIR = os.path.abspath(os.path.dirname(__file__)) @@ -31,6 +32,33 @@ def win32_get_short_path_name(long_name): else: output_buf_size = needed + +def get_wine_shortpath(winecmd, wine_paths): + seen = set() + wine_paths += [p for p in wine_paths if not (p in seen or seen.add(p))] + + getShortPathScript = '%s.bat' % str(uuid.uuid4()).lower()[:5] + with open(getShortPathScript, mode='w') as f: + f.write("@ECHO OFF\nfor %%x in (%*) do (\n echo|set /p=;%~sx\n)\n") + f.flush() + try: + with open(os.devnull, 'w') as stderr: + wine_path = subprocess.check_output( + winecmd + + ['cmd', '/C', getShortPathScript] + wine_paths, + stderr=stderr).decode('utf-8') + except subprocess.CalledProcessError as e: + print("Could not get short paths: %s" % e) + wine_path = ';'.join(wine_paths) + finally: + os.remove(getShortPathScript) + if len(wine_path) > 2048: + raise AssertionError('WINEPATH size {} > 2048' + ' this will cause random failure.'.format( + len(wine_path))) + return wine_path + + class Colors: HEADER = '\033[95m' OKBLUE = '\033[94m' From 0d54e153d3445edb92c29018a93e05a253093fd9 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 24 Sep 2019 13:36:54 -0300 Subject: [PATCH 261/448] Update ffmpeg to 4.1.4 --- subprojects/FFmpeg.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/FFmpeg.wrap b/subprojects/FFmpeg.wrap index b29dce6c2f..0d319648da 100644 --- a/subprojects/FFmpeg.wrap +++ b/subprojects/FFmpeg.wrap @@ -2,4 +2,4 @@ directory=FFmpeg url=https://gitlab.freedesktop.org/gstreamer/meson-ports/ffmpeg.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/ffmpeg.git -revision=meson-4.1.3 +revision=meson-4.1.4 From f93a39a9eefa7476c57824ed063310b6cc9b0dd5 Mon Sep 17 00:00:00 2001 From: Ruben Gonzalez Date: Sun, 20 Oct 2019 21:21:27 +0200 Subject: [PATCH 262/448] Add subprojects/gst-docs in gitignore gst-docs in only build on Linux if hotdoc is in the PATH. A correct gitigonore is important for modern tools like ripgrep, fd or skim. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5ddf02b483..689f7feed3 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ __pycache__ meson/ subprojects/gst-integration-testsuites subprojects/gst-devtools +subprojects/gst-docs subprojects/gst-editing-services subprojects/gst-examples subprojects/gst-libav From 9dcac5fbddd207be57ef294bba4765b8e1c5ba19 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Tue, 8 Oct 2019 18:06:58 +0200 Subject: [PATCH 263/448] subprojects: add wrap for libmicrodns This library is used by the newly-merged mdns device provider for discovering devices advertised over multicast dns. --- subprojects/libmicrodns.wrap | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 subprojects/libmicrodns.wrap diff --git a/subprojects/libmicrodns.wrap b/subprojects/libmicrodns.wrap new file mode 100644 index 0000000000..27ae6aa607 --- /dev/null +++ b/subprojects/libmicrodns.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=libmicrodns +url=https://github.com/videolabs/libmicrodns.git +revision=master From a15dc0b5894f0840d87e3eedd1044e350e84fa09 Mon Sep 17 00:00:00 2001 From: Ruben Gonzalez Date: Fri, 25 Oct 2019 16:04:52 +0200 Subject: [PATCH 264/448] Add gst-examples in gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 689f7feed3..d12948b975 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ cscope.out cscope.po.out gst-devtools gst-editing-services +gst-examples gst-integration-testsuites gst-libav gst-omx From 3dc7c9de94eee75403711bae21df8a8a076602f7 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Sat, 2 Nov 2019 10:44:57 +0100 Subject: [PATCH 265/448] gst-env: Use locally built GStreamer utility programs The host environment might not have gst-launch-1.0 and gst-inspect-1.0 installed. Fixes #52 --- gst-env.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gst-env.py b/gst-env.py index 06f04ae0d5..16c7a1498f 100755 --- a/gst-env.py +++ b/gst-env.py @@ -167,6 +167,14 @@ def get_subprocess_env(options, gst_version): prepend_env_var(env, "PATH", os.path.join(SCRIPTDIR, 'gstreamer', 'tools'), options.sysroot) + # tools: gst-launch-1.0, gst-inspect-1.0 + prepend_env_var(env, "PATH", os.path.join(options.builddir, 'subprojects', + 'gstreamer', 'tools'), + options.sysroot) + prepend_env_var(env, "PATH", os.path.join(options.builddir, 'subprojects', + 'gst-plugins-base', 'tools'), + options.sysroot) + # Library and binary search paths prepend_env_var(env, "PATH", os.path.join(PREFIX_DIR, 'bin'), options.sysroot) From 1ee4c316c1119b59a70556c6204341c832970066 Mon Sep 17 00:00:00 2001 From: Stephan Hesse Date: Sat, 2 Nov 2019 17:18:27 +0100 Subject: [PATCH 266/448] instead of 'examples' use 'gst-examples' as option to build the respective subproject we want to do this because the other "examples" in plugins (tests etc) need a lot deps (qt5 etc) that are not needed by gst-examples itself. --- meson.build | 2 +- meson_options.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index e64c5b0a3e..a6e8dccd1b 100644 --- a/meson.build +++ b/meson.build @@ -63,7 +63,7 @@ subprojects = [ ['gstreamer-sharp', { 'option': get_option('sharp') }], ['pygobject', { 'option': get_option('python'), 'match_gst_version': false }], ['gst-python', { 'option': get_option('python'), 'has-plugins': true}], - ['gst-examples', { 'option': get_option('examples'), 'match_gst_versions': false}], + ['gst-examples', { 'option': get_option('gst-examples'), 'match_gst_versions': false}], ] symlink = ''' diff --git a/meson_options.txt b/meson_options.txt index de4243c341..5ae2ea251f 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -10,6 +10,7 @@ option('omx', type : 'feature', value : 'disabled') option('vaapi', type : 'feature', value : 'auto') option('sharp', type : 'feature', value : 'disabled') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') +option('gst-examples', type : 'feature', value : 'auto', description : 'Build gst-examples') # Common options, automatically inherited by subprojects option('examples', type : 'feature', value : 'auto', description : 'Build examples') From df0808f4934822e56e0a60afa6ff07e755fcd6f4 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Wed, 23 Oct 2019 16:51:24 +0900 Subject: [PATCH 267/448] meson: Enable some msvc warnings Enable following warnings - unused variable - unhandled enum value in switch/case Those warnings might cause build error on CI pipeline, but not enabled by default. For development environment, let's enable them to save CI (and developer's time) resource. Fixes: https://gitlab.freedesktop.org/gstreamer/gst-build/issues/31 --- meson.build | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/meson.build b/meson.build index a6e8dccd1b..7f7efa43b3 100644 --- a/meson.build +++ b/meson.build @@ -43,6 +43,14 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif endif endif + + # Change some warning which belong to level 3 (production quality) or + # 4 (informational) to level 1 (severe) + add_global_arguments ( + '/w14062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled + '/w14101', # 'identifier' : unreferenced local variable + '/w14189', # 'identifier' : local variable is initialized but not referenced + language: 'c') endif # Ordered list of subprojects (dict has no ordering guarantees) From f7ac326d5a4315d98310a45459d0413d71795b4c Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Wed, 23 Oct 2019 16:54:43 +0900 Subject: [PATCH 268/448] meson: Specify encoding as utf-8 for msvc Some projects does not have this option which causes verbose warnings --- meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/meson.build b/meson.build index 7f7efa43b3..b1d2a41931 100644 --- a/meson.build +++ b/meson.build @@ -50,6 +50,7 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' '/w14062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled '/w14101', # 'identifier' : unreferenced local variable '/w14189', # 'identifier' : local variable is initialized but not referenced + cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 language: 'c') endif From aded9c617fa334774d746ef0ebd3cd879c343bb4 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Sat, 2 Nov 2019 16:23:45 +0100 Subject: [PATCH 269/448] gst-env: Ensure target install filename is a list At least in Meson 0.49, the target['install_name'] is a string, not a list, so the heuristics declared in the is_library_target_and_not_plugin() can't apply because Python is actually happy to iterate over a string without any warning. --- gst-env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-env.py b/gst-env.py index 16c7a1498f..c5e2fc801a 100755 --- a/gst-env.py +++ b/gst-env.py @@ -77,7 +77,7 @@ def is_library_target_and_not_plugin(target, filename): if not SHAREDLIB_REG.search(filename): return False # Check if it's installed to the gstreamer plugin location - for install_filename in target['install_filename']: + for install_filename in listify(target['install_filename']): if install_filename.endswith(os.path.basename(filename)): break else: From 2e6bd1ca8d4e09fa7c5f5c8a39ce110d6e9f290c Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Sat, 2 Nov 2019 16:27:16 +0100 Subject: [PATCH 270/448] gst-env: Fix the gst plugin file path regex for Linux platforms On Linux, the library file is stored in the platform triplet directory under the lib directory (hence for example lib/x86_64-linux-gnu/gstreamer-1.0/libgstfoo.so) so the regex needs to take this into account. With this change the LD_LIBRARY_PATH on Linux now contains only the directories with gst libs, ignoring the plugins, as initially intended in c6613d8da2191aaf2bd7d1ddd4130a289b02e1ba. Fixes #56 --- gst-env.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/gst-env.py b/gst-env.py index c5e2fc801a..d368a21b0a 100755 --- a/gst-env.py +++ b/gst-env.py @@ -30,8 +30,11 @@ if not os.path.exists(DEFAULT_BUILDDIR): TYPELIB_REG = re.compile(r'.*\.typelib$') SHAREDLIB_REG = re.compile(r'\.so|\.dylib|\.dll') -GSTPLUGIN_FILEPATH_REG = re.compile(r'.*/lib[^/]*/gstreamer-1.0/[^/]+$') +# libdir is expanded from option of the same name listed in the `meson +# introspect --buildoptions` output. +GSTPLUGIN_FILEPATH_REG_TEMPLATE = r'.*/{libdir}/gstreamer-1.0/[^/]+$' +GSTPLUGIN_FILEPATH_REG = None def listify(o): if isinstance(o, str): @@ -84,6 +87,10 @@ def is_library_target_and_not_plugin(target, filename): # None of the installed files in the target correspond to the built # filename, so skip return False + + global GSTPLUGIN_FILEPATH_REG + if GSTPLUGIN_FILEPATH_REG is None: + GSTPLUGIN_FILEPATH_REG = re.compile(GSTPLUGIN_FILEPATH_REG_TEMPLATE) if GSTPLUGIN_FILEPATH_REG.search(install_filename.replace('\\', '/')): return False return True @@ -194,6 +201,15 @@ def get_subprocess_env(options, gst_version): paths = set() mono_paths = set() srcdir_path = pathlib.Path(options.srcdir) + + build_options_s = subprocess.check_output(meson + ['introspect', options.builddir, '--buildoptions']) + build_options = json.loads(build_options_s.decode()) + libdir, = [o['value'] for o in build_options if o['name'] == 'libdir'] + libdir = libdir.replace('\\', '/') + + global GSTPLUGIN_FILEPATH_REG_TEMPLATE + GSTPLUGIN_FILEPATH_REG_TEMPLATE = GSTPLUGIN_FILEPATH_REG_TEMPLATE.format(libdir=libdir) + for target in targets: filenames = listify(target['filename']) for filename in filenames: From 49fea2520f5c672493a91be8c0e3bb4ef6de6e27 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Mon, 11 Nov 2019 12:41:23 +0100 Subject: [PATCH 271/448] python: Avoid using 'is' to compare strings This is the wrong operator to use, which only seems to work because `os.name` and `'nt'` happen to be the same object. Python 3.8 also produces a `SyntaxWarning` when encountering this pattern. --- git-update | 2 +- gst-env.py | 6 +++--- scripts/common.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/git-update b/git-update index 19f27ef5f3..e578d74fd0 100755 --- a/git-update +++ b/git-update @@ -86,7 +86,7 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], re "\n=====================================" % ( out, repo_dir)) try: - if os.name is 'nt': + if os.name == 'nt': shell = os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe") else: shell = os.environ.get("SHELL", os.path.realpath("/bin/sh")) diff --git a/gst-env.py b/gst-env.py index d368a21b0a..ad00cd8546 100755 --- a/gst-env.py +++ b/gst-env.py @@ -56,7 +56,7 @@ def prepend_env_var(env, var, value, sysroot): if value.startswith(sysroot): value = value[len(sysroot):] # Try not to exceed maximum length limits for env vars on Windows - if os.name is 'nt': + if os.name == 'nt': value = win32_get_short_path_name(value) env_val = env.get(var, '') val = os.pathsep + value + os.pathsep @@ -144,7 +144,7 @@ def get_subprocess_env(options, gst_version): env["GST_PTP_HELPER"] = os.path.normpath( "%s/subprojects/gstreamer/libs/gst/helpers/gst-ptp-helper" % options.builddir) - if os.name is 'nt': + if os.name == 'nt': lib_path_envvar = 'PATH' elif platform.system() == 'Darwin': lib_path_envvar = 'DYLD_LIBRARY_PATH' @@ -361,7 +361,7 @@ if __name__ == "__main__": gst_version += '-' + os.path.basename(options.wine) if not args: - if os.name is 'nt': + if os.name == 'nt': shell = get_windows_shell() if shell == 'powershell.exe': args = ['powershell.exe'] diff --git a/scripts/common.py b/scripts/common.py index 4fea527359..f9c19850d2 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -11,7 +11,7 @@ import uuid ROOTDIR = os.path.abspath(os.path.dirname(__file__)) -if os.name is 'nt': +if os.name == 'nt': import ctypes from ctypes import wintypes _GetShortPathNameW = ctypes.windll.kernel32.GetShortPathNameW From d72ce5f14eea170f63db3f9c84f920d1de4e2cf7 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Mon, 3 Jun 2019 15:16:07 -0400 Subject: [PATCH 272/448] Add sqlite.wrap from wrapdb This allows building libsoup support on platforms that does not have sqlite. --- subprojects/sqlite.wrap | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 subprojects/sqlite.wrap diff --git a/subprojects/sqlite.wrap b/subprojects/sqlite.wrap new file mode 100644 index 0000000000..8c5587732e --- /dev/null +++ b/subprojects/sqlite.wrap @@ -0,0 +1,10 @@ +[wrap-file] +directory = sqlite-amalgamation-3250100 + +source_url = https://www.sqlite.org/2018/sqlite-amalgamation-3250100.zip +source_filename = sqlite-amalgamation-3250100.zip +source_hash = 6c68b6364fa0e01d9d05088ba473ac4e7a6fbc64f9b9aeb6d830f944e2a1fa03 + +patch_url = https://wrapdb.mesonbuild.com/v1/projects/sqlite/3250100/1/get_zip +patch_filename = sqlite-3250100-1-wrap.zip +patch_hash = cbb697a1e4649cf6b7f28d82048109d87ccbf01106e1d5a68f763d4685d8607c From a950c286ba9d9ac8554d9b853a9cc3ed4846c6de Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 23 Nov 2019 16:56:34 +0530 Subject: [PATCH 273/448] git-worktree: Parse wrap files instead of meson introspect meson introspect is the wrong approach since it: * Requires a pre-existing build directory for some branch * Gives us potentially incorrect information since it tells us subproject details for the current branch, not the branch we're checking out. * Does not allow us to share the git repos for non-gst repos since it can't tell us the git branches for them. Instead, parse the wrap files in the branch we're checking out since they're just INI-style config files. --- checkout-branch-worktree | 84 +++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/checkout-branch-worktree b/checkout-branch-worktree index 8afb39333f..1240277b0e 100755 --- a/checkout-branch-worktree +++ b/checkout-branch-worktree @@ -1,45 +1,56 @@ #!/usr/bin/env python3 -import argparse -import json import os +import glob +import argparse import subprocess -import xml.etree.ElementTree as ET -import sys +import configparser from scripts.common import git from scripts.common import Colors -from scripts.common import get_meson -from scripts.common import accept_command SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) +SUBPROJECTS_DIR = os.path.normpath(os.path.join(SCRIPTDIR, "subprojects")) - -def checkout_subprojects(worktree_dir, branch): - subprojects_dir = os.path.join(SCRIPTDIR, "subprojects") - worktree_subdir = os.path.join(worktree_dir, "subprojects") - - meson = get_meson() - installed_s = subprocess.check_output(meson + ['introspect', options.builddir, '--projectinfo']) - for subproj in json.loads(installed_s.decode())["subprojects"]: - repo_name = subproj["name"] - if not repo_name.startswith("gst"): - continue - - repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name)) - if not os.path.exists(os.path.join(repo_dir, '.git')): - continue - - workdir = os.path.normpath(os.path.join(worktree_subdir, repo_name)) - if not checkout_worktree(repo_name, repo_dir, workdir, branch): - return False - +def repo_has_branch(repo_dir, branch): + try: + git("describe", branch, repository_path=repo_dir) + except subprocess.CalledProcessError: + return False return True +def parse_wrapfile(wrapf): + cgp = configparser.ConfigParser() + cgp.read(wrapf) + if 'wrap-git' not in cgp: + return None + section = cgp['wrap-git'] + return section['directory'], section['revision'] + +def get_wrap_subprojects(srcdir, gst_branch): + ''' + Parses wrap files in the subprojects directory for the specified source + tree and gets the revisions for all common repos. + ''' + for wrapf in glob.glob(os.path.join(srcdir, 'subprojects', '*.wrap')): + entries = parse_wrapfile(wrapf) + if not entries: + continue + + repo_name, repo_branch = entries + parent_repo_dir = os.path.join(SUBPROJECTS_DIR, repo_name) + if not os.path.exists(os.path.join(parent_repo_dir, '.git')): + continue + # If a branch of the same name exists in the gst subproject, use it + if repo_name.startswith('gst') and repo_has_branch(parent_repo_dir, gst_branch): + repo_branch = gst_branch + + yield repo_name, repo_branch, parent_repo_dir def checkout_worktree(repo_name, repo_dir, worktree_dir, branch): - print("Checking out worktree %s in %s (branch %s)" % (repo_name, worktree_dir, branch)) + print('Checking out worktree for project {!r} into {!r} ' + '(branch {})'.format(repo_name, worktree_dir, branch)) try: git("worktree", "add", worktree_dir, branch, repository_path=repo_dir) except Exception as e: @@ -52,12 +63,21 @@ def checkout_worktree(repo_name, repo_dir, worktree_dir, branch): commit_message = git("show", "--shortstat", repository_path=repo_dir).split("\n") print(u" -> %s%s%s - %s" % (Colors.HEADER, repo_dir, Colors.ENDC, commit_message[4].strip())) + return True + +def checkout_subprojects(worktree_dir, branch): + worktree_subdir = os.path.join(worktree_dir, "subprojects") + + for repo_name, repo_branch, parent_repo_dir in get_wrap_subprojects(worktree_dir, branch): + workdir = os.path.normpath(os.path.join(worktree_subdir, repo_name)) + if not checkout_worktree(repo_name, parent_repo_dir, workdir, repo_branch): + return False return True if __name__ == "__main__": - parser = argparse.ArgumentParser(prog="git-update") + parser = argparse.ArgumentParser(prog="git-worktree") parser.add_argument('worktree_dir', metavar='worktree_dir', type=str, @@ -68,19 +88,11 @@ if __name__ == "__main__": default=False, action='store_true', help="Do not output ansi colors.") - parser.add_argument("--builddir", '-C', - default=os.path.join(SCRIPTDIR, "build"), - help="The meson build directory") options = parser.parse_args() if options.no_color or not Colors.can_enable(): Colors.disable() - if not os.path.exists(options.builddir): - print("GStreamer not built in %s\n\nBuild it and try again" % - options.builddir) - exit(1) - options.worktree_dir = os.path.abspath(options.worktree_dir) if not checkout_worktree('gst-build', SCRIPTDIR, options.worktree_dir, options.branch): exit(1) From 2138bce2f17872f6539be16ac9b87add3850af59 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 23 Nov 2019 17:03:07 +0530 Subject: [PATCH 274/448] git-worktree: Allow multiple worktrees for subproject branches It's pretty common to have the same branch for a subproject in multiple worktrees. F.ex., when you want to test a feature branch common to a few gstreamer subprojects but not the rest. --- checkout-branch-worktree | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/checkout-branch-worktree b/checkout-branch-worktree index 1240277b0e..bbb9871d43 100755 --- a/checkout-branch-worktree +++ b/checkout-branch-worktree @@ -48,11 +48,15 @@ def get_wrap_subprojects(srcdir, gst_branch): yield repo_name, repo_branch, parent_repo_dir -def checkout_worktree(repo_name, repo_dir, worktree_dir, branch): +def checkout_worktree(repo_name, repo_dir, worktree_dir, branch, force=False): print('Checking out worktree for project {!r} into {!r} ' '(branch {})'.format(repo_name, worktree_dir, branch)) try: - git("worktree", "add", worktree_dir, branch, repository_path=repo_dir) + args = ["worktree", "add"] + if force: + args += ["-f", "-f"] + args += [worktree_dir, branch] + git(*args, repository_path=repo_dir) except Exception as e: out = getattr(e, "output", b"").decode() print("\nCould not checkout worktree %s, please fix and try again." @@ -70,7 +74,7 @@ def checkout_subprojects(worktree_dir, branch): for repo_name, repo_branch, parent_repo_dir in get_wrap_subprojects(worktree_dir, branch): workdir = os.path.normpath(os.path.join(worktree_subdir, repo_name)) - if not checkout_worktree(repo_name, parent_repo_dir, workdir, repo_branch): + if not checkout_worktree(repo_name, parent_repo_dir, workdir, repo_branch, force=True): return False return True From dd065f67cf8d2eb922d80fd91a1de21e0d20ca3c Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 23 Nov 2019 17:06:51 +0530 Subject: [PATCH 275/448] git-worktree: Fix indentation --- checkout-branch-worktree | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/checkout-branch-worktree b/checkout-branch-worktree index bbb9871d43..ddbce1e02a 100755 --- a/checkout-branch-worktree +++ b/checkout-branch-worktree @@ -88,9 +88,7 @@ if __name__ == "__main__": help='The directory where to checkout the new worktree') parser.add_argument('branch', metavar='branch', type=str, help='The branch to checkout') - parser.add_argument("--no-color", - default=False, - action='store_true', + parser.add_argument("--no-color", default=False, action='store_true', help="Do not output ansi colors.") options = parser.parse_args() From 85e818947b0b0ba3bf66c3d9858258346822496d Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 23 Nov 2019 23:39:54 +0530 Subject: [PATCH 276/448] .gitignore: Ignore subproject package cache --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d12948b975..165e314ac5 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ gstreamer-vaapi libnice __pycache__ meson/ +subprojects/packagecache/ subprojects/gst-integration-testsuites subprojects/gst-devtools subprojects/gst-docs From 5b77e65d06130d55d723ac0e5b9f026c3bbc7331 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 23 Nov 2019 23:45:11 +0530 Subject: [PATCH 277/448] Move checkout-branch-worktree to gst-worktree.py We will add more actions to it than just 'checkout'. Also add a wrapper shell script that calls gst-worktree.py with the correct arguments. --- checkout-branch-worktree | 106 +++------------------------------------ gst-worktree.py | 102 +++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 99 deletions(-) create mode 100644 gst-worktree.py diff --git a/checkout-branch-worktree b/checkout-branch-worktree index ddbce1e02a..dbc99e532a 100755 --- a/checkout-branch-worktree +++ b/checkout-branch-worktree @@ -1,102 +1,10 @@ -#!/usr/bin/env python3 +#!/bin/sh -import os -import glob -import argparse -import subprocess -import configparser +cd `dirname $0` -from scripts.common import git -from scripts.common import Colors +case "$MSYSTEM" in + *MINGW*) PYTHON="py -3";; + *) PYTHON="python3";; +esac - -SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) -SUBPROJECTS_DIR = os.path.normpath(os.path.join(SCRIPTDIR, "subprojects")) - -def repo_has_branch(repo_dir, branch): - try: - git("describe", branch, repository_path=repo_dir) - except subprocess.CalledProcessError: - return False - return True - -def parse_wrapfile(wrapf): - cgp = configparser.ConfigParser() - cgp.read(wrapf) - if 'wrap-git' not in cgp: - return None - section = cgp['wrap-git'] - return section['directory'], section['revision'] - -def get_wrap_subprojects(srcdir, gst_branch): - ''' - Parses wrap files in the subprojects directory for the specified source - tree and gets the revisions for all common repos. - ''' - for wrapf in glob.glob(os.path.join(srcdir, 'subprojects', '*.wrap')): - entries = parse_wrapfile(wrapf) - if not entries: - continue - - repo_name, repo_branch = entries - parent_repo_dir = os.path.join(SUBPROJECTS_DIR, repo_name) - if not os.path.exists(os.path.join(parent_repo_dir, '.git')): - continue - # If a branch of the same name exists in the gst subproject, use it - if repo_name.startswith('gst') and repo_has_branch(parent_repo_dir, gst_branch): - repo_branch = gst_branch - - yield repo_name, repo_branch, parent_repo_dir - -def checkout_worktree(repo_name, repo_dir, worktree_dir, branch, force=False): - print('Checking out worktree for project {!r} into {!r} ' - '(branch {})'.format(repo_name, worktree_dir, branch)) - try: - args = ["worktree", "add"] - if force: - args += ["-f", "-f"] - args += [worktree_dir, branch] - git(*args, repository_path=repo_dir) - except Exception as e: - out = getattr(e, "output", b"").decode() - print("\nCould not checkout worktree %s, please fix and try again." - " Error:\n\n%s %s" % (repo_dir, out, e)) - - return False - - commit_message = git("show", "--shortstat", repository_path=repo_dir).split("\n") - print(u" -> %s%s%s - %s" % (Colors.HEADER, repo_dir, Colors.ENDC, - commit_message[4].strip())) - return True - -def checkout_subprojects(worktree_dir, branch): - worktree_subdir = os.path.join(worktree_dir, "subprojects") - - for repo_name, repo_branch, parent_repo_dir in get_wrap_subprojects(worktree_dir, branch): - workdir = os.path.normpath(os.path.join(worktree_subdir, repo_name)) - if not checkout_worktree(repo_name, parent_repo_dir, workdir, repo_branch, force=True): - return False - - return True - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(prog="git-worktree") - - - parser.add_argument('worktree_dir', metavar='worktree_dir', type=str, - help='The directory where to checkout the new worktree') - parser.add_argument('branch', metavar='branch', type=str, - help='The branch to checkout') - parser.add_argument("--no-color", default=False, action='store_true', - help="Do not output ansi colors.") - options = parser.parse_args() - - if options.no_color or not Colors.can_enable(): - Colors.disable() - - options.worktree_dir = os.path.abspath(options.worktree_dir) - if not checkout_worktree('gst-build', SCRIPTDIR, options.worktree_dir, options.branch): - exit(1) - if not checkout_subprojects(options.worktree_dir, options.branch): - exit(1) +$PYTHON gst-worktree.py "$@" diff --git a/gst-worktree.py b/gst-worktree.py new file mode 100644 index 0000000000..eb3d601aab --- /dev/null +++ b/gst-worktree.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 + +import os +import glob +import argparse +import subprocess +import configparser + +from scripts.common import git +from scripts.common import Colors + + +SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) +SUBPROJECTS_DIR = os.path.normpath(os.path.join(SCRIPTDIR, "subprojects")) + +def repo_has_branch(repo_dir, branch): + try: + git("describe", branch, repository_path=repo_dir) + except subprocess.CalledProcessError: + return False + return True + +def parse_wrapfile(wrapf): + cgp = configparser.ConfigParser() + cgp.read(wrapf) + if 'wrap-git' not in cgp: + return None + section = cgp['wrap-git'] + return section['directory'], section['revision'] + +def get_wrap_subprojects(srcdir, gst_branch): + ''' + Parses wrap files in the subprojects directory for the specified source + tree and gets the revisions for all common repos. + ''' + for wrapf in glob.glob(os.path.join(srcdir, 'subprojects', '*.wrap')): + entries = parse_wrapfile(wrapf) + if not entries: + continue + + repo_name, repo_branch = entries + parent_repo_dir = os.path.join(SUBPROJECTS_DIR, repo_name) + if not os.path.exists(os.path.join(parent_repo_dir, '.git')): + continue + # If a branch of the same name exists in the gst subproject, use it + if repo_name.startswith('gst') and repo_has_branch(parent_repo_dir, gst_branch): + repo_branch = gst_branch + + yield repo_name, repo_branch, parent_repo_dir + +def checkout_worktree(repo_name, repo_dir, worktree_dir, branch, force=False): + print('Checking out worktree for project {!r} into {!r} ' + '(branch {})'.format(repo_name, worktree_dir, branch)) + try: + args = ["worktree", "add"] + if force: + args += ["-f", "-f"] + args += [worktree_dir, branch] + git(*args, repository_path=repo_dir) + except Exception as e: + out = getattr(e, "output", b"").decode() + print("\nCould not checkout worktree %s, please fix and try again." + " Error:\n\n%s %s" % (repo_dir, out, e)) + + return False + + commit_message = git("show", "--shortstat", repository_path=repo_dir).split("\n") + print(u" -> %s%s%s - %s" % (Colors.HEADER, repo_dir, Colors.ENDC, + commit_message[4].strip())) + return True + +def checkout_subprojects(worktree_dir, branch): + worktree_subdir = os.path.join(worktree_dir, "subprojects") + + for repo_name, repo_branch, parent_repo_dir in get_wrap_subprojects(worktree_dir, branch): + workdir = os.path.normpath(os.path.join(worktree_subdir, repo_name)) + if not checkout_worktree(repo_name, parent_repo_dir, workdir, repo_branch, force=True): + return False + + return True + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(prog="gst-worktree") + + + parser.add_argument('worktree_dir', metavar='worktree_dir', type=str, + help='The directory where to checkout the new worktree') + parser.add_argument('branch', metavar='branch', type=str, + help='The branch to checkout') + parser.add_argument("--no-color", default=False, action='store_true', + help="Do not output ansi colors.") + options = parser.parse_args() + + if options.no_color or not Colors.can_enable(): + Colors.disable() + + options.worktree_dir = os.path.abspath(options.worktree_dir) + if not checkout_worktree('gst-build', SCRIPTDIR, options.worktree_dir, options.branch): + exit(1) + if not checkout_subprojects(options.worktree_dir, options.branch): + exit(1) From 769711394e216b27406c144279d83003251bb068 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sun, 24 Nov 2019 00:43:37 +0530 Subject: [PATCH 278/448] gst-worktree: Add sub-commands: add and rm `add` behaves the same as before. `rm` removes worktrees. `git worktree remove` on the gst-build worktree will delete the subproject worktrees inside it, but will not remove the references to them in the main repository's subproject worktrees. The `rm` command will. --- checkout-branch-worktree | 2 +- gst-worktree.py | 77 +++++++++++++++++++++++++++++++++------- 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/checkout-branch-worktree b/checkout-branch-worktree index dbc99e532a..bd060b6f6b 100755 --- a/checkout-branch-worktree +++ b/checkout-branch-worktree @@ -7,4 +7,4 @@ case "$MSYSTEM" in *) PYTHON="python3";; esac -$PYTHON gst-worktree.py "$@" +$PYTHON gst-worktree.py add "$@" diff --git a/gst-worktree.py b/gst-worktree.py index eb3d601aab..e5692bb9da 100644 --- a/gst-worktree.py +++ b/gst-worktree.py @@ -13,7 +13,10 @@ from scripts.common import Colors SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) SUBPROJECTS_DIR = os.path.normpath(os.path.join(SCRIPTDIR, "subprojects")) + def repo_has_branch(repo_dir, branch): + if not branch: + return False try: git("describe", branch, repository_path=repo_dir) except subprocess.CalledProcessError: @@ -57,7 +60,7 @@ def checkout_worktree(repo_name, repo_dir, worktree_dir, branch, force=False): args += ["-f", "-f"] args += [worktree_dir, branch] git(*args, repository_path=repo_dir) - except Exception as e: + except subprocess.CalledProcessError as e: out = getattr(e, "output", b"").decode() print("\nCould not checkout worktree %s, please fix and try again." " Error:\n\n%s %s" % (repo_dir, out, e)) @@ -79,24 +82,74 @@ def checkout_subprojects(worktree_dir, branch): return True +def remove_worktree(worktree_dir): + worktree_subdir = os.path.join(worktree_dir, "subprojects") + + for repo_name, _, parent_repo_dir in get_wrap_subprojects(worktree_dir, None): + workdir = os.path.normpath(os.path.join(worktree_subdir, repo_name)) + if not os.path.exists(workdir): + continue + + subprojdir = os.path.normpath(os.path.join(SUBPROJECTS_DIR, repo_name)) + if not os.path.exists(subprojdir): + continue + + print('Removing worktree {!r}'.format(workdir)) + try: + git('worktree', 'remove', '-f', workdir, repository_path=subprojdir) + except subprocess.CalledProcessError as e: + out = getattr(e, "output", b"").decode() + print('Ignoring error while removing worktree {!r}:\n\n{}'.format(workdir, out)) + + try: + git('worktree', 'remove', '-f', worktree_dir, repository_path=SCRIPTDIR) + except subprocess.CalledProcessError: + print('Failed to remove worktree {!r}'.format(worktree_dir)) + return False + return True + if __name__ == "__main__": parser = argparse.ArgumentParser(prog="gst-worktree") - - - parser.add_argument('worktree_dir', metavar='worktree_dir', type=str, - help='The directory where to checkout the new worktree') - parser.add_argument('branch', metavar='branch', type=str, - help='The branch to checkout') parser.add_argument("--no-color", default=False, action='store_true', - help="Do not output ansi colors.") + help="Do not output ANSI colors") + + subparsers = parser.add_subparsers(help='The sub-command to run', dest='command') + + parser_add = subparsers.add_parser('add', + help='Create a worktree for gst-build and all subprojects') + parser_add.add_argument('worktree_dir', type=str, + help='Directory where to create the new worktree') + parser_add.add_argument('branch', type=str, default=None, + help='Branch to checkout') + + parser_rm = subparsers.add_parser('rm', + help='Remove a gst-build worktree and the subproject worktrees inside it') + parser_rm.add_argument('worktree_dir', type=str, + help='Worktree directory to remove') + options = parser.parse_args() if options.no_color or not Colors.can_enable(): Colors.disable() - options.worktree_dir = os.path.abspath(options.worktree_dir) - if not checkout_worktree('gst-build', SCRIPTDIR, options.worktree_dir, options.branch): - exit(1) - if not checkout_subprojects(options.worktree_dir, options.branch): + if not options.command: + parser.print_usage() exit(1) + + worktree_dir = os.path.abspath(options.worktree_dir) + + if options.command == 'add': + if not checkout_worktree('gst-build', SCRIPTDIR, worktree_dir, options.branch): + exit(1) + if not checkout_subprojects(worktree_dir, options.branch): + exit(1) + elif options.command == 'rm': + if not os.path.exists(worktree_dir): + print('Cannot remove worktree directory {!r}, it does not exist'.format(worktree_dir)) + exit(1) + if not remove_worktree(worktree_dir): + exit(1) + else: + # Unreachable code + raise AssertionError From c9a52c793996667ea51346363ece1ab662269e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Mon, 25 Nov 2019 20:40:05 +0000 Subject: [PATCH 279/448] dev environment: update documentation Add gst-dev.py usage with an external script. --- README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7fc75e84ae..d2e7d61ac1 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,12 @@ hack in there and to rebuild you just need to rerun `ninja -C build/`. NOTE: In the development environment, a fully usable prefix is also configured in `gst-build/prefix` where you can install any extra dependency/project. +An external script can be run in development environment with: + +``` +./gst-env.py external_script.sh +``` + ## Update git subprojects We added a special `update` target to update subprojects (it uses `git pull @@ -171,13 +177,17 @@ you can use the `checkout-branch-worktree` script provided by `gst-build`. It al to create a new `gst-build` environment with new checkout of all the GStreamer modules as [git worktrees](https://git-scm.com/docs/git-worktree). -For example to get a fresh checkout of `gst-1.14` from a `gst-build` in master already -built in a `build` directory you can simply run: +For example to get a fresh checkout of `gst-1.14` from a `gst-build` in master **already +built** in a `build` directory you can simply run: ``` -./checkout-branch-worktree ../gst-1.14 1.14 -C build/ +./checkout-branch-worktree ../gst-build-1.14 origin/1.14 -C build/ ``` +This will create a new ``gst-build-1.14`` folder at the same level of ``gst-build`` pointing to the given branch ie *1.14* +for all the subprojects ( gstreamer, gst-plugins-base etc.) + + ## Add information about GStreamer development environment in your prompt line ### Bash prompt @@ -330,4 +340,4 @@ you can run GStreamer tools under wine by running: gst-launch-1.0.exe videotestsrc ! glimagesink ``` -[binfmt]: http://man7.org/linux/man-pages/man5/binfmt.d.5.html \ No newline at end of file +[binfmt]: http://man7.org/linux/man-pages/man5/binfmt.d.5.html From 4bf0504e2a1af0c55f5d930255fb57dc4eea9586 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 3 Dec 2019 19:41:24 -0500 Subject: [PATCH 280/448] Bump libsoup wrap to latest stable release It contains fix to properly fallback to libxml2 and sqlite subprojects, as well as using feature options. --- subprojects/libsoup.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libsoup.wrap b/subprojects/libsoup.wrap index b4310d0b25..401c388b25 100644 --- a/subprojects/libsoup.wrap +++ b/subprojects/libsoup.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=libsoup url=https://gitlab.gnome.org/gnome/libsoup.git -revision=2.66.1 +revision=2.68.2 From 675cec1ed2933faf23c40bfd6e6c069fe0fd6a4c Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 19 Dec 2019 02:14:30 +0530 Subject: [PATCH 281/448] gst-env: Ignore SIGINT when using the fish shell After discussion with fish upstream it looks like it will take some work to fix this issue. https://github.com/fish-shell/fish-shell/pull/6426#issuecomment-567174105 In the meantime, this only happens when there's no command running in the terminal, and in that case the shell just ignores it anyway. So just do that in `gst-env.py`. Fixes https://gitlab.freedesktop.org/gstreamer/gst-build/issues/18 --- gst-env.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gst-env.py b/gst-env.py index ad00cd8546..64196428be 100755 --- a/gst-env.py +++ b/gst-env.py @@ -12,6 +12,7 @@ import subprocess import sys import tempfile import pathlib +import signal from distutils.sysconfig import get_python_lib from distutils.util import strtobool @@ -384,6 +385,11 @@ if __name__ == "__main__": # Let the GC remove the tmp file args.append("--rcfile") args.append(tmprc.name) + if 'fish' in args[0]: + # Ignore SIGINT while using fish as the shell to make it behave + # like other shells such as bash and zsh. + # See: https://gitlab.freedesktop.org/gstreamer/gst-build/issues/18 + signal.signal(signal.SIGINT, lambda x, y: True) try: exit(subprocess.call(args, close_fds=False, env=get_subprocess_env(options, gst_version))) From e13e6758e343d8012a2b15a9621d02f57fcbab93 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 19 Dec 2019 02:39:01 +0530 Subject: [PATCH 282/448] gst-env: Set the prompt for fish to be same as bash --- gst-env.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gst-env.py b/gst-env.py index 64196428be..56d90dddc2 100755 --- a/gst-env.py +++ b/gst-env.py @@ -390,6 +390,13 @@ if __name__ == "__main__": # like other shells such as bash and zsh. # See: https://gitlab.freedesktop.org/gstreamer/gst-build/issues/18 signal.signal(signal.SIGINT, lambda x, y: True) + # Set the prompt + args.append('--init-command') + prompt_cmd = '''functions --copy fish_prompt original_fish_prompt + function fish_prompt + echo -n '[gst-{}] '(original_fish_prompt) + end'''.format(gst_version) + args.append(prompt_cmd) try: exit(subprocess.call(args, close_fds=False, env=get_subprocess_env(options, gst_version))) From 245baadbce97279d7d8902769305c0fc10d5c2a6 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 19 Dec 2019 02:45:44 +0530 Subject: [PATCH 283/448] gst-env: Fix shell name check We should use `endswith`, not `in`. Else we'll match paths like: `/home/arbash/.local/bin/fish` as a bash shell, not a fish shell. --- gst-env.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gst-env.py b/gst-env.py index 56d90dddc2..2124c9c578 100755 --- a/gst-env.py +++ b/gst-env.py @@ -374,7 +374,7 @@ if __name__ == "__main__": args += ['/k', 'prompt [gst-{}] $P$G'.format(gst_version)] else: args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] - if "bash" in args[0] and not strtobool(os.environ.get("GST_BUILD_DISABLE_PS1_OVERRIDE", r"FALSE")): + if args[0].endswith('bash') and not strtobool(os.environ.get("GST_BUILD_DISABLE_PS1_OVERRIDE", r"FALSE")): tmprc = tempfile.NamedTemporaryFile(mode='w') bashrc = os.path.expanduser('~/.bashrc') if os.path.exists(bashrc): @@ -385,7 +385,7 @@ if __name__ == "__main__": # Let the GC remove the tmp file args.append("--rcfile") args.append(tmprc.name) - if 'fish' in args[0]: + if args[0].endswith('fish'): # Ignore SIGINT while using fish as the shell to make it behave # like other shells such as bash and zsh. # See: https://gitlab.freedesktop.org/gstreamer/gst-build/issues/18 From bc1c337c77ec941405dcbffdda94f789403a9c45 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 19 Dec 2019 03:39:37 +0530 Subject: [PATCH 284/448] gst-env: Don't put helper binaries in PATH Check if the executable would be installed into bindir before adding it to PATH in the uninstalled shell. Fixes https://gitlab.freedesktop.org/gstreamer/gst-build/issues/67 --- gst-env.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/gst-env.py b/gst-env.py index 2124c9c578..a2e139edd6 100755 --- a/gst-env.py +++ b/gst-env.py @@ -13,6 +13,7 @@ import sys import tempfile import pathlib import signal +from pathlib import PurePath from distutils.sysconfig import get_python_lib from distutils.util import strtobool @@ -96,6 +97,24 @@ def is_library_target_and_not_plugin(target, filename): return False return True +def is_binary_target_and_in_path(target, filename, bindir): + if target['type'] != 'executable': + return False + if not target['installed']: + return False + # Check if this file installed by this target is installed to bindir + for install_filename in listify(target['install_filename']): + if install_filename.endswith(os.path.basename(filename)): + break + else: + # None of the installed files in the target correspond to the built + # filename, so skip + return False + fpath = PurePath(install_filename) + if fpath.parent != bindir: + return False + return True + def get_wine_subprocess_env(options, env): with open(os.path.join(options.builddir, 'meson-info', 'intro-buildoptions.json')) as f: @@ -206,10 +225,14 @@ def get_subprocess_env(options, gst_version): build_options_s = subprocess.check_output(meson + ['introspect', options.builddir, '--buildoptions']) build_options = json.loads(build_options_s.decode()) libdir, = [o['value'] for o in build_options if o['name'] == 'libdir'] - libdir = libdir.replace('\\', '/') + libdir = PurePath(libdir) + prefix, = [o['value'] for o in build_options if o['name'] == 'prefix'] + bindir, = [o['value'] for o in build_options if o['name'] == 'bindir'] + prefix = PurePath(prefix) + bindir = prefix / bindir global GSTPLUGIN_FILEPATH_REG_TEMPLATE - GSTPLUGIN_FILEPATH_REG_TEMPLATE = GSTPLUGIN_FILEPATH_REG_TEMPLATE.format(libdir=libdir) + GSTPLUGIN_FILEPATH_REG_TEMPLATE = GSTPLUGIN_FILEPATH_REG_TEMPLATE.format(libdir=libdir.as_posix()) for target in targets: filenames = listify(target['filename']) @@ -227,7 +250,7 @@ def get_subprocess_env(options, gst_version): prepend_env_var(env, lib_path_envvar, os.path.join(options.builddir, root), options.sysroot) - elif target['type'] == 'executable' and target['installed']: + elif is_binary_target_and_in_path(target, filename, bindir): paths.add(os.path.join(options.builddir, root)) with open(os.path.join(options.builddir, 'GstPluginsPath.json')) as f: From 7cbd30eb651d88afb9cec4c0019267c5f190650a Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Fri, 20 Dec 2019 19:34:05 +0100 Subject: [PATCH 285/448] README: Remove now-useless Fish prompt setup docs After commit e13e6758e343d8012a2b15a9621d02f57fcbab93 there's no need to manually configure the prompt. --- README.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/README.md b/README.md index d2e7d61ac1..9baab5d891 100644 --- a/README.md +++ b/README.md @@ -214,16 +214,6 @@ In your `.zshrc`, you should add something like: export PROMPT="$GST_ENV-$PROMPT" ``` -### Fish prompt - -In your `~/.config/fish/functions/fish_prompt.fish`, you should add something like this at the end of the fish_prompt function body: - -``` -if set -q GST_ENV - echo -n -s (set_color -b blue white) "(" (basename "$GST_ENV") ")" (set_color normal) " " -end -``` - ### Using powerline In your powerline theme configuration file (by default in From b46aa21ed43ebf29b84d3efe93d3fc7ff923db9d Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sun, 22 Dec 2019 20:16:25 +0530 Subject: [PATCH 286/448] gst-env: Automatically set the prompt for zsh too --- README.md | 9 --------- gst-env.py | 19 +++++++++++++++---- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9baab5d891..ff16c00dde 100644 --- a/README.md +++ b/README.md @@ -203,15 +203,6 @@ then PS1+="[ ${GST_ENV} ]" fi ... - -``` - -### Zsh prompt - -In your `.zshrc`, you should add something like: - -``` -export PROMPT="$GST_ENV-$PROMPT" ``` ### Using powerline diff --git a/gst-env.py b/gst-env.py index a2e139edd6..44faf7b31b 100755 --- a/gst-env.py +++ b/gst-env.py @@ -384,6 +384,7 @@ if __name__ == "__main__": if options.wine: gst_version += '-' + os.path.basename(options.wine) + env = get_subprocess_env(options, gst_version) if not args: if os.name == 'nt': shell = get_windows_shell() @@ -398,6 +399,7 @@ if __name__ == "__main__": else: args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))] if args[0].endswith('bash') and not strtobool(os.environ.get("GST_BUILD_DISABLE_PS1_OVERRIDE", r"FALSE")): + # Let the GC remove the tmp file tmprc = tempfile.NamedTemporaryFile(mode='w') bashrc = os.path.expanduser('~/.bashrc') if os.path.exists(bashrc): @@ -405,10 +407,9 @@ if __name__ == "__main__": shutil.copyfileobj(src, tmprc) tmprc.write('\nexport PS1="[gst-%s] $PS1"' % gst_version) tmprc.flush() - # Let the GC remove the tmp file args.append("--rcfile") args.append(tmprc.name) - if args[0].endswith('fish'): + elif args[0].endswith('fish'): # Ignore SIGINT while using fish as the shell to make it behave # like other shells such as bash and zsh. # See: https://gitlab.freedesktop.org/gstreamer/gst-build/issues/18 @@ -420,8 +421,18 @@ if __name__ == "__main__": echo -n '[gst-{}] '(original_fish_prompt) end'''.format(gst_version) args.append(prompt_cmd) + elif args[0].endswith('zsh'): + tmpdir = tempfile.TemporaryDirectory() + # Let the GC remove the tmp file + tmprc = open(os.path.join(tmpdir.name, '.zshrc'), 'w') + zshrc = os.path.expanduser('~/.zshrc') + if os.path.exists(zshrc): + with open(zshrc, 'r') as src: + shutil.copyfileobj(src, tmprc) + tmprc.write('\nexport PROMPT="[gst-{}] $PROMPT"'.format(gst_version)) + tmprc.flush() + env['ZDOTDIR'] = tmpdir.name try: - exit(subprocess.call(args, close_fds=False, - env=get_subprocess_env(options, gst_version))) + exit(subprocess.call(args, close_fds=False, env=env)) except subprocess.CalledProcessError as e: exit(e.returncode) From cca62a11f5ac5c3666ff17d28ffbd0231fc51f6c Mon Sep 17 00:00:00 2001 From: Julien Isorce Date: Sat, 21 Dec 2019 11:01:47 -0800 Subject: [PATCH 287/448] env: preprend gst-build/prefix/etc/xdg to XDG_CONFIG_DIRS So gst-build/prefix/etc/xdg/tizonia/tizonia.conf can be found. Which one contains path to tizonia plugins. Useful when compiling tizonia-openmax-il and installing it in gst-build 's prefix location: autoreconf -ifs ./configure --disable-player --without-libspotify --prefix=path_to_gst-build/prefix/ make && make install Allows the following to work: gst-launch-1.0 videotestsrc ! vp8enc ! omxvp8dec ! xvimagesink --- gst-env.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gst-env.py b/gst-env.py index 44faf7b31b..2f83fc1b82 100755 --- a/gst-env.py +++ b/gst-env.py @@ -329,7 +329,7 @@ def get_subprocess_env(options, gst_version): prepend_env_var(env, 'PYTHONPATH', mesonpath, options.sysroot) # For devhelp books - if not 'XDG_DATA_DIRS' in env or not env['XDG_DATA_DIRS']: + if 'XDG_DATA_DIRS' not in env or not env['XDG_DATA_DIRS']: # Preserve default paths when empty prepend_env_var(env, 'XDG_DATA_DIRS', '/usr/local/share/:/usr/share/', '') @@ -339,6 +339,13 @@ def get_subprocess_env(options, gst_version): 'GStreamer-doc'), options.sysroot) + if 'XDG_CONFIG_DIRS' not in env or not env['XDG_CONFIG_DIRS']: + # Preserve default paths when empty + prepend_env_var(env, 'XDG_CONFIG_DIRS', '/etc/local/xdg:/etc/xdg', '') + + prepend_env_var(env, "XDG_CONFIG_DIRS", os.path.join(PREFIX_DIR, 'etc', 'xdg'), + options.sysroot) + return env def get_windows_shell(): From 20fc4b92b8c063424e389f7484b850be19d0a697 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 19 Nov 2019 14:34:05 +0530 Subject: [PATCH 288/448] add gst-plugins-rs Fix #63 --- .gitignore | 2 ++ meson.build | 1 + meson_options.txt | 1 + subprojects/gst-plugins-rs.wrap | 5 +++++ 4 files changed, 9 insertions(+) create mode 100644 subprojects/gst-plugins-rs.wrap diff --git a/.gitignore b/.gitignore index 165e314ac5..c724360c47 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ gst-omx gst-plugins-bad gst-plugins-base gst-plugins-good +gst-plugins-rs gst-plugins-ugly gst-python gst-rtsp-server @@ -31,6 +32,7 @@ subprojects/gst-omx subprojects/gst-plugins-bad subprojects/gst-plugins-base subprojects/gst-plugins-good +subprojects/gst-plugins-rs subprojects/gst-plugins-ugly subprojects/gst-python subprojects/gst-rtsp-server diff --git a/meson.build b/meson.build index b1d2a41931..5a5f6d2bd7 100644 --- a/meson.build +++ b/meson.build @@ -73,6 +73,7 @@ subprojects = [ ['pygobject', { 'option': get_option('python'), 'match_gst_version': false }], ['gst-python', { 'option': get_option('python'), 'has-plugins': true}], ['gst-examples', { 'option': get_option('gst-examples'), 'match_gst_versions': false}], + ['gst-plugins-rs', { 'option': get_option('rs'), 'has-plugins': true, 'match_gst_version': false}], ] symlink = ''' diff --git a/meson_options.txt b/meson_options.txt index 5ae2ea251f..b7b7440879 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -11,6 +11,7 @@ option('vaapi', type : 'feature', value : 'auto') option('sharp', type : 'feature', value : 'disabled') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') option('gst-examples', type : 'feature', value : 'auto', description : 'Build gst-examples') +option('rs', type : 'feature', value : 'auto') # Common options, automatically inherited by subprojects option('examples', type : 'feature', value : 'auto', description : 'Build examples') diff --git a/subprojects/gst-plugins-rs.wrap b/subprojects/gst-plugins-rs.wrap new file mode 100644 index 0000000000..1dd32a7a22 --- /dev/null +++ b/subprojects/gst-plugins-rs.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gst-plugins-rs +url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git +push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-rs.git +revision=master From 1e8cdbf137a985e73f00cfd723f8b02136a79d0d Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 21 Nov 2019 16:10:32 +0530 Subject: [PATCH 289/448] git-update: try updating cargo deps May prevent build errors if a newer version gstreamer-rs or gst-plugins-rs depend on an updated version of a git dependency. --- git-update | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/git-update b/git-update index e578d74fd0..0138fd95a3 100755 --- a/git-update +++ b/git-update @@ -117,6 +117,23 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], re return True +# Update gst-plugins-rs dependencies +def update_cargo(build_dir): + cargo_toml = os.path.join('subprojects', 'gst-plugins-rs', 'Cargo.toml') + if not os.path.exists(cargo_toml): + return True + + cmd = ['cargo', 'update', '--manifest-path', cargo_toml] + + try: + ret = subprocess.run(cmd) + except FileNotFoundError: + # silenty ignore if cargo isn't installed + return False + + return ret == 0 + + if __name__ == "__main__": parser = argparse.ArgumentParser(prog="git-update") @@ -157,6 +174,8 @@ if __name__ == "__main__": if not update_subprojects(repos_commits, options.no_interaction): exit(1) + update_cargo(options.builddir) + if options.builddir: ninja = accept_command(["ninja", "ninja-build"]) if not ninja: From 7aaa11aa772053eb82617eb92b5f4ff7424ec3d1 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Mon, 22 Jul 2019 20:56:01 +0900 Subject: [PATCH 290/448] gitignore: Ignore libxml2 and sqlite Add more things to ignore. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c724360c47..1d87138cf5 100644 --- a/.gitignore +++ b/.gitignore @@ -57,5 +57,7 @@ subprojects/orc subprojects/libsoup subprojects/FFmpeg subprojects/x264 +subprojects/libxml2-* +subprojects/sqlite-* prefix/ pygobject From c57dca5220a2f121331d46691aadb8e7f3168f75 Mon Sep 17 00:00:00 2001 From: Charlie Turner Date: Mon, 6 Jan 2020 13:22:54 +0000 Subject: [PATCH 291/448] dev environment: allow printing only env without starting a shell allow for workflows that don't want the gst scripts to start shells, this can be awkward for higher-level scripts setting up shells themselves. this is especially useful in combination with eval, and mimics the sort of thing you can do with ssh-agent -s. --- README.md | 10 ++++++++++ gst-env.py | 13 ++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ff16c00dde..c5b7c8591d 100644 --- a/README.md +++ b/README.md @@ -314,6 +314,16 @@ You can get into the development environment the usual way: ninja -C $BUILDDIR/ devenv ``` +Alternatively, if you'd rather not start a shell in your workflow, you +can mutate the current environment into a suitable state like so: + +``` +gst-env.py --only-environment +``` + +This will print output suitable for an sh-compatible `eval` function, +just like `ssh-agent -s`. + After setting up [binfmt] to use wine for windows binaries, you can run GStreamer tools under wine by running: diff --git a/gst-env.py b/gst-env.py index 2f83fc1b82..86bb32bea0 100755 --- a/gst-env.py +++ b/gst-env.py @@ -7,6 +7,7 @@ import os import platform import re import site +import shlex import shutil import subprocess import sys @@ -371,6 +372,10 @@ if __name__ == "__main__": parser.add_argument("--winepath", default='', help="Exra path to set to WINEPATH.") + parser.add_argument("--only-environment", + action='store_true', + default=False, + help="Do not start a shell, only print required environment.") options, args = parser.parse_known_args() if not os.path.exists(options.builddir): @@ -440,6 +445,12 @@ if __name__ == "__main__": tmprc.flush() env['ZDOTDIR'] = tmpdir.name try: - exit(subprocess.call(args, close_fds=False, env=env)) + if options.only_environment: + for name, value in env.items(): + print('{}={}'.format(name, shlex.quote(value))) + print('export {}'.format(name)) + else: + exit(subprocess.call(args, close_fds=False, env=env)) + except subprocess.CalledProcessError as e: exit(e.returncode) From 5e6c0b389afb25b26433ff82be38e88f39e3c555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 8 Jan 2020 17:40:43 +0000 Subject: [PATCH 292/448] meson: add graphene subproject So we can build all the OpenGL elements. --- subprojects/graphene.wrap | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 subprojects/graphene.wrap diff --git a/subprojects/graphene.wrap b/subprojects/graphene.wrap new file mode 100644 index 0000000000..1f61aecd1c --- /dev/null +++ b/subprojects/graphene.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=graphene +url=https://github.com/ebassi/graphene.git +revision=master \ No newline at end of file From 84e01411e41625f2f905c584e9dd31b8fb42614e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 21 Jun 2019 16:40:34 -0400 Subject: [PATCH 293/448] uninstalled: Add support for GStreamer and GLib gdb scripts --- gst-env.py | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/gst-env.py b/gst-env.py index 86bb32bea0..775a41852b 100755 --- a/gst-env.py +++ b/gst-env.py @@ -2,6 +2,7 @@ import argparse import contextlib +import glob import json import os import platform @@ -135,6 +136,40 @@ def get_wine_subprocess_env(options, env): return env +def setup_gdb(options): + bdir = os.path.realpath(options.builddir) + python_paths = set() + for libpath, gdb_path in [ + ("subprojects/gstreamer/gst/", "subprojects/gstreamer/libs/gst/helpers/"), + ("subprojects/glib/gobject", None), + ("subprojects/glib/glib", None)]: + + if not gdb_path: + gdb_path = libpath + + autoload_path = os.path.join(bdir, "gdb-auto-load/", bdir[1:], libpath) + os.makedirs(autoload_path, exist_ok=True) + for gdb_helper in glob.glob(os.path.join(bdir, gdb_path, "*-gdb.py")): + python_paths.add(os.path.join(bdir, gdb_path)) + python_paths.add(os.path.join(options.srcdir, gdb_path)) + try: + os.symlink(gdb_helper, os.path.join(autoload_path, os.path.basename(gdb_helper))) + except FileExistsError: + pass + + gdbinit_line = 'add-auto-load-scripts-directory %s' % os.path.join(bdir, 'gdb-auto-load\n') + try: + with open(os.path.join(options.srcdir, '.gdbinit'), 'r') as f: + if gdbinit_line in f.readlines(): + return python_paths + except FileNotFoundError: + pass + + with open(os.path.join(options.srcdir, '.gdbinit'), 'a') as f: + f.write(gdbinit_line) + + return python_paths + def get_subprocess_env(options, gst_version): env = os.environ.copy() @@ -269,7 +304,7 @@ def get_subprocess_env(options, gst_version): presets = set() encoding_targets = set() pkg_dirs = set() - python_dirs = set(["%s/subprojects/gstreamer/libs/gst/helpers/" % options.srcdir]) + python_dirs = setup_gdb(options) if '--installed' in subprocess.check_output(meson + ['introspect', '-h']).decode(): installed_s = subprocess.check_output(meson + ['introspect', options.builddir, '--installed']) for path, installpath in json.loads(installed_s.decode()).items(): @@ -371,7 +406,7 @@ if __name__ == "__main__": help="Build a wine env based on specified wine command") parser.add_argument("--winepath", default='', - help="Exra path to set to WINEPATH.") + help="Extra path to set to WINEPATH.") parser.add_argument("--only-environment", action='store_true', default=False, From ef2c97babeb00076ff9f3b6546de716768d5e320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sun, 12 Jan 2020 01:03:46 +0000 Subject: [PATCH 294/448] meson: bump glib subproject wrap to GLib 2.62 --- subprojects/glib.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index e30b0f2763..46a1fc95b3 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -2,4 +2,4 @@ directory=glib url=https://gitlab.gnome.org/GNOME/glib.git push-url=git@gitlab.gnome.org:GNOME/glib.git -revision=glib-2-60 +revision=glib-2-62 From 4720ef876780edd4ada9c8344f20d69fabcc2e5e Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 16 Jan 2020 13:21:26 +0530 Subject: [PATCH 295/448] fetch wrap patches from github wrapdb.mesonbuild.com has been down for a few days now. Fix #71 --- subprojects/libxml2.wrap | 4 ++-- subprojects/sqlite.wrap | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/subprojects/libxml2.wrap b/subprojects/libxml2.wrap index 5b3a3f5e4d..a93954d632 100644 --- a/subprojects/libxml2.wrap +++ b/subprojects/libxml2.wrap @@ -4,6 +4,6 @@ directory = libxml2-2.9.7 source_url = http://xmlsoft.org/sources/libxml2-2.9.7.tar.gz source_filename = libxml2-2.9.7.tar.gz source_hash = f63c5e7d30362ed28b38bfa1ac6313f9a80230720b7fb6c80575eeab3ff5900c -patch_url = https://wrapdb.mesonbuild.com/v1/projects/libxml2/2.9.7/5/get_zip -patch_filename = libxml2-2.9.7-5-wrap.zip +patch_url = https://github.com/mesonbuild/libxml2/releases/download/2.9.7-5/libxml2.zip +patch_filename = libxml2.zip patch_hash = aed5d6719eb96da0fb3cf284d88c4af486fd6b7754aec40b2be9a5ffd9ecadab diff --git a/subprojects/sqlite.wrap b/subprojects/sqlite.wrap index 8c5587732e..d05f67b485 100644 --- a/subprojects/sqlite.wrap +++ b/subprojects/sqlite.wrap @@ -5,6 +5,6 @@ source_url = https://www.sqlite.org/2018/sqlite-amalgamation-3250100.zip source_filename = sqlite-amalgamation-3250100.zip source_hash = 6c68b6364fa0e01d9d05088ba473ac4e7a6fbc64f9b9aeb6d830f944e2a1fa03 -patch_url = https://wrapdb.mesonbuild.com/v1/projects/sqlite/3250100/1/get_zip -patch_filename = sqlite-3250100-1-wrap.zip +patch_url = https://github.com/mesonbuild/sqlite/releases/download/3250100-1/sqlite.zip +patch_filename = sqlite.zip patch_hash = cbb697a1e4649cf6b7f28d82048109d87ccbf01106e1d5a68f763d4685d8607c From 439dfa2955ba08164fee1569e28828e4a7f0c016 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 18 Jan 2020 17:38:47 +0530 Subject: [PATCH 296/448] win-nasm: Error out if accidentally called on non-Windows --- subprojects/win-nasm/meson.build | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/subprojects/win-nasm/meson.build b/subprojects/win-nasm/meson.build index d7775f56fb..40b5bc2656 100644 --- a/subprojects/win-nasm/meson.build +++ b/subprojects/win-nasm/meson.build @@ -2,6 +2,10 @@ project('win-nasm', version : '2.14.02') py3 = import('python3').find_python() +if host_machine.system() != 'windows' + error('Can only download nasm for Windows, sorry') +endif + message('Downloading and extracting nasm binaries for Windows...') arch = host_machine.cpu_family() From 352b83812182eed561bc5bb6722994e5f563a25e Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 18 Jan 2020 17:37:46 +0530 Subject: [PATCH 297/448] win-nasm: Use gstreamer mirror as primary source nasm.us went down today and broke all our CI. Use the gstreamer mirror as the primary source and fallback to nasm.us if that's down. --- subprojects/win-nasm/download-binary.py | 29 +++++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/subprojects/win-nasm/download-binary.py b/subprojects/win-nasm/download-binary.py index 26ad64ba1e..e879ff86dd 100644 --- a/subprojects/win-nasm/download-binary.py +++ b/subprojects/win-nasm/download-binary.py @@ -6,6 +6,7 @@ import ssl import zipfile import hashlib import urllib.request +import urllib.error # Disable certificate checking because it always fails on Windows # We verify the checksum anyway. @@ -13,12 +14,15 @@ ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE -base_url = 'https://www.nasm.us/pub/nasm/releasebuilds/{0}/{1}/nasm-{0}-{1}.zip' +BASENAME = 'nasm-{}-{}.zip' +UPSTREAM_URL = 'https://www.nasm.us/pub/nasm/releasebuilds/{}/{}/{}' +GSTREAMER_URL = 'https://gstreamer.freedesktop.org/src/mirror/{}' + +version = sys.argv[1] arch = 'win64' if sys.argv[2] == 'x86_64' else 'win32' -url = base_url.format(sys.argv[1], arch) zip_sha256 = sys.argv[3] source_dir = os.path.join(os.environ['MESON_SOURCE_ROOT'], os.environ['MESON_SUBDIR']) -dest = os.path.basename(url) +dest = BASENAME.format(version, arch) dest_path = os.path.join(source_dir, dest) def get_sha256(zipf): @@ -35,10 +39,21 @@ if os.path.isfile(dest_path): else: print('{} checksum mismatch, redownloading'.format(dest)) -print('Downloading {} to {}'.format(url, dest)) -with open(dest_path, 'wb') as d: - f = urllib.request.urlopen(url, context=ctx) - d.write(f.read()) +for url in (GSTREAMER_URL.format(dest), UPSTREAM_URL.format(version, arch, dest)): + print('Downloading {} to {}'.format(url, dest)) + try: + with open(dest_path, 'wb') as d: + f = urllib.request.urlopen(url, context=ctx) + d.write(f.read()) + break + except urllib.error.URLError as ex: + print(ex) + print('Failed to download from {!r}, trying mirror...'.format(url)) + continue +else: + curdir = os.path.dirname(sys.argv[0]) + print('Couldn\'t download {!r}! Try downloading it manually and ' + 'placing it into {!r}'.format(dest, curdir)) found_sha256 = get_sha256(dest_path) if found_sha256 != zip_sha256: From 2f11c43f49783902f5565d98d9cabd069b964937 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sat, 18 Jan 2020 17:52:22 +0530 Subject: [PATCH 298/448] win-flex-bison: Use gstreamer mirror as primary source Use the gstreamer mirror as the primary source and fallback to upstream if it's down. --- .../download-binary.py | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/subprojects/win-flex-bison-binaries/download-binary.py b/subprojects/win-flex-bison-binaries/download-binary.py index 855a1fa41e..8bd351f6e5 100644 --- a/subprojects/win-flex-bison-binaries/download-binary.py +++ b/subprojects/win-flex-bison-binaries/download-binary.py @@ -6,6 +6,7 @@ import ssl import zipfile import hashlib import urllib.request +import urllib.error # Disable certificate checking because it always fails on Windows # We verify the checksum anyway. @@ -13,11 +14,14 @@ ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE -base_url = 'https://github.com/lexxmark/winflexbison/releases/download/v{0}/win_flex_bison-{0}.zip' -url = base_url.format(sys.argv[1]) +BASENAME = 'win_flex_bison-{}.zip' +UPSTREAM_URL = 'https://github.com/lexxmark/winflexbison/releases/download/v{}/{}' +GSTREAMER_URL = 'https://gstreamer.freedesktop.org/src/mirror/{}' + +version = sys.argv[1] zip_sha256 = sys.argv[2] source_dir = os.path.join(os.environ['MESON_SOURCE_ROOT'], os.environ['MESON_SUBDIR']) -dest = os.path.basename(url) +dest = BASENAME.format(version) dest_path = os.path.join(source_dir, dest) def get_sha256(zipf): @@ -34,10 +38,21 @@ if os.path.isfile(dest_path): else: print('{} checksum mismatch, redownloading'.format(dest)) -print('Downloading {} to {}'.format(url, dest)) -with open(dest_path, 'wb') as d: - f = urllib.request.urlopen(url, context=ctx) - d.write(f.read()) +for url in (GSTREAMER_URL.format(dest), UPSTREAM_URL.format(version, dest)): + print('Downloading {} to {}'.format(url, dest)) + try: + with open(dest_path, 'wb') as d: + f = urllib.request.urlopen(url, context=ctx) + d.write(f.read()) + break + except urllib.error.URLError as ex: + print(ex) + print('Failed to download from {!r}, trying mirror...'.format(url)) + continue +else: + curdir = os.path.dirname(sys.argv[0]) + print('Couldn\'t download {!r}! Try downloading it manually and ' + 'placing it into {!r}'.format(dest, curdir)) found_sha256 = get_sha256(dest_path) if found_sha256 != zip_sha256: From 7d08aef9ed34398aedcb0537ed0bbab7cf9e4ae3 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 14 Jan 2020 20:02:20 -0300 Subject: [PATCH 299/448] devenv: Fix path handling for gdb support And enable gdb support only when gdb is avalaible --- gst-env.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/gst-env.py b/gst-env.py index 775a41852b..37503c6e31 100755 --- a/gst-env.py +++ b/gst-env.py @@ -137,12 +137,17 @@ def get_wine_subprocess_env(options, env): return env def setup_gdb(options): - bdir = os.path.realpath(options.builddir) python_paths = set() + + if not shutil.which('gdb'): + return python_paths + + bdir = os.path.realpath(options.builddir) for libpath, gdb_path in [ - ("subprojects/gstreamer/gst/", "subprojects/gstreamer/libs/gst/helpers/"), - ("subprojects/glib/gobject", None), - ("subprojects/glib/glib", None)]: + (os.path.join("subprojects", "gstreamer", "gst"), + os.path.join("subprojects", "gstreamer", "libs", "gst", "helpers")), + (os.path.join("subprojects", "glib", "gobject"), None), + (os.path.join("subprojects", "glib", "glib"), None)]: if not gdb_path: gdb_path = libpath From c1f9d409b4913549a44e98200dde3b6338af5bdf Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Fri, 31 Jan 2020 13:56:05 -0500 Subject: [PATCH 300/448] gst-worktree: Allow creating a new branch This is useful when you want to create a worktree from let's say master branch and start a new branch. This basically reproduce git-worktree -b options. --- gst-worktree.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/gst-worktree.py b/gst-worktree.py index e5692bb9da..9999bcf2ee 100644 --- a/gst-worktree.py +++ b/gst-worktree.py @@ -51,7 +51,7 @@ def get_wrap_subprojects(srcdir, gst_branch): yield repo_name, repo_branch, parent_repo_dir -def checkout_worktree(repo_name, repo_dir, worktree_dir, branch, force=False): +def checkout_worktree(repo_name, repo_dir, worktree_dir, branch, new_branch, force=False): print('Checking out worktree for project {!r} into {!r} ' '(branch {})'.format(repo_name, worktree_dir, branch)) try: @@ -59,6 +59,8 @@ def checkout_worktree(repo_name, repo_dir, worktree_dir, branch, force=False): if force: args += ["-f", "-f"] args += [worktree_dir, branch] + if new_branch: + args += ["-b", new_branch] git(*args, repository_path=repo_dir) except subprocess.CalledProcessError as e: out = getattr(e, "output", b"").decode() @@ -72,12 +74,12 @@ def checkout_worktree(repo_name, repo_dir, worktree_dir, branch, force=False): commit_message[4].strip())) return True -def checkout_subprojects(worktree_dir, branch): +def checkout_subprojects(worktree_dir, branch, new_branch): worktree_subdir = os.path.join(worktree_dir, "subprojects") for repo_name, repo_branch, parent_repo_dir in get_wrap_subprojects(worktree_dir, branch): workdir = os.path.normpath(os.path.join(worktree_subdir, repo_name)) - if not checkout_worktree(repo_name, parent_repo_dir, workdir, repo_branch, force=True): + if not checkout_worktree(repo_name, parent_repo_dir, workdir, repo_branch, new_branch, force=True): return False return True @@ -122,6 +124,8 @@ if __name__ == "__main__": help='Directory where to create the new worktree') parser_add.add_argument('branch', type=str, default=None, help='Branch to checkout') + parser_add.add_argument('-b', '--new-branch', type=str, default=None, + help='Branch to create') parser_rm = subparsers.add_parser('rm', help='Remove a gst-build worktree and the subproject worktrees inside it') @@ -140,9 +144,9 @@ if __name__ == "__main__": worktree_dir = os.path.abspath(options.worktree_dir) if options.command == 'add': - if not checkout_worktree('gst-build', SCRIPTDIR, worktree_dir, options.branch): + if not checkout_worktree('gst-build', SCRIPTDIR, worktree_dir, options.branch, options.new_branch): exit(1) - if not checkout_subprojects(worktree_dir, options.branch): + if not checkout_subprojects(worktree_dir, options.branch, options.new_branch): exit(1) elif options.command == 'rm': if not os.path.exists(worktree_dir): From 32bf9a29f7c67f78ba94183373a93f023f20d93e Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Sun, 2 Feb 2020 17:44:00 -0500 Subject: [PATCH 301/448] gst-worktree.py: Add execution permission This allow doing ./gst-worktree.py directly. --- gst-worktree.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gst-worktree.py diff --git a/gst-worktree.py b/gst-worktree.py old mode 100644 new mode 100755 From e958c85b37ccea26ae5e865fe410bdf37fb1f89d Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 12 Feb 2020 01:56:23 +0530 Subject: [PATCH 302/448] Nuke setup.py: It doesn't do anything special It's just confusing for people to see that in the build root, and we do not even mention this file in the README. --- setup.py | 82 -------------------------------------------------------- 1 file changed, 82 deletions(-) delete mode 100755 setup.py diff --git a/setup.py b/setup.py deleted file mode 100755 index 27766781db..0000000000 --- a/setup.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python3 -"""Script for generating the Makefiles.""" - -import argparse -import os -import sys -import shutil -import subprocess - -from scripts.common import get_meson -from scripts.common import accept_command - - -PROJECTNAME = "GStreamer build" - -ROOTDIR = os.path.abspath(os.path.dirname(__file__)) - - -class GstBuildConfigurer: - - def __init__(self, options, args): - self.options = options - self.args = args - - def get_configs(self): - if self.options.werror: - return ['--werror'] - return [] - - def configure_meson(self): - if not self.options.reconfigure: - if os.path.exists(ROOTDIR + "/build/build.ninja"): - print("Not reconfiguring") - return True - - try: - meson = get_meson() - except RuntimeError: - print("Install mesonbuild to build %s: http://mesonbuild.com/\n" - "You can simply install it with:\n" - " $ sudo pip3 install meson" % PROJECTNAME) - return False - - ninja = accept_command(["ninja", "ninja-build"]) - if not ninja: - print("Install ninja-build to build %s: https://ninja-build.org/" - % PROJECTNAME) - return False - - build_dir = os.path.join(ROOTDIR, "build") - shutil.rmtree(build_dir, True) - os.mkdir(build_dir) - - try: - subprocess.check_call(meson + ["../"] + self.args + self.get_configs(), - cwd=build_dir) - print("\nYou can now build GStreamer and its various subprojects running:\n" - " $ {} -C {!r}".format(os.path.basename(ninja), build_dir)) - except subprocess.CalledProcessError: - return False - - return True - - def setup(self): - return self.configure_meson() - - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Process some integers.') - parser.add_argument("--reconfigure", action='store_true', - default=False, help='Force a full reconfiguration' - ' meaning the build/ folder is removed.' - ' You can also use `ninja reconfigure` to just' - ' make sure meson is rerun but the build folder' - ' is kept.') - parser.add_argument("--werror", action='store_true', - default=False, help="Do not error out on warnings") - - options, args = parser.parse_known_args() - configurer = GstBuildConfigurer(options, args) - exit(not configurer.setup()) From 631677589c0ef21711cad95c3c6e74e3a0142b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Wed, 19 Feb 2020 13:45:52 +0100 Subject: [PATCH 303/448] libxml2: update wrap path to 2.9.7-6 This patch allows to fallback on zlib subproject --- subprojects/libxml2.wrap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subprojects/libxml2.wrap b/subprojects/libxml2.wrap index a93954d632..7a7f83e6f1 100644 --- a/subprojects/libxml2.wrap +++ b/subprojects/libxml2.wrap @@ -4,6 +4,6 @@ directory = libxml2-2.9.7 source_url = http://xmlsoft.org/sources/libxml2-2.9.7.tar.gz source_filename = libxml2-2.9.7.tar.gz source_hash = f63c5e7d30362ed28b38bfa1ac6313f9a80230720b7fb6c80575eeab3ff5900c -patch_url = https://github.com/mesonbuild/libxml2/releases/download/2.9.7-5/libxml2.zip +patch_url = https://github.com/mesonbuild/libxml2/releases/download/2.9.7-6/libxml2.zip patch_filename = libxml2.zip -patch_hash = aed5d6719eb96da0fb3cf284d88c4af486fd6b7754aec40b2be9a5ffd9ecadab +patch_hash = 4f56174fef39fdcc83f235e7021f18ec638403ab3ee2c314fb2509a8bf599b27 From b9acfcace892d4b797454661dc87917d681d4e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Wed, 19 Feb 2020 16:18:39 +0100 Subject: [PATCH 304/448] git-update: provides a check status option Add --check-status to git-update python script to provide the list of subprojects with their git status (branch and state). --- git-update | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/git-update b/git-update index 0138fd95a3..8c223d3f72 100755 --- a/git-update +++ b/git-update @@ -50,7 +50,7 @@ def ensure_revision_if_necessary(repo_dir, revision): return revision -def update_subprojects(repos_commits, no_interaction=False): +def update_subprojects(manifest, no_interaction=False, check_status=False): subprojects_dir = os.path.join(SCRIPTDIR, "subprojects") for repo_name in os.listdir(subprojects_dir): repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name)) @@ -58,13 +58,32 @@ def update_subprojects(repos_commits, no_interaction=False): continue revision, args = repos_commits.get(repo_name, [None, []]) - if not update_repo(repo_name, repo_dir, revision, no_interaction, args): - return False + if not update_repo(repo_name, repo_dir, revision, no_interaction, args, check_status=check_status): + return False return True +def repo_status(commit_message): + status = "clean" + for message in commit_message: + if message.startswith('??'): + status = "%sclean but untracked files%s" % (Colors.WARNING,Colors.ENDC) + elif message.startswith(' M'): + status = "%shas local modificationss%s" % (Colors.WARNING,Colors.ENDC) + break; + return status -def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0): +def check_repo_status(repo_name, worktree_dir): + branch_message = git("status", repository_path=worktree_dir).split("\n") + commit_message = git("status", "--porcelain", repository_path=worktree_dir).split("\n") + + print(u"%s%s%s - %s - %s" % (Colors.HEADER, repo_name, Colors.ENDC, + branch_message[0].strip(), repo_status(commit_message))) + return True + +def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0, check_status=False): + if check_status: + return check_repo_status(repo_name, repo_dir) revision = ensure_revision_if_necessary(repo_dir, revision) git("config", "rebase.autoStash", "true", repository_path=repo_dir) try: @@ -149,6 +168,10 @@ if __name__ == "__main__": default=False, action='store_true', help="Do not allow interaction with the user.") + parser.add_argument("--check-status", + default=False, + action='store_true', + help="Check repositories status only.") parser.add_argument("--manifest", default=None, help="Use a android repo manifest to sync repositories" @@ -168,13 +191,12 @@ if __name__ == "__main__": repos_commits = {} revision, args = repos_commits.get('gst-build', [None, []]) - if not update_repo('gst-build', SCRIPTDIR, revision, options.no_interaction, args): + if not update_repo('gst-build', SCRIPTDIR, None, options.no_interaction, args, check_status=options.check_status): exit(1) - - if not update_subprojects(repos_commits, options.no_interaction): + if not update_subprojects(options.manifest, options.no_interaction, check_status=options.check_status): exit(1) - - update_cargo(options.builddir) + if not options.check_status: + update_cargo(options.builddir) if options.builddir: ninja = accept_command(["ninja", "ninja-build"]) From ee4108a0866d01c0cb675b9eb08c94fe9098b69c Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 21 Feb 2020 22:08:03 +0530 Subject: [PATCH 305/448] cross-files/android: cpu is aarch64, not arm64 Matching the value in glib: https://gitlab.gnome.org/GNOME/glib/merge_requests/1376#note_719427 --- data/cross-files/android_arm64_api28.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/cross-files/android_arm64_api28.txt b/data/cross-files/android_arm64_api28.txt index 27b803d821..c697549a6e 100644 --- a/data/cross-files/android_arm64_api28.txt +++ b/data/cross-files/android_arm64_api28.txt @@ -1,7 +1,7 @@ [host_machine] system = 'android' cpu_family = 'aarch64' -cpu = 'arm64' +cpu = 'aarch64' endian = 'little' [properties] From 7716ea303a7d6d68eddf7ce2e9202ffae39b0d9b Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 21 Feb 2020 22:12:15 +0530 Subject: [PATCH 306/448] cross-files/android: Update paths and args for latest NDK -fuse-ld=gold was always needed, but we missed it while adding this. The rest are new in NDK r21. --- data/cross-files/android_arm64_api28.txt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/data/cross-files/android_arm64_api28.txt b/data/cross-files/android_arm64_api28.txt index c697549a6e..7137fabd17 100644 --- a/data/cross-files/android_arm64_api28.txt +++ b/data/cross-files/android_arm64_api28.txt @@ -5,12 +5,16 @@ cpu = 'aarch64' endian = 'little' [properties] -c_args = ['--sysroot', '/opt/android-arm64-api28/sysroot'] -cpp_args = ['--sysroot', '/opt/android-arm64-api28/sysroot'] +sys_root = '/path/to/android-ndk-r21/sysroot' +c_link_args = ['-fuse-ld=gold'] +cpp_link_args = ['-fuse-ld=gold'] +# Starting with 0.53.1, you can replace the above *_link_args: +# c_ld = 'gold' +# cpp_ld = 'gold' [binaries] -c = '/opt/android-arm64-api28/bin/aarch64-linux-android-clang' -cpp = '/opt/android-arm64-api28/bin/aarch64-linux-android-clang++' -ar = '/opt/android-arm64-api28/bin/aarch64-linux-android-ar' -strip = '/opt/android-arm64-api28/bin/aarch64-linux-android-strip' +c = '/path/to/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android28-clang' +cpp = '/path/to/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android28-clang++' +ar = '/path/to/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar' +strip = '/path/to/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip' pkgconfig = 'false' From bc5c73e6514885ea954aa1becb98ff178641e9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Thu, 27 Feb 2020 09:01:57 +0100 Subject: [PATCH 307/448] git-update: fix typo in message --- git-update | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-update b/git-update index 8c223d3f72..37d9a4364d 100755 --- a/git-update +++ b/git-update @@ -69,7 +69,7 @@ def repo_status(commit_message): if message.startswith('??'): status = "%sclean but untracked files%s" % (Colors.WARNING,Colors.ENDC) elif message.startswith(' M'): - status = "%shas local modificationss%s" % (Colors.WARNING,Colors.ENDC) + status = "%shas local modifications%s" % (Colors.WARNING,Colors.ENDC) break; return status From d06b4ffe1eef5166899b3f1120ac5b7e597706a9 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Wed, 19 Feb 2020 10:22:25 -0500 Subject: [PATCH 308/448] libsoup: Bump subproject version to 2.68.4 Older versions fails to build because the glib dependency was wrong. Fixes: #75 --- subprojects/libsoup.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libsoup.wrap b/subprojects/libsoup.wrap index 401c388b25..c039f081a9 100644 --- a/subprojects/libsoup.wrap +++ b/subprojects/libsoup.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=libsoup url=https://gitlab.gnome.org/gnome/libsoup.git -revision=2.68.2 +revision=2.68.4 From 588250eaeb7136baea30151651af5fd0c2457638 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Sun, 1 Mar 2020 19:58:35 +0900 Subject: [PATCH 309/448] meson: Apply msvc warning level to cpp too We have c++ code as well. --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 5a5f6d2bd7..3a6a8f0a75 100644 --- a/meson.build +++ b/meson.build @@ -51,7 +51,7 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' '/w14101', # 'identifier' : unreferenced local variable '/w14189', # 'identifier' : local variable is initialized but not referenced cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 - language: 'c') + language: ['c', 'cpp']) endif # Ordered list of subprojects (dict has no ordering guarantees) From c67034c5291bf43112d1764cc7c43f6e0ded07d6 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 2 Mar 2020 11:04:40 +0530 Subject: [PATCH 310/448] Remove unused variable in meson.build We don't use this anywhere. It's confusing. --- meson.build | 2 -- 1 file changed, 2 deletions(-) diff --git a/meson.build b/meson.build index 3a6a8f0a75..4b16d23ed1 100644 --- a/meson.build +++ b/meson.build @@ -6,8 +6,6 @@ project('All GStreamer modules', 'c', gst_version = '>= @0@'.format(meson.project_version()) gst_branch = 'master' -glib_req = '>= 2.44.0' - build_system = build_machine.system() cc = meson.get_compiler('c') From 7f231c2d8a8d7f8cae4225e12baf9c33f07a3af9 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 2 Mar 2020 11:05:41 +0530 Subject: [PATCH 311/448] Disable rust feature option by default The only requirement for the rust plugins is that a rust toolchain be present on the system. This is problematic: 1. This means gst-build on Windows is broken by default if you have a Rust toolchain, since glib can't be used uninstalled 2. No output is printed on Windows at all while the rust plugins are being built. `custom_target()`'s `console:` keyword argument seems to be broken on some Windows shells. 3. Even on Linux/macOS having this enabled by default is problematic since it more than doubles the total build time. 4. The biggest issue with having it enabled by default is that it does not dependency tracking, so we always run `cargo`, which might update crates. This increases friction when you're working on unrelated code. --- meson_options.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson_options.txt b/meson_options.txt index b7b7440879..686c67556f 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -11,7 +11,7 @@ option('vaapi', type : 'feature', value : 'auto') option('sharp', type : 'feature', value : 'disabled') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') option('gst-examples', type : 'feature', value : 'auto', description : 'Build gst-examples') -option('rs', type : 'feature', value : 'auto') +option('rs', type : 'feature', value : 'disabled') # Common options, automatically inherited by subprojects option('examples', type : 'feature', value : 'auto', description : 'Build examples') From 6dfcecb16a13980b4650a7c9e6102e8d71fc3f7b Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 2 Mar 2020 11:11:47 +0530 Subject: [PATCH 312/448] Disable vaapi feature by default Having vaapi decoders/encoders accidentally available by default often causes strange test failures or weird behaviour since the plugins are sometimes buggy or have different behaviour. --- meson_options.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson_options.txt b/meson_options.txt index 686c67556f..47b9c596d5 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -7,7 +7,7 @@ option('devtools', type : 'feature', value : 'auto') option('ges', type : 'feature', value : 'auto') option('rtsp_server', type : 'feature', value : 'auto') option('omx', type : 'feature', value : 'disabled') -option('vaapi', type : 'feature', value : 'auto') +option('vaapi', type : 'feature', value : 'disabled') option('sharp', type : 'feature', value : 'disabled') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') option('gst-examples', type : 'feature', value : 'auto', description : 'Build gst-examples') From 7cf00627beaa3e0aec12df6e70282bd981c792b3 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 17 Sep 2019 15:53:40 -0400 Subject: [PATCH 313/448] Simplify generate_plugins_path.py script This also fix an empty plugin name being prepended to the list. --- meson.build | 24 ++++++++++++++---------- scripts/generate_plugins_path.py | 8 ++++---- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/meson.build b/meson.build index 4b16d23ed1..382eb42724 100644 --- a/meson.build +++ b/meson.build @@ -86,13 +86,11 @@ if build_system == 'windows' subproject('win-nasm') endif -pathsep = host_machine.system() == 'windows' ? ';' : ':' - subproject('orc', required: get_option('orc')) subprojects_names = [] plugins_doc_caches = [] -all_plugins = '' +all_plugins = [] foreach sp : subprojects project_name = sp[0] build_infos = sp[1] @@ -114,10 +112,7 @@ foreach sp : subprojects else plugins = [] endif - - foreach plugin: plugins - all_plugins += pathsep + plugin.full_path() - endforeach + all_plugins += plugins subprojects_names += [project_name] cmdres = run_command(python3, '-c', symlink.format(project_name, meson.current_source_dir())) @@ -170,9 +165,18 @@ else endif endif -cmdres = run_command(python3, find_program('scripts/generate_plugins_path.py'), '--builddir', - meson.build_root(), all_plugins) -assert(cmdres.returncode() == 0, 'Could not create plugins path: @0@'.format(cmdres.stderr())) +all_plugins_paths = [] +foreach plugin: all_plugins + all_plugins_paths += plugin.full_path() +endforeach + +generate_plugins_paths = find_program('scripts/generate_plugins_path.py') +configure_file( + output : 'GstPluginsPath.json', + command : [generate_plugins_paths, + '@OUTPUT@', + all_plugins_paths] +) message('Building subprojects: ' + ', '.join(subprojects_names)) setenv = find_program('gst-env.py') diff --git a/scripts/generate_plugins_path.py b/scripts/generate_plugins_path.py index d57c60c2fe..17a38f123b 100644 --- a/scripts/generate_plugins_path.py +++ b/scripts/generate_plugins_path.py @@ -6,14 +6,14 @@ import json if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("--builddir", help="The meson build directory") - parser.add_argument(dest="plugins", help="The list of plugins") + parser.add_argument(dest="output", help="Output file") + parser.add_argument(dest="plugins", nargs=argparse.REMAINDER, help="The list of plugins") options = parser.parse_args() all_paths = set() - for plugin in options.plugins.split(os.pathsep): + for plugin in options.plugins: all_paths.add(os.path.dirname(plugin)) - with open(os.path.join(options.builddir, 'GstPluginsPath.json'), "w") as f: + with open(options.output, "w") as f: json.dump(list(all_paths), f, indent=4, sort_keys=True) From 35285c51b8d72f4567abe6599b24b74ea3a548f4 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 17 Sep 2019 11:52:10 -0400 Subject: [PATCH 314/448] Add gstreamer-full library containing all plugins and their deps When building with -Ddefault_library=static, also build a single library containing all built plugins. Any external dependencies are still dynamically linked. A monolithic library is easier to distribute, and in some envs like Android is required. --- gstinitstaticplugins.h | 29 +++++++++ meson.build | 84 +++++++++++++++++++++++++ meson_options.txt | 2 + scripts/generate_init_static_plugins.py | 39 ++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 gstinitstaticplugins.h create mode 100644 scripts/generate_init_static_plugins.py diff --git a/gstinitstaticplugins.h b/gstinitstaticplugins.h new file mode 100644 index 0000000000..bd6245e3b1 --- /dev/null +++ b/gstinitstaticplugins.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2019 Collabora Ltd. + * Author: Xavier Claessens + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +void gst_init_static_plugins (void); + +G_END_DECLS diff --git a/meson.build b/meson.build index 382eb42724..1209c8b148 100644 --- a/meson.build +++ b/meson.build @@ -9,6 +9,7 @@ gst_branch = 'master' build_system = build_machine.system() cc = meson.get_compiler('c') +pkgconfig = import('pkgconfig') python3 = import('python').find_installation() # Ensure that we're not being run from inside the gst-uninstalled env # because that will confuse meson, and it might find the already-built @@ -178,6 +179,89 @@ configure_file( all_plugins_paths] ) +# FIXME: Create a 'libraries' list in each subproject like we do for 'plugins' +libraries_map = { + # name: [subproject_name, variable_name] + 'gstreamer': ['gstreamer', 'libgst'], + 'base': ['gstreamer', 'gst_base'], + 'check': ['gstreamer', 'gst_check'], + 'controller': ['gstreamer', 'gst_controller'], + 'net': ['gstreamer', 'gst_net'], + + 'allocators': ['gst-plugins-base', 'gstallocators'], + 'app': ['gst-plugins-base', 'gstapp'], + 'audio': ['gst-plugins-base', 'gstaudio'], + 'fft': ['gst-plugins-base', 'gstfft'], + 'pbutils': ['gst-plugins-base', 'pbutils'], + 'riff': ['gst-plugins-base', 'gstriff'], + 'rtp': ['gst-plugins-base', 'gst_rtp'], + 'rtsp': ['gst-plugins-base', 'gst_rtsp'], + 'sdp': ['gst-plugins-base', 'gstsdp'], + 'tag': ['gst-plugins-base', 'gsttag'], + 'video': ['gst-plugins-base', 'gstvideo'], + 'gl': ['gst-plugins-base', 'gstgl'], + + 'bad-audio': ['gst-plugins-bad', 'gstbadaudio'], + 'bad-transcoder': ['gst-plugins-bad', 'gst_transcoder'], + 'codecparsers': ['gst-plugins-bad', 'gstcodecparsers'], + 'insertbin': ['gst-plugins-bad', 'gstinsertbin'], + 'mpegts': ['gst-plugins-bad', 'gstmpegts'], + 'player': ['gst-plugins-bad', 'gstplayer'], + 'sctp': ['gst-plugins-bad', 'libgstsctp'], + 'webrtc': ['gst-plugins-bad', 'gstwebrtc'], + 'vulkan': ['gst-plugins-bad', 'gstvulkan'], + + 'rtsp-server': ['gst-rtsp-server', 'gst_rtsp_server'], +} + +if get_option('default_library') == 'static' + # Generate a .c file which declare and register all built plugins + generate_init_static_plugins = find_program('scripts/generate_init_static_plugins.py') + init_static_plugins_c = configure_file( + output: 'gstinitstaticplugins.c', + command : [generate_init_static_plugins, + '@OUTPUT@', + all_plugins_paths] + ) + install_headers('gstinitstaticplugins.h', subdir : 'gstreamer-1.0/gst') + + # Get include paths in source tree + gst_dep = subproject('gstreamer').get_variable('gst_dep') + gst_includes = gst_dep.partial_dependency(includes: true, compile_args: true) + + # Get a list of libraries that needs to be exposed in the ABI. + exposed_libs = [] + foreach name : get_option('gst-full-libraries') + ['gstreamer'] + info = libraries_map[name] + exposed_libs += subproject(info[0]).get_variable(info[1]) + endforeach + + # glib and gobject are part of our public API. If we are using glib from the + # system then our pkg-config file must require it. If we built it as + # subproject then we need to link_whole it. + requires = [] + gobject_dep = dependency('gobject-2.0', fallback: ['glib', 'libgobject_dep']) + if gobject_dep.type_name() == 'internal' + glib_subproject = subproject('glib') + exposed_libs += glib_subproject.get_variable('libglib') + exposed_libs += glib_subproject.get_variable('libgobject') + else + requires = ['glib-2.0', 'gobject-2.0'] + endif + + # Build both shared and static library + gstfull = both_libraries('gstreamer-full-1.0', + init_static_plugins_c, + link_with : all_plugins, + link_whole : exposed_libs, + dependencies : gst_includes, + install : true, + ) + pkgconfig.generate(gstfull, + requires: requires, + subdirs : 'gstreamer-1.0') +endif + message('Building subprojects: ' + ', '.join(subprojects_names)) setenv = find_program('gst-env.py') diff --git a/meson_options.txt b/meson_options.txt index 47b9c596d5..8b7487685b 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -12,6 +12,8 @@ option('sharp', type : 'feature', value : 'disabled') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') option('gst-examples', type : 'feature', value : 'auto', description : 'Build gst-examples') option('rs', type : 'feature', value : 'disabled') +option('gst-full-libraries', type : 'array', value : [], + description : '''List of libraries to expose in gstreamer-full's ABI. gstreamer, glib and gobject are always included.''') # Common options, automatically inherited by subprojects option('examples', type : 'feature', value : 'auto', description : 'Build examples') diff --git a/scripts/generate_init_static_plugins.py b/scripts/generate_init_static_plugins.py new file mode 100644 index 0000000000..d7a13e28ee --- /dev/null +++ b/scripts/generate_init_static_plugins.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +import argparse +import os +from string import Template + +TEMPLATE = Template(''' +#include + +$plugins_declaration + +void +gst_init_static_plugins (void) +{ + $plugins_registration +} +''') + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument(dest="output", help="Output file") + parser.add_argument(dest="plugins", nargs=argparse.REMAINDER, help="The list of plugins") + + options = parser.parse_args() + + names = set() + for plugin in options.plugins: + filename = os.path.basename(plugin) + if filename.startswith('libgst') and filename.endswith('.a'): + names.add(filename[len('libgst'):-len('.a')]) + + registration = ['GST_PLUGIN_STATIC_REGISTER(%s);' % name for name in names] + declaration = ['GST_PLUGIN_STATIC_DECLARE(%s);' % name for name in names] + + with open(options.output, "w") as f: + f.write(TEMPLATE.substitute({ + 'plugins_declaration': '\n'.join(declaration), + 'plugins_registration': '\n '.join(registration), + })) From 7fa292406e7d15c7716ef4883b02873d922d96f4 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Mon, 16 Dec 2019 16:05:30 -0500 Subject: [PATCH 315/448] Add example using gstreamer-full It will be used by the CI to verify we can build it. --- examples/static-plugins/main.c | 17 +++++++++++++++++ examples/static-plugins/meson.build | 6 ++++++ 2 files changed, 23 insertions(+) create mode 100644 examples/static-plugins/main.c create mode 100644 examples/static-plugins/meson.build diff --git a/examples/static-plugins/main.c b/examples/static-plugins/main.c new file mode 100644 index 0000000000..7124232d69 --- /dev/null +++ b/examples/static-plugins/main.c @@ -0,0 +1,17 @@ +#include +#include + +int +main (int argc, char *argv[]) +{ + GstElement *e; + + gst_init (&argc, &argv); + gst_init_static_plugins (); + + e = gst_element_factory_make ("identity", NULL); + g_assert_nonnull (e); + g_object_unref (e); + + return 0; +} diff --git a/examples/static-plugins/meson.build b/examples/static-plugins/meson.build new file mode 100644 index 0000000000..0273086be9 --- /dev/null +++ b/examples/static-plugins/meson.build @@ -0,0 +1,6 @@ +project('myapp', 'c') + +dep = dependency('gstreamer-full-1.0') +app = executable('myapp', 'main.c', dependencies : dep) + +test('test-gstreamer-full', app) From 7ef372db76cf40b1ea3459c4c8ebd6d757b8cd96 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Wed, 11 Mar 2020 13:49:11 -0400 Subject: [PATCH 316/448] Meson: Fix useless reconfigure when plugins libs change This is a workaround for a Meson bug that incorrectly trigger reconfigure when files change in build directory. This commit can be reverted once GStreamer depends on Meson >=0.54.0. See https://github.com/mesonbuild/meson/pull/6770 Fixes: #85 --- meson.build | 3 +++ scripts/generate_init_static_plugins.py | 4 ++-- scripts/generate_plugins_path.py | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index 1209c8b148..4055415566 100644 --- a/meson.build +++ b/meson.build @@ -170,6 +170,9 @@ all_plugins_paths = [] foreach plugin: all_plugins all_plugins_paths += plugin.full_path() endforeach +# Work around meson bug: https://github.com/mesonbuild/meson/pull/6770 +pathsep = host_machine.system() == 'windows' ? ';' : ':' +all_plugins_paths = pathsep.join(all_plugins_paths) generate_plugins_paths = find_program('scripts/generate_plugins_path.py') configure_file( diff --git a/scripts/generate_init_static_plugins.py b/scripts/generate_init_static_plugins.py index d7a13e28ee..c2ed122512 100644 --- a/scripts/generate_init_static_plugins.py +++ b/scripts/generate_init_static_plugins.py @@ -19,12 +19,12 @@ gst_init_static_plugins (void) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument(dest="output", help="Output file") - parser.add_argument(dest="plugins", nargs=argparse.REMAINDER, help="The list of plugins") + parser.add_argument(dest="plugins", help="The list of plugins") options = parser.parse_args() names = set() - for plugin in options.plugins: + for plugin in options.plugins.split(os.pathsep): filename = os.path.basename(plugin) if filename.startswith('libgst') and filename.endswith('.a'): names.add(filename[len('libgst'):-len('.a')]) diff --git a/scripts/generate_plugins_path.py b/scripts/generate_plugins_path.py index 17a38f123b..d609639f94 100644 --- a/scripts/generate_plugins_path.py +++ b/scripts/generate_plugins_path.py @@ -7,12 +7,12 @@ import json if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument(dest="output", help="Output file") - parser.add_argument(dest="plugins", nargs=argparse.REMAINDER, help="The list of plugins") + parser.add_argument(dest="plugins", help="The list of plugins") options = parser.parse_args() all_paths = set() - for plugin in options.plugins: + for plugin in options.plugins.split(os.pathsep): all_paths.add(os.path.dirname(plugin)) with open(options.output, "w") as f: From 66d22c103b4decd25e0714bd44c88abdca2c1b2a Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Thu, 12 Mar 2020 14:40:58 -0400 Subject: [PATCH 317/448] Meson: dict.has_key() method has no 'default' argument Meson silently accept those keyword arguments, will produce a warning in the future: https://github.com/mesonbuild/meson/pull/6780 --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 4055415566..3333a23850 100644 --- a/meson.build +++ b/meson.build @@ -108,7 +108,7 @@ foreach sp : subprojects # Replace by using subproject.get_variable('plugins', []) # when https://github.com/mesonbuild/meson/pull/5426/files # is merged and released - if build_infos.has_key('has-plugins', default: false) + if build_infos.get('has-plugins', false) plugins = subproj.get_variable('plugins') else plugins = [] @@ -121,7 +121,7 @@ foreach sp : subprojects message('Created symlink to ' + project_name) endif - if not meson.is_cross_build() and build_infos.has_key('build-hotdoc', default: false) + if not meson.is_cross_build() and build_infos.get('build-hotdoc', false) if plugins.length() > 0 plugins_doc_caches += [subproj.get_variable('plugins_doc_dep')] endif From 315c5f87e27ef0408bc93065d2950c1abcf294b8 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Mon, 16 Mar 2020 21:53:29 -0400 Subject: [PATCH 318/448] gst-full: Create 'alpha' element It is the only plugin built by the CI, with coreelements. --- examples/static-plugins/main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/static-plugins/main.c b/examples/static-plugins/main.c index 7124232d69..a205b7834a 100644 --- a/examples/static-plugins/main.c +++ b/examples/static-plugins/main.c @@ -13,5 +13,9 @@ main (int argc, char *argv[]) g_assert_nonnull (e); g_object_unref (e); + e = gst_element_factory_make ("alpha", NULL); + g_assert_nonnull (e); + g_object_unref (e); + return 0; } From 6d79e7cc97f841bd6e833d217fca394bc74d34d9 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Mon, 16 Mar 2020 21:54:26 -0400 Subject: [PATCH 319/448] gst-full: Use gst_dep dependency It is needed because that dependency object brings generated headers too. --- meson.build | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/meson.build b/meson.build index 3333a23850..c408d33e20 100644 --- a/meson.build +++ b/meson.build @@ -228,9 +228,7 @@ if get_option('default_library') == 'static' ) install_headers('gstinitstaticplugins.h', subdir : 'gstreamer-1.0/gst') - # Get include paths in source tree gst_dep = subproject('gstreamer').get_variable('gst_dep') - gst_includes = gst_dep.partial_dependency(includes: true, compile_args: true) # Get a list of libraries that needs to be exposed in the ABI. exposed_libs = [] @@ -257,7 +255,7 @@ if get_option('default_library') == 'static' init_static_plugins_c, link_with : all_plugins, link_whole : exposed_libs, - dependencies : gst_includes, + dependencies : gst_dep, install : true, ) pkgconfig.generate(gstfull, From f69a2c9fd2d446754fbe3820d790864c7001c406 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Wed, 25 Mar 2020 08:43:10 -0400 Subject: [PATCH 320/448] gst-env: Allow setting environment without git This is needed to use gst-uninstalled mode over NFS when gst-build is a worktree. When this is the case, the .git is a file that links to the original git tree, but this tree is unlikely to be visible over NFS. Instead of forcing NFS contorsion, simply ignore the error. --- gst-env.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gst-env.py b/gst-env.py index 37503c6e31..1f30a55f4c 100755 --- a/gst-env.py +++ b/gst-env.py @@ -430,8 +430,11 @@ if __name__ == "__main__": exit(1) # The following incantation will retrieve the current branch name. - gst_version = git("rev-parse", "--symbolic-full-name", "--abbrev-ref", "HEAD", - repository_path=options.srcdir).strip('\n') + try: + gst_version = git("rev-parse", "--symbolic-full-name", "--abbrev-ref", "HEAD", + repository_path=options.srcdir).strip('\n') + except subprocess.CalledProcessError: + gst_version = "unknown" if options.wine: gst_version += '-' + os.path.basename(options.wine) From d1db3f989490f6d44687736acdb54c7ffa9cb6a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Mon, 23 Mar 2020 12:05:54 +0100 Subject: [PATCH 321/448] sqlite: wrap use 3250100-2 patch to install lib In order to install the lib in DESTDIR, use the new sqlite patch zip 3250100-2. --- subprojects/sqlite.wrap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subprojects/sqlite.wrap b/subprojects/sqlite.wrap index d05f67b485..a9c9eb03d5 100644 --- a/subprojects/sqlite.wrap +++ b/subprojects/sqlite.wrap @@ -5,6 +5,6 @@ source_url = https://www.sqlite.org/2018/sqlite-amalgamation-3250100.zip source_filename = sqlite-amalgamation-3250100.zip source_hash = 6c68b6364fa0e01d9d05088ba473ac4e7a6fbc64f9b9aeb6d830f944e2a1fa03 -patch_url = https://github.com/mesonbuild/sqlite/releases/download/3250100-1/sqlite.zip +patch_url = https://github.com/mesonbuild/sqlite/releases/download/3250100-2/sqlite.zip patch_filename = sqlite.zip -patch_hash = cbb697a1e4649cf6b7f28d82048109d87ccbf01106e1d5a68f763d4685d8607c +patch_hash = b8b4c04b02f20a842b013a2609a8ebb367669a39e4077eba4892796ede39f6ec From 4f8b12ee6886335d58a5c858e3f5299287c18843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Fri, 3 Apr 2020 10:15:09 +0200 Subject: [PATCH 322/448] subprojects: add libdrm wrap --- .gitignore | 1 + subprojects/libdrm.wrap | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 subprojects/libdrm.wrap diff --git a/.gitignore b/.gitignore index 1d87138cf5..b899d1aa10 100644 --- a/.gitignore +++ b/.gitignore @@ -59,5 +59,6 @@ subprojects/FFmpeg subprojects/x264 subprojects/libxml2-* subprojects/sqlite-* +subprojects/libdrm-* prefix/ pygobject diff --git a/subprojects/libdrm.wrap b/subprojects/libdrm.wrap new file mode 100644 index 0000000000..c2d477e875 --- /dev/null +++ b/subprojects/libdrm.wrap @@ -0,0 +1,5 @@ +[wrap-file] +directory=libdrm-2.4.100 +source_url=https://dri.freedesktop.org/libdrm/libdrm-2.4.100.tar.bz2 +source_filename=libdrm-2.4.100.tar.bz2 +source_hash=c77cc828186c9ceec3e56ae202b43ee99eb932b4a87255038a80e8a1060d0a5d From 3ceafd2ebc48a3e37bf7ed0604d5aa6bd6a4701d Mon Sep 17 00:00:00 2001 From: ssethupa Date: Tue, 7 Apr 2020 21:55:29 -0500 Subject: [PATCH 323/448] libsoup: bump wrap to 2.70.0 --- subprojects/libsoup.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libsoup.wrap b/subprojects/libsoup.wrap index c039f081a9..10053e2a51 100644 --- a/subprojects/libsoup.wrap +++ b/subprojects/libsoup.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=libsoup url=https://gitlab.gnome.org/gnome/libsoup.git -revision=2.68.4 +revision=2.70.0 From 88f5262ba3530084361e532711215166b77f94f7 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 16 Apr 2020 18:47:03 +0530 Subject: [PATCH 324/448] README: Use 'builddir' instead of 'build/' `/` was added to make it clear that `build` is a directory and not a meson sub-command. However, this can be confusing for Windows users. use `builddir` which does the same job. --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c5b7c8591d..8a35a8dbce 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,8 @@ You can find [instructions for Windows below](#windows-prerequisites-setup). You can get all GStreamer built running: ``` -meson build/ -ninja -C build/ +meson builddir +ninja -C builddir ``` This will automatically create the `build` directory and build everything @@ -70,13 +70,13 @@ development environment where you will be able to work on GStreamer easily. You can get into that environment running: ``` -ninja -C build/ devenv +ninja -C builddir devenv ``` If your operating system handles symlinks, built modules source code will be available at the root of `gst-build/` for example GStreamer core will be in `gstreamer/`. Otherwise they will be present in `subprojects/`. You can simply -hack in there and to rebuild you just need to rerun `ninja -C build/`. +hack in there and to rebuild you just need to rerun `ninja -C builddir`. NOTE: In the development environment, a fully usable prefix is also configured in `gst-build/prefix` where you can install any extra dependency/project. @@ -98,13 +98,13 @@ branch). Update all GStreamer modules and rebuild: ``` -ninja -C build/ update +ninja -C builddir update ``` Update all GStreamer modules without rebuilding: ``` -ninja -C build/ git-update +ninja -C builddir git-update ``` ## Custom subprojects @@ -134,25 +134,25 @@ meson test -C build To list all available tests: ``` -meson test -C build --list +meson test -C builddir --list ``` To run all the tests of a specific component: ``` -meson test -C build --suite gst-plugins-base +meson test -C builddir --suite gst-plugins-base ``` Or to run a specific test file: ``` -meson test -C build/ --suite gstreamer gst_gstbuffer +meson test -C builddir --suite gstreamer gst_gstbuffer ``` Run a specific test from a specific test file: ``` -GST_CHECKS=test_subbuffer meson test -C build/ --suite gstreamer gst_gstbuffer +GST_CHECKS=test_subbuffer meson test -C builddir --suite gstreamer gst_gstbuffer ``` ## Optional Installation @@ -161,9 +161,9 @@ GST_CHECKS=test_subbuffer meson test -C build/ --suite gstreamer gst_gstbuffer but you can also install everything that is built into a predetermined prefix like so: ``` -meson --prefix=/path/to/install/prefix build/ -ninja -C build/ -meson install -C build/ +meson --prefix=/path/to/install/prefix builddir +ninja -C builddir +meson install -C builddir ``` Note that the installed files have `RPATH` stripped, so you will need to set @@ -181,7 +181,7 @@ For example to get a fresh checkout of `gst-1.14` from a `gst-build` in master * built** in a `build` directory you can simply run: ``` -./checkout-branch-worktree ../gst-build-1.14 origin/1.14 -C build/ +./checkout-branch-worktree ../gst-build-1.16 origin/1.14 -C builddir ``` This will create a new ``gst-build-1.14`` folder at the same level of ``gst-build`` pointing to the given branch ie *1.14* From d6fdd8afc657ff3881a5cc38c2d191c5c92c3c7b Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 16 Apr 2020 18:53:37 +0530 Subject: [PATCH 325/448] README: Document gst-worktree, remove checkout-branch-worktree Closes https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/72 --- README.md | 14 +++++++------- checkout-branch-worktree | 10 ---------- 2 files changed, 7 insertions(+), 17 deletions(-) delete mode 100755 checkout-branch-worktree diff --git a/README.md b/README.md index 8a35a8dbce..4e09364ec1 100644 --- a/README.md +++ b/README.md @@ -172,20 +172,20 @@ platform for things to work. ## Checkout another branch using worktrees -If you need to have several versions of GStreamer coexisting (eg. `master` and `1.14`), -you can use the `checkout-branch-worktree` script provided by `gst-build`. It allows you +If you need to have several versions of GStreamer coexisting (eg. `master` and `1.16`), +you can use the `gst-worktree.py` script provided by `gst-build`. It allows you to create a new `gst-build` environment with new checkout of all the GStreamer modules as [git worktrees](https://git-scm.com/docs/git-worktree). -For example to get a fresh checkout of `gst-1.14` from a `gst-build` in master **already -built** in a `build` directory you can simply run: +For example to get a fresh checkout of `gst-1.16` from a `gst-build` repository +that is checked out at master, you can run: ``` -./checkout-branch-worktree ../gst-build-1.16 origin/1.14 -C builddir +./gst-worktree.py add gst-build-1.16 origin/1.16 ``` -This will create a new ``gst-build-1.14`` folder at the same level of ``gst-build`` pointing to the given branch ie *1.14* -for all the subprojects ( gstreamer, gst-plugins-base etc.) +This will create a new ``gst-build-1.16`` directory pointing to the given branch `1.16` +for all the subprojects (gstreamer, gst-plugins-base, etc.) ## Add information about GStreamer development environment in your prompt line diff --git a/checkout-branch-worktree b/checkout-branch-worktree deleted file mode 100755 index bd060b6f6b..0000000000 --- a/checkout-branch-worktree +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -cd `dirname $0` - -case "$MSYSTEM" in - *MINGW*) PYTHON="py -3";; - *) PYTHON="python3";; -esac - -$PYTHON gst-worktree.py add "$@" From 3e1c57553e82724a6708454a86a43ede25641566 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 16 Apr 2020 18:57:07 +0530 Subject: [PATCH 326/448] README: Document which dependencies are available Also document how to build the Intel MSDK plugins, and how to enable/disable plugins in general. Closes https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/90 --- README.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4e09364ec1..66669ece66 100644 --- a/README.md +++ b/README.md @@ -50,18 +50,66 @@ inside it. NOTE: On Windows, you *must* run this from inside the Visual Studio command prompt of the appropriate architecture and version. -# Development environment +### External dependencies -## Building the Qt5 QML plugin +All mandatory dependencies of GStreamer are included as [meson subprojects](https://mesonbuild.com/Subprojects.html): +libintl, zlib, libffi, glib. Some optional dependencies are also included as +subprojects, such as ffmpeg, x264, json-glib, graphene, openh264, orc, etc. + +Mandatory dependencies will be automatically built if meson cannot find them on +your system using pkg-config. The same is true for optional dependencies that +are included as subprojects. You can find a full list by looking at the +`subprojects` directory. + +Plugins that need optional dependencies that aren't included can only be built +if they are provided by the system. Instructions on how to build some common +ones such as Qt5/QML are listed below. If you do not know how to provide an +optional dependency needed by a plugin, you should use [Cerbero](https://gitlab.freedesktop.org/gstreamer/cerbero/#description) +which handles this for you automatically. + +Plugins will be automatically enabled if possible, but you can ensure that +a particular plugin (especially if it has external dependencies) is built by +enabling the gstreamer repository that ships it and the plugin inside it. For +example, to enable the Qt5 plugin in the gst-plugins-good repository, you need +to run meson as follows: + +``` +meson -Dgood=enabled -Dgst-plugins-good:qt5=enabled builddir +``` + +This will cause Meson to error out if the plugin could not be enabled. You can +also flip the default and disable all plugins except those explicitly enabled +like so: + +``` +meson -Dauto_features=disabled -Dgstreamer:tools=enabled -Dbad=enabled -Dgst-plugins-bad:openh264=enabled +``` + +This will disable all optional features and then enable the `openh264` plugin +and the tools that ship with the core gstreamer repository: `gst-inspect-1.0`, +`gst-launch-1.0`, etc. As usual, you can change these values on a builddir that +has already been setup with `meson configure -Doption=value`. + +### Building the Qt5 QML plugin If `qmake` is not in `PATH` and pkgconfig files are not available, you can point the `QMAKE` env var to the Qt5 installation of your choosing before running `meson` as shown above. The plugin will be automatically enabled if possible, but you can ensure that -it is built by passing `-Dgst-plugins-good:qt5=enabled` to `meson`. This will -cause Meson to error out if the plugin could not be enabled. This also works -for all plugins in all GStreamer repositories. +it is built by passing `-Dgood=enabled -Dgst-plugins-good:qt5=enabled` to `meson`. + +### Building the Intel MSDK plugin + +On Linux, you need to have development files for `libmfx` installed. On +Windows, if you have the [Intel Media SDK](https://software.intel.com/en-us/media-sdk), +it will set the `INTELMEDIASDKROOT` environment variable, which will be used by +the build files to find `libmfx`. + +The plugin will be automatically enabled if possible, but you can ensure it by +passing `-Dbad=enabled -Dgst-plugins-bad:msdk=enabled` to `meson`. + +# Development environment ## Development environment target From 478836e85bcd59aed0d224a85cb3206acdc60799 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 16 Apr 2020 19:38:29 +0530 Subject: [PATCH 327/448] gst-env: Also look for `builddir` when hunting for a build dir --- gst-env.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gst-env.py b/gst-env.py index 1f30a55f4c..fe21286784 100755 --- a/gst-env.py +++ b/gst-env.py @@ -27,10 +27,12 @@ from scripts.common import get_wine_shortpath SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) PREFIX_DIR = os.path.join(SCRIPTDIR, 'prefix') -# Use '_build' as the builddir instead of 'build' +# Look for the following build dirs: `build` `_build` `builddir` DEFAULT_BUILDDIR = os.path.join(SCRIPTDIR, 'build') if not os.path.exists(DEFAULT_BUILDDIR): DEFAULT_BUILDDIR = os.path.join(SCRIPTDIR, '_build') +if not os.path.exists(DEFAULT_BUILDDIR): + DEFAULT_BUILDDIR = os.path.join(SCRIPTDIR, 'builddir') TYPELIB_REG = re.compile(r'.*\.typelib$') SHAREDLIB_REG = re.compile(r'\.so|\.dylib|\.dll') From 6abaee851b921c80c393adc3e157d143e0c18f00 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Mon, 20 Apr 2020 14:49:16 +0100 Subject: [PATCH 328/448] gst-env: Remove non-existent directory from PKG_CONFIG_PATH There is no pkgconfig directory in -good. --- gst-env.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/gst-env.py b/gst-env.py index fe21286784..66ec2720dd 100755 --- a/gst-env.py +++ b/gst-env.py @@ -357,11 +357,6 @@ def get_subprocess_env(options, gst_version): for pkg_dir in pkg_dirs: prepend_env_var(env, "PKG_CONFIG_PATH", pkg_dir, options.sysroot) - prepend_env_var(env, "PKG_CONFIG_PATH", os.path.join(options.builddir, - 'subprojects', - 'gst-plugins-good', - 'pkgconfig'), - options.sysroot) for python_dir in python_dirs: prepend_env_var(env, 'PYTHONPATH', python_dir, options.sysroot) From b9d39e2f7f42e35af6476ba61c1f43ea53c5572a Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Thu, 23 Apr 2020 13:48:22 +1000 Subject: [PATCH 329/448] build: allow for changing subprojects with docs enabled Fixes: https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/60 Part-of: --- meson.build | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/meson.build b/meson.build index c408d33e20..4302eef809 100644 --- a/meson.build +++ b/meson.build @@ -153,19 +153,41 @@ if meson.is_cross_build() or build_machine.system() == 'windows' error('Documentation enabled but building the doc while cross building or building on windows is not supported yet.') endif + documented_projects = '' message('Documentation not built as building the documentation while cross building or building on windows is not supported yet.') else hotdoc_p = find_program('hotdoc', required : get_option('doc')) - if hotdoc_p.found() - if documented_projects != '' - subproject('gst-docs', default_options: 'built_subprojects=' + documented_projects) - message('Gst docs subprojects: ' + documented_projects) - endif - else + if not hotdoc_p.found() + documented_projects = '' message('Not building documentation as hotdoc was not found') endif endif +write_file_contents = ''' +import os +import sys + +assert len(sys.argv) >= 3 +fname = sys.argv[1] +contents = sys.argv[2] + +with open(fname, 'w') as f: + f.write(contents) +''' + +configure_file( + output : 'GstDocumentedSubprojects', + command : [python3, + '-c', write_file_contents, + '@OUTPUT@', + documented_projects] +) + +if documented_projects != '' + subproject('gst-docs') + message('Gst docs subprojects: ' + documented_projects) +endif + all_plugins_paths = [] foreach plugin: all_plugins all_plugins_paths += plugin.full_path() From 2758487db97671617d05fac59ff9bc0ec131f94f Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Wed, 11 Mar 2020 09:39:46 -0400 Subject: [PATCH 330/448] Add dav1d wrap file This is needed to build gst-plugins-rs with dav1d as subproject. Part-of: --- subprojects/dav1d.wrap | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 subprojects/dav1d.wrap diff --git a/subprojects/dav1d.wrap b/subprojects/dav1d.wrap new file mode 100644 index 0000000000..cba3c310de --- /dev/null +++ b/subprojects/dav1d.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=dav1d +url=https://code.videolan.org/videolan/dav1d.git +push-url=git@code.videolan.org:videolan/dav1d.git +revision=0.6.0 From 31d81f70daa139884cdec0f4a3adca0f2b073e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 11 May 2020 12:46:59 +0100 Subject: [PATCH 331/448] subprojects: ffmpeg: bump to 4.1.5 Part-of: --- subprojects/FFmpeg.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/FFmpeg.wrap b/subprojects/FFmpeg.wrap index 0d319648da..959d3e76a6 100644 --- a/subprojects/FFmpeg.wrap +++ b/subprojects/FFmpeg.wrap @@ -2,4 +2,4 @@ directory=FFmpeg url=https://gitlab.freedesktop.org/gstreamer/meson-ports/ffmpeg.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/ffmpeg.git -revision=meson-4.1.4 +revision=meson-4.1.5 From ac7b46033fffd5814c74fa200b22174100876424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Mon, 11 May 2020 12:31:57 +0200 Subject: [PATCH 332/448] gst-env: fix program name in argparse Part-of: --- gst-env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-env.py b/gst-env.py index 66ec2720dd..11ca42181a 100755 --- a/gst-env.py +++ b/gst-env.py @@ -392,7 +392,7 @@ def get_windows_shell(): return result.decode().strip() if __name__ == "__main__": - parser = argparse.ArgumentParser(prog="gstreamer-uninstalled") + parser = argparse.ArgumentParser(prog="gst-env") parser.add_argument("--builddir", default=DEFAULT_BUILDDIR, From 94aed416e0f305a58899773c8578ae4616b75163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Thu, 14 May 2020 17:16:11 +0200 Subject: [PATCH 333/448] wrap: add libopenjp2 for gst-plugins-bad Part-of: --- .gitignore | 1 + subprojects/libopenjp2.wrap | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 subprojects/libopenjp2.wrap diff --git a/.gitignore b/.gitignore index b899d1aa10..bb1bd68a21 100644 --- a/.gitignore +++ b/.gitignore @@ -60,5 +60,6 @@ subprojects/x264 subprojects/libxml2-* subprojects/sqlite-* subprojects/libdrm-* +subprojects/openjpeg* prefix/ pygobject diff --git a/subprojects/libopenjp2.wrap b/subprojects/libopenjp2.wrap new file mode 100644 index 0000000000..3e70c15cbc --- /dev/null +++ b/subprojects/libopenjp2.wrap @@ -0,0 +1,10 @@ +[wrap-file] +directory = libopenjp2 + +source_url = https://github.com/uclouvain/openjpeg/archive/v2.3.1.tar.gz +source_filename = openjpeg-2.3.1.tar.gz +source_hash = 63f5a4713ecafc86de51bfad89cc07bb788e9bba24ebbf0c4ca637621aadb6a9 + +patch_url = https://wrapdb.mesonbuild.com/v1/projects/libopenjp2/2.3.1/1/get_zip +patch_filename = libopenjp2-2.3.1-1-wrap.zip +patch_hash = e98704b3dcb854071ce2aa107b676ffbd52b94cdcf7dde24420e34a1a5bd85fd From ced7f9d5a26a1b89f330bb701c1ba6f39bf07018 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Wed, 13 May 2020 14:39:12 +0100 Subject: [PATCH 334/448] Add wpebackend-fdo wrap file This will allow the wpe plugin to require WPEBackend-FDO 1.7.x which has support for headless SHM. Hence we should be able to enable the wpesrc integration tests in CI. Part-of: --- subprojects/wpebackend-fdo.wrap | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 subprojects/wpebackend-fdo.wrap diff --git a/subprojects/wpebackend-fdo.wrap b/subprojects/wpebackend-fdo.wrap new file mode 100644 index 0000000000..64cec129ef --- /dev/null +++ b/subprojects/wpebackend-fdo.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=wpebackend-fdo +url=https://github.com/Igalia/WPEBackend-FDO.git +revision=8975a239700e5cfd3333e8bf9c0b823658cdad7e From 02cd310c6b190a5c4c9fa48bc09364eafcc79076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Mon, 25 May 2020 11:35:24 +0200 Subject: [PATCH 335/448] libopenjp2 wrap: change default directory Part-of: --- subprojects/libopenjp2.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libopenjp2.wrap b/subprojects/libopenjp2.wrap index 3e70c15cbc..b781b25dc0 100644 --- a/subprojects/libopenjp2.wrap +++ b/subprojects/libopenjp2.wrap @@ -1,5 +1,5 @@ [wrap-file] -directory = libopenjp2 +directory = openjpeg-2.3.1 source_url = https://github.com/uclouvain/openjpeg/archive/v2.3.1.tar.gz source_filename = openjpeg-2.3.1.tar.gz From 2f514b809808a90a3aba1977d6b77a8398e17148 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Fri, 22 May 2020 11:46:06 +0100 Subject: [PATCH 336/448] Update WPEBackend-FDO wrap file Current git master for the 1.7.0 development version is now usable as a subproject. Part-of: --- subprojects/wpebackend-fdo.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/wpebackend-fdo.wrap b/subprojects/wpebackend-fdo.wrap index 64cec129ef..b7b368f123 100644 --- a/subprojects/wpebackend-fdo.wrap +++ b/subprojects/wpebackend-fdo.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=wpebackend-fdo url=https://github.com/Igalia/WPEBackend-FDO.git -revision=8975a239700e5cfd3333e8bf9c0b823658cdad7e +revision=0e10c424223dbc663ea6f4f2f299c99cd4e14718 From a7b7ca5a5978ae9fa312d45f6182f29e0b71a41c Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 27 May 2020 09:59:16 -0400 Subject: [PATCH 337/448] Notify that gst-rts-server has plugin Part-of: --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 4302eef809..e0a59ee1e3 100644 --- a/meson.build +++ b/meson.build @@ -62,7 +62,7 @@ subprojects = [ ['gst-plugins-bad', { 'option': get_option('bad'), 'build-hotdoc': true, 'has-plugins': true}], ['gst-plugins-ugly', { 'option': get_option('ugly'), 'build-hotdoc': true, 'has-plugins': true}], ['gst-libav', { 'option': get_option('libav'), 'build-hotdoc': true, 'has-plugins': true}], - ['gst-rtsp-server', { 'option': get_option('rtsp_server'), 'build-hotdoc': true }], + ['gst-rtsp-server', { 'option': get_option('rtsp_server'), 'build-hotdoc': true , 'has-plugins': true}], ['gst-devtools', { 'option': get_option('devtools'), 'build-hotdoc': true }], ['gst-integration-testsuites', { 'option': get_option('devtools') }], ['gst-editing-services', { 'option': get_option('ges'), 'build-hotdoc': true, 'has-plugins': true}], From 93074302b9f75378299ed10a3222fc1d9fcd457a Mon Sep 17 00:00:00 2001 From: Ederson de Souza Date: Wed, 13 May 2020 14:30:37 -0700 Subject: [PATCH 338/448] Add libavtp wrap file So that the avtp plugin on gst-plugins-bad cab be built and tested on the CI. Part-of: --- .gitignore | 1 + subprojects/avtp.wrap | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 subprojects/avtp.wrap diff --git a/.gitignore b/.gitignore index bb1bd68a21..2ce041c952 100644 --- a/.gitignore +++ b/.gitignore @@ -61,5 +61,6 @@ subprojects/libxml2-* subprojects/sqlite-* subprojects/libdrm-* subprojects/openjpeg* +subprojects/avtp prefix/ pygobject diff --git a/subprojects/avtp.wrap b/subprojects/avtp.wrap new file mode 100644 index 0000000000..6cc07a5777 --- /dev/null +++ b/subprojects/avtp.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=avtp +url=https://github.com/Avnu/libavtp.git +revision=9482c1143d2bca1303c4c0eeff30674eb468d357 From 1ec87d752a7a14304e98068520cbb216894dbfa7 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 28 May 2020 10:08:26 +0200 Subject: [PATCH 339/448] Revert "Add libavtp wrap file" This reverts commit 93074302b9f75378299ed10a3222fc1d9fcd457a. Adding libavtp hasn't properly passed CI for some reason. Reopens !148 Part-of: --- .gitignore | 1 - subprojects/avtp.wrap | 4 ---- 2 files changed, 5 deletions(-) delete mode 100644 subprojects/avtp.wrap diff --git a/.gitignore b/.gitignore index 2ce041c952..bb1bd68a21 100644 --- a/.gitignore +++ b/.gitignore @@ -61,6 +61,5 @@ subprojects/libxml2-* subprojects/sqlite-* subprojects/libdrm-* subprojects/openjpeg* -subprojects/avtp prefix/ pygobject diff --git a/subprojects/avtp.wrap b/subprojects/avtp.wrap deleted file mode 100644 index 6cc07a5777..0000000000 --- a/subprojects/avtp.wrap +++ /dev/null @@ -1,4 +0,0 @@ -[wrap-git] -directory=avtp -url=https://github.com/Avnu/libavtp.git -revision=9482c1143d2bca1303c4c0eeff30674eb468d357 From 088c7f1eda90bdaa608b273ccb062532fd4491e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sun, 31 May 2020 11:11:18 +0100 Subject: [PATCH 340/448] openh264: update to v2.1.1 Part-of: --- subprojects/openh264.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/openh264.wrap b/subprojects/openh264.wrap index 2b71eade76..7093d1fcb9 100644 --- a/subprojects/openh264.wrap +++ b/subprojects/openh264.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=openh264 url=https://github.com/cisco/openh264.git -revision=894eb0c6e1e0f5f96df7a18e1eaf13d65c8eec81 +revision=v2.1.1 From 8ecede2ff1d3cd8b4b545005ce9a200af3ebb287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 5 Jun 2020 10:40:29 +0100 Subject: [PATCH 341/448] meson_options: disable gtk_doc by default We don't need to build documentation for gtk-doc using subprojects, not by default at least, and our 'auto' option would override the subproject 'disabled' default in libnice's case. Part-of: --- meson_options.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson_options.txt b/meson_options.txt index 8b7487685b..498dddd0d5 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -21,4 +21,4 @@ option('introspection', type : 'feature', value : 'auto', description : 'Generat option('nls', type : 'feature', value : 'auto', description : 'Enable native language support (translations)') option('orc', type : 'feature', value : 'auto', description : 'Enable Optimized Inner Loop Runtime Compiler') option('doc', type : 'feature', value : 'auto', description : 'Generate API documentation with hotdoc') -option('gtk_doc', type : 'feature', value : 'auto', description : 'Generate API documentation with gtk-doc') +option('gtk_doc', type : 'feature', value : 'disabled', description : 'Generate API documentation with gtk-doc') From 5234b05f929ccac15a43382f1d4b0b6cf98e6854 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 11 Jun 2020 13:19:18 +0530 Subject: [PATCH 342/448] meson_options.txt: Add an option to enable/disable tests All subproject options yield to this. Part-of: --- meson_options.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/meson_options.txt b/meson_options.txt index 498dddd0d5..eb5063df71 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -16,6 +16,7 @@ option('gst-full-libraries', type : 'array', value : [], description : '''List of libraries to expose in gstreamer-full's ABI. gstreamer, glib and gobject are always included.''') # Common options, automatically inherited by subprojects +option('tests', type : 'feature', value : 'auto', description : 'Build tests') option('examples', type : 'feature', value : 'auto', description : 'Build examples') option('introspection', type : 'feature', value : 'auto', description : 'Generate introspection data') option('nls', type : 'feature', value : 'auto', description : 'Enable native language support (translations)') From 8b9073367fc9b282f4fe379d7d021d4e4986812a Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 12 Jun 2020 18:59:17 +0530 Subject: [PATCH 343/448] gst-env: Use meson-uninstalled pkgconfig files if available This allows people to use the development environment for building projects when glib is built as a subproject. Part-of: --- gst-env.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gst-env.py b/gst-env.py index 11ca42181a..34f8f21db6 100755 --- a/gst-env.py +++ b/gst-env.py @@ -358,6 +358,11 @@ def get_subprocess_env(options, gst_version): for pkg_dir in pkg_dirs: prepend_env_var(env, "PKG_CONFIG_PATH", pkg_dir, options.sysroot) + # Check if meson has generated -uninstalled pkgconfig files + meson_uninstalled = pathlib.Path(options.builddir) / 'meson-uninstalled' + if meson_uninstalled.is_dir(): + prepend_env_var(env, 'PKG_CONFIG_PATH', str(meson_uninstalled), options.sysroot) + for python_dir in python_dirs: prepend_env_var(env, 'PYTHONPATH', python_dir, options.sysroot) From d570c770adeb89ab5b954f4dadb89d6daadbd238 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 15 Jun 2020 19:06:22 +0530 Subject: [PATCH 344/448] gst-env: Fix creation of gdb-autoload dirs on Windows `bdir[1:]` is supposed to convert `/path/to/bdir` to `path/to/bdir` which is only correct on UNIX. On Windows it will convert `C:\path\to\bdir` to `:\path\to\bdir` which is totally wrong. Use pathlib instead, which makes it trivial to do the conversion using `joinpath(*bdir.parts)` Part-of: --- gst-env.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gst-env.py b/gst-env.py index 34f8f21db6..d91381a731 100755 --- a/gst-env.py +++ b/gst-env.py @@ -144,7 +144,7 @@ def setup_gdb(options): if not shutil.which('gdb'): return python_paths - bdir = os.path.realpath(options.builddir) + bdir = pathlib.Path(options.builddir).resolve() for libpath, gdb_path in [ (os.path.join("subprojects", "gstreamer", "gst"), os.path.join("subprojects", "gstreamer", "libs", "gst", "helpers")), @@ -154,17 +154,17 @@ def setup_gdb(options): if not gdb_path: gdb_path = libpath - autoload_path = os.path.join(bdir, "gdb-auto-load/", bdir[1:], libpath) - os.makedirs(autoload_path, exist_ok=True) - for gdb_helper in glob.glob(os.path.join(bdir, gdb_path, "*-gdb.py")): - python_paths.add(os.path.join(bdir, gdb_path)) + autoload_path = (pathlib.Path(bdir) / 'gdb-auto-load').joinpath(*bdir.parts[1:]) / libpath + autoload_path.mkdir(parents=True, exist_ok=True) + for gdb_helper in glob.glob(str(bdir / gdb_path / "*-gdb.py")): + python_paths.add(str(bdir / gdb_path)) python_paths.add(os.path.join(options.srcdir, gdb_path)) try: - os.symlink(gdb_helper, os.path.join(autoload_path, os.path.basename(gdb_helper))) + os.symlink(gdb_helper, str(autoload_path / os.path.basename(gdb_helper))) except FileExistsError: pass - gdbinit_line = 'add-auto-load-scripts-directory %s' % os.path.join(bdir, 'gdb-auto-load\n') + gdbinit_line = 'add-auto-load-scripts-directory {}\n'.format(bdir / 'gdb-auto-load') try: with open(os.path.join(options.srcdir, '.gdbinit'), 'r') as f: if gdbinit_line in f.readlines(): From 77cd988ac855a00fc3104623f1893a5a17f1a484 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 15 Jun 2020 19:48:30 +0530 Subject: [PATCH 345/448] gst-env: Copy instead of symlink on Windows os.symlink needs admin privs in most cases. Part-of: --- gst-env.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gst-env.py b/gst-env.py index d91381a731..d95b2e9be2 100755 --- a/gst-env.py +++ b/gst-env.py @@ -160,8 +160,11 @@ def setup_gdb(options): python_paths.add(str(bdir / gdb_path)) python_paths.add(os.path.join(options.srcdir, gdb_path)) try: - os.symlink(gdb_helper, str(autoload_path / os.path.basename(gdb_helper))) - except FileExistsError: + if os.name == 'nt': + shutil.copy(gdb_helper, str(autoload_path / os.path.basename(gdb_helper))) + else: + os.symlink(gdb_helper, str(autoload_path / os.path.basename(gdb_helper))) + except (FileExistsError, shutil.SameFileError): pass gdbinit_line = 'add-auto-load-scripts-directory {}\n'.format(bdir / 'gdb-auto-load') From 9782400920a95b482576bb3a7c44b89bd4276131 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 15 Jun 2020 20:58:57 +0530 Subject: [PATCH 346/448] README: Add a screenshot showing how to run meson on windows Part-of: --- README.md | 13 +++++++++++-- data/images/vs-2019-dev-prompt.png | Bin 0 -> 50695 bytes 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 data/images/vs-2019-dev-prompt.png diff --git a/README.md b/README.md index 66669ece66..524e1cdc59 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,8 @@ ninja -C builddir This will automatically create the `build` directory and build everything inside it. -NOTE: On Windows, you *must* run this from inside the Visual Studio command -prompt of the appropriate architecture and version. +NOTE: On Windows, you *must* run this from [inside the Visual Studio command +prompt](#running-meson-on-windows) of the appropriate architecture and version. ### External dependencies @@ -319,6 +319,15 @@ Note that Meson is written entirely in Python, so you can also run it as-is from the [git repository](https://github.com/mesonbuild/meson/) if you want to use the latest master branch for some reason. +### Running Meson on Windows + +At present, to build with Visual Studio, you need to run Meson from inside the +VS 2019 command prompt. Press `Start`, and search for `VS 2019`, and click on +`x64 Native Tools Command Prompt for VS 2019`, or a prompt named similar to +that: + +![x64 Native Tools Command Prompt for VS 2019](/data/images/vs-2019-dev-prompt.png) + ### Setup a mingw/wine based development environment on linux diff --git a/data/images/vs-2019-dev-prompt.png b/data/images/vs-2019-dev-prompt.png new file mode 100644 index 0000000000000000000000000000000000000000..766fa6273becb2cd2458a226981a87c2044322f9 GIT binary patch literal 50695 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 a$Gp0u_43NIG!6tH80eUsA)I!&@qYkoP($(n literal 0 HcmV?d00001 From 4d60e89a99529eda56b9f167295e0ceb3d53a118 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 15 Jun 2020 23:58:17 +0530 Subject: [PATCH 347/448] git-update: Use --force when checking out manifest When we have a manifest, we DEFINITELY want exactly that, please throw away any local changes, thanks. Fixes CI: https://gitlab.freedesktop.org/alatiera/gst-ci/-/jobs/3105690 ``` Checking out f5b44d31284cfa1b6d029fdfe69d6cdb9a8aeb36 in gst-devtools Could not rebase subprojects\gst-devtools, please fix and try again. Error: error: Your local changes to the following files would be overwritten by checkout: docs/plugins/fakesrc.simple.validatetest.yaml Please commit your changes or stash them before you switch branches. Aborting Command '['git', 'checkout', '--detach', 'f5b44d31284cfa1b6d029fdfe69d6cdb9a8aeb36']' returned non-zero exit status 1. ``` This is probably caused by some shared cache shenanigans, but forcing is also what we want anyway in this case. Part-of: --- git-update | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/git-update b/git-update index 37d9a4364d..3cd604e00f 100755 --- a/git-update +++ b/git-update @@ -12,6 +12,8 @@ from scripts.common import get_meson SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) +# Force a checkout to happen and throw away local changes +FORCE_CHECKOUT = False def manifest_get_commits(manifest): @@ -90,7 +92,9 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], re if revision: print("Checking out %s in %s" % (revision, repo_name)) git("fetch", *fetch_args, repository_path=repo_dir) - git("checkout", "--detach", revision, repository_path=repo_dir) + checkout_args = ["--force"] if FORCE_CHECKOUT else [] + checkout_args += ["--detach", revision] + git("checkout", *checkout_args, repository_path=repo_dir) else: print("Updating branch %s in %s" % (get_branch_name(repo_dir), repo_name)) git("pull", "--rebase", repository_path=repo_dir) @@ -187,6 +191,7 @@ if __name__ == "__main__": meson = get_meson() targets_s = subprocess.check_output(meson + ['subprojects', 'download']) repos_commits = manifest_get_commits(options.manifest) + FORCE_CHECKOUT = True else: repos_commits = {} From cb94bb162377452d3262ce8511b43e547a53d700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Tue, 16 Jun 2020 14:57:42 +0200 Subject: [PATCH 348/448] git-update: rename check-status to status 'Check' prefix is superfluous Part-of: --- git-update | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/git-update b/git-update index 3cd604e00f..03ce87f7a0 100755 --- a/git-update +++ b/git-update @@ -52,7 +52,7 @@ def ensure_revision_if_necessary(repo_dir, revision): return revision -def update_subprojects(manifest, no_interaction=False, check_status=False): +def update_subprojects(manifest, no_interaction=False, status=False): subprojects_dir = os.path.join(SCRIPTDIR, "subprojects") for repo_name in os.listdir(subprojects_dir): repo_dir = os.path.normpath(os.path.join(SCRIPTDIR, subprojects_dir, repo_name)) @@ -60,7 +60,7 @@ def update_subprojects(manifest, no_interaction=False, check_status=False): continue revision, args = repos_commits.get(repo_name, [None, []]) - if not update_repo(repo_name, repo_dir, revision, no_interaction, args, check_status=check_status): + if not update_repo(repo_name, repo_dir, revision, no_interaction, args, status=status): return False return True @@ -83,8 +83,8 @@ def check_repo_status(repo_name, worktree_dir): branch_message[0].strip(), repo_status(commit_message))) return True -def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0, check_status=False): - if check_status: +def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0, status=False): + if status: return check_repo_status(repo_name, repo_dir) revision = ensure_revision_if_necessary(repo_dir, revision) git("config", "rebase.autoStash", "true", repository_path=repo_dir) @@ -172,7 +172,7 @@ if __name__ == "__main__": default=False, action='store_true', help="Do not allow interaction with the user.") - parser.add_argument("--check-status", + parser.add_argument("--status", default=False, action='store_true', help="Check repositories status only.") @@ -196,11 +196,11 @@ if __name__ == "__main__": repos_commits = {} revision, args = repos_commits.get('gst-build', [None, []]) - if not update_repo('gst-build', SCRIPTDIR, None, options.no_interaction, args, check_status=options.check_status): + if not update_repo('gst-build', SCRIPTDIR, None, options.no_interaction, args, status=options.status): exit(1) - if not update_subprojects(options.manifest, options.no_interaction, check_status=options.check_status): + if not update_subprojects(options.manifest, options.no_interaction, status=options.status): exit(1) - if not options.check_status: + if not options.status: update_cargo(options.builddir) if options.builddir: From 398576dfdb117537ea496e57a5afaddcadf1654a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 18 Jun 2020 15:41:18 +0100 Subject: [PATCH 349/448] meson: bump meson requirement to 0.52 to align with effective requirement Latest libnice requires 0.52, so it probably makes sense to update the meson requirement in gst-build for that, so we have good out-of-the-box developer experience for people, with webrtc working out of the box. Might also make it easier to backport things later. Part-of: --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index e0a59ee1e3..ad453d1a90 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('All GStreamer modules', 'c', version : '1.17.0.1', - meson_version : '>= 0.48.0', + meson_version : '>= 0.52.0', default_options : ['buildtype=debugoptimized']) gst_version = '>= @0@'.format(meson.project_version()) From d47dddb78c3131088cc6a2c90bc202a639f11d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 18 Jun 2020 16:42:33 +0100 Subject: [PATCH 350/448] README: document updated meson requirement --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 524e1cdc59..f2b09698fa 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,9 @@ You can find [instructions for Windows below](#windows-prerequisites-setup). ### Install meson and ninja -Meson 0.48 or newer is required. +Meson 0.52 or newer is required. + +For cross-compilation Meson 0.54 or newer is required. On Linux and macOS you can get meson through your package manager or using: From 7dc67a389da7434ca62a115f5f2273d976c01055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 19 Jun 2020 19:28:22 +0100 Subject: [PATCH 351/448] Release 1.17.1 --- meson.build | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-docs.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-examples.wrap | 2 +- subprojects/gst-integration-testsuites.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index ad453d1a90..0d0bda8a7f 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.17.0.1', + version : '1.17.1', meson_version : '>= 0.52.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 3ad4f0fce3..5a3fb52e96 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap index 60609394f9..49ab61aaaf 100644 --- a/subprojects/gst-docs.wrap +++ b/subprojects/gst-docs.wrap @@ -2,4 +2,4 @@ directory=gst-docs url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 0e3510a56f..3102303bbd 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap index 50624b4393..edf9beca25 100644 --- a/subprojects/gst-examples.wrap +++ b/subprojects/gst-examples.wrap @@ -2,4 +2,4 @@ directory=gst-examples url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap index 357edc2d9f..b3c2daf070 100644 --- a/subprojects/gst-integration-testsuites.wrap +++ b/subprojects/gst-integration-testsuites.wrap @@ -2,4 +2,4 @@ directory=gst-integration-testsuites url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index d01154348a..7169866887 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index d5ba267d17..8c8f6456f0 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 7d3a04af64..e1e46c3a73 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 705662d731..4aadb8edf6 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 7ed12291ce..53622d4651 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index bab6ef61be..a1213d0ec4 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b3e87a738..d894a125a8 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=master +revision=1.17.1 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index c7b473b3b2..e9b107a756 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=master +revision=1.17.1 diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index a14dab93a9..f98727386c 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=master +revision=1.17.1 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8765f69928..ee001d258b 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=master +revision=1.17.1 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 85aa7f483a..e1b6adc1cb 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=master +revision=1.17.1 From 075ed8610fa4e16c8c85c9544b855a100738f84b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 20 Jun 2020 00:28:49 +0100 Subject: [PATCH 352/448] Back to development --- meson.build | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-docs.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-examples.wrap | 2 +- subprojects/gst-integration-testsuites.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index 0d0bda8a7f..f78ddbfbc3 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.17.1', + version : '1.17.1.1', meson_version : '>= 0.52.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 5a3fb52e96..3ad4f0fce3 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap index 49ab61aaaf..60609394f9 100644 --- a/subprojects/gst-docs.wrap +++ b/subprojects/gst-docs.wrap @@ -2,4 +2,4 @@ directory=gst-docs url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 3102303bbd..0e3510a56f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap index edf9beca25..50624b4393 100644 --- a/subprojects/gst-examples.wrap +++ b/subprojects/gst-examples.wrap @@ -2,4 +2,4 @@ directory=gst-examples url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap index b3c2daf070..357edc2d9f 100644 --- a/subprojects/gst-integration-testsuites.wrap +++ b/subprojects/gst-integration-testsuites.wrap @@ -2,4 +2,4 @@ directory=gst-integration-testsuites url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 7169866887..d01154348a 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index 8c8f6456f0..d5ba267d17 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index e1e46c3a73..7d3a04af64 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 4aadb8edf6..705662d731 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 53622d4651..7ed12291ce 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index a1213d0ec4..bab6ef61be 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index d894a125a8..2b3e87a738 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=1.17.1 +revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index e9b107a756..c7b473b3b2 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=1.17.1 +revision=master diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index f98727386c..a14dab93a9 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=1.17.1 +revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index ee001d258b..8765f69928 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=1.17.1 +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index e1b6adc1cb..85aa7f483a 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=1.17.1 +revision=master From 4a3ceaa498ee3d5832ad773911d17c0a1eff1c3a Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Wed, 24 Jun 2020 14:37:28 +0200 Subject: [PATCH 353/448] meson: pass doc option as required argument to gst-docs subproject Part-of: --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index f78ddbfbc3..193d453ef5 100644 --- a/meson.build +++ b/meson.build @@ -184,7 +184,7 @@ configure_file( ) if documented_projects != '' - subproject('gst-docs') + subproject('gst-docs', required: get_option('doc').enabled()) message('Gst docs subprojects: ' + documented_projects) endif From a910ea6192cb6b71a6af613fb99461dd5559ce5a Mon Sep 17 00:00:00 2001 From: Ederson de Souza Date: Thu, 28 May 2020 16:13:18 -0700 Subject: [PATCH 354/448] Revert "Revert "Add libavtp wrap file"" This reverts commit 1ec87d752a7a14304e98068520cbb216894dbfa7. As the avtp plugin on gst-plugins-bad is now ensured to be built only on Linux, this patch can come back. Part-of: --- .gitignore | 1 + subprojects/avtp.wrap | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 subprojects/avtp.wrap diff --git a/.gitignore b/.gitignore index bb1bd68a21..2ce041c952 100644 --- a/.gitignore +++ b/.gitignore @@ -61,5 +61,6 @@ subprojects/libxml2-* subprojects/sqlite-* subprojects/libdrm-* subprojects/openjpeg* +subprojects/avtp prefix/ pygobject diff --git a/subprojects/avtp.wrap b/subprojects/avtp.wrap new file mode 100644 index 0000000000..6cc07a5777 --- /dev/null +++ b/subprojects/avtp.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=avtp +url=https://github.com/Avnu/libavtp.git +revision=9482c1143d2bca1303c4c0eeff30674eb468d357 From 1016bf239ce10f2f86e2f48d2e6250f31bc0fcc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 3 Jul 2020 00:37:52 +0100 Subject: [PATCH 355/448] Release 1.17.2 --- meson.build | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-docs.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-examples.wrap | 2 +- subprojects/gst-integration-testsuites.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index 193d453ef5..17539331eb 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.17.1.1', + version : '1.17.2', meson_version : '>= 0.52.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 3ad4f0fce3..445610f2ae 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap index 60609394f9..5d6baf898b 100644 --- a/subprojects/gst-docs.wrap +++ b/subprojects/gst-docs.wrap @@ -2,4 +2,4 @@ directory=gst-docs url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 0e3510a56f..3be2841ab5 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap index 50624b4393..59e88d9fb7 100644 --- a/subprojects/gst-examples.wrap +++ b/subprojects/gst-examples.wrap @@ -2,4 +2,4 @@ directory=gst-examples url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap index 357edc2d9f..efe11267cf 100644 --- a/subprojects/gst-integration-testsuites.wrap +++ b/subprojects/gst-integration-testsuites.wrap @@ -2,4 +2,4 @@ directory=gst-integration-testsuites url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index d01154348a..bac3a508e0 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index d5ba267d17..a16111f9ce 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 7d3a04af64..0c4f8b93ad 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 705662d731..973daa4b9e 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 7ed12291ce..0a1c8c4e0e 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index bab6ef61be..8e65ea1406 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b3e87a738..5fdff1f2f6 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=master +revision=1.17.2 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index c7b473b3b2..87be3d5de3 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=master +revision=1.17.2 diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index a14dab93a9..6362a11ec6 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=master +revision=1.17.2 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8765f69928..b7c0017133 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=master +revision=1.17.2 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 85aa7f483a..e65513a1a1 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=master +revision=1.17.2 From 45a09d4a81e13f10c643e8e14018479130df72c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 3 Jul 2020 02:04:31 +0100 Subject: [PATCH 356/448] Back to development --- meson.build | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-docs.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-examples.wrap | 2 +- subprojects/gst-integration-testsuites.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index 17539331eb..ff397bfc02 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.17.2', + version : '1.17.2.1', meson_version : '>= 0.52.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 445610f2ae..3ad4f0fce3 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap index 5d6baf898b..60609394f9 100644 --- a/subprojects/gst-docs.wrap +++ b/subprojects/gst-docs.wrap @@ -2,4 +2,4 @@ directory=gst-docs url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 3be2841ab5..0e3510a56f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap index 59e88d9fb7..50624b4393 100644 --- a/subprojects/gst-examples.wrap +++ b/subprojects/gst-examples.wrap @@ -2,4 +2,4 @@ directory=gst-examples url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap index efe11267cf..357edc2d9f 100644 --- a/subprojects/gst-integration-testsuites.wrap +++ b/subprojects/gst-integration-testsuites.wrap @@ -2,4 +2,4 @@ directory=gst-integration-testsuites url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index bac3a508e0..d01154348a 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index a16111f9ce..d5ba267d17 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 0c4f8b93ad..7d3a04af64 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 973daa4b9e..705662d731 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 0a1c8c4e0e..7ed12291ce 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 8e65ea1406..bab6ef61be 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 5fdff1f2f6..2b3e87a738 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=1.17.2 +revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index 87be3d5de3..c7b473b3b2 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=1.17.2 +revision=master diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index 6362a11ec6..a14dab93a9 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=1.17.2 +revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index b7c0017133..8765f69928 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=1.17.2 +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index e65513a1a1..85aa7f483a 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=1.17.2 +revision=master From ebf79cf723813e902c3f13da882a0f95a4fa8d53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 4 Jul 2020 15:00:35 +0100 Subject: [PATCH 357/448] Add update-orc-dist target Part-of: --- meson.build | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index ff397bfc02..dd35b4fdf9 100644 --- a/meson.build +++ b/meson.build @@ -87,10 +87,11 @@ if build_system == 'windows' subproject('win-nasm') endif -subproject('orc', required: get_option('orc')) +orc_subproject = subproject('orc', required: get_option('orc')) subprojects_names = [] plugins_doc_caches = [] +orc_update_targets = [] all_plugins = [] foreach sp : subprojects project_name = sp[0] @@ -115,6 +116,8 @@ foreach sp : subprojects endif all_plugins += plugins + orc_update_targets += subproj.get_variable('orc_update_targets', []) + subprojects_names += [project_name] cmdres = run_command(python3, '-c', symlink.format(project_name, meson.current_source_dir())) if cmdres.returncode() == 0 @@ -308,3 +311,7 @@ update = find_program('git-update') run_target('git-update', command : [update]) run_target('update', command : [update, '--builddir=@0@'.format(meson.current_build_dir())]) + +if orc_subproject.found() + alias_target('update-orc-dist', orc_update_targets) +endif From 869f25a938f3979755025ecb15a1a2723cdcb9cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 7 Jul 2020 15:23:29 +0100 Subject: [PATCH 358/448] subprojects: libmicrodns: pin to 0.1.2 release Now that there is a release with the meson build. Part-of: --- subprojects/libmicrodns.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libmicrodns.wrap b/subprojects/libmicrodns.wrap index 27ae6aa607..13ebfe8524 100644 --- a/subprojects/libmicrodns.wrap +++ b/subprojects/libmicrodns.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=libmicrodns url=https://github.com/videolabs/libmicrodns.git -revision=master +revision=0.1.2 From 02995c84172f68ec8c700cf4306302cedfa2ffb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 7 Jul 2020 15:36:04 +0100 Subject: [PATCH 359/448] meson: clean up workaround for older meson versions that's no longer needed Part-of: --- meson.build | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/meson.build b/meson.build index dd35b4fdf9..b53a884c7c 100644 --- a/meson.build +++ b/meson.build @@ -55,24 +55,24 @@ endif # Ordered list of subprojects (dict has no ordering guarantees) subprojects = [ - ['gstreamer', {'build-hotdoc': true, 'has-plugins': true}], - ['gst-plugins-base', {'build-hotdoc': true, 'has-plugins': true}], - ['gst-plugins-good', {'build-hotdoc': true, 'has-plugins': true}], + ['gstreamer', {'build-hotdoc': true}], + ['gst-plugins-base', {'build-hotdoc': true}], + ['gst-plugins-good', {'build-hotdoc': true}], ['libnice', { 'option': get_option('libnice'), 'match_gst_version': false}], - ['gst-plugins-bad', { 'option': get_option('bad'), 'build-hotdoc': true, 'has-plugins': true}], - ['gst-plugins-ugly', { 'option': get_option('ugly'), 'build-hotdoc': true, 'has-plugins': true}], - ['gst-libav', { 'option': get_option('libav'), 'build-hotdoc': true, 'has-plugins': true}], - ['gst-rtsp-server', { 'option': get_option('rtsp_server'), 'build-hotdoc': true , 'has-plugins': true}], + ['gst-plugins-bad', { 'option': get_option('bad'), 'build-hotdoc': true}], + ['gst-plugins-ugly', { 'option': get_option('ugly'), 'build-hotdoc': true}], + ['gst-libav', { 'option': get_option('libav'), 'build-hotdoc': true}], + ['gst-rtsp-server', { 'option': get_option('rtsp_server'), 'build-hotdoc': true}], ['gst-devtools', { 'option': get_option('devtools'), 'build-hotdoc': true }], ['gst-integration-testsuites', { 'option': get_option('devtools') }], - ['gst-editing-services', { 'option': get_option('ges'), 'build-hotdoc': true, 'has-plugins': true}], - ['gstreamer-vaapi', { 'option': get_option('vaapi'), 'build-hotdoc': true, 'has-plugins': true}], - ['gst-omx', { 'option': get_option('omx'), 'build-hotdoc': true, 'has-plugins': true}], + ['gst-editing-services', { 'option': get_option('ges'), 'build-hotdoc': true}], + ['gstreamer-vaapi', { 'option': get_option('vaapi'), 'build-hotdoc': true}], + ['gst-omx', { 'option': get_option('omx'), 'build-hotdoc': true}], ['gstreamer-sharp', { 'option': get_option('sharp') }], ['pygobject', { 'option': get_option('python'), 'match_gst_version': false }], - ['gst-python', { 'option': get_option('python'), 'has-plugins': true}], + ['gst-python', { 'option': get_option('python')}], ['gst-examples', { 'option': get_option('gst-examples'), 'match_gst_versions': false}], - ['gst-plugins-rs', { 'option': get_option('rs'), 'has-plugins': true, 'match_gst_version': false}], + ['gst-plugins-rs', { 'option': get_option('rs'), 'match_gst_version': false}], ] symlink = ''' @@ -106,14 +106,7 @@ foreach sp : subprojects endif if subproj.found() - # Replace by using subproject.get_variable('plugins', []) - # when https://github.com/mesonbuild/meson/pull/5426/files - # is merged and released - if build_infos.get('has-plugins', false) - plugins = subproj.get_variable('plugins') - else - plugins = [] - endif + plugins = subproj.get_variable('plugins', []) all_plugins += plugins orc_update_targets += subproj.get_variable('orc_update_targets', []) From 80976dea2c5f90081fa37db9316fe2594814efd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Wed, 8 Jul 2020 11:28:19 +0100 Subject: [PATCH 360/448] Fix up update-orc-dist target for the case where there are no orc targets See https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/168#note_561914 Part-of: --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index b53a884c7c..aaf19f4126 100644 --- a/meson.build +++ b/meson.build @@ -305,6 +305,6 @@ run_target('git-update', command : [update]) run_target('update', command : [update, '--builddir=@0@'.format(meson.current_build_dir())]) -if orc_subproject.found() +if orc_subproject.found() and orc_update_targets.length() > 0 alias_target('update-orc-dist', orc_update_targets) endif From 856239a7a7380e52ba7ff327d6ff873e9e21c0bb Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 13 Jul 2020 17:38:48 +0530 Subject: [PATCH 361/448] sqlite: Fix build on Windows with MSVC We need to use the latest sqlite wrap version which fixes a bug where symbols weren't getting exported and the import library couldn't be created, so libsoup couldn't find sqlite. Part-of: --- subprojects/sqlite.wrap | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/subprojects/sqlite.wrap b/subprojects/sqlite.wrap index a9c9eb03d5..6934dc4f3d 100644 --- a/subprojects/sqlite.wrap +++ b/subprojects/sqlite.wrap @@ -1,10 +1,10 @@ [wrap-file] -directory = sqlite-amalgamation-3250100 +directory = sqlite-amalgamation-3310100 -source_url = https://www.sqlite.org/2018/sqlite-amalgamation-3250100.zip -source_filename = sqlite-amalgamation-3250100.zip -source_hash = 6c68b6364fa0e01d9d05088ba473ac4e7a6fbc64f9b9aeb6d830f944e2a1fa03 +source_url = https://www.sqlite.org/2020/sqlite-amalgamation-3310100.zip +source_filename = sqlite-amalgamation-3310100.zip +source_hash = f3c79bc9f4162d0b06fa9fe09ee6ccd23bb99ce310b792c5145f87fbcc30efca -patch_url = https://github.com/mesonbuild/sqlite/releases/download/3250100-2/sqlite.zip -patch_filename = sqlite.zip -patch_hash = b8b4c04b02f20a842b013a2609a8ebb367669a39e4077eba4892796ede39f6ec +patch_url = https://wrapdb.mesonbuild.com/v1/projects/sqlite/3310100/1/get_zip +patch_filename = sqlite-3310100-1-wrap.zip +patch_hash = 81f8efc1cbed88226b2fcd7c0221a90f43613fd8c311b8f653c3487cc88363cd From 64029b1461da186627c8a4e16f1d1fa65bb22ac9 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Wed, 15 Jul 2020 03:51:10 +0900 Subject: [PATCH 362/448] README: Document ARM64 native build on Windows Add some guide for native ARM64 build on Windows Part-of: --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index f2b09698fa..815c2efb66 100644 --- a/README.md +++ b/README.md @@ -321,6 +321,12 @@ Note that Meson is written entirely in Python, so you can also run it as-is from the [git repository](https://github.com/mesonbuild/meson/) if you want to use the latest master branch for some reason. +**ARM64 native only**: You might need +[native upstream ARM64 support fix](https://github.com/mesonbuild/meson/pull/7432) +which is expected to be a part of Meson 0.55.1. +If your Meson package version which was installed via `pip3` is lower than 0.55.1, +then you need to use [the latest master branch](https://github.com/mesonbuild/meson/). + ### Running Meson on Windows At present, to build with Visual Studio, you need to run Meson from inside the @@ -330,6 +336,9 @@ that: ![x64 Native Tools Command Prompt for VS 2019](/data/images/vs-2019-dev-prompt.png) +**ARM64 native only**: Since Visual Studio might not install dedicated command +prompt for native ARM64 build, you might need to run `vcvarsx86_arm64.bat` on CMD. +Please refer to [this document](https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=vs-2019#developer_command_file_locations) ### Setup a mingw/wine based development environment on linux From 9fa22f587361419bbbf6b22e914f5f40fc1343b2 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Tue, 21 Jul 2020 21:07:13 +0200 Subject: [PATCH 363/448] gst-env.py: Sort path sets before using prepend_env_var Python `set`s have a random ordering. To avoid creating a random environment, create sorted lists before iterating over them. Our Rust crates instruct cargo to rebuild if `PKG_CONFIG_PATH` changes, so this has been causing unnecessary rebuilds. Part-of: --- gst-env.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gst-env.py b/gst-env.py index d95b2e9be2..519418eeb5 100755 --- a/gst-env.py +++ b/gst-env.py @@ -304,11 +304,12 @@ def get_subprocess_env(options, gst_version): prepend_env_var(env, 'GST_PLUGIN_PATH', plugin_path, options.sysroot) - for p in paths: + # Sort to iterate in a consistent order (`set`s and `hash`es are randomized) + for p in sorted(paths): prepend_env_var(env, 'PATH', p, options.sysroot) if os.name != 'nt': - for p in mono_paths: + for p in sorted(mono_paths): prepend_env_var(env, "MONO_PATH", p, options.sysroot) presets = set() @@ -352,13 +353,13 @@ def get_subprocess_env(options, gst_version): prepend_env_var(env, 'GST_OMX_CONFIG_DIR', os.path.dirname(path), options.sysroot) - for p in presets: + for p in sorted(presets): prepend_env_var(env, 'GST_PRESET_PATH', p, options.sysroot) - for t in encoding_targets: + for t in sorted(encoding_targets): prepend_env_var(env, 'GST_ENCODING_TARGET_PATH', t, options.sysroot) - for pkg_dir in pkg_dirs: + for pkg_dir in sorted(pkg_dirs): prepend_env_var(env, "PKG_CONFIG_PATH", pkg_dir, options.sysroot) # Check if meson has generated -uninstalled pkgconfig files @@ -366,7 +367,7 @@ def get_subprocess_env(options, gst_version): if meson_uninstalled.is_dir(): prepend_env_var(env, 'PKG_CONFIG_PATH', str(meson_uninstalled), options.sysroot) - for python_dir in python_dirs: + for python_dir in sorted(python_dirs): prepend_env_var(env, 'PYTHONPATH', python_dir, options.sysroot) mesonpath = os.path.join(SCRIPTDIR, "meson") From e236d4f71a014cb26417428cc3dac881200e455d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Tue, 7 Jul 2020 11:13:49 +0200 Subject: [PATCH 364/448] gstreamer-full: Fix link with x264 If a static build is requested and x264 plugin has been enabled the full link fails with: /usr/bin/ld: subprojects/x264/libx264.a(cabac-a.o): relocation R_X86_64_PC32 against symbol `x264_cabac_range_lps' can not be used when making a shared object; recompile with -fPIC Fixes #108 Part-of: --- meson.build | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/meson.build b/meson.build index aaf19f4126..41a2a04379 100644 --- a/meson.build +++ b/meson.build @@ -246,6 +246,14 @@ if get_option('default_library') == 'static' ) install_headers('gstinitstaticplugins.h', subdir : 'gstreamer-1.0/gst') + # Avoid a x264 link issue described here: https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/108 + # Similar issue has been found with VLC: https://mailman.videolan.org/pipermail/vlc-devel/2009-March/057640.html + gstfull_link_args = [] + if cc.has_link_argument('-Wl,-Bsymbolic') + gstfull_link_args += ['-Wl,-Bsymbolic'] + endif + + gst_dep = subproject('gstreamer').get_variable('gst_dep') # Get a list of libraries that needs to be exposed in the ABI. @@ -272,6 +280,7 @@ if get_option('default_library') == 'static' gstfull = both_libraries('gstreamer-full-1.0', init_static_plugins_c, link_with : all_plugins, + link_args: gstfull_link_args, link_whole : exposed_libs, dependencies : gst_dep, install : true, From df52da961de1bbfc6db4e4edbde64f7f9e3fa2ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 25 Jul 2020 13:43:44 +0100 Subject: [PATCH 365/448] FFmpeg: update to 4.3.1 Fixes #54 Part-of: --- subprojects/FFmpeg.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/FFmpeg.wrap b/subprojects/FFmpeg.wrap index 959d3e76a6..ecd177de3e 100644 --- a/subprojects/FFmpeg.wrap +++ b/subprojects/FFmpeg.wrap @@ -2,4 +2,4 @@ directory=FFmpeg url=https://gitlab.freedesktop.org/gstreamer/meson-ports/ffmpeg.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/ffmpeg.git -revision=meson-4.1.5 +revision=meson-4.3.1 From e9261b7f500f11a3f6c9bdd4202783ba01cd6c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 30 Jul 2020 15:52:04 +0100 Subject: [PATCH 366/448] x264: update to latest stable 160.3011 Part-of: --- subprojects/x264.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/x264.wrap b/subprojects/x264.wrap index 46978d39f2..0c29316070 100644 --- a/subprojects/x264.wrap +++ b/subprojects/x264.wrap @@ -2,4 +2,4 @@ directory=x264 url=https://gitlab.freedesktop.org/gstreamer/meson-ports/x264.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/x264.git -revision=157.2945-meson +revision=160.3011-meson From 237f5cc4ee8a20a51d8191e5c96c2b0efa268b5c Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 23 Jul 2020 16:31:07 +0530 Subject: [PATCH 367/448] Add glib-networking as a subproject when glib is a subproject We need gio modules for tls when building gstwebrtcbin, gstsoup, etc. Control it via a new 'tls' option, since it requires either gnutls or openssl. Part-of: --- meson.build | 7 +++++++ meson_options.txt | 8 ++++++-- subprojects/glib-networking.wrap | 5 +++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 subprojects/glib-networking.wrap diff --git a/meson.build b/meson.build index 41a2a04379..009e2b40d1 100644 --- a/meson.build +++ b/meson.build @@ -129,6 +129,13 @@ foreach sp : subprojects endif endforeach +# Check if we need to also build glib-networking for TLS modules +glib_dep = dependency('glib-2.0') +if glib_dep.type_name() == 'internal' + subproject('glib-networking', required : get_option('tls'), + default_options: ['gnutls=auto', 'openssl=auto']) +endif + plugins_doc_dep = custom_target('plugins-doc-cache', command: [python3, '-c', 'print("Built all doc caches")'], input: plugins_doc_caches, diff --git a/meson_options.txt b/meson_options.txt index eb5063df71..aabb9611cc 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,3 +1,4 @@ +# Subproject options option('python', type : 'feature', value : 'auto') option('libav', type : 'feature', value : 'auto') option('libnice', type : 'feature', value : 'auto') @@ -9,9 +10,12 @@ option('rtsp_server', type : 'feature', value : 'auto') option('omx', type : 'feature', value : 'disabled') option('vaapi', type : 'feature', value : 'disabled') option('sharp', type : 'feature', value : 'disabled') -option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') -option('gst-examples', type : 'feature', value : 'auto', description : 'Build gst-examples') option('rs', type : 'feature', value : 'disabled') +option('gst-examples', type : 'feature', value : 'auto', description : 'Build gst-examples') +option('tls', type : 'feature', value : 'auto', description : 'TLS support using glib-networking') + +# Other options +option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') option('gst-full-libraries', type : 'array', value : [], description : '''List of libraries to expose in gstreamer-full's ABI. gstreamer, glib and gobject are always included.''') diff --git a/subprojects/glib-networking.wrap b/subprojects/glib-networking.wrap new file mode 100644 index 0000000000..4321af57b5 --- /dev/null +++ b/subprojects/glib-networking.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=glib-networking +url=https://gitlab.gnome.org/GNOME/glib-networking.git +push-url=git@gitlab.gnome.org:GNOME/glib-networking.git +revision=glib-2-62 From 84bd4960354a66beb726a3c8ae873bf91a79ac3c Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 23 Jul 2020 14:18:39 +0530 Subject: [PATCH 368/448] Update .gitignore with subprojects and gdbinit Part-of: --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 2ce041c952..36acb3e048 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ subprojects/gstreamer subprojects/gstreamer-sharp subprojects/gstreamer-vaapi subprojects/glib +subprojects/glib-networking subprojects/gl-headers subprojects/bindinator subprojects/dssim @@ -62,5 +63,9 @@ subprojects/sqlite-* subprojects/libdrm-* subprojects/openjpeg* subprojects/avtp +subprojects/graphene +subprojects/libmicrodns +subprojects/libpsl prefix/ pygobject +.gdbinit From beeec59a0112f4c28eca477b8f5944314fe98aea Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 23 Jul 2020 16:05:06 +0530 Subject: [PATCH 369/448] gst-env: Prematurely skip all targets that aren't installed Simplifies the code a bit. Part-of: --- gst-env.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gst-env.py b/gst-env.py index 519418eeb5..3bbe2c925e 100755 --- a/gst-env.py +++ b/gst-env.py @@ -80,8 +80,6 @@ def is_library_target_and_not_plugin(target, filename): ''' if not target['type'].startswith('shared'): return False - if not target['installed']: - return False # Check if this output of that target is a shared library if not SHAREDLIB_REG.search(filename): return False @@ -104,8 +102,6 @@ def is_library_target_and_not_plugin(target, filename): def is_binary_target_and_in_path(target, filename, bindir): if target['type'] != 'executable': return False - if not target['installed']: - return False # Check if this file installed by this target is installed to bindir for install_filename in listify(target['install_filename']): if install_filename.endswith(os.path.basename(filename)): @@ -282,6 +278,8 @@ def get_subprocess_env(options, gst_version): for target in targets: filenames = listify(target['filename']) + if not target['installed']: + continue for filename in filenames: root = os.path.dirname(filename) if srcdir_path / "subprojects/gst-devtools/validate/plugins" in (srcdir_path / root).parents: From ef4059d4addf3f13d4c35633e3eeca7956886753 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 23 Jul 2020 16:29:53 +0530 Subject: [PATCH 370/448] gst-env: Factor out some common code Part-of: --- gst-env.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/gst-env.py b/gst-env.py index 3bbe2c925e..6b49fcb594 100755 --- a/gst-env.py +++ b/gst-env.py @@ -72,6 +72,17 @@ def prepend_env_var(env, var, value, sysroot): env[var] = val + env_val env[var] = env[var].replace(os.pathsep + os.pathsep, os.pathsep).strip(os.pathsep) +def get_target_install_filename(target, filename): + ''' + Checks whether this file is one of the files installed by the target + ''' + basename = os.path.basename(filename) + for install_filename in listify(target['install_filename']): + if install_filename.endswith(basename): + return install_filename + return None + + def is_library_target_and_not_plugin(target, filename): ''' Don't add plugins to PATH/LD_LIBRARY_PATH because: @@ -84,14 +95,9 @@ def is_library_target_and_not_plugin(target, filename): if not SHAREDLIB_REG.search(filename): return False # Check if it's installed to the gstreamer plugin location - for install_filename in listify(target['install_filename']): - if install_filename.endswith(os.path.basename(filename)): - break - else: - # None of the installed files in the target correspond to the built - # filename, so skip + install_filename = get_target_install_filename(target, filename) + if not install_filename: return False - global GSTPLUGIN_FILEPATH_REG if GSTPLUGIN_FILEPATH_REG is None: GSTPLUGIN_FILEPATH_REG = re.compile(GSTPLUGIN_FILEPATH_REG_TEMPLATE) @@ -103,12 +109,8 @@ def is_binary_target_and_in_path(target, filename, bindir): if target['type'] != 'executable': return False # Check if this file installed by this target is installed to bindir - for install_filename in listify(target['install_filename']): - if install_filename.endswith(os.path.basename(filename)): - break - else: - # None of the installed files in the target correspond to the built - # filename, so skip + install_filename = get_target_install_filename(target, filename) + if not install_filename: return False fpath = PurePath(install_filename) if fpath.parent != bindir: From 2a4d7f2264ca3da8896683e54c34854be4e43640 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 23 Jul 2020 16:32:44 +0530 Subject: [PATCH 371/448] gst-env: Load gio modules in the devenv By setting GIO_EXTRA_MODULES we can ensure that any gio modules we built are loaded by the devenv. Part-of: --- gst-env.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/gst-env.py b/gst-env.py index 6b49fcb594..8811ae878b 100755 --- a/gst-env.py +++ b/gst-env.py @@ -15,7 +15,8 @@ import sys import tempfile import pathlib import signal -from pathlib import PurePath +from functools import lru_cache +from pathlib import PurePath, Path from distutils.sysconfig import get_python_lib from distutils.util import strtobool @@ -82,6 +83,46 @@ def get_target_install_filename(target, filename): return install_filename return None +def get_pkgconfig_variable_from_pcfile(pcfile, varname): + variables = {} + substre = re.compile('\$\{[^${}]+\}') + with open(pcfile, 'r', encoding='utf-8') as f: + for line in f: + if '=' not in line: + continue + key, value = line[:-1].split('=', 1) + subst = {} + for each in substre.findall(value): + substkey = each[2:-1] + subst[each] = variables.get(substkey, '') + for k, v in subst.items(): + value = value.replace(k, v) + variables[key] = value + return variables.get(varname, '') + +@lru_cache() +def get_pkgconfig_variable(builddir, pcname, varname): + ''' + Parsing isn't perfect, but it's good enough. + ''' + pcfile = Path(builddir) / 'meson-private' / (pcname + '.pc') + if pcfile.is_file(): + return get_pkgconfig_variable_from_pcfile(pcfile, varname) + return subprocess.check_output(['pkg-config', pcname, '--variable=' + varname], + universal_newlines=True, encoding='utf-8') + + +def is_gio_module(target, filename, builddir): + if target['type'] != 'shared module': + return False + install_filename = get_target_install_filename(target, filename) + if not install_filename: + return False + giomoduledir = PurePath(get_pkgconfig_variable(builddir, 'gio-2.0', 'giomoduledir')) + fpath = PurePath(install_filename) + if fpath.parent != giomoduledir: + return False + return True def is_library_target_and_not_plugin(target, filename): ''' @@ -89,7 +130,7 @@ def is_library_target_and_not_plugin(target, filename): 1. We don't need to 2. It causes us to exceed the PATH length limit on Windows and Wine ''' - if not target['type'].startswith('shared'): + if target['type'] != 'shared library': return False # Check if this output of that target is a shared library if not SHAREDLIB_REG.search(filename): @@ -298,6 +339,10 @@ def get_subprocess_env(options, gst_version): options.sysroot) elif is_binary_target_and_in_path(target, filename, bindir): paths.add(os.path.join(options.builddir, root)) + elif is_gio_module(target, filename, options.builddir): + prepend_env_var(env, 'GIO_EXTRA_MODULES', + os.path.join(options.builddir, root), + options.sysroot) with open(os.path.join(options.builddir, 'GstPluginsPath.json')) as f: for plugin_path in json.load(f): From dd2bf7996c9464d08389491be1dc7712b425be8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 20 Aug 2020 16:17:01 +0100 Subject: [PATCH 372/448] Release 1.17.90 --- meson.build | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-docs.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-examples.wrap | 2 +- subprojects/gst-integration-testsuites.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index 009e2b40d1..1878914c38 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.17.2.1', + version : '1.17.90', meson_version : '>= 0.52.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 3ad4f0fce3..af5ed7e185 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap index 60609394f9..d2798e43d9 100644 --- a/subprojects/gst-docs.wrap +++ b/subprojects/gst-docs.wrap @@ -2,4 +2,4 @@ directory=gst-docs url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 0e3510a56f..f7b471de15 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap index 50624b4393..438aa1f015 100644 --- a/subprojects/gst-examples.wrap +++ b/subprojects/gst-examples.wrap @@ -2,4 +2,4 @@ directory=gst-examples url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap index 357edc2d9f..a3f1a7668b 100644 --- a/subprojects/gst-integration-testsuites.wrap +++ b/subprojects/gst-integration-testsuites.wrap @@ -2,4 +2,4 @@ directory=gst-integration-testsuites url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index d01154348a..81ce7d9cb6 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index d5ba267d17..2dff3d7b29 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 7d3a04af64..d1b57d435b 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 705662d731..9298e20d64 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 7ed12291ce..34f6180356 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index bab6ef61be..168c83d0e7 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b3e87a738..2e4a8e4848 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=master +revision=1.17.90 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index c7b473b3b2..eaaf56fae5 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=master +revision=1.17.90 diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index a14dab93a9..b268fddf02 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=master +revision=1.17.90 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8765f69928..21867f11d0 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=master +revision=1.17.90 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 85aa7f483a..55fedeaecf 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=master +revision=1.17.90 From 789b048b7cd7e3f95c6b0ea47323abbcc29ac606 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 27 Aug 2020 14:59:41 +0200 Subject: [PATCH 373/448] cross-files: update README - fix cross file path in example; - make_standalone_toolchain.py has been deprecated, it's now recommended to use prebuilt toolchains. --- data/cross-files/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/data/cross-files/README.md b/data/cross-files/README.md index 469ef12f8d..bff1b6e836 100644 --- a/data/cross-files/README.md +++ b/data/cross-files/README.md @@ -6,17 +6,16 @@ recommended to use Cerbero to cross compile GStreamer when other external dependencies are required. Once the toolchain is installed and a Meson cross file is created, to build -GStreamer simply run for example: `meson --cross-file cross-files/mingw_w64_x86-64.txt builddir`. +GStreamer simply run for example: `meson --cross-file data/cross-files/mingw_w64_x86-64.txt builddir`. ## Android Requires Android API level >= 28, previous versions are missing *iconv* dependency. - Download and extract the [NDK](https://developer.android.com/ndk/) -- Create a standalone toolchain targeting your arch and API level: -`./build/tools/make_standalone_toolchain.py --arch $arch --api $api --install-dir $toolchain_path` - Create a Meson cross file, you can use `android_arm64_api28.txt` as example - and change CPU architectures and toolchain path. + and change CPU architectures and toolchain path using the prebuilt toolchains + from the NDK. Notes: - On fedora the Android NDK requires the `ncurses-compat-libs` package. From 32d3a2544d8143b7f24e24d1c28a81ba126881ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 8 Sep 2020 00:10:28 +0100 Subject: [PATCH 374/448] Release 1.18.0 Part-of: --- meson.build | 2 +- subprojects/gl-headers.wrap | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-docs.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-examples.wrap | 2 +- subprojects/gst-integration-testsuites.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/meson.build b/meson.build index 1878914c38..7dc964d513 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.17.90', + version : '1.18.0', meson_version : '>= 0.52.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gl-headers.wrap b/subprojects/gl-headers.wrap index f5a9fa4f2b..0c9d533ff6 100644 --- a/subprojects/gl-headers.wrap +++ b/subprojects/gl-headers.wrap @@ -2,4 +2,4 @@ directory=gl-headers url=https://gitlab.freedesktop.org/gstreamer/meson-ports/gl-headers.git push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/gl-headers.git -revision=master +revision=5c8c7c0d3ca1f0b783272dac0b95e09414e49bc8 diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index af5ed7e185..100b029007 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap index d2798e43d9..840d954549 100644 --- a/subprojects/gst-docs.wrap +++ b/subprojects/gst-docs.wrap @@ -2,4 +2,4 @@ directory=gst-docs url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index f7b471de15..08da888f12 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap index 438aa1f015..0552a7e3b2 100644 --- a/subprojects/gst-examples.wrap +++ b/subprojects/gst-examples.wrap @@ -2,4 +2,4 @@ directory=gst-examples url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap index a3f1a7668b..645e74b3db 100644 --- a/subprojects/gst-integration-testsuites.wrap +++ b/subprojects/gst-integration-testsuites.wrap @@ -2,4 +2,4 @@ directory=gst-integration-testsuites url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 81ce7d9cb6..351c6b4f3b 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index 2dff3d7b29..aa7fd8fdfe 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index d1b57d435b..639bbb7dba 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 9298e20d64..4ab10b12c0 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 34f6180356..4e775cacf4 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index 168c83d0e7..d1e780f796 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2e4a8e4848..11e7ad732a 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index eaaf56fae5..a89af75b00 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index b268fddf02..699b0b98b2 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 21867f11d0..31e5324a48 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=1.17.90 +revision=1.18.0 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 55fedeaecf..292e18ede5 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=1.17.90 +revision=1.18.0 From be984e88db5570fe87054db677194ab69ef3eb1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 8 Sep 2020 16:59:25 +0100 Subject: [PATCH 375/448] Back to development --- meson.build | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-docs.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-examples.wrap | 2 +- subprojects/gst-integration-testsuites.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index 7dc964d513..d4cf73ac64 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.18.0', + version : '1.19.0.1', meson_version : '>= 0.52.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 100b029007..3ad4f0fce3 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap index 840d954549..60609394f9 100644 --- a/subprojects/gst-docs.wrap +++ b/subprojects/gst-docs.wrap @@ -2,4 +2,4 @@ directory=gst-docs url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 08da888f12..0e3510a56f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap index 0552a7e3b2..50624b4393 100644 --- a/subprojects/gst-examples.wrap +++ b/subprojects/gst-examples.wrap @@ -2,4 +2,4 @@ directory=gst-examples url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap index 645e74b3db..357edc2d9f 100644 --- a/subprojects/gst-integration-testsuites.wrap +++ b/subprojects/gst-integration-testsuites.wrap @@ -2,4 +2,4 @@ directory=gst-integration-testsuites url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 351c6b4f3b..d01154348a 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index aa7fd8fdfe..d5ba267d17 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 639bbb7dba..7d3a04af64 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 4ab10b12c0..705662d731 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 4e775cacf4..7ed12291ce 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index d1e780f796..bab6ef61be 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 11e7ad732a..2b3e87a738 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=1.18.0 +revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index a89af75b00..c7b473b3b2 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=1.18.0 +revision=master diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index 699b0b98b2..a14dab93a9 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=1.18.0 +revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 31e5324a48..8765f69928 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=1.18.0 +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 292e18ede5..85aa7f483a 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=1.18.0 +revision=master From 5758e5461f9a25887672e30c2566879a24058bb1 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Tue, 15 Sep 2020 15:12:25 +0300 Subject: [PATCH 376/448] {pygobject,pycairo}.wrap: point to stable refs Part-of: --- subprojects/pycairo.wrap | 2 +- subprojects/pygobject.wrap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/subprojects/pycairo.wrap b/subprojects/pycairo.wrap index 87eac571ed..e80fc1176d 100644 --- a/subprojects/pycairo.wrap +++ b/subprojects/pycairo.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=pycairo url=https://github.com/pygobject/pycairo.git -revision=master +revision=v1.19.1 diff --git a/subprojects/pygobject.wrap b/subprojects/pygobject.wrap index 1a4e7bedf8..7fe72f62ee 100644 --- a/subprojects/pygobject.wrap +++ b/subprojects/pygobject.wrap @@ -2,4 +2,4 @@ directory=pygobject url=https://gitlab.gnome.org/GNOME/pygobject.git push-url=git@gitlab.gnome.org:GNOME/pygobject.git -revision=master +revision=pygobject-3-38 From 9e8ce49ac42b461a83098f8164915b19c0a78cfb Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Tue, 15 Sep 2020 14:23:40 -0400 Subject: [PATCH 377/448] meson: Add qt5 feature This allow disabling qt5 across GStreamer with a single configuration. Part-of: --- meson_options.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/meson_options.txt b/meson_options.txt index aabb9611cc..db487dd276 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -13,6 +13,7 @@ option('sharp', type : 'feature', value : 'disabled') option('rs', type : 'feature', value : 'disabled') option('gst-examples', type : 'feature', value : 'auto', description : 'Build gst-examples') option('tls', type : 'feature', value : 'auto', description : 'TLS support using glib-networking') +option('qt5', type : 'feature', value : 'auto', description : 'Qt5 Support') # Other options option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') From fa9627eb75c3904c53b81e06f6e0d2034a4a2d98 Mon Sep 17 00:00:00 2001 From: Antonio Ospite Date: Thu, 24 Sep 2020 13:50:09 +0200 Subject: [PATCH 378/448] gst-env: use Path.open() in get_pkgconfig_variable_from_pcfile() The pcfile argument passed to get_target_install_filename() is guaranteed to be a Path() object so use the .open() method to open the file instead of the standard open() function. This makes it possible to run gst-env.py on older systems with pyhton3.5 where the standard open() function cannot handle Path arguments. The change fixes errors like the following: ----------------------------------------------------------------------- $ ninja -C build/ devenv ninja: Entering directory `build/' [0/1] Running external command devenv Traceback (most recent call last): File "/home/ao2/gst-build/gst-env.py", line 493, in env = get_subprocess_env(options, gst_version) File "/home/ao2/gst-build/gst-env.py", line 342, in get_subprocess_env elif is_gio_module(target, filename, options.builddir): File "/home/ao2/gst-build/gst-env.py", line 121, in is_gio_module giomoduledir = PurePath(get_pkgconfig_variable(builddir, 'gio-2.0', 'giomoduledir')) File "/home/ao2/gst-build/gst-env.py", line 110, in get_pkgconfig_variable return get_pkgconfig_variable_from_pcfile(pcfile, varname) File "/home/ao2/gst-build/gst-env.py", line 89, in get_pkgconfig_variable_from_pcfile with open(pcfile, 'r', encoding='utf-8') as f: TypeError: invalid file: PosixPath('/home/ao2/gst-build/build/meson-private/gio-2.0.pc') FAILED: meson-devenv ----------------------------------------------------------------------- Part-of: --- gst-env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-env.py b/gst-env.py index 8811ae878b..a94432b461 100755 --- a/gst-env.py +++ b/gst-env.py @@ -86,7 +86,7 @@ def get_target_install_filename(target, filename): def get_pkgconfig_variable_from_pcfile(pcfile, varname): variables = {} substre = re.compile('\$\{[^${}]+\}') - with open(pcfile, 'r', encoding='utf-8') as f: + with pcfile.open('r', encoding='utf-8') as f: for line in f: if '=' not in line: continue From debe544d3f5a80954c949af9580ba1df94f91e49 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 1 Oct 2020 23:05:34 +0530 Subject: [PATCH 379/448] windows: Detect Strawberry Perl and error out early This is going to fail during the compile phase because Strawberry Perl ships with its own pkg-config and pkgconfig files for zlib/libffi with unusable values. Fixes https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/41 Part-of: --- meson.build | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/meson.build b/meson.build index d4cf73ac64..aec7d52dc6 100644 --- a/meson.build +++ b/meson.build @@ -24,6 +24,21 @@ if cmdres.returncode() != 0 error('Do not run `ninja` or `meson` for gst-build inside the uninstalled environment, you will run into problems') endif +# Ensure that the user does not have Strawberry Perl in PATH, since it ships +# with a pkg-config.bat and broken pkgconfig files for libffi and zlib. Will +# cause a build error, such as in +# https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/41 +ensure_no_strawberry_perl = ''' +import os +assert(r'Strawberry\perl\bin' not in os.environ['PATH']) +''' +if build_system == 'windows' + cmdres = run_command(python3, '-c', ensure_no_strawberry_perl) + if cmdres.returncode() != 0 + error('You have Strawberry Perl in PATH which is known to cause build issues with gst-build. Please remove it from PATH or uninstall it.') + endif +endif + documented_projects = '' # Make it possible to use msys2 built zlib which fails # when not using the mingw toolchain as it uses unistd.h From 4dc93ef1308dac0b6b1f38279e9825228a4e9458 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Wed, 23 Sep 2020 13:47:40 -0400 Subject: [PATCH 380/448] gst-full: Remove gstinitstaticplugins.h That header is not needed any more because gst_init() now calls gst_init_static_plugins() automatically when available. This is an API break compared to 1.18, but release notes made it clear it was an experimental feature. Part-of: --- examples/static-plugins/main.c | 2 -- gstinitstaticplugins.h | 29 ----------------------------- meson.build | 1 - 3 files changed, 32 deletions(-) delete mode 100644 gstinitstaticplugins.h diff --git a/examples/static-plugins/main.c b/examples/static-plugins/main.c index a205b7834a..1917726f25 100644 --- a/examples/static-plugins/main.c +++ b/examples/static-plugins/main.c @@ -1,5 +1,4 @@ #include -#include int main (int argc, char *argv[]) @@ -7,7 +6,6 @@ main (int argc, char *argv[]) GstElement *e; gst_init (&argc, &argv); - gst_init_static_plugins (); e = gst_element_factory_make ("identity", NULL); g_assert_nonnull (e); diff --git a/gstinitstaticplugins.h b/gstinitstaticplugins.h deleted file mode 100644 index bd6245e3b1..0000000000 --- a/gstinitstaticplugins.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2019 Collabora Ltd. - * Author: Xavier Claessens - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#pragma once - -#include - -G_BEGIN_DECLS - -void gst_init_static_plugins (void); - -G_END_DECLS diff --git a/meson.build b/meson.build index aec7d52dc6..e519f306aa 100644 --- a/meson.build +++ b/meson.build @@ -266,7 +266,6 @@ if get_option('default_library') == 'static' '@OUTPUT@', all_plugins_paths] ) - install_headers('gstinitstaticplugins.h', subdir : 'gstreamer-1.0/gst') # Avoid a x264 link issue described here: https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/108 # Similar issue has been found with VLC: https://mailman.videolan.org/pipermail/vlc-devel/2009-March/057640.html From d4f95054e1e791deaa3543ab7a1beb26a06d3fe5 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 29 Sep 2020 15:24:07 -0400 Subject: [PATCH 381/448] README: Document gstreamer-full-1.0 Part-of: --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index 815c2efb66..452190fc25 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,29 @@ the build files to find `libmfx`. The plugin will be automatically enabled if possible, but you can ensure it by passing `-Dbad=enabled -Dgst-plugins-bad:msdk=enabled` to `meson`. +### Static build + +Since *1.18.0* when doing a static build using `--default-library=static`, a +shared library `gstreamer-full-1.0` will be produced and includes all enabled +GStreamer plugins and libraries. A list of libraries that needs to be exposed in +`gstreamer-full-1.0` ABI can be set using `gst-full-libraries` option. glib-2.0, +gobject-2.0 and gstreamer-1.0 are always included. + +``` +meson --default-library=static -Dgst-full-libraries=app,video builddir +``` + +GStreamer *1.18* requires applications using gstreamer-full-1.0 to initialize +static plugins by calling `gst_init_static_plugins()` after `gst_init()`. That +function is defined in `gst/gstinitstaticplugins.h` header file. + +Since *1.20.0* `gst_init_static_plugins()` is called automatically by +`gst_init()` and applications must not call it manually any more. The header +file has been removed from public API. + +This is an experimental feature, backward uncompatible changes could still be +made in the future. + # Development environment ## Development environment target From 89913b2f83be7158050cd4e55255f16da83db674 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Thu, 1 Oct 2020 10:43:36 -0400 Subject: [PATCH 382/448] gst-full: Prevent multiple calls to gst_init_static_plugins() Part-of: --- scripts/generate_init_static_plugins.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/generate_init_static_plugins.py b/scripts/generate_init_static_plugins.py index c2ed122512..15725d8dc2 100644 --- a/scripts/generate_init_static_plugins.py +++ b/scripts/generate_init_static_plugins.py @@ -12,7 +12,11 @@ $plugins_declaration void gst_init_static_plugins (void) { - $plugins_registration + static gsize initialization_value = 0; + if (g_once_init_enter (&initialization_value)) { + $plugins_registration + g_once_init_leave (&initialization_value, 1); + } } ''') From c96dcd269808446962c7e7426e90dd5029e3dac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Wed, 15 Jul 2020 15:01:37 +0200 Subject: [PATCH 383/448] meson: make good and base optional Be able to disable the base/good build on demand By default its always enabled. Part-of: --- meson.build | 4 ++-- meson_options.txt | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index e519f306aa..89041f7b6e 100644 --- a/meson.build +++ b/meson.build @@ -71,8 +71,8 @@ endif # Ordered list of subprojects (dict has no ordering guarantees) subprojects = [ ['gstreamer', {'build-hotdoc': true}], - ['gst-plugins-base', {'build-hotdoc': true}], - ['gst-plugins-good', {'build-hotdoc': true}], + ['gst-plugins-base', {'option': get_option('base'), 'build-hotdoc': true}], + ['gst-plugins-good', {'option': get_option('good'), 'build-hotdoc': true}], ['libnice', { 'option': get_option('libnice'), 'match_gst_version': false}], ['gst-plugins-bad', { 'option': get_option('bad'), 'build-hotdoc': true}], ['gst-plugins-ugly', { 'option': get_option('ugly'), 'build-hotdoc': true}], diff --git a/meson_options.txt b/meson_options.txt index db487dd276..c285a3cff9 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -2,6 +2,8 @@ option('python', type : 'feature', value : 'auto') option('libav', type : 'feature', value : 'auto') option('libnice', type : 'feature', value : 'auto') +option('base', type : 'feature', value : 'enabled') +option('good', type : 'feature', value : 'enabled') option('ugly', type : 'feature', value : 'auto') option('bad', type : 'feature', value : 'auto') option('devtools', type : 'feature', value : 'auto') From a9731bdcb70978e667e342419a0c6b9c07db1113 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 29 Sep 2020 10:33:44 -0400 Subject: [PATCH 384/448] Add pango.wrap file and its dependencies Part-of: --- subprojects/cairo.wrap | 5 +++++ subprojects/expat.wrap | 10 ++++++++++ subprojects/fontconfig.wrap | 6 ++++++ subprojects/freetype2.wrap | 6 ++++++ subprojects/fribidi.wrap | 6 ++++++ subprojects/harfbuzz.wrap | 6 ++++++ subprojects/pango.wrap | 4 ++++ subprojects/pixman.wrap | 6 ++++++ subprojects/sqlite.wrap | 14 +++++++------- 9 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 subprojects/cairo.wrap create mode 100644 subprojects/expat.wrap create mode 100644 subprojects/fontconfig.wrap create mode 100644 subprojects/freetype2.wrap create mode 100644 subprojects/fribidi.wrap create mode 100644 subprojects/harfbuzz.wrap create mode 100644 subprojects/pango.wrap create mode 100644 subprojects/pixman.wrap diff --git a/subprojects/cairo.wrap b/subprojects/cairo.wrap new file mode 100644 index 0000000000..e6c7ea6acf --- /dev/null +++ b/subprojects/cairo.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=cairo +url=https://gitlab.freedesktop.org/cairo/cairo.git +depth=1 +revision=master diff --git a/subprojects/expat.wrap b/subprojects/expat.wrap new file mode 100644 index 0000000000..b6efa5394c --- /dev/null +++ b/subprojects/expat.wrap @@ -0,0 +1,10 @@ +[wrap-file] +directory = expat-2.2.9 + +source_url = https://github.com/libexpat/libexpat/releases/download/R_2_2_9/expat-2.2.9.tar.xz +source_filename = expat-2.2.9.tar.bz2 +source_hash = 1ea6965b15c2106b6bbe883397271c80dfa0331cdf821b2c319591b55eadc0a4 + +patch_url = https://wrapdb.mesonbuild.com/v1/projects/expat/2.2.9/1/get_zip +patch_filename = expat-2.2.9-1-wrap.zip +patch_hash = f2ea858f3cb00eed10e2502f4b97873a3788da19d9b944bcb3bb113c2db4e5f4 diff --git a/subprojects/fontconfig.wrap b/subprojects/fontconfig.wrap new file mode 100644 index 0000000000..35f6b17c85 --- /dev/null +++ b/subprojects/fontconfig.wrap @@ -0,0 +1,6 @@ +[wrap-git] +directory=fontconfig +url=https://gitlab.freedesktop.org/fontconfig/fontconfig +push-url=git@gitlab.freedesktop.org:fontconfig/fontconfig.git +depth=1 +revision=master diff --git a/subprojects/freetype2.wrap b/subprojects/freetype2.wrap new file mode 100644 index 0000000000..7c88f89cbc --- /dev/null +++ b/subprojects/freetype2.wrap @@ -0,0 +1,6 @@ +[wrap-git] +directory=freetype2 +url=https://github.com/centricular/freetype2.git +depth=1 +push-url=git@github.com:centricular/freetype2.git +revision=meson diff --git a/subprojects/fribidi.wrap b/subprojects/fribidi.wrap new file mode 100644 index 0000000000..0132d4ecda --- /dev/null +++ b/subprojects/fribidi.wrap @@ -0,0 +1,6 @@ +[wrap-git] +directory=fribidi +url=https://github.com/fribidi/fribidi.git +push-url=git@github.com:fribidi/fribidi.git +revision=master +depth=1 diff --git a/subprojects/harfbuzz.wrap b/subprojects/harfbuzz.wrap new file mode 100644 index 0000000000..6fdcb63352 --- /dev/null +++ b/subprojects/harfbuzz.wrap @@ -0,0 +1,6 @@ +[wrap-git] +directory=harfbuzz +url=https://github.com/harfbuzz/harfbuzz.git +push-url=git@github.com:harfbuzz/harfbuzz.git +revision=master +depth=1 diff --git a/subprojects/pango.wrap b/subprojects/pango.wrap new file mode 100644 index 0000000000..512087ced5 --- /dev/null +++ b/subprojects/pango.wrap @@ -0,0 +1,4 @@ +[wrap-git] +url=https://gitlab.gnome.org/GNOME/pango.git +push-url=git@gitlab.gnome.org:GNOME/pango.git +revision=master diff --git a/subprojects/pixman.wrap b/subprojects/pixman.wrap new file mode 100644 index 0000000000..dd2b1ceadf --- /dev/null +++ b/subprojects/pixman.wrap @@ -0,0 +1,6 @@ +[wrap-git] +directory=pixman +url=https://gitlab.freedesktop.org/pixman/pixman +push-url=git@gitlab.freedesktop.org:pixman/pixman.git +depth=1 +revision=master diff --git a/subprojects/sqlite.wrap b/subprojects/sqlite.wrap index 6934dc4f3d..4215a69a33 100644 --- a/subprojects/sqlite.wrap +++ b/subprojects/sqlite.wrap @@ -1,10 +1,10 @@ [wrap-file] -directory = sqlite-amalgamation-3310100 +directory = sqlite-amalgamation-3320300 -source_url = https://www.sqlite.org/2020/sqlite-amalgamation-3310100.zip -source_filename = sqlite-amalgamation-3310100.zip -source_hash = f3c79bc9f4162d0b06fa9fe09ee6ccd23bb99ce310b792c5145f87fbcc30efca +source_url = https://www.sqlite.org/2020/sqlite-amalgamation-3320300.zip +source_filename = sqlite-amalgamation-3320300.zip +source_hash = e9cec01d4519e2d49b3810615237325263fe1feaceae390ee12b4a29bd73dbe2 -patch_url = https://wrapdb.mesonbuild.com/v1/projects/sqlite/3310100/1/get_zip -patch_filename = sqlite-3310100-1-wrap.zip -patch_hash = 81f8efc1cbed88226b2fcd7c0221a90f43613fd8c311b8f653c3487cc88363cd +patch_url = https://wrapdb.mesonbuild.com/v1/projects/sqlite/3320300/3/get_zip +patch_filename = sqlite-3320300-3-wrap.zip +patch_hash = 135e712664116a52fd4df0da464331a4ec75e6d9babd785906cd138bea43aed6 From 89faf739c92e0e9ec72eb06cc224e1d64173b537 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 11 Aug 2020 15:49:53 +0200 Subject: [PATCH 385/448] meson: add gst-full-version-script option Can be used to control the exact symbols exported, or not, in libgstreamer-full. This is useful when building a tailored libgstreamer-full aimed to be run with some specific binaries. By using such version script one can reduce the size of the generated lib by letting the linker garbage collect all the unused APIs. Part-of: --- README.md | 6 ++++++ meson.build | 13 +++++++++++++ meson_options.txt | 2 ++ 3 files changed, 21 insertions(+) diff --git a/README.md b/README.md index 452190fc25..c9ca05158e 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,12 @@ Since *1.20.0* `gst_init_static_plugins()` is called automatically by `gst_init()` and applications must not call it manually any more. The header file has been removed from public API. +One can use the `gst-full-version-script` option to pass a +[version script](https://www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html) +to the linker. This can be used to control the exact symbols that are exported by +the gstreamer-full library, allowing the linker to garbage collect unused code +and so reduce the total library size. + This is an experimental feature, backward uncompatible changes could still be made in the future. diff --git a/meson.build b/meson.build index 89041f7b6e..99ce97282d 100644 --- a/meson.build +++ b/meson.build @@ -297,6 +297,18 @@ if get_option('default_library') == 'static' requires = ['glib-2.0', 'gobject-2.0'] endif + link_deps = [] + if get_option('gst-full-version-script') != '' + symbol_map = meson.current_source_dir() / get_option('gst-full-version-script') + link_arg = '-Wl,--version-script=' + symbol_map + if cc.has_link_argument(link_arg) + gstfull_link_args += link_arg + else + error('Failed to link with version script (' + symbol_map + '), check logs for details') + endif + link_deps += symbol_map + endif + # Build both shared and static library gstfull = both_libraries('gstreamer-full-1.0', init_static_plugins_c, @@ -304,6 +316,7 @@ if get_option('default_library') == 'static' link_args: gstfull_link_args, link_whole : exposed_libs, dependencies : gst_dep, + link_depends : link_deps, install : true, ) pkgconfig.generate(gstfull, diff --git a/meson_options.txt b/meson_options.txt index c285a3cff9..a3b73a1538 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -21,6 +21,8 @@ option('qt5', type : 'feature', value : 'auto', description : 'Qt5 Support') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') option('gst-full-libraries', type : 'array', value : [], description : '''List of libraries to expose in gstreamer-full's ABI. gstreamer, glib and gobject are always included.''') +option('gst-full-version-script', type : 'string', value: '', + description : 'path of the version script to be used by the linker, see https://www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html') # Common options, automatically inherited by subprojects option('tests', type : 'feature', value : 'auto', description : 'Build tests') From 9c90e6a1c3f6a9d70e5ec949d949ed067982d368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Tue, 6 Oct 2020 12:31:24 +0200 Subject: [PATCH 386/448] libopenjp2: update wrap Fix lcms2 and wxWidgets system dependencies. https://github.com/mesonbuild/libopenjp2/pull/2 Part-of: --- subprojects/libopenjp2.wrap | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subprojects/libopenjp2.wrap b/subprojects/libopenjp2.wrap index b781b25dc0..a6b670d39e 100644 --- a/subprojects/libopenjp2.wrap +++ b/subprojects/libopenjp2.wrap @@ -5,6 +5,6 @@ source_url = https://github.com/uclouvain/openjpeg/archive/v2.3.1.tar.gz source_filename = openjpeg-2.3.1.tar.gz source_hash = 63f5a4713ecafc86de51bfad89cc07bb788e9bba24ebbf0c4ca637621aadb6a9 -patch_url = https://wrapdb.mesonbuild.com/v1/projects/libopenjp2/2.3.1/1/get_zip -patch_filename = libopenjp2-2.3.1-1-wrap.zip -patch_hash = e98704b3dcb854071ce2aa107b676ffbd52b94cdcf7dde24420e34a1a5bd85fd +patch_url = https://wrapdb.mesonbuild.com/v1/projects/libopenjp2/2.3.1/3/get_zip +patch_filename = libopenjp2-2.3.1-3-wrap.zip +patch_hash = 95c3195d46b02b7d96d59920fcddfb107bba09c4b014b7319307e658895ce501 From 4a2e037fd6f8f0db28d262a0418626056b6e93e1 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 7 Oct 2020 15:01:10 +0200 Subject: [PATCH 387/448] gst-worktree: add support for wrap file without 'directory' field The script is currently not usable because of pango.wrap not having the 'directory' field and relying on the default from the file name. Part-of: --- gst-worktree.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gst-worktree.py b/gst-worktree.py index 9999bcf2ee..0032a2a6db 100755 --- a/gst-worktree.py +++ b/gst-worktree.py @@ -29,7 +29,9 @@ def parse_wrapfile(wrapf): if 'wrap-git' not in cgp: return None section = cgp['wrap-git'] - return section['directory'], section['revision'] + # Default to the wrapper filename if 'directory' field is missing + directory = section.get('directory', os.path.splitext(os.path.basename(wrapf))[0]) + return directory, section['revision'] def get_wrap_subprojects(srcdir, gst_branch): ''' From 852f8f7a532181d603de46ced66499fd86e3e0dc Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Thu, 8 Oct 2020 10:26:03 +0100 Subject: [PATCH 388/448] Add libwpe subproject This is a dependency of wpebackend-fdo. Part-of: --- .gitignore | 1 + subprojects/libwpe.wrap | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 subprojects/libwpe.wrap diff --git a/.gitignore b/.gitignore index 36acb3e048..092cf43c20 100644 --- a/.gitignore +++ b/.gitignore @@ -66,6 +66,7 @@ subprojects/avtp subprojects/graphene subprojects/libmicrodns subprojects/libpsl +subprojects/libwpe prefix/ pygobject .gdbinit diff --git a/subprojects/libwpe.wrap b/subprojects/libwpe.wrap new file mode 100644 index 0000000000..a3a1634140 --- /dev/null +++ b/subprojects/libwpe.wrap @@ -0,0 +1,4 @@ +[wrap-git] +directory=libwpe +url=https://github.com/WebPlatformForEmbedded/libwpe +revision=e87c99f78fa0df4a05dc75185e6115351e42debb From e7b9f6b04ad0864686011c7b1a16045f09763e46 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Thu, 8 Oct 2020 09:41:30 +0100 Subject: [PATCH 389/448] wpebackend-fdo: Update to 1.9 This commit will be useful for the wpesrc audio support, and for CI/SHM purposes in general. Part-of: --- .gitignore | 1 + subprojects/wpebackend-fdo.wrap | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 092cf43c20..9c7b3f7967 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,7 @@ subprojects/graphene subprojects/libmicrodns subprojects/libpsl subprojects/libwpe +subprojects/wpebackend-fdo prefix/ pygobject .gdbinit diff --git a/subprojects/wpebackend-fdo.wrap b/subprojects/wpebackend-fdo.wrap index b7b368f123..92d790aad0 100644 --- a/subprojects/wpebackend-fdo.wrap +++ b/subprojects/wpebackend-fdo.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=wpebackend-fdo url=https://github.com/Igalia/WPEBackend-FDO.git -revision=0e10c424223dbc663ea6f4f2f299c99cd4e14718 +revision=409af4493562c49196da5c9eace914ae10cfe9a3 From 30ea94f40c0ada4d495c70f1ed34da680cc32c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Wed, 15 Jul 2020 15:46:49 +0200 Subject: [PATCH 390/448] meson: move custom_subproject definition for gst-full In order to let any subproject to use gstreamer-full declare the subprojects after gstreamer-full definition. Part-of: --- meson.build | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/meson.build b/meson.build index 99ce97282d..bafeea9a96 100644 --- a/meson.build +++ b/meson.build @@ -158,14 +158,6 @@ plugins_doc_dep = custom_target('plugins-doc-cache', capture: true, ) -foreach custom_subproj: get_option('custom_subprojects').split(',') - if custom_subproj != '' - message ('Adding custom subproject ' + custom_subproj) - subproject(custom_subproj) - subprojects_names += [custom_subproj] - endif -endforeach - if meson.is_cross_build() or build_machine.system() == 'windows' if get_option('doc').enabled() error('Documentation enabled but building the doc while cross building or building on windows is not supported yet.') @@ -324,6 +316,14 @@ if get_option('default_library') == 'static' subdirs : 'gstreamer-1.0') endif +foreach custom_subproj: get_option('custom_subprojects').split(',') + if custom_subproj != '' + message ('Adding custom subproject ' + custom_subproj) + subproject(custom_subproj) + subprojects_names += [custom_subproj] + endif +endforeach + message('Building subprojects: ' + ', '.join(subprojects_names)) setenv = find_program('gst-env.py') From b4256c219dc8b48ece04f1085479a9b19c33aa0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Wed, 15 Jul 2020 16:57:47 +0200 Subject: [PATCH 391/448] gst-full: declare dependency Declare the gstreamer-full dependency which can be used later by 3rd party applications. Part-of: --- meson.build | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index bafeea9a96..b1b6dfa0ec 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('All GStreamer modules', 'c', version : '1.19.0.1', - meson_version : '>= 0.52.0', + meson_version : '>= 0.54.0', default_options : ['buildtype=debugoptimized']) gst_version = '>= @0@'.format(meson.project_version()) @@ -311,9 +311,15 @@ if get_option('default_library') == 'static' link_depends : link_deps, install : true, ) + + gst_full_dep = declare_dependency(link_with: gstfull.get_shared_lib(), + dependencies : gst_dep, + include_directories: include_directories('.') + ) pkgconfig.generate(gstfull, requires: requires, subdirs : 'gstreamer-1.0') + meson.override_dependency('gstreamer-full-1.0', gst_full_dep) endif foreach custom_subproj: get_option('custom_subprojects').split(',') From 8a9d21ce18d27eeb8733ca81a22f07d88b555b0a Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Fri, 24 Jul 2020 11:15:44 -0400 Subject: [PATCH 392/448] gst-full: Add missing include directories to use it in subprojects Part-of: --- meson.build | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/meson.build b/meson.build index b1b6dfa0ec..30d7604399 100644 --- a/meson.build +++ b/meson.build @@ -267,26 +267,32 @@ if get_option('default_library') == 'static' endif - gst_dep = subproject('gstreamer').get_variable('gst_dep') - # Get a list of libraries that needs to be exposed in the ABI. exposed_libs = [] + incdir_deps = [] foreach name : get_option('gst-full-libraries') + ['gstreamer'] info = libraries_map[name] exposed_libs += subproject(info[0]).get_variable(info[1]) + depname = name == 'gstreamer' ? 'gstreamer-1.0' : 'gstreamer-@0@-1.0'.format(name) + incdir_deps += dependency(depname).partial_dependency(includes: true) endforeach # glib and gobject are part of our public API. If we are using glib from the # system then our pkg-config file must require it. If we built it as # subproject then we need to link_whole it. - requires = [] - gobject_dep = dependency('gobject-2.0', fallback: ['glib', 'libgobject_dep']) + glib_deps = [] + glib_dep = dependency('glib-2.0') + gobject_dep = dependency('gobject-2.0') if gobject_dep.type_name() == 'internal' - glib_subproject = subproject('glib') - exposed_libs += glib_subproject.get_variable('libglib') - exposed_libs += glib_subproject.get_variable('libgobject') + glib_subproject = subproject('glib') + exposed_libs += glib_subproject.get_variable('libglib') + exposed_libs += glib_subproject.get_variable('libgobject') + incdir_deps += [ + glib_dep.partial_dependency(includes: true), + gobject_dep.partial_dependency(includes: true), + ] else - requires = ['glib-2.0', 'gobject-2.0'] + glib_deps = [glib_dep, gobject_dep] endif link_deps = [] @@ -307,17 +313,17 @@ if get_option('default_library') == 'static' link_with : all_plugins, link_args: gstfull_link_args, link_whole : exposed_libs, - dependencies : gst_dep, + dependencies : incdir_deps + glib_deps, link_depends : link_deps, install : true, ) gst_full_dep = declare_dependency(link_with: gstfull.get_shared_lib(), - dependencies : gst_dep, + dependencies : incdir_deps + glib_deps, include_directories: include_directories('.') ) pkgconfig.generate(gstfull, - requires: requires, + requires: glib_deps, subdirs : 'gstreamer-1.0') meson.override_dependency('gstreamer-full-1.0', gst_full_dep) endif From b25e471eafafeab1b1cddb4a029d1976e0ad61db Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Sun, 26 Jul 2020 08:00:58 -0400 Subject: [PATCH 393/448] gstfull: Also include 'sources' from dependencies It contains generated headers like mkenums. Part-of: --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 30d7604399..39a336a77c 100644 --- a/meson.build +++ b/meson.build @@ -274,7 +274,7 @@ if get_option('default_library') == 'static' info = libraries_map[name] exposed_libs += subproject(info[0]).get_variable(info[1]) depname = name == 'gstreamer' ? 'gstreamer-1.0' : 'gstreamer-@0@-1.0'.format(name) - incdir_deps += dependency(depname).partial_dependency(includes: true) + incdir_deps += dependency(depname).partial_dependency(includes: true, sources: true) endforeach # glib and gobject are part of our public API. If we are using glib from the From bda71454601340a0f4e496c90f961e016df853b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Thu, 16 Jul 2020 18:13:50 +0200 Subject: [PATCH 394/448] gstreamer-full: add unit test This test allows to test gstreamer-full behaviour Part-of: --- examples/static-plugins/main.c | 19 ------------------- examples/static-plugins/meson.build | 6 ------ meson.build | 3 +++ tests/meson.build | 4 ++++ tests/static-plugins/meson.build | 6 ++++++ tests/static-plugins/test-gst-full.c | 14 ++++++++++++++ 6 files changed, 27 insertions(+), 25 deletions(-) delete mode 100644 examples/static-plugins/main.c delete mode 100644 examples/static-plugins/meson.build create mode 100644 tests/meson.build create mode 100644 tests/static-plugins/meson.build create mode 100644 tests/static-plugins/test-gst-full.c diff --git a/examples/static-plugins/main.c b/examples/static-plugins/main.c deleted file mode 100644 index 1917726f25..0000000000 --- a/examples/static-plugins/main.c +++ /dev/null @@ -1,19 +0,0 @@ -#include - -int -main (int argc, char *argv[]) -{ - GstElement *e; - - gst_init (&argc, &argv); - - e = gst_element_factory_make ("identity", NULL); - g_assert_nonnull (e); - g_object_unref (e); - - e = gst_element_factory_make ("alpha", NULL); - g_assert_nonnull (e); - g_object_unref (e); - - return 0; -} diff --git a/examples/static-plugins/meson.build b/examples/static-plugins/meson.build deleted file mode 100644 index 0273086be9..0000000000 --- a/examples/static-plugins/meson.build +++ /dev/null @@ -1,6 +0,0 @@ -project('myapp', 'c') - -dep = dependency('gstreamer-full-1.0') -app = executable('myapp', 'main.c', dependencies : dep) - -test('test-gstreamer-full', app) diff --git a/meson.build b/meson.build index 39a336a77c..3a187b111e 100644 --- a/meson.build +++ b/meson.build @@ -337,6 +337,9 @@ foreach custom_subproj: get_option('custom_subprojects').split(',') endforeach message('Building subprojects: ' + ', '.join(subprojects_names)) + +subdir('tests') + setenv = find_program('gst-env.py') devenv_cmd = [setenv, '--builddir=@0@'.format(meson.build_root()), diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 0000000000..6884250f76 --- /dev/null +++ b/tests/meson.build @@ -0,0 +1,4 @@ +if get_option('tests').disabled() + subdir_done() +endif +subdir('static-plugins') diff --git a/tests/static-plugins/meson.build b/tests/static-plugins/meson.build new file mode 100644 index 0000000000..37b133672f --- /dev/null +++ b/tests/static-plugins/meson.build @@ -0,0 +1,6 @@ + +dep = dependency('gstreamer-full-1.0', required: get_option('default_library') == 'static') +if dep.found() + test_elements = executable('test-gst-full', 'test-gst-full.c', dependencies : gst_full_dep) + test('test-gst-full', test_elements) +endif diff --git a/tests/static-plugins/test-gst-full.c b/tests/static-plugins/test-gst-full.c new file mode 100644 index 0000000000..6ba1a2ab40 --- /dev/null +++ b/tests/static-plugins/test-gst-full.c @@ -0,0 +1,14 @@ +#include + +int +main (int argc, char *argv[]) +{ + GstElement *e; + + gst_init (&argc, &argv); + + e = gst_element_factory_make ("pipeline", NULL); + g_assert_nonnull (e); + g_object_unref (e); + +} From 05f70661792f3ccf314fc3326c958facee2c77d4 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Mon, 12 Oct 2020 13:24:14 +0100 Subject: [PATCH 395/448] subprojects: Update libwpe and wpebackend-fdo for fallback support Part-of: --- subprojects/libwpe.wrap | 2 +- subprojects/wpebackend-fdo.wrap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/subprojects/libwpe.wrap b/subprojects/libwpe.wrap index a3a1634140..ae3acc359a 100644 --- a/subprojects/libwpe.wrap +++ b/subprojects/libwpe.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=libwpe url=https://github.com/WebPlatformForEmbedded/libwpe -revision=e87c99f78fa0df4a05dc75185e6115351e42debb +revision=8cce32deb48b91f18c5e920fb3666dc409a11219 diff --git a/subprojects/wpebackend-fdo.wrap b/subprojects/wpebackend-fdo.wrap index 92d790aad0..a8a62ab894 100644 --- a/subprojects/wpebackend-fdo.wrap +++ b/subprojects/wpebackend-fdo.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=wpebackend-fdo url=https://github.com/Igalia/WPEBackend-FDO.git -revision=409af4493562c49196da5c9eace914ae10cfe9a3 +revision=3a76a810c0787ad5d515e49de50ffb956f3a04cd From 71616b93174dc2fa41a8379a492e871560ee98b7 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 13 Oct 2020 12:27:28 -0400 Subject: [PATCH 396/448] meson: Update expat.wrap with latest version It fixes missing exported symbols: https://github.com/mesonbuild/expat/commit/2602bd52eb7db804b5f0f988e293a1571b2b2709 Part-of: --- subprojects/expat.wrap | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/subprojects/expat.wrap b/subprojects/expat.wrap index b6efa5394c..c3648d8d07 100644 --- a/subprojects/expat.wrap +++ b/subprojects/expat.wrap @@ -1,10 +1,9 @@ [wrap-file] directory = expat-2.2.9 - source_url = https://github.com/libexpat/libexpat/releases/download/R_2_2_9/expat-2.2.9.tar.xz source_filename = expat-2.2.9.tar.bz2 source_hash = 1ea6965b15c2106b6bbe883397271c80dfa0331cdf821b2c319591b55eadc0a4 +patch_url = https://wrapdb.mesonbuild.com/v1/projects/expat/2.2.9/2/get_zip +patch_filename = expat-2.2.9-2-wrap.zip +patch_hash = 156420a117553817e751bf9406480614a88e104acb06b7054637f1d439246e5f -patch_url = https://wrapdb.mesonbuild.com/v1/projects/expat/2.2.9/1/get_zip -patch_filename = expat-2.2.9-1-wrap.zip -patch_hash = f2ea858f3cb00eed10e2502f4b97873a3788da19d9b944bcb3bb113c2db4e5f4 From d5dcbdb51bfee9c9b3085a62fbe30f6f457991ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Mon, 12 Oct 2020 17:46:04 +0200 Subject: [PATCH 397/448] gst-full: use a default version script Use a default version script instead of Bsymbolic to get rid of x264 and ffmpeg symbol relocation issue. https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/108 Export only glib and gstreamer symbols. Part-of: --- README.md | 3 ++- gstreamer-full-default.map | 10 ++++++++++ meson_options.txt | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 gstreamer-full-default.map diff --git a/README.md b/README.md index c9ca05158e..05e4c9def2 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,8 @@ One can use the `gst-full-version-script` option to pass a [version script](https://www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html) to the linker. This can be used to control the exact symbols that are exported by the gstreamer-full library, allowing the linker to garbage collect unused code -and so reduce the total library size. +and so reduce the total library size. A default script `gstreamer-full-default.map` +declares only glib/gstreamer symbols as public. This is an experimental feature, backward uncompatible changes could still be made in the future. diff --git a/gstreamer-full-default.map b/gstreamer-full-default.map new file mode 100644 index 0000000000..5fd04d07ff --- /dev/null +++ b/gstreamer-full-default.map @@ -0,0 +1,10 @@ +{ + global: + gst_*; + GST_*; + _gst_*; + g_*; + glib_*; + local: + *; +}; diff --git a/meson_options.txt b/meson_options.txt index a3b73a1538..1cc6c547b1 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -21,7 +21,7 @@ option('qt5', type : 'feature', value : 'auto', description : 'Qt5 Support') option('custom_subprojects', type : 'string', value : '', description : 'Comma-separated project names') option('gst-full-libraries', type : 'array', value : [], description : '''List of libraries to expose in gstreamer-full's ABI. gstreamer, glib and gobject are always included.''') -option('gst-full-version-script', type : 'string', value: '', +option('gst-full-version-script', type : 'string', value: 'gstreamer-full-default.map', description : 'path of the version script to be used by the linker, see https://www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html') # Common options, automatically inherited by subprojects From 751aacd8fc3acad27edb85da27e27f59f04b83ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Fri, 9 Oct 2020 18:17:03 +0200 Subject: [PATCH 398/448] Revert "gstreamer-full: Fix link with x264" This reverts commit e236d4f71a014cb26417428cc3dac881200e455d. Part-of: --- meson.build | 7 ------- 1 file changed, 7 deletions(-) diff --git a/meson.build b/meson.build index 3a187b111e..804c896d60 100644 --- a/meson.build +++ b/meson.build @@ -259,14 +259,7 @@ if get_option('default_library') == 'static' all_plugins_paths] ) - # Avoid a x264 link issue described here: https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/108 - # Similar issue has been found with VLC: https://mailman.videolan.org/pipermail/vlc-devel/2009-March/057640.html gstfull_link_args = [] - if cc.has_link_argument('-Wl,-Bsymbolic') - gstfull_link_args += ['-Wl,-Bsymbolic'] - endif - - # Get a list of libraries that needs to be exposed in the ABI. exposed_libs = [] incdir_deps = [] From 139fbac92e08b572925e37e807e3447c403a070b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Fri, 9 Oct 2020 12:58:07 +0200 Subject: [PATCH 399/448] gstreamer-full: add assert for global symbols Add _gst_caps_features_any not null assert Add _gst_caps_features_memory_system_memory as well A bug has been detected when using -Bsymbolic in the link of libgstreamer-full.so This flag has been introduced to fix this issue: https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/108 Part-of: --- tests/static-plugins/test-gst-full.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/static-plugins/test-gst-full.c b/tests/static-plugins/test-gst-full.c index 6ba1a2ab40..8b52e78108 100644 --- a/tests/static-plugins/test-gst-full.c +++ b/tests/static-plugins/test-gst-full.c @@ -7,8 +7,12 @@ main (int argc, char *argv[]) gst_init (&argc, &argv); + /* -Bsymbolic option is introducing a regression where this variable + * were duplicated over the use in a dynamical use of libgstreamer-full.so */ + g_assert_nonnull (_gst_caps_features_any); + g_assert_nonnull (_gst_caps_features_memory_system_memory); + e = gst_element_factory_make ("pipeline", NULL); g_assert_nonnull (e); g_object_unref (e); - } From f82527519cb62df8411e818f0c554a9d601a2a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Tue, 13 Oct 2020 16:31:57 +0200 Subject: [PATCH 400/448] gst-full: use '-Wl,-Bsymbolic-functions' to reduce footprint As most of the gst/glib modules, use this linker flag to reduce footprint. Part-of: --- meson.build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 804c896d60..725a91de8c 100644 --- a/meson.build +++ b/meson.build @@ -259,7 +259,8 @@ if get_option('default_library') == 'static' all_plugins_paths] ) - gstfull_link_args = [] + gstfull_link_args = cc.get_supported_link_arguments(['-Wl,-Bsymbolic-functions']) + # Get a list of libraries that needs to be exposed in the ABI. exposed_libs = [] incdir_deps = [] From a4f711e9e5ff2c6f6488e20e48a462890f31ffca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Tue, 20 Oct 2020 12:45:59 +0200 Subject: [PATCH 401/448] gst-full: add linker flag to keep gst_init_static_plugins In a fully static link where an app link with gstreamer-full the gst_init_static_plugins can be discarded because no one references it. Indeed the symbol is looked up by gst_init to call if it exists and so it is not clearly referenced. In order to avoid this issue, we use the linker flag --undefined=gst_init_static_plugins to keep the symbol. Part-of: --- meson.build | 1 + 1 file changed, 1 insertion(+) diff --git a/meson.build b/meson.build index 725a91de8c..010a0f4c04 100644 --- a/meson.build +++ b/meson.build @@ -318,6 +318,7 @@ if get_option('default_library') == 'static' ) pkgconfig.generate(gstfull, requires: glib_deps, + libraries_private: cc.get_supported_link_arguments(['-Wl,--undefined=gst_init_static_plugins']), subdirs : 'gstreamer-1.0') meson.override_dependency('gstreamer-full-1.0', gst_full_dep) endif From 8046eda879da51c4d5e30e402a6f6a30fb212327 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Mon, 30 Mar 2020 15:31:13 -0400 Subject: [PATCH 402/448] Meson: Use generated -uninstalled.pc files --- gst-env.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/gst-env.py b/gst-env.py index a94432b461..fcd7863aa2 100755 --- a/gst-env.py +++ b/gst-env.py @@ -359,7 +359,6 @@ def get_subprocess_env(options, gst_version): presets = set() encoding_targets = set() - pkg_dirs = set() python_dirs = setup_gdb(options) if '--installed' in subprocess.check_output(meson + ['introspect', '-h']).decode(): installed_s = subprocess.check_output(meson + ['introspect', options.builddir, '--installed']) @@ -388,11 +387,6 @@ def get_subprocess_env(options, gst_version): elif path.endswith('.gep'): encoding_targets.add( os.path.abspath(os.path.join(os.path.dirname(path), '..'))) - elif path.endswith('.pc'): - # Is there a -uninstalled pc file for this file? - uninstalled = "{0}-uninstalled.pc".format(path[:-3]) - if os.path.exists(uninstalled): - pkg_dirs.add(os.path.dirname(path)) if path.endswith('gstomx.conf'): prepend_env_var(env, 'GST_OMX_CONFIG_DIR', os.path.dirname(path), @@ -404,9 +398,6 @@ def get_subprocess_env(options, gst_version): for t in sorted(encoding_targets): prepend_env_var(env, 'GST_ENCODING_TARGET_PATH', t, options.sysroot) - for pkg_dir in sorted(pkg_dirs): - prepend_env_var(env, "PKG_CONFIG_PATH", pkg_dir, options.sysroot) - # Check if meson has generated -uninstalled pkgconfig files meson_uninstalled = pathlib.Path(options.builddir) / 'meson-uninstalled' if meson_uninstalled.is_dir(): From 2faa29909f4d4589e42ac886efb6a13d87b55407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 26 Oct 2020 12:13:12 +0000 Subject: [PATCH 403/448] libpsl.wrap: pin to 0.21.1 tag So build failures on master don't break our build and CI. https://github.com/rockdaboot/libpsl/pull/164 Part-of: --- subprojects/libpsl.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libpsl.wrap b/subprojects/libpsl.wrap index 350e22e317..745a39a15b 100644 --- a/subprojects/libpsl.wrap +++ b/subprojects/libpsl.wrap @@ -1,5 +1,5 @@ [wrap-git] directory=libpsl url=https://github.com/rockdaboot/libpsl.git -revision=master +revision=0.21.1 clone-recursive=true From 89176610d2a461536d1e3ccd2a10f266ac02b394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Tue, 27 Oct 2020 14:02:36 +0100 Subject: [PATCH 404/448] Revert "subprojects: orc: pin to 0.4.29 release" This reverts commit 8a2ac5c668e9cf65dbd905be9b9aa996ed420429. Part-of: --- subprojects/orc.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/orc.wrap b/subprojects/orc.wrap index aa184d467b..40fb220cbe 100644 --- a/subprojects/orc.wrap +++ b/subprojects/orc.wrap @@ -2,4 +2,4 @@ directory=orc url=https://gitlab.freedesktop.org/gstreamer/orc.git push-url=git@gitlab.freedesktop.org:gstreamer/orc.git -revision=0.4.29 +revision=master From 94260955ba9a5929b01e64b3094e760a24698ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Thu, 22 Oct 2020 11:55:43 +0200 Subject: [PATCH 405/448] gst-full: add warning for gst_init_static_plugins As some compiler might not supported -Wl,--undefined add a warning to the meson configure stage. Part-of: --- meson.build | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 010a0f4c04..ec582e239f 100644 --- a/meson.build +++ b/meson.build @@ -316,9 +316,13 @@ if get_option('default_library') == 'static' dependencies : incdir_deps + glib_deps, include_directories: include_directories('.') ) + gst_full_libs_private = cc.get_supported_link_arguments(['-Wl,--undefined=gst_init_static_plugins']) + if gst_full_libs_private == [] + warning('The compiler does not support `-Wl,--undefined` linker flag. The method `gst_init_static_plugins` might be dropped during the link stage of an application using libgstreamer-full-1.0.a, preventing plugins registration.') + endif pkgconfig.generate(gstfull, requires: glib_deps, - libraries_private: cc.get_supported_link_arguments(['-Wl,--undefined=gst_init_static_plugins']), + libraries_private: gst_full_libs_private, subdirs : 'gstreamer-1.0') meson.override_dependency('gstreamer-full-1.0', gst_full_dep) endif From eba05e57a6485268ae8941d18e4f2eef1de5ebf8 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Wed, 28 Oct 2020 16:14:41 +0100 Subject: [PATCH 406/448] subprojects: add webrtc-audio-processing.wrap Will be useful to build the iSAC plugin: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1124 Depends on https://gitlab.freedesktop.org/pulseaudio/webrtc-audio-processing/-/merge_requests/11 Part-of: --- subprojects/webrtc-audio-processing.wrap | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 subprojects/webrtc-audio-processing.wrap diff --git a/subprojects/webrtc-audio-processing.wrap b/subprojects/webrtc-audio-processing.wrap new file mode 100644 index 0000000000..ab47573d3d --- /dev/null +++ b/subprojects/webrtc-audio-processing.wrap @@ -0,0 +1,8 @@ +[wrap-git] +directory=webrtc-audio-processing +url=https://gitlab.freedesktop.org/pulseaudio/webrtc-audio-processing.git +push-url=git@gitlab.freedesktop.org:pulseaudio/webrtc-audio-processing.git +revision=master + +[provide] +dependency_names = webrtc-audio-coding-1, webrtc-audio-processing-1 \ No newline at end of file From 81c3c9175b6d0b43204e51aab615bb56e0a29ece Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 4 Nov 2020 16:00:14 +0530 Subject: [PATCH 407/448] meson: Do not add MSVC warnings flags globally These get added to *all* subprojects, including ones we do not maintain such as ffmpeg which then emits thousands of warnings that completely overwhelm the compile output. We will add these in each gstreamer subproject separately. Part-of: --- meson.build | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/meson.build b/meson.build index ec582e239f..c6e6b2adc0 100644 --- a/meson.build +++ b/meson.build @@ -57,13 +57,11 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif endif endif +endif - # Change some warning which belong to level 3 (production quality) or - # 4 (informational) to level 1 (severe) - add_global_arguments ( - '/w14062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled - '/w14101', # 'identifier' : unreferenced local variable - '/w14189', # 'identifier' : local variable is initialized but not referenced +# Ensure that MSVC interprets all source code as UTF-8 +if cc.get_id() == 'msvc' + add_global_arguments( cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 language: ['c', 'cpp']) endif From e3d694195f10091a0fbe6be6f34abc0646051072 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 4 Nov 2020 18:56:38 +0530 Subject: [PATCH 408/448] gitignore: Add new subprojects to ignore list Part-of: --- .gitignore | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9c7b3f7967..0113daff39 100644 --- a/.gitignore +++ b/.gitignore @@ -49,7 +49,7 @@ subprojects/libffi subprojects/libnice subprojects/libunwind subprojects/proxy-libintl -subprojects/zlib +subprojects/zlib-* subprojects/openh264 subprojects/pygobject subprojects/pycairo @@ -68,6 +68,22 @@ subprojects/libmicrodns subprojects/libpsl subprojects/libwpe subprojects/wpebackend-fdo +subprojects/cairo +subprojects/expat-* +subprojects/fontconfig +subprojects/freetype2 +subprojects/fribidi +subprojects/gobject-introspection.wrap +subprojects/gobject-introspection +subprojects/googletest-* +subprojects/gperf.wrap +subprojects/gperf +subprojects/gtest.wrap +subprojects/harfbuzz +subprojects/libpng-* +subprojects/libpng.wrap +subprojects/pango +subprojects/pixman prefix/ pygobject .gdbinit From 9898650a312f89df34566b95676741ae8df130ed Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 5 Nov 2020 13:08:37 +0530 Subject: [PATCH 409/448] meson: Update expat.wrap for MSVC fix This broke during the update in !206, and we didn't notice because the CI doesn't update --reset the wraps, which will be fixed by https://gitlab.freedesktop.org/gstreamer/gst-ci/-/merge_requests/375 Part-of: --- subprojects/expat.wrap | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/subprojects/expat.wrap b/subprojects/expat.wrap index c3648d8d07..79aa6ccd1e 100644 --- a/subprojects/expat.wrap +++ b/subprojects/expat.wrap @@ -3,7 +3,6 @@ directory = expat-2.2.9 source_url = https://github.com/libexpat/libexpat/releases/download/R_2_2_9/expat-2.2.9.tar.xz source_filename = expat-2.2.9.tar.bz2 source_hash = 1ea6965b15c2106b6bbe883397271c80dfa0331cdf821b2c319591b55eadc0a4 -patch_url = https://wrapdb.mesonbuild.com/v1/projects/expat/2.2.9/2/get_zip -patch_filename = expat-2.2.9-2-wrap.zip -patch_hash = 156420a117553817e751bf9406480614a88e104acb06b7054637f1d439246e5f - +patch_url = https://wrapdb.mesonbuild.com/v1/projects/expat/2.2.9/3/get_zip +patch_filename = expat-2.2.9-3-wrap.zip +patch_hash = e9aaace62e9a158b5e96f5c38c9f81f369179206acd87697653d777c0d3975d3 From 000b01c6f1cb76433271b82979db0bad7897edc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 7 Nov 2020 17:27:51 +0000 Subject: [PATCH 410/448] Add opus wrap Now that Meson build system support has been merged upstream. Part-of: --- subprojects/opus.wrap | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 subprojects/opus.wrap diff --git a/subprojects/opus.wrap b/subprojects/opus.wrap new file mode 100644 index 0000000000..f619646475 --- /dev/null +++ b/subprojects/opus.wrap @@ -0,0 +1,7 @@ +[wrap-git] +directory=opus +url=https://gitlab.xiph.org/xiph/opus.git +revision=master + +[provide] +opus=opus_dep From 52e7b2a8e039450bd15e812ada6bb0f53ce316e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Wed, 18 Nov 2020 10:44:34 +0100 Subject: [PATCH 411/448] gst-full: fix static build on Windows host Static build needs a version script which is not available on Windows. Need to implement use of def file. Part-of: --- meson.build | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index c6e6b2adc0..551000e3b8 100644 --- a/meson.build +++ b/meson.build @@ -293,10 +293,12 @@ if get_option('default_library') == 'static' link_arg = '-Wl,--version-script=' + symbol_map if cc.has_link_argument(link_arg) gstfull_link_args += link_arg + link_deps += symbol_map + elif cc.get_id() == 'msvc' + warning('FIXME: Provide a def file to publish the public symbols') else error('Failed to link with version script (' + symbol_map + '), check logs for details') endif - link_deps += symbol_map endif # Build both shared and static library From f0210bf92e4b957b8b9873a7fa211500189ca08c Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Thu, 3 Dec 2020 06:40:15 -0500 Subject: [PATCH 412/448] gitignore: Add the webrtc-audio-processing subproject Part-of: --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0113daff39..f25958b085 100644 --- a/.gitignore +++ b/.gitignore @@ -84,6 +84,7 @@ subprojects/libpng-* subprojects/libpng.wrap subprojects/pango subprojects/pixman +subprojects/webrtc-audio-processing prefix/ pygobject .gdbinit From b6f61768d381b91ce7cb9c0a568a524e85ce20cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Thu, 16 Jul 2020 13:18:38 +0200 Subject: [PATCH 413/448] gst-full: add 'gst-full-' features options These options allow to select a set of features from a given plugin with the following syntax: -Dgst-full-plugins=plugin1;plugin10 -Dgst-full-elements=plugin2:element1,element2 -Dgst-full-typefind-functions=plugins3:func -Dgst-full-device-providers=plugin4,dp1 -Dgst-full-dynamic-types=plugin5:dt1 By default all the enabled plugin are registered and gst-full-plugins will allow to include only a set of plugin If a feature(element, typefind etc.) is selected from a plugin, the plugin is removed from the plugins list. Part-of: --- README.md | 27 +++++++ meson.build | 19 ++++- meson_options.txt | 10 +++ scripts/generate_init_static_plugins.py | 99 ++++++++++++++++++++++--- 4 files changed, 141 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 05e4c9def2..ba62f4996e 100644 --- a/README.md +++ b/README.md @@ -138,6 +138,33 @@ the gstreamer-full library, allowing the linker to garbage collect unused code and so reduce the total library size. A default script `gstreamer-full-default.map` declares only glib/gstreamer symbols as public. +One can use the `gst-full-plugins` option to pass a list of plugins to be registered +in the gstreamer-full library. The default value is '*' which means that all the plugins selected +during the build process will be registered statically. An empty value will prevent any plugins to +be registered. + +One can select a specific set of features with `gst-full-elements`, `gst-full-typefind-functions`, `gst-full-device-providers` or `gst-full-dynamic-types` to select specific feature from a plugin. +When a feature has been listed in one of those options, the other features from its plugin will no longer be automatically included, even if the plugin is listed in `gst-full-plugins`. + +The user must insure that all selected plugins and features (element, typefind, etc.) have been +enabled during the build configuration. + +To register features, the syntax is the following: +plugins are separated by ';' and features from a plugin starts after ':' and are ',' separated. + +As an example: + * `-Dgst-full-plugins=coreelements;playback;typefindfunctions;alsa;pbtypes`: enable only `coreelements`, `playback`, `typefindfunctions`, `alsa`, `pbtypes` plugins. + * `-Dgst-full-elements=coreelements:filesrc,fakesink,identity;alsa:alsasrc`: enable only `filesrc`, `identity` and `fakesink` elements from `coreelements` and `alsasrc` element from `alsa` plugin. + * `-Dgst-full-typefind-functions=typefindfunctions:wav,flv`: enable only typefind func `wav` and `flv` from `typefindfunctions` + * `-Dgst-full-device-providers=alsa:alsadeviceprovider`: enable `alsadeviceprovider` from `alsa`. + * `-Dgst-full-dynamic-types=pbtypes:video_multiview_flagset`: enable `video_multiview_flagset` from `pbtypes + +All features from the `playback` plugin will be enabled and the other plugins will be restricted to the specific features requested. + +All the selected features will be registered into a dedicated `NULL` plugin name. + +This will cause the features/plugins that are not registered to not be included in the final gstreamer-full library. + This is an experimental feature, backward uncompatible changes could still be made in the future. diff --git a/meson.build b/meson.build index 551000e3b8..61373021f8 100644 --- a/meson.build +++ b/meson.build @@ -249,12 +249,27 @@ libraries_map = { if get_option('default_library') == 'static' # Generate a .c file which declare and register all built plugins + plugins_names = [] + foreach plugin: all_plugins + plugins_names += plugin.full_path() + endforeach + all_plugin_names = ';'.join(plugins_names) + + static_plugins = get_option('gst-full-plugins') + if static_plugins == '*' + static_plugins = all_plugin_names + endif generate_init_static_plugins = find_program('scripts/generate_init_static_plugins.py') init_static_plugins_c = configure_file( output: 'gstinitstaticplugins.c', command : [generate_init_static_plugins, - '@OUTPUT@', - all_plugins_paths] + '-o ' + '@OUTPUT@', + '-p ' + static_plugins, + '-e ' + get_option('gst-full-elements'), + '-t ' + get_option('gst-full-typefind-functions'), + '-d ' + get_option('gst-full-device-providers'), + '-T ' + get_option('gst-full-dynamic-types') + ] ) gstfull_link_args = cc.get_supported_link_arguments(['-Wl,-Bsymbolic-functions']) diff --git a/meson_options.txt b/meson_options.txt index 1cc6c547b1..818855a862 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -23,6 +23,16 @@ option('gst-full-libraries', type : 'array', value : [], description : '''List of libraries to expose in gstreamer-full's ABI. gstreamer, glib and gobject are always included.''') option('gst-full-version-script', type : 'string', value: 'gstreamer-full-default.map', description : 'path of the version script to be used by the linker, see https://www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html') +option('gst-full-plugins', type : 'string', value : '*', + description : '''List of plugins to expose in gstreamer-full's ABI with the syntax plugin1;plugin2. By default '*' will export all plugins enabled by the build process.''') +option('gst-full-elements', type : 'string', value : '', + description : '''List of elements to expose in gstreamer-full's ABI with the syntax plugin1;plugin2:element1,element2. By default '' will export all element of the enabled plugin.''') +option('gst-full-typefind-functions', type : 'string', value : '', + description : '''List of typefind functions to expose in gstreamer-full's ABI with the syntax plugin:func1,func2. By default '' will export all typefind functions of the enabled plugin.''') +option('gst-full-device-providers', type : 'string', value : '', + description : '''List of device providers to expose in gstreamer-full's ABI with the syntax plugin1:dp1;plugin2:dp1:dp2. By default '' will export all device provider of the enabled plugin.''') +option('gst-full-dynamic-types', type : 'string', value : '', + description : '''List of dynamic types to expose in gstreamer-full's ABI with the syntax plugin:dt1,dt2. By default '' will export all device provider of the enabled plugin.''') # Common options, automatically inherited by subprojects option('tests', type : 'feature', value : 'auto', description : 'Build tests') diff --git a/scripts/generate_init_static_plugins.py b/scripts/generate_init_static_plugins.py index 15725d8dc2..5d7af8b9b7 100644 --- a/scripts/generate_init_static_plugins.py +++ b/scripts/generate_init_static_plugins.py @@ -7,6 +7,10 @@ from string import Template TEMPLATE = Template(''' #include +$elements_declaration +$typefind_funcs_declaration +$device_providers_declaration +$dynamic_types_declaration $plugins_declaration void @@ -14,30 +18,101 @@ gst_init_static_plugins (void) { static gsize initialization_value = 0; if (g_once_init_enter (&initialization_value)) { + $elements_registration + $typefind_funcs_registration + $device_providers_registration + $dynamic_types_registration $plugins_registration + g_once_init_leave (&initialization_value, 1); } } ''') +# Retrieve the plugin name as it can be a plugin filename +def get_plugin_name(name): + for p in plugins: + if name in p: + return p + return '' + +def process_features(features_list, plugins, feature_prefix): + plugins_list = plugins + feature_declaration = [] + feature_registration = [] + if features_list is not None: + feature_plugins = features_list.split(';') + for plugin in feature_plugins: + split = plugin.split(':') + plugin_name = split[0].strip() + if len(split) == 2: + if (get_plugin_name(plugin_name)) != '': + plugins_list.remove(get_plugin_name(plugin_name)) + features = split[1].split(',') + for feature in features: + feature = feature.replace("-", "_") + feature_declaration += ['%s_REGISTER_DECLARE(%s);' % (feature_prefix, feature)] + feature_registration += ['%s_REGISTER(%s, NULL);' % (feature_prefix, feature)] + return (plugins_list, feature_declaration, feature_registration) if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument(dest="output", help="Output file") - parser.add_argument(dest="plugins", help="The list of plugins") - + parser.add_argument('-o', dest="output", help="Output file") + parser.add_argument('-p','--plugins', nargs='?', default='', dest="plugins", help="The list of plugins") + parser.add_argument('-e', '--elements', nargs='?', default='', dest="elements", help="The list of plugin:elements") + parser.add_argument('-t', '--type-finds', nargs='?', default='', dest="typefindfuncs", help="The list of plugin:typefinds") + parser.add_argument('-d', '--devide-providers', nargs='?', default='', dest="deviceproviders", help="The list of plugin:deviceproviders") + parser.add_argument('-T', '--dynamic-types', nargs='?', default='', dest="dynamictypes", help="The list of plugin:dynamictypes") options = parser.parse_args() + if options.output is None: + output_file = 'gstinitstaticplugins.c' + else: + output_file = options.output + enable_staticelements_plugin = 0; + elements_declaration = [] + elements_registration = [] + typefind_funcs_declaration = [] + typefind_funcs_registration = [] + device_providers_declaration = [] + device_providers_registration = [] + dynamic_types_declaration = [] + dynamic_types_registration = [] + plugins_declaration = [] + plugins_registration = [] - names = set() - for plugin in options.plugins.split(os.pathsep): + if options.plugins is None: + plugins = [] + else: + plugins = options.plugins.split(';') + + # process the features + (plugins, elements_declaration, elements_registration) = process_features(options.elements, plugins, 'GST_ELEMENT') + (plugins, typefind_funcs_declaration, typefind_funcs_registration) = process_features(options.typefindfuncs, plugins, 'GST_TYPE_FIND') + (plugins, device_providers_declaration, device_providers_registration) = process_features(options.deviceproviders, plugins, 'GST_DEVICE_PROVIDER') + (plugins, dynamic_types_declaration, dynamic_types_registration) = process_features(options.dynamictypes, plugins, 'GST_DYNAMIC_TYPE') + + # Enable plugin or elements according to the ';' separated list. + for plugin in plugins: + split = plugin.split(':') + plugin_name = split[0] + if plugin_name == '': + continue filename = os.path.basename(plugin) if filename.startswith('libgst') and filename.endswith('.a'): - names.add(filename[len('libgst'):-len('.a')]) + plugin_name = filename[len('libgst'):-len('.a')] + plugins_registration += ['GST_PLUGIN_STATIC_REGISTER(%s);' % (plugin_name)] + plugins_declaration += ['GST_PLUGIN_STATIC_DECLARE(%s);' % (plugin_name)] - registration = ['GST_PLUGIN_STATIC_REGISTER(%s);' % name for name in names] - declaration = ['GST_PLUGIN_STATIC_DECLARE(%s);' % name for name in names] - - with open(options.output, "w") as f: + with open(output_file.strip(), "w") as f: + static_elements_plugin = '' f.write(TEMPLATE.substitute({ - 'plugins_declaration': '\n'.join(declaration), - 'plugins_registration': '\n '.join(registration), + 'elements_declaration': '\n'.join(elements_declaration), + 'elements_registration': '\n '.join(elements_registration), + 'typefind_funcs_declaration': '\n'.join(typefind_funcs_declaration), + 'typefind_funcs_registration': '\n '.join(typefind_funcs_registration), + 'device_providers_declaration': '\n'.join(device_providers_declaration), + 'device_providers_registration': '\n '.join(device_providers_registration), + 'dynamic_types_declaration': '\n'.join(dynamic_types_declaration), + 'dynamic_types_registration': '\n '.join(dynamic_types_registration), + 'plugins_declaration': '\n'.join(plugins_declaration), + 'plugins_registration': '\n '.join(plugins_registration), })) From f0f0662d9d982fc48409734233e39cb68c324d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Fri, 9 Oct 2020 11:54:19 +0200 Subject: [PATCH 414/448] gst-full: add way to test features presence This test allows to test a list of features to be registered in the library (or not). Part-of: --- tests/static-plugins/meson.build | 6 +- tests/static-plugins/test-gst-full-features.c | 108 ++++++++++++++++++ 2 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 tests/static-plugins/test-gst-full-features.c diff --git a/tests/static-plugins/meson.build b/tests/static-plugins/meson.build index 37b133672f..227e9e4af9 100644 --- a/tests/static-plugins/meson.build +++ b/tests/static-plugins/meson.build @@ -1,6 +1,8 @@ dep = dependency('gstreamer-full-1.0', required: get_option('default_library') == 'static') if dep.found() - test_elements = executable('test-gst-full', 'test-gst-full.c', dependencies : gst_full_dep) - test('test-gst-full', test_elements) + test_gst_full_features = executable('test-gst-full-features', 'test-gst-full-features.c', dependencies : gst_full_dep) + test('test-gst-full-features', test_gst_full_features) + test_gst_full = executable('test-gst-full', 'test-gst-full.c', dependencies : gst_full_dep) + test('test-gst-full', test_gst_full) endif diff --git a/tests/static-plugins/test-gst-full-features.c b/tests/static-plugins/test-gst-full-features.c new file mode 100644 index 0000000000..5e8afbe14f --- /dev/null +++ b/tests/static-plugins/test-gst-full-features.c @@ -0,0 +1,108 @@ +#include + + +void +assert_feature_names (gchar * names, GType feature_type, gboolean spook) +{ + GstPluginFeature *feature = NULL; + gchar **split = NULL; + int i; + + if (names) + split = g_strsplit (names, ",", 0); + if (split) { + for (i = 0; split[i]; i++) { + feature = gst_registry_find_feature (gst_registry_get (), + split[i], feature_type); + if (spook) + g_assert_null (feature); + else + g_assert_nonnull (feature); + if (feature) + gst_object_unref (feature); + } + g_strfreev (split); + } +} + +int +main (int argc, char *argv[]) +{ + GOptionContext *ctx; + GError *err = NULL; + gchar *elements, *typefinds, *deviceproviders, *dynamictypes; + gchar *spook_elements, *spook_typefinds, *spook_deviceproviders, + *spook_dynamictypes; + + elements = typefinds = deviceproviders = dynamictypes = NULL; + spook_elements = spook_typefinds = spook_deviceproviders = + spook_dynamictypes = NULL; + + GOptionEntry options[] = { + {"elements", 'e', 0, G_OPTION_ARG_STRING, &elements, + "Element(s) which should be available. Specify multiple ones using ',' as separator", + NULL}, + {"spook-elements", 'E', 0, G_OPTION_ARG_STRING, &spook_elements, + "Element(s) which should NOT be available. Specify multiple ones using ',' as separator", + NULL}, + {"typefinds", 't', 0, G_OPTION_ARG_STRING, &typefinds, + "Typefind(s) which should be available. Specify multiple ones using ',' as separator", + NULL}, + {"spook-typefinds", 'T', 0, G_OPTION_ARG_STRING, &spook_typefinds, + "Typefind(s) which should NOT be available. Specify multiple ones using ',' as separator", + NULL}, + {"deviceproviders", 'd', 0, G_OPTION_ARG_STRING, &deviceproviders, + "Deviceprovider(s) which should be available. Specify multiple ones using ',' as separator", + NULL}, + {"spook-deviceproviders", 'D', 0, G_OPTION_ARG_STRING, + &spook_deviceproviders, + "Deviceprovider(s) which should NOT be available. Specify multiple ones using ',' as separator", + NULL}, + {"dynamictypes", 'l', 0, G_OPTION_ARG_STRING, &dynamictypes, + "Dynamictype(s) which should be available. Specify multiple ones using ',' as separator", + NULL}, + {"spook-dynamictypes", 'L', 0, G_OPTION_ARG_STRING, &spook_dynamictypes, + "Dynamictype(s) which should NOT be available. Specify multiple ones using ',' as separator", + NULL}, + {NULL} + }; + ctx = g_option_context_new ("elements ..."); + g_option_context_add_main_entries (ctx, options, NULL); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { + g_print ("Error initializing: %s\n", GST_STR_NULL (err->message)); + g_clear_error (&err); + g_option_context_free (ctx); + return 1; + } + g_option_context_free (ctx); + + gst_init (&argc, &argv); + + /* Test that elements are instanciable. */ + assert_feature_names (elements, GST_TYPE_ELEMENT_FACTORY, FALSE); + /* Test that elements are NOT instanciable. */ + assert_feature_names (spook_elements, GST_TYPE_ELEMENT_FACTORY, TRUE); + + /* Test that typefinds are instanciable. */ + assert_feature_names (typefinds, GST_TYPE_TYPE_FIND_FACTORY, FALSE); + /* Test that typefinds are NOT instanciable. */ + assert_feature_names (spook_typefinds, GST_TYPE_TYPE_FIND_FACTORY, TRUE); + + /* Test that device providers are instanciable. */ + assert_feature_names (deviceproviders, GST_TYPE_DEVICE_PROVIDER_FACTORY, + FALSE); + /* Test that device providers are NOT instanciable. */ + assert_feature_names (spook_deviceproviders, GST_TYPE_DEVICE_PROVIDER_FACTORY, + TRUE); + + /* Test that dynamic types are instanciable. */ + assert_feature_names (dynamictypes, GST_TYPE_DYNAMIC_TYPE_FACTORY, FALSE); + /* Test that dynamic types are NOT instanciable. */ + assert_feature_names (spook_dynamictypes, GST_TYPE_DYNAMIC_TYPE_FACTORY, + TRUE); + + gst_deinit (); + + return 0; +} From a64eacd73b7ecdd3b3ef113f2f7800b581b1e660 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 27 Oct 2020 09:45:32 -0400 Subject: [PATCH 415/448] meson: Update zlib.wrap to use wrapdb instead of github fork Part-of: --- subprojects/zlib.wrap | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/subprojects/zlib.wrap b/subprojects/zlib.wrap index de1e861e1e..ce20fb0532 100644 --- a/subprojects/zlib.wrap +++ b/subprojects/zlib.wrap @@ -1,4 +1,12 @@ -[wrap-git] -directory=zlib -url=https://github.com/centricular/zlib.git -revision=meson +[wrap-file] +directory = zlib-1.2.11 +source_url = http://zlib.net/fossils/zlib-1.2.11.tar.gz +source_filename = zlib-1.2.11.tar.gz +source_hash = c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 +patch_url = https://wrapdb.mesonbuild.com/v1/projects/zlib/1.2.11/5/get_zip +patch_filename = zlib-1.2.11-5-wrap.zip +patch_hash = 728c8e24acbc2e6682fbd950fec39e2fc77528af361adb87259f8a8511434004 + +[provide] +zlib = zlib_dep + From 334fdf5c3a7b9b52d246df9ba04636a423a82a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 14 Jan 2021 19:16:01 +0000 Subject: [PATCH 416/448] subprojects: add libdv wrap Part-of: --- subprojects/dv.wrap | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 subprojects/dv.wrap diff --git a/subprojects/dv.wrap b/subprojects/dv.wrap new file mode 100644 index 0000000000..429708da5e --- /dev/null +++ b/subprojects/dv.wrap @@ -0,0 +1,7 @@ +[wrap-git] +directory=dv +url=https://gitlab.freedesktop.org/gstreamer/meson-ports/libdv.git +revision=meson + +[provide] +libdv=dv_dep From d3c4043db3833ec758093d40fe255518059baf5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 14 Jan 2021 19:18:26 +0000 Subject: [PATCH 417/448] .gitignore: add more subproject checkouts Part-of: --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f25958b085..4d96d77f54 100644 --- a/.gitignore +++ b/.gitignore @@ -49,7 +49,7 @@ subprojects/libffi subprojects/libnice subprojects/libunwind subprojects/proxy-libintl -subprojects/zlib-* +subprojects/zlib* subprojects/openh264 subprojects/pygobject subprojects/pycairo @@ -85,6 +85,8 @@ subprojects/libpng.wrap subprojects/pango subprojects/pixman subprojects/webrtc-audio-processing +subprojects/dv +subprojects/opus prefix/ pygobject .gdbinit From d5b6cc88f9308bfd73d9f9f7a2ef586ee1d1c79d Mon Sep 17 00:00:00 2001 From: Andrey Moiseev Date: Mon, 5 Apr 2021 07:00:34 +0000 Subject: [PATCH 418/448] gst-env: Windows: Fix looking for cmd_or_ps.ps1 in the wrong directory At the point of get_windows_shell() execution, the current directory equals DEFAULT_BUILDDIR=./build. But cmd_or_ps.ps1 is in SCRIPTDIR=./ (repo root). Point subprocess.check_output() to the correct directory. Part-of: --- gst-env.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-env.py b/gst-env.py index fcd7863aa2..0fa40f598c 100755 --- a/gst-env.py +++ b/gst-env.py @@ -433,7 +433,7 @@ def get_subprocess_env(options, gst_version): def get_windows_shell(): command = ['powershell.exe' ,'-noprofile', '-executionpolicy', 'bypass', '-file', 'cmd_or_ps.ps1'] - result = subprocess.check_output(command) + result = subprocess.check_output(command, cwd=SCRIPTDIR) return result.decode().strip() if __name__ == "__main__": From 468232b6bc498449bc9e1d733012733f7ebd1077 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 8 Apr 2021 15:21:07 +0530 Subject: [PATCH 419/448] git-update: Make fetching of external repos non-fatal on the CI Fixes intermittent failures when external repos have downtime. This is common with GNOME Gitlab. Only error out on CI if a FDO gitlab repo fails to fetch. Part-of: --- git-update | 19 +++++++++++++++++-- scripts/common.py | 15 +++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/git-update b/git-update index 03ce87f7a0..f295db0dbd 100755 --- a/git-update +++ b/git-update @@ -14,6 +14,7 @@ from scripts.common import get_meson SCRIPTDIR = os.path.normpath(os.path.dirname(__file__)) # Force a checkout to happen and throw away local changes FORCE_CHECKOUT = False +CI = os.environ.get('CI', False) def manifest_get_commits(manifest): @@ -83,21 +84,35 @@ def check_repo_status(repo_name, worktree_dir): branch_message[0].strip(), repo_status(commit_message))) return True +def fatal_git_fetches(repo_dir): + ''' + When running on the CI, we usually have a cache, in which case we don't + want the git update to be fatal since we don't want our CI to fail when + there's downtime on external repos. + ''' + if not CI: + return True + remote = git("remote", "get-url", "origin", repository_path=repo_dir) + if 'gitlab.freedesktop.org' in remote: + return True + return False + def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0, status=False): if status: return check_repo_status(repo_name, repo_dir) revision = ensure_revision_if_necessary(repo_dir, revision) git("config", "rebase.autoStash", "true", repository_path=repo_dir) + fatal = fatal_git_fetches(repo_dir) try: if revision: print("Checking out %s in %s" % (revision, repo_name)) - git("fetch", *fetch_args, repository_path=repo_dir) + git("fetch", *fetch_args, repository_path=repo_dir, fatal=fatal) checkout_args = ["--force"] if FORCE_CHECKOUT else [] checkout_args += ["--detach", revision] git("checkout", *checkout_args, repository_path=repo_dir) else: print("Updating branch %s in %s" % (get_branch_name(repo_dir), repo_name)) - git("pull", "--rebase", repository_path=repo_dir) + git("pull", "--rebase", repository_path=repo_dir, fatal=fatal) git("submodule", "update", repository_path=repo_dir) except Exception as e: out = getattr(e, "output", b"").decode() diff --git a/scripts/common.py b/scripts/common.py index f9c19850d2..ec0cc707db 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -113,10 +113,17 @@ class Colors: -def git(*args, repository_path='.'): - return subprocess.check_output(["git"] + list(args), cwd=repository_path, - stdin=subprocess.DEVNULL, - stderr=subprocess.STDOUT).decode() +def git(*args, repository_path='.', fatal=True): + try: + ret = subprocess.check_output(["git"] + list(args), cwd=repository_path, + stdin=subprocess.DEVNULL, + stderr=subprocess.STDOUT).decode() + except subprocess.CalledProcessError as e: + if fatal: + raise e + print("Non-fatal error running git {}:\n{}".format(' '.join(args), e)) + return None + return ret def accept_command(commands): """Search @commands and returns the first found absolute path.""" From ce79200376374b3006b3cddcd9fe1a559b9d6a20 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 12 Apr 2021 00:09:17 +0100 Subject: [PATCH 420/448] subprojects: Update glib to 2.68 and glib-networking to 2.66 branch Part-of: --- subprojects/glib-networking.wrap | 2 +- subprojects/glib.wrap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/subprojects/glib-networking.wrap b/subprojects/glib-networking.wrap index 4321af57b5..5e17cf8e8c 100644 --- a/subprojects/glib-networking.wrap +++ b/subprojects/glib-networking.wrap @@ -2,4 +2,4 @@ directory=glib-networking url=https://gitlab.gnome.org/GNOME/glib-networking.git push-url=git@gitlab.gnome.org:GNOME/glib-networking.git -revision=glib-2-62 +revision=glib-2-66 diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index 46a1fc95b3..1dfaae01b7 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -2,4 +2,4 @@ directory=glib url=https://gitlab.gnome.org/GNOME/glib.git push-url=git@gitlab.gnome.org:GNOME/glib.git -revision=glib-2-62 +revision=glib-2-68 From e4421c3c90eff66131c107049bd77aa29bc9cace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Fri, 26 Feb 2021 11:13:45 +0100 Subject: [PATCH 421/448] bash-completion: add completion for gstreamer tools Allow to autocomplete with elements/properties in the devenv using gst-launch-1.0 etc. Part-of: --- gst-env.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/gst-env.py b/gst-env.py index 0fa40f598c..42907fa747 100755 --- a/gst-env.py +++ b/gst-env.py @@ -43,6 +43,18 @@ SHAREDLIB_REG = re.compile(r'\.so|\.dylib|\.dll') GSTPLUGIN_FILEPATH_REG_TEMPLATE = r'.*/{libdir}/gstreamer-1.0/[^/]+$' GSTPLUGIN_FILEPATH_REG = None +BC_RC = ''' +BASH_COMPLETION_SCRIPTS="{bash_completions}" +BASH_COMPLETION_PATHS="{bash_completions_paths}" +for p in $BASH_COMPLETION_PATHS; do +for f in $BASH_COMPLETION_SCRIPTS; do + [ -f "$p/$f" ] && . "$p/$f" +done +done +''' +BASH_COMPLETION_PATHS = [SCRIPTDIR + '/subprojects/gstreamer/data/bash-completion/completions'] +BASH_COMPLETION_PATHS += [SCRIPTDIR + '/subprojects/gst-devtools/validate/data/bash-completion/completions'] + def listify(o): if isinstance(o, str): return [o] @@ -219,6 +231,8 @@ def setup_gdb(options): return python_paths +def is_bash_completion_available (options): + return os.path.exists(os.path.join(options.builddir, 'subprojects/gstreamer/data/bash-completion/helpers/gst')) def get_subprocess_env(options, gst_version): env = os.environ.copy() @@ -504,6 +518,14 @@ if __name__ == "__main__": shutil.copyfileobj(src, tmprc) tmprc.write('\nexport PS1="[gst-%s] $PS1"' % gst_version) tmprc.flush() + if is_bash_completion_available(options): + bash_completions_files = [] + for p in BASH_COMPLETION_PATHS: + if os.path.exists(p): + bash_completions_files += os.listdir(path=p) + bc_rc = BC_RC.format(bash_completions=' '.join(bash_completions_files), bash_completions_paths=' '.join(BASH_COMPLETION_PATHS)) + tmprc.write(bc_rc) + tmprc.flush() args.append("--rcfile") args.append(tmprc.name) elif args[0].endswith('fish'): From e43985d8bb205346a20e73fa5daf4c1a0fd48725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Fri, 30 Apr 2021 17:37:31 -0400 Subject: [PATCH 422/448] devenv: Add webrtc testsuite to paths This makes it a little easier to run it. Part-of: --- gst-env.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/gst-env.py b/gst-env.py index 42907fa747..693d21b7c0 100755 --- a/gst-env.py +++ b/gst-env.py @@ -239,18 +239,27 @@ def get_subprocess_env(options, gst_version): env["CURRENT_GST"] = os.path.normpath(SCRIPTDIR) env["GST_VERSION"] = gst_version - env["GST_VALIDATE_SCENARIOS_PATH"] = os.path.normpath( - "%s/subprojects/gst-devtools/validate/data/scenarios" % SCRIPTDIR) + prepend_env_var (env, "GST_VALIDATE_SCENARIOS_PATH", os.path.normpath( + "%s/subprojects/gst-devtools/validate/data/scenarios" % SCRIPTDIR), + options.sysroot) env["GST_VALIDATE_PLUGIN_PATH"] = os.path.normpath( "%s/subprojects/gst-devtools/validate/plugins" % options.builddir) - env["GST_VALIDATE_APPS_DIR"] = os.path.normpath( - "%s/subprojects/gst-editing-services/tests/validate" % SCRIPTDIR) + prepend_env_var (env, "GST_VALIDATE_APPS_DIR", os.path.normpath( + "%s/subprojects/gst-editing-services/tests/validate" % SCRIPTDIR), + options.sysroot) env["GST_ENV"] = 'gst-' + gst_version env["GST_REGISTRY"] = os.path.normpath(options.builddir + "/registry.dat") prepend_env_var(env, "PATH", os.path.normpath( "%s/subprojects/gst-devtools/validate/tools" % options.builddir), options.sysroot) + prepend_env_var (env, "GST_VALIDATE_SCENARIOS_PATH", os.path.normpath( + "%s/subprojects/gst-examples/webrtc/check/validate/scenarios" % + SCRIPTDIR), options.sysroot) + prepend_env_var (env, "GST_VALIDATE_APPS_DIR", os.path.normpath( + "%s/subprojects/gst-examples/webrtc/check/validate/apps" % + SCRIPTDIR), options.sysroot) + if options.wine: return get_wine_subprocess_env(options, env) From cb74a24fbdde07cc5703c290babb46a01b9e5db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Fri, 30 Apr 2021 11:08:10 +0200 Subject: [PATCH 423/448] gstreamer-full: error about introspection The introspection feature is not supported yet in static build. Needs https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/167/diffs Part-of: --- meson.build | 3 +++ 1 file changed, 3 insertions(+) diff --git a/meson.build b/meson.build index 61373021f8..0cd65ecd6f 100644 --- a/meson.build +++ b/meson.build @@ -248,6 +248,9 @@ libraries_map = { } if get_option('default_library') == 'static' + if not get_option('introspection').disabled() + error('GObject Introspection is not supported in static builds. Please use -Dintrospection=disabled') + endif # Generate a .c file which declare and register all built plugins plugins_names = [] foreach plugin: all_plugins From 23f4266bbd345aeacc1934d4900939cdcbd0818a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Tue, 18 May 2021 14:30:33 +0200 Subject: [PATCH 424/448] gstreamer-full: fix empty -Dgst-full-plugins= When this option was given empty, when for example we don't want any plugin in gstreamer full, the build process was failing because an empty plugin was created in gstinitstaticplugins.c. Part-of: --- scripts/generate_init_static_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/generate_init_static_plugins.py b/scripts/generate_init_static_plugins.py index 5d7af8b9b7..230929fc91 100644 --- a/scripts/generate_init_static_plugins.py +++ b/scripts/generate_init_static_plugins.py @@ -79,7 +79,7 @@ if __name__ == "__main__": plugins_declaration = [] plugins_registration = [] - if options.plugins is None: + if options.plugins is None or options.plugins.isspace(): plugins = [] else: plugins = options.plugins.split(';') From 3804f23e3f46b4d294d1b11c01e080cd9f142fb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 1 Jun 2021 00:17:06 +0100 Subject: [PATCH 425/448] Release 1.19.1 --- meson.build | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-docs.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-examples.wrap | 2 +- subprojects/gst-integration-testsuites.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index 0cd65ecd6f..de8ecdc247 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.19.0.1', + version : '1.19.1', meson_version : '>= 0.54.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index 3ad4f0fce3..d0d21bf2dd 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap index 60609394f9..03c08dc349 100644 --- a/subprojects/gst-docs.wrap +++ b/subprojects/gst-docs.wrap @@ -2,4 +2,4 @@ directory=gst-docs url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index 0e3510a56f..dbbe9022e1 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap index 50624b4393..ff11cb9dbf 100644 --- a/subprojects/gst-examples.wrap +++ b/subprojects/gst-examples.wrap @@ -2,4 +2,4 @@ directory=gst-examples url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap index 357edc2d9f..797fb5dc12 100644 --- a/subprojects/gst-integration-testsuites.wrap +++ b/subprojects/gst-integration-testsuites.wrap @@ -2,4 +2,4 @@ directory=gst-integration-testsuites url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index d01154348a..74393cbc4d 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index d5ba267d17..3ddd3b14bb 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 7d3a04af64..55a8101489 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 705662d731..0c866a4718 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index 7ed12291ce..e72b952057 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index bab6ef61be..f581512206 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 2b3e87a738..6b10ee862e 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=master +revision=1.19.1 diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index c7b473b3b2..f5fc0de520 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=master +revision=1.19.1 diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index a14dab93a9..49c03370bc 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=master +revision=1.19.1 diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index 8765f69928..e94537f300 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=master +revision=1.19.1 diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 85aa7f483a..7a7d3c434a 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=master +revision=1.19.1 From 723478b6bee99d2cc5fbff7788afc600d5d7fe82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 1 Jun 2021 15:34:41 +0100 Subject: [PATCH 426/448] Back to development --- meson.build | 2 +- subprojects/gst-devtools.wrap | 2 +- subprojects/gst-docs.wrap | 2 +- subprojects/gst-editing-services.wrap | 2 +- subprojects/gst-examples.wrap | 2 +- subprojects/gst-integration-testsuites.wrap | 2 +- subprojects/gst-libav.wrap | 2 +- subprojects/gst-omx.wrap | 2 +- subprojects/gst-plugins-bad.wrap | 2 +- subprojects/gst-plugins-base.wrap | 2 +- subprojects/gst-plugins-good.wrap | 2 +- subprojects/gst-plugins-ugly.wrap | 2 +- subprojects/gst-python.wrap | 2 +- subprojects/gst-rtsp-server.wrap | 2 +- subprojects/gstreamer-sharp.wrap | 2 +- subprojects/gstreamer-vaapi.wrap | 2 +- subprojects/gstreamer.wrap | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/meson.build b/meson.build index de8ecdc247..fe450f14c6 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('All GStreamer modules', 'c', - version : '1.19.1', + version : '1.19.1.1', meson_version : '>= 0.54.0', default_options : ['buildtype=debugoptimized']) diff --git a/subprojects/gst-devtools.wrap b/subprojects/gst-devtools.wrap index d0d21bf2dd..3ad4f0fce3 100644 --- a/subprojects/gst-devtools.wrap +++ b/subprojects/gst-devtools.wrap @@ -2,4 +2,4 @@ directory=gst-devtools url=https://gitlab.freedesktop.org/gstreamer/gst-devtools.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-devtools.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-docs.wrap b/subprojects/gst-docs.wrap index 03c08dc349..60609394f9 100644 --- a/subprojects/gst-docs.wrap +++ b/subprojects/gst-docs.wrap @@ -2,4 +2,4 @@ directory=gst-docs url=https://gitlab.freedesktop.org/gstreamer/gst-docs.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-docs.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-editing-services.wrap b/subprojects/gst-editing-services.wrap index dbbe9022e1..0e3510a56f 100644 --- a/subprojects/gst-editing-services.wrap +++ b/subprojects/gst-editing-services.wrap @@ -2,4 +2,4 @@ directory=gst-editing-services url=https://gitlab.freedesktop.org/gstreamer/gst-editing-services.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-editing-services.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-examples.wrap b/subprojects/gst-examples.wrap index ff11cb9dbf..50624b4393 100644 --- a/subprojects/gst-examples.wrap +++ b/subprojects/gst-examples.wrap @@ -2,4 +2,4 @@ directory=gst-examples url=https://gitlab.freedesktop.org/gstreamer/gst-examples.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-examples.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-integration-testsuites.wrap b/subprojects/gst-integration-testsuites.wrap index 797fb5dc12..357edc2d9f 100644 --- a/subprojects/gst-integration-testsuites.wrap +++ b/subprojects/gst-integration-testsuites.wrap @@ -2,4 +2,4 @@ directory=gst-integration-testsuites url=https://gitlab.freedesktop.org/gstreamer/gst-integration-testsuites.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-integration-testsuites.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-libav.wrap b/subprojects/gst-libav.wrap index 74393cbc4d..d01154348a 100644 --- a/subprojects/gst-libav.wrap +++ b/subprojects/gst-libav.wrap @@ -2,4 +2,4 @@ directory=gst-libav url=https://gitlab.freedesktop.org/gstreamer/gst-libav.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-libav.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-omx.wrap b/subprojects/gst-omx.wrap index 3ddd3b14bb..d5ba267d17 100644 --- a/subprojects/gst-omx.wrap +++ b/subprojects/gst-omx.wrap @@ -2,4 +2,4 @@ directory=gst-omx url=https://gitlab.freedesktop.org/gstreamer/gst-omx.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-omx.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-plugins-bad.wrap b/subprojects/gst-plugins-bad.wrap index 55a8101489..7d3a04af64 100644 --- a/subprojects/gst-plugins-bad.wrap +++ b/subprojects/gst-plugins-bad.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-bad url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-bad.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-plugins-base.wrap b/subprojects/gst-plugins-base.wrap index 0c866a4718..705662d731 100644 --- a/subprojects/gst-plugins-base.wrap +++ b/subprojects/gst-plugins-base.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-base url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-base.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-plugins-good.wrap b/subprojects/gst-plugins-good.wrap index e72b952057..7ed12291ce 100644 --- a/subprojects/gst-plugins-good.wrap +++ b/subprojects/gst-plugins-good.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-good url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-good.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-plugins-ugly.wrap b/subprojects/gst-plugins-ugly.wrap index f581512206..bab6ef61be 100644 --- a/subprojects/gst-plugins-ugly.wrap +++ b/subprojects/gst-plugins-ugly.wrap @@ -2,4 +2,4 @@ directory=gst-plugins-ugly url=https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-plugins-ugly.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-python.wrap b/subprojects/gst-python.wrap index 6b10ee862e..2b3e87a738 100644 --- a/subprojects/gst-python.wrap +++ b/subprojects/gst-python.wrap @@ -2,4 +2,4 @@ directory=gst-python url=https://gitlab.freedesktop.org/gstreamer/gst-python.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-python.git -revision=1.19.1 +revision=master diff --git a/subprojects/gst-rtsp-server.wrap b/subprojects/gst-rtsp-server.wrap index f5fc0de520..c7b473b3b2 100644 --- a/subprojects/gst-rtsp-server.wrap +++ b/subprojects/gst-rtsp-server.wrap @@ -2,4 +2,4 @@ directory=gst-rtsp-server url=https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git push-url=git@gitlab.freedesktop.org:gstreamer/gst-rtsp-server.git -revision=1.19.1 +revision=master diff --git a/subprojects/gstreamer-sharp.wrap b/subprojects/gstreamer-sharp.wrap index 49c03370bc..a14dab93a9 100644 --- a/subprojects/gstreamer-sharp.wrap +++ b/subprojects/gstreamer-sharp.wrap @@ -2,4 +2,4 @@ directory=gstreamer-sharp url=https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-sharp.git -revision=1.19.1 +revision=master diff --git a/subprojects/gstreamer-vaapi.wrap b/subprojects/gstreamer-vaapi.wrap index e94537f300..8765f69928 100644 --- a/subprojects/gstreamer-vaapi.wrap +++ b/subprojects/gstreamer-vaapi.wrap @@ -2,4 +2,4 @@ directory=gstreamer-vaapi url=https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer-vaapi.git -revision=1.19.1 +revision=master diff --git a/subprojects/gstreamer.wrap b/subprojects/gstreamer.wrap index 7a7d3c434a..85aa7f483a 100644 --- a/subprojects/gstreamer.wrap +++ b/subprojects/gstreamer.wrap @@ -2,4 +2,4 @@ directory=gstreamer url=https://gitlab.freedesktop.org/gstreamer/gstreamer.git push-url=git@gitlab.freedesktop.org:gstreamer/gstreamer.git -revision=1.19.1 +revision=master From 227c137692b4987112eff55ab7de28ec7f7ec6db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 5 Jun 2021 19:09:18 +0100 Subject: [PATCH 427/448] subprojects: update harfbuzz branch ref after rename Part-of: --- subprojects/harfbuzz.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/harfbuzz.wrap b/subprojects/harfbuzz.wrap index 6fdcb63352..10b770d424 100644 --- a/subprojects/harfbuzz.wrap +++ b/subprojects/harfbuzz.wrap @@ -2,5 +2,5 @@ directory=harfbuzz url=https://github.com/harfbuzz/harfbuzz.git push-url=git@github.com:harfbuzz/harfbuzz.git -revision=master +revision=main depth=1 From 16767263320f89871bb9ab4506e19721deb5168d Mon Sep 17 00:00:00 2001 From: Antonio Ospite Date: Mon, 7 Jun 2021 10:42:05 +0200 Subject: [PATCH 428/448] subprojects: update glib-networking.wrap to use the 2.68 branch glib-networking fixed some issues when building with older libssl version in the 2.68 release, update the wrap file to use the newer version. In particular this fixes building on Ubuntu 16.04 with: meson --wrap-mode=forcefallback Part-of: --- subprojects/glib-networking.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/glib-networking.wrap b/subprojects/glib-networking.wrap index 5e17cf8e8c..1c40da12c9 100644 --- a/subprojects/glib-networking.wrap +++ b/subprojects/glib-networking.wrap @@ -2,4 +2,4 @@ directory=glib-networking url=https://gitlab.gnome.org/GNOME/glib-networking.git push-url=git@gitlab.gnome.org:GNOME/glib-networking.git -revision=glib-2-66 +revision=glib-2-68 From 2f4635091025d78d8d73e830c0a895c8b72a2e1a Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 17 Jun 2021 21:41:10 -0400 Subject: [PATCH 429/448] git-update: Respect specified revision from manifest for gst-build This broke in b9acfcace892d4b797454661dc87917d681d4e83 Part-of: --- git-update | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-update b/git-update index f295db0dbd..487047d8ee 100755 --- a/git-update +++ b/git-update @@ -211,7 +211,7 @@ if __name__ == "__main__": repos_commits = {} revision, args = repos_commits.get('gst-build', [None, []]) - if not update_repo('gst-build', SCRIPTDIR, None, options.no_interaction, args, status=options.status): + if not update_repo('gst-build', SCRIPTDIR, revision, options.no_interaction, args, status=options.status): exit(1) if not update_subprojects(options.manifest, options.no_interaction, status=options.status): exit(1) From 1dcdcc9b68e611900b1375c9c4c9629f84d82c58 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Wed, 30 Jun 2021 10:01:04 -0400 Subject: [PATCH 430/448] Fix fontconfig wrap revision The project now uses main in replacement for master. --- subprojects/fontconfig.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/fontconfig.wrap b/subprojects/fontconfig.wrap index 35f6b17c85..960a0e5678 100644 --- a/subprojects/fontconfig.wrap +++ b/subprojects/fontconfig.wrap @@ -3,4 +3,4 @@ directory=fontconfig url=https://gitlab.freedesktop.org/fontconfig/fontconfig push-url=git@gitlab.freedesktop.org:fontconfig/fontconfig.git depth=1 -revision=master +revision=main From 765fc5703bccf14a92829b84e1eb4cb17df4ff92 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Fri, 2 Apr 2021 14:50:55 +0300 Subject: [PATCH 431/448] harfbuzz.wrap: Use the latest tag instead of tip of git Part-of: --- subprojects/harfbuzz.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/harfbuzz.wrap b/subprojects/harfbuzz.wrap index 10b770d424..f7f31732d1 100644 --- a/subprojects/harfbuzz.wrap +++ b/subprojects/harfbuzz.wrap @@ -2,5 +2,5 @@ directory=harfbuzz url=https://github.com/harfbuzz/harfbuzz.git push-url=git@github.com:harfbuzz/harfbuzz.git -revision=main +revision=2.8.1 depth=1 From e8d09435ae7062464d192a0ced11ce69628240d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Tue, 20 Jul 2021 09:48:23 +0200 Subject: [PATCH 432/448] gitlab: add a gitlab issue template for bug To clarify what is expected in an issue description and avoid issue which is just an usage issue, add a bug template in gitlab. Part-of: --- .gitlab/issue_templates/Bug.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .gitlab/issue_templates/Bug.md diff --git a/.gitlab/issue_templates/Bug.md b/.gitlab/issue_templates/Bug.md new file mode 100644 index 0000000000..71c79ac67f --- /dev/null +++ b/.gitlab/issue_templates/Bug.md @@ -0,0 +1,32 @@ +### Describe your issue + + + +#### Expected Behavior + + +#### Observed Behavior + + +#### Setup +- **Operating System:** +- **Device:** Computer / Tablet / Mobile / Virtual Machine +- **GStreamer Version:** +- **Command line:** + +### Steps to reproduce the bug + +1. open terminal +2. type `command` + +### How reproducible is the bug? + + +### Screenshots if relevant + +### Solutions you have tried + +### Related non-duplicate issues + +### Additional Information + From fbc0fa0086c464e3219bba3b53be3ff7ce1f4f04 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Sat, 31 Jul 2021 23:11:02 +0900 Subject: [PATCH 433/448] subprojects: Add libjpeg-turbo wrap Would be useful for Windows Part-of: --- .gitignore | 1 + subprojects/libjpeg-turbo.wrap | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 subprojects/libjpeg-turbo.wrap diff --git a/.gitignore b/.gitignore index 4d96d77f54..3189b3e43e 100644 --- a/.gitignore +++ b/.gitignore @@ -87,6 +87,7 @@ subprojects/pixman subprojects/webrtc-audio-processing subprojects/dv subprojects/opus +subprojects/libjpeg-turbo-* prefix/ pygobject .gdbinit diff --git a/subprojects/libjpeg-turbo.wrap b/subprojects/libjpeg-turbo.wrap new file mode 100644 index 0000000000..f425824a92 --- /dev/null +++ b/subprojects/libjpeg-turbo.wrap @@ -0,0 +1,12 @@ +[wrap-file] +directory = libjpeg-turbo-2.1.0 +source_url = https://sourceforge.net/projects/libjpeg-turbo/files/2.1.0/libjpeg-turbo-2.1.0.tar.gz +source_filename = libjpeg-turbo-2.1.0.tar.gz +source_hash = bef89803e506f27715c5627b1e3219c95b80fc31465d4452de2a909d382e4444 +patch_url = https://wrapdb.mesonbuild.com/v1/projects/libjpeg-turbo/2.1.0/1/get_zip +patch_filename = libjpeg-turbo-2.1.0-1-wrap.zip +patch_hash = 1bef2d46d99118d9693b8e248d2ae86a72f0651a74340ae925190c2a2f7d08c7 + +[provide] +dependency_names = libjpeg + From 0587385a42200fd94ce5d8731dff30367c085ba0 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Wed, 4 Aug 2021 01:07:41 +0900 Subject: [PATCH 434/448] subprojects: Bump libjpeg-turbo version to 2.1.0-2 for x86 MSVC build Need the latest version to support 32bit MSVC build See also https://github.com/mesonbuild/wrapdb/commit/f24069784f129c35ea3c6750af0b7dab612216a9 and https://github.com/mesonbuild/wrapdb/issues/111 Part-of: --- subprojects/libjpeg-turbo.wrap | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subprojects/libjpeg-turbo.wrap b/subprojects/libjpeg-turbo.wrap index f425824a92..93bfb270ed 100644 --- a/subprojects/libjpeg-turbo.wrap +++ b/subprojects/libjpeg-turbo.wrap @@ -3,9 +3,9 @@ directory = libjpeg-turbo-2.1.0 source_url = https://sourceforge.net/projects/libjpeg-turbo/files/2.1.0/libjpeg-turbo-2.1.0.tar.gz source_filename = libjpeg-turbo-2.1.0.tar.gz source_hash = bef89803e506f27715c5627b1e3219c95b80fc31465d4452de2a909d382e4444 -patch_url = https://wrapdb.mesonbuild.com/v1/projects/libjpeg-turbo/2.1.0/1/get_zip -patch_filename = libjpeg-turbo-2.1.0-1-wrap.zip -patch_hash = 1bef2d46d99118d9693b8e248d2ae86a72f0651a74340ae925190c2a2f7d08c7 +patch_filename = libjpeg-turbo_2.1.0-2_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/libjpeg-turbo_2.1.0-2/get_patch +patch_hash = e2a6957bdece284e2c14c7665be4fcd5a880ec637c2acae076511f9efe28fdf5 [provide] dependency_names = libjpeg From 681068a59dd4853019df60a3dd5bf93438c1057d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sun, 8 Aug 2021 19:42:24 +0100 Subject: [PATCH 435/448] subprojects: pin pango wrap to tag master branch got renamed to main, but might as well pin it. Part-of: --- subprojects/pango.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/pango.wrap b/subprojects/pango.wrap index 512087ced5..7da354c912 100644 --- a/subprojects/pango.wrap +++ b/subprojects/pango.wrap @@ -1,4 +1,4 @@ [wrap-git] url=https://gitlab.gnome.org/GNOME/pango.git push-url=git@gitlab.gnome.org:GNOME/pango.git -revision=master +revision=1.48.7 From b29665f3bd645310ba299d45f1734e2151a9899d Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 4 Aug 2021 22:02:15 -0400 Subject: [PATCH 436/448] git-update: Force fetching tags Making it simpler for user to specify tags in manifests Part-of: --- git-update | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/git-update b/git-update index 487047d8ee..f03ffb8130 100755 --- a/git-update +++ b/git-update @@ -97,11 +97,14 @@ def fatal_git_fetches(repo_dir): return True return False -def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=[], recurse_i=0, status=False): +def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=None, recurse_i=0, status=False): if status: return check_repo_status(repo_name, repo_dir) revision = ensure_revision_if_necessary(repo_dir, revision) git("config", "rebase.autoStash", "true", repository_path=repo_dir) + + fetch_args = fetch_args if fetch_args is None else [] + fetch_args.append('--tags') fatal = fatal_git_fetches(repo_dir) try: if revision: From c24958c7813fcc151253f6985d6dee83ec6090d0 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 4 Aug 2021 22:15:19 -0400 Subject: [PATCH 437/448] git-update: Fix passing fetch_args Part-of: --- git-update | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/git-update b/git-update index f03ffb8130..948d0d4931 100755 --- a/git-update +++ b/git-update @@ -61,7 +61,7 @@ def update_subprojects(manifest, no_interaction=False, status=False): continue revision, args = repos_commits.get(repo_name, [None, []]) - if not update_repo(repo_name, repo_dir, revision, no_interaction, args, status=status): + if not update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=args, status=status): return False return True @@ -103,7 +103,7 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=None, revision = ensure_revision_if_necessary(repo_dir, revision) git("config", "rebase.autoStash", "true", repository_path=repo_dir) - fetch_args = fetch_args if fetch_args is None else [] + fetch_args = fetch_args if fetch_args is not None else [] fetch_args.append('--tags') fatal = fatal_git_fetches(repo_dir) try: @@ -142,7 +142,7 @@ def update_repo(repo_name, repo_dir, revision, no_interaction, fetch_args=None, if recurse_i < 3: return update_repo(repo_name, repo_dir, revision, no_interaction, - recurse_i + 1) + recurse_i=recurse_i + 1) return False else: print("\nCould not rebase %s, please fix and try again." @@ -214,7 +214,7 @@ if __name__ == "__main__": repos_commits = {} revision, args = repos_commits.get('gst-build', [None, []]) - if not update_repo('gst-build', SCRIPTDIR, revision, options.no_interaction, args, status=options.status): + if not update_repo('gst-build', SCRIPTDIR, revision, options.no_interaction, fetch_args=args, status=options.status): exit(1) if not update_subprojects(options.manifest, options.no_interaction, status=options.status): exit(1) From ebcca1e5ead27cab1eafc028332b1984c84b10b2 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Fri, 26 Mar 2021 08:22:13 -0400 Subject: [PATCH 438/448] Meson: Avoid using add_global_arguments() when gst-build is a subproject Meson only allows the main project to use it. We already set that flag in all GStreamer modules just like warning flags. Fixes: #152 Part-of: --- meson.build | 7 ------- 1 file changed, 7 deletions(-) diff --git a/meson.build b/meson.build index fe450f14c6..ae832740e1 100644 --- a/meson.build +++ b/meson.build @@ -59,13 +59,6 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif endif -# Ensure that MSVC interprets all source code as UTF-8 -if cc.get_id() == 'msvc' - add_global_arguments( - cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 - language: ['c', 'cpp']) -endif - # Ordered list of subprojects (dict has no ordering guarantees) subprojects = [ ['gstreamer', {'build-hotdoc': true}], From 8f62c0c9331b587936de918940c51194c264eb01 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 20 Jul 2021 13:54:23 -0400 Subject: [PATCH 439/448] Update to sqlite3 from wrapdb `meson subprojects update` fails with Meson >= 0.59 because 'sqlite' wrap got renamed to 'sqlite3' in wrapdb v2. Part-of: --- subprojects/sqlite.wrap | 10 ---------- subprojects/sqlite3.wrap | 12 ++++++++++++ 2 files changed, 12 insertions(+), 10 deletions(-) delete mode 100644 subprojects/sqlite.wrap create mode 100644 subprojects/sqlite3.wrap diff --git a/subprojects/sqlite.wrap b/subprojects/sqlite.wrap deleted file mode 100644 index 4215a69a33..0000000000 --- a/subprojects/sqlite.wrap +++ /dev/null @@ -1,10 +0,0 @@ -[wrap-file] -directory = sqlite-amalgamation-3320300 - -source_url = https://www.sqlite.org/2020/sqlite-amalgamation-3320300.zip -source_filename = sqlite-amalgamation-3320300.zip -source_hash = e9cec01d4519e2d49b3810615237325263fe1feaceae390ee12b4a29bd73dbe2 - -patch_url = https://wrapdb.mesonbuild.com/v1/projects/sqlite/3320300/3/get_zip -patch_filename = sqlite-3320300-3-wrap.zip -patch_hash = 135e712664116a52fd4df0da464331a4ec75e6d9babd785906cd138bea43aed6 diff --git a/subprojects/sqlite3.wrap b/subprojects/sqlite3.wrap new file mode 100644 index 0000000000..55885801a1 --- /dev/null +++ b/subprojects/sqlite3.wrap @@ -0,0 +1,12 @@ +[wrap-file] +directory = sqlite-amalgamation-3340100 +source_url = https://www.sqlite.org/2021/sqlite-amalgamation-3340100.zip +source_filename = sqlite-amalgamation-3340100.zip +source_hash = e0b1c0345fe4338b936e17da8e1bd88366cd210e576834546977f040c12a8f68 +patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.34.1-1/get_patch +patch_filename = sqlite3-3.34.1-1-wrap.zip +patch_hash = cba9e47bdb4c02f88fadaae8deab357218d32562c6b86ce7ba0c72f107044360 + +[provide] +sqlite3 = sqlite3_dep + From 747e62aed877fe626713f071be066551b6edd15e Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Tue, 24 Aug 2021 23:53:39 +0300 Subject: [PATCH 440/448] libsoup: update to 2.74.0 With an extra commit on top to fix the windows build. See https://gitlab.gnome.org/GNOME/libsoup/-/merge_requests/249 Part-of: --- subprojects/libsoup.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libsoup.wrap b/subprojects/libsoup.wrap index 10053e2a51..6fd7d542a3 100644 --- a/subprojects/libsoup.wrap +++ b/subprojects/libsoup.wrap @@ -1,4 +1,4 @@ [wrap-git] directory=libsoup url=https://gitlab.gnome.org/gnome/libsoup.git -revision=2.70.0 +revision=e190e70298be1186ad1a8a5dd0ac430463f76fee From 395407483c4a9f05c08647ffe863d5cc810eaf3c Mon Sep 17 00:00:00 2001 From: Jay Douglass Date: Fri, 27 Aug 2021 03:21:52 +0000 Subject: [PATCH 441/448] Use the default formatting for git show in case the user has set a pretty format Part-of: --- gst-worktree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-worktree.py b/gst-worktree.py index 0032a2a6db..d7b7877cdf 100755 --- a/gst-worktree.py +++ b/gst-worktree.py @@ -71,7 +71,7 @@ def checkout_worktree(repo_name, repo_dir, worktree_dir, branch, new_branch, for return False - commit_message = git("show", "--shortstat", repository_path=repo_dir).split("\n") + commit_message = git("show", "--format=medium", "--shortstat", repository_path=repo_dir).split("\n") print(u" -> %s%s%s - %s" % (Colors.HEADER, repo_dir, Colors.ENDC, commit_message[4].strip())) return True From 879126a31c77622f594e70f205fcefd4556d9865 Mon Sep 17 00:00:00 2001 From: Olivier Crete Date: Mon, 24 Aug 2020 13:17:32 -0700 Subject: [PATCH 442/448] Allow running gst-uninstalled when gst-build is a subproject Part-of: --- gst-env.py | 14 +++++++++++++- meson.build | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gst-env.py b/gst-env.py index 693d21b7c0..40d66e3572 100755 --- a/gst-env.py +++ b/gst-env.py @@ -367,7 +367,7 @@ def get_subprocess_env(options, gst_version): os.path.join(options.builddir, root), options.sysroot) - with open(os.path.join(options.builddir, 'GstPluginsPath.json')) as f: + with open(os.path.join(options.gstbuilddir, 'GstPluginsPath.json')) as f: for plugin_path in json.load(f): prepend_env_var(env, 'GST_PLUGIN_PATH', plugin_path, options.sysroot) @@ -465,6 +465,9 @@ if __name__ == "__main__": parser.add_argument("--builddir", default=DEFAULT_BUILDDIR, help="The meson build directory") + parser.add_argument("--gstbuilddir", + default=None, + help="The meson gst-build build directory (defaults to builddir)") parser.add_argument("--srcdir", default=SCRIPTDIR, help="The top level source directory") @@ -487,7 +490,16 @@ if __name__ == "__main__": print("GStreamer not built in %s\n\nBuild it and try again" % options.builddir) exit(1) + + if options.gstbuilddir and not os.path.exists(options.gstbuilddir): + print("gst-build is not built in %s\n\nBuild it and try again" % + options.gstbuilddir) + exit(1) + elif not options.gstbuilddir: + options.gstbuilddir = options.builddir + options.builddir = os.path.abspath(options.builddir) + options.gstbuilddir = os.path.abspath(options.gstbuilddir) if not os.path.exists(options.srcdir): print("The specified source dir does not exist" % diff --git a/meson.build b/meson.build index ae832740e1..91ff608db4 100644 --- a/meson.build +++ b/meson.build @@ -353,6 +353,7 @@ subdir('tests') setenv = find_program('gst-env.py') devenv_cmd = [setenv, '--builddir=@0@'.format(meson.build_root()), + '--gstbuilddir=@0@'.format(meson.current_build_dir()), '--srcdir=@0@'.format(meson.source_root())] if meson.has_exe_wrapper() and build_machine.system() == 'linux' and host_machine.system() == 'windows' From afd11f3383398dc8516751a42d6e92c38bd66cdb Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 23 Aug 2021 18:53:54 +0530 Subject: [PATCH 443/448] New subproject macos-bison-binary to provide bison on macOS The version of bison that ships with macOS is too old, so we need to provide our own version of it. Fixes https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/174 Part-of: --- meson.build | 2 + subprojects/macos-bison-binary/.gitignore | 4 + subprojects/macos-bison-binary/README.md | 14 ++++ subprojects/macos-bison-binary/bison.py.in | 14 ++++ .../macos-bison-binary/download-binary.py | 77 +++++++++++++++++++ subprojects/macos-bison-binary/meson.build | 28 +++++++ 6 files changed, 139 insertions(+) create mode 100644 subprojects/macos-bison-binary/.gitignore create mode 100644 subprojects/macos-bison-binary/README.md create mode 100755 subprojects/macos-bison-binary/bison.py.in create mode 100644 subprojects/macos-bison-binary/download-binary.py create mode 100644 subprojects/macos-bison-binary/meson.build diff --git a/meson.build b/meson.build index 91ff608db4..5c766267f5 100644 --- a/meson.build +++ b/meson.build @@ -91,6 +91,8 @@ os.symlink(os.path.join('@1@', 'subprojects', '@0@'), if build_system == 'windows' subproject('win-flex-bison-binaries') subproject('win-nasm') +elif build_system == 'darwin' + subproject('macos-bison-binary') endif orc_subproject = subproject('orc', required: get_option('orc')) diff --git a/subprojects/macos-bison-binary/.gitignore b/subprojects/macos-bison-binary/.gitignore new file mode 100644 index 0000000000..adaad829c4 --- /dev/null +++ b/subprojects/macos-bison-binary/.gitignore @@ -0,0 +1,4 @@ +*.sw[op] +*~ +*.tar.* +bison-3.7.6-macos-x86_64/ diff --git a/subprojects/macos-bison-binary/README.md b/subprojects/macos-bison-binary/README.md new file mode 100644 index 0000000000..9b590d500f --- /dev/null +++ b/subprojects/macos-bison-binary/README.md @@ -0,0 +1,14 @@ +## How to generate binaries and update build files + +1. Download the latest bison source tarball +1. Extract, then build it with --prefix=/ +1. Install into some dir using `DESTDIR` +1. Delete all files except the following subdirs: `bin` `lib` `share/bison` `share/aclocal` +1. Rename installdir to `bison-$version-macos-$arch` where `$arch` follows Meson's CPU families list: + https://mesonbuild.com/Reference-tables.html#cpu-families +1. `tar -cvjf bison-$version-macos-$arch.tar.bz2 bison-$version-macos-$arch/` +1. Fetch sha256sum: `shasum -256 bison-$version-macos-$arch.tar.bz2` +1. Update sha256sum in `meson.build` +1. Update `project()` version in `meson.build` + +That's it! diff --git a/subprojects/macos-bison-binary/bison.py.in b/subprojects/macos-bison-binary/bison.py.in new file mode 100755 index 0000000000..64807d0a93 --- /dev/null +++ b/subprojects/macos-bison-binary/bison.py.in @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +import os +import sys +import pathlib +import subprocess + +srcdir = pathlib.Path("@SRCDIR@") +extractdir = pathlib.Path("@EXTRACTDIR@") +bison_path = srcdir / extractdir / 'bin/bison' +env = os.environ.copy() +env['BISON_PKGDATADIR'] = str(srcdir / extractdir / 'share/bison') +ret = subprocess.run([str(bison_path)] + sys.argv[1:], check=False, env=env) +sys.exit(ret.returncode) diff --git a/subprojects/macos-bison-binary/download-binary.py b/subprojects/macos-bison-binary/download-binary.py new file mode 100644 index 0000000000..460e5b00b3 --- /dev/null +++ b/subprojects/macos-bison-binary/download-binary.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 + +import os +import sys +import ssl +import tarfile +import hashlib +import urllib.request +import urllib.error + +# Disable certificate checking because it requires custom Python setup on macOS +ctx = ssl.create_default_context() +ctx.check_hostname = False +ctx.verify_mode = ssl.CERT_NONE + +EXTRACTDIR = 'bison-{}-macos-{}' +BASENAME = '{}.tar.bz2'.format(EXTRACTDIR) +GSTREAMER_URL = 'https://gstreamer.freedesktop.org/src/mirror/{}' + +version = sys.argv[1] +arch = sys.argv[2] +tar_sha256 = sys.argv[3] +source_dir = os.path.join(os.environ['MESON_SOURCE_ROOT'], os.environ['MESON_SUBDIR']) +dest = BASENAME.format(version, arch) +dest_path = os.path.join(source_dir, dest) +extract_path = EXTRACTDIR.format(version, arch) + +def get_sha256(tarf): + hasher = hashlib.sha256() + with open(tarf, 'rb') as f: + hasher.update(f.read()) + return hasher.hexdigest() + +def download(): + for url in (GSTREAMER_URL.format(dest),): + print('Downloading {} to {}'.format(url, dest), file=sys.stderr) + try: + with open(dest_path, 'wb') as d: + f = urllib.request.urlopen(url, context=ctx) + d.write(f.read()) + break + except urllib.error.URLError as ex: + print(ex, file=sys.stderr) + print('Failed to download from {!r}, trying mirror...'.format(url), file=sys.stderr) + continue + else: + curdir = os.path.dirname(sys.argv[0]) + print('Couldn\'t download {!r}! Try downloading it manually and ' + 'placing it into {!r}'.format(dest, curdir), file=sys.stderr) + +def print_extract_dir(): + 'Print the extracted directory name' + print(extract_path, end='') + +if os.path.isfile(dest_path): + found_sha256 = get_sha256(dest_path) + if found_sha256 == tar_sha256: + if os.path.isdir(os.path.join(source_dir, extract_path)): + print('{} already downloaded and extracted'.format(dest), file=sys.stderr) + print_extract_dir() + sys.exit(0) + else: + print('{} checksum mismatch, redownloading'.format(dest), file=sys.stderr) + download() +else: + download() + +found_sha256 = get_sha256(dest_path) +if found_sha256 != tar_sha256: + print('SHA256 of downloaded file {} was {} instead of {}' + ''.format(dest, found_sha256, tar_sha256), file=sys.stderr) + sys.exit(1) + +print('Extracting {}'.format(dest), file=sys.stderr) +tf = tarfile.open(dest_path, "r") +tf.extractall(path=source_dir) +print_extract_dir() diff --git a/subprojects/macos-bison-binary/meson.build b/subprojects/macos-bison-binary/meson.build new file mode 100644 index 0000000000..7a1680f0a6 --- /dev/null +++ b/subprojects/macos-bison-binary/meson.build @@ -0,0 +1,28 @@ +project('win-flex-bison-binary', version : '3.7.6') + +py3 = import('python3').find_python() + +message('Downloading and extracting bison for macOS x64...') + +arch = host_machine.cpu_family() +tar_hash = '932f91d7c7fa0121abc3e5f8e54a7234b03d3de468c254ab8063ff8e6eb92a09' +if arch != 'x86_64' + warning('bison binary is untested on non-x86_64, please report whether this worked or not') + arch = 'x86_64' +endif + +ret = run_command(py3, files('download-binary.py'), meson.project_version(), arch, tar_hash) +if ret.returncode() != 0 + message(ret.stdout()) + error(ret.stderr()) +endif + +conf = configuration_data() +conf.set('SRCDIR', meson.project_source_root()) +conf.set('EXTRACTDIR', ret.stdout()) +bison_py = configure_file( + input: 'bison.py.in', + output: 'bison.py', + configuration: conf) + +meson.override_find_program('bison', find_program(bison_py)) From 80621a3f07f685e7cde1e56b2ace1e73cd760fd6 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 23 Aug 2021 21:39:09 +0530 Subject: [PATCH 444/448] libopenjp2.wrap: Update to v6 to fix macOS build https://github.com/mesonbuild/wrapdb/pull/138 Part-of: --- subprojects/libopenjp2.wrap | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/subprojects/libopenjp2.wrap b/subprojects/libopenjp2.wrap index a6b670d39e..e8cf13a43b 100644 --- a/subprojects/libopenjp2.wrap +++ b/subprojects/libopenjp2.wrap @@ -1,10 +1,12 @@ [wrap-file] directory = openjpeg-2.3.1 - source_url = https://github.com/uclouvain/openjpeg/archive/v2.3.1.tar.gz source_filename = openjpeg-2.3.1.tar.gz source_hash = 63f5a4713ecafc86de51bfad89cc07bb788e9bba24ebbf0c4ca637621aadb6a9 +patch_filename = libopenjp2_2.3.1-6_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/libopenjp2_2.3.1-6/get_patch +patch_hash = 153e4b6a0addb20ceceac9f1562588c7f4b03c91282ac55d3b63df8743f6e873 + +[provide] +libopenjp2 = libopenjp2_dep -patch_url = https://wrapdb.mesonbuild.com/v1/projects/libopenjp2/2.3.1/3/get_zip -patch_filename = libopenjp2-2.3.1-3-wrap.zip -patch_hash = 95c3195d46b02b7d96d59920fcddfb107bba09c4b014b7319307e658895ce501 From a31e9dcf4304bb036866fa4d2f4c3a4d99f7ced8 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Tue, 24 Aug 2021 13:53:37 +0530 Subject: [PATCH 445/448] gst-env: Don't set DYLD_LIBRARY_PATH on macOS This is not actually needed because everything we build is using @rpath already, and setting it causes dynamic linker path priority issues with macOS internals causing *all* programs to fail to run inside gst-env: ``` $ vim dyld: Symbol not found: __cg_jpeg_resync_to_restart Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib Expected in: /Users/nirbheek/projects/repos/gst-build/_build_macos/subprojects/libjpeg-turbo-2.1.0/libJPEG.dylib in /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib Abort trap: 6 ``` In this case it is caused by libjpeg.dylib, but it can happen with other dylibs that conflict with dylibs used by macOS internally. Part-of: --- gst-env.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gst-env.py b/gst-env.py index 40d66e3572..df3e402332 100755 --- a/gst-env.py +++ b/gst-env.py @@ -72,6 +72,8 @@ def stringify(o): raise AssertionError('Object {!r} must be a string or a list'.format(o)) def prepend_env_var(env, var, value, sysroot): + if var is None: + return if value.startswith(sysroot): value = value[len(sysroot):] # Try not to exceed maximum length limits for env vars on Windows @@ -275,7 +277,8 @@ def get_subprocess_env(options, gst_version): if os.name == 'nt': lib_path_envvar = 'PATH' elif platform.system() == 'Darwin': - lib_path_envvar = 'DYLD_LIBRARY_PATH' + # RPATH is sufficient on macOS, and DYLD_LIBRARY_PATH can cause issues with dynamic linker path priority + lib_path_envvar = None else: lib_path_envvar = 'LD_LIBRARY_PATH' From 06869815fd55017b63b54b89c276ec75e87d864c Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 30 Aug 2021 17:21:44 +0530 Subject: [PATCH 446/448] Revert "Meson: Avoid using add_global_arguments() when gst-build is a subproject" This reverts commit ebcca1e5ead27cab1eafc028332b1984c84b10b2. /utf-8 is needed to deal with subprojects that we do not control. Part-of: --- meson.build | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/meson.build b/meson.build index 5c766267f5..04ec9a9e8d 100644 --- a/meson.build +++ b/meson.build @@ -59,6 +59,13 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif endif +# Ensure that MSVC interprets all source code as UTF-8 +if cc.get_id() == 'msvc' + add_global_arguments( + cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 + language: ['c', 'cpp']) +endif + # Ordered list of subprojects (dict has no ordering guarantees) subprojects = [ ['gstreamer', {'build-hotdoc': true}], From c99e3b312a613b38724a14d59ed98cce57d89e37 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 30 Aug 2021 17:23:05 +0530 Subject: [PATCH 447/448] meson: Don't use add_global_arguments when a subproject This is the correct fix for https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/236 Part-of: --- meson.build | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 04ec9a9e8d..303dba1af8 100644 --- a/meson.build +++ b/meson.build @@ -59,8 +59,10 @@ if not meson.is_subproject() and cc.get_id() == 'msvc' endif endif -# Ensure that MSVC interprets all source code as UTF-8 -if cc.get_id() == 'msvc' +# Ensure that MSVC interprets all source code as UTF-8. Only do this when we're +# not a subproject, because subprojects are not allowed to call +# add_global_arguments(). +if not meson.is_subproject() and cc.get_id() == 'msvc' add_global_arguments( cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8 language: ['c', 'cpp']) From f75713f07038762f6fd09e199886dd4b6c00284c Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Tue, 31 Aug 2021 19:47:34 +0300 Subject: [PATCH 448/448] git-update: dump output in case subproject download fails Part-of: --- git-update | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/git-update b/git-update index 948d0d4931..ec0f4704ff 100755 --- a/git-update +++ b/git-update @@ -207,7 +207,14 @@ if __name__ == "__main__": if options.manifest: meson = get_meson() - targets_s = subprocess.check_output(meson + ['subprojects', 'download']) + try: + targets_s = subprocess.check_output(meson + ['subprojects', 'download'], shell=False, universal_newlines=True) + except subprocess.CalledProcessError as err: + print(f"Subproject download Failed") + print(f"Output: {err.output}") + print(f"Exit code: {err.returncode}") + exit(err.returncode) + repos_commits = manifest_get_commits(options.manifest) FORCE_CHECKOUT = True else: