Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

adding Cmake functionality #255

Closed
wants to merge 12 commits into from
Closed

adding Cmake functionality #255

wants to merge 12 commits into from

Conversation

andik
Copy link

@andik andik commented Jan 29, 2015

added CMakelists based on https://github.com/arunoda/cmake-boilerplate.

mkdir _build
cd _build
cmake ..
make

will compile the lib and the standalone example, no iOS yet

@andik
Copy link
Author

andik commented Jan 29, 2015

the examples build is currently OSX only. I need to add some parts of RTAudio buildsystem to configure this correctly. the lib itself should build without problems.
But I think this is a good starting point

@morganpackard
Copy link
Member

Awesome!
Does this generate an xcode project, or just a lib?

On Thu, Jan 29, 2015 at 2:23 AM, andik notifications@github.com wrote:

the exmaples build is currently OSX only. I need to add some parts of
RTAudio buildsystem to configure this correctly. the lib itself should
build without problems.
But I think this is a good starting point

Reply to this email directly or view it on GitHub
#255 (comment).

Morgan Packard
cell: (720) 891-0122
twitter: @morganpackard

@morganpackard
Copy link
Member

@andik I have no doubt that this is a great enhancement to the workflow. However, relying on cmake rather than XCode or Visual Studio for compilation is a pretty major change in workflow for me and everyone else using Tonic. If this is intended to be a replacement for compiling with XCode/Visual studio, we'll need to consider this PR very carefully.

@LB--
Copy link

LB-- commented Jan 29, 2015

Huh? Doesn't CMake generate Visual Studio projects on Windows by default?

@morganpackard
Copy link
Member

@LB-- That's sort of what I thought, based on my extreme superficial understanding of CMake, but it sounds like what @andik has created is something that compiles outside of Visual Studio.

@LB--
Copy link

LB-- commented Jan 29, 2015

In order for CMake to succeed I had to change this line:

        string(REGEX REPLACE ".*\\" "" testname "${filename}" )

To this:

        string(REGEX REPLACE ".*\\\\" "" testname "${filename}" )

After that,

C:\Users\Nicholas\Desktop\Tonic-development\build>cmake ..
-- Building for: Visual Studio 12 2013
-- The C compiler identification is MSVC 18.0.30723.0
-- The CXX compiler identification is MSVC 18.0.30723.0
-- Check for working C compiler using: Visual Studio 12 2013
-- Check for working C compiler using: Visual Studio 12 2013 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Visual Studio 12 2013
-- Check for working CXX compiler using: Visual Studio 12 2013 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Warning (dev) at Tests/CMakeLists.txt:31 (add_executable):
  Policy CMP0037 is not set: Target names should not be reserved and should
  match a validity pattern.  Run "cmake --help-policy CMP0037" for policy
  details.  Use the cmake_policy command to set the policy and suppress this
  warning.

  The target name "C:/Users/Nicholas/Desktop/Tonic-development/Tests/main" is
  reserved or not valid for certain CMake features, such as generator
  expressions, and may result in undefined behavior.
This warning is for project developers.  Use -Wno-dev to suppress it.

C:/Users/Nicholas/Desktop/Tonic-development/Tests/main C:/Users/Nicholas/Desktop
/Tonic-development/Tests/main.cpp
-- Configuring done
CMake Error: Cannot open file for write: C:/Users/Nicholas/Desktop/Tonic-develop
ment/build/Tests/C:/Users/Nicholas/Desktop/Tonic-development/Tests/main.vcxproj.
tmp
CMake Error: : System Error: Invalid argument
CMake Error: Cannot open file for write: C:/Users/Nicholas/Desktop/Tonic-develop
ment/build/Tests/C:/Users/Nicholas/Desktop/Tonic-development/Tests/main.vcxproj.
filters.tmp
CMake Error: : System Error: Invalid argument
-- Generating done
-- Build files have been written to: C:/Users/Nicholas/Desktop/Tonic-development
/build

So there's still some issues with the CMakeLists.txt in /Tests/, but the project at least generated.

I opened /build/Tonic.sln and once the solution loaded, I did a rebuild-all. It succeeded with 402 warnings. I tried running /build/examples/Standalone/Debug/TonicStandaloneDemo.exe but got this:

RtApiDummy: This class provides no functionality.


RtApi::openStream: output device parameter value is invalid.

So, at least it builds.

@morganpackard
Copy link
Member

@LB-- Thanks for taking a look.

@andik
Copy link
Author

andik commented Jan 29, 2015

added a commit @LB-- Windows should theoretically work now. I also removed that "main" target...
Still the warnings are remaining... I have really no Idea how to fix it as Cmake seems to add a -Wmost to the XCode project and equivalent to VS Project...

@andik
Copy link
Author

andik commented Jan 29, 2015

@morganpackard ah and for XCode Projects do

mkdir _prj
cd _prj
cmake -G Xcode ..
open Tonic.xcodeproj

@andik
Copy link
Author

andik commented Jan 29, 2015

ok, looks like the warnings will stay until -wmost is manually removed from the xcode build settings... this is awkward, but built in cmake XCode Generator...

@LB--
Copy link

LB-- commented Jan 30, 2015

Something is still a little off with the CMake scripts:

C:\Users\Nicholas\Desktop\Tonic-development\build>cmake ..
-- Building for: Visual Studio 12 2013
-- The C compiler identification is MSVC 18.0.31101.0
-- The CXX compiler identification is MSVC 18.0.31101.0
-- Check for working C compiler using: Visual Studio 12 2013
-- Check for working C compiler using: Visual Studio 12 2013 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Visual Studio 12 2013
-- Check for working CXX compiler using: Visual Studio 12 2013 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Warning (dev) at Tests/CMakeLists.txt:31 (add_executable):
  Policy CMP0037 is not set: Target names should not be reserved and should
  match a validity pattern.  Run "cmake --help-policy CMP0037" for policy
  details.  Use the cmake_policy command to set the policy and suppress this
  warning.

  The target name "C:/Users/Nicholas/Desktop/Tonic-development/Tests/main" is
  reserved or not valid for certain CMake features, such as generator
  expressions, and may result in undefined behavior.
This warning is for project developers.  Use -Wno-dev to suppress it.

C:/Users/Nicholas/Desktop/Tonic-development/Tests/main C:/Users/Nicholas/Desktop
/Tonic-development/Tests/main.cpp
CMake Warning (dev) at Tests/CMakeLists.txt:31 (add_executable):
  Policy CMP0037 is not set: Target names should not be reserved and should
  match a validity pattern.  Run "cmake --help-policy CMP0037" for policy
  details.  Use the cmake_policy command to set the policy and suppress this
  warning.

  The target name
  "C:/Users/Nicholas/Desktop/Tonic-development/Tests/testmain" is reserved or
  not valid for certain CMake features, such as generator expressions, and
  may result in undefined behavior.
This warning is for project developers.  Use -Wno-dev to suppress it.

C:/Users/Nicholas/Desktop/Tonic-development/Tests/testmain C:/Users/Nicholas/Des
ktop/Tonic-development/Tests/testmain.cpp
-- Using Windows WASAPI
-- Configuring done
CMake Error: Cannot open file for write: C:/Users/Nicholas/Desktop/Tonic-develop
ment/build/Tests/C:/Users/Nicholas/Desktop/Tonic-development/Tests/main.vcxproj.
tmp
CMake Error: : System Error: Invalid argument
CMake Error: Cannot open file for write: C:/Users/Nicholas/Desktop/Tonic-develop
ment/build/Tests/C:/Users/Nicholas/Desktop/Tonic-development/Tests/main.vcxproj.
filters.tmp
CMake Error: : System Error: Invalid argument
CMake Error: Cannot open file for write: C:/Users/Nicholas/Desktop/Tonic-develop
ment/build/Tests/C:/Users/Nicholas/Desktop/Tonic-development/Tests/testmain.vcxp
roj.tmp
CMake Error: : System Error: Invalid argument
CMake Error: Cannot open file for write: C:/Users/Nicholas/Desktop/Tonic-develop
ment/build/Tests/C:/Users/Nicholas/Desktop/Tonic-development/Tests/testmain.vcxp
roj.filters.tmp
CMake Error: : System Error: Invalid argument
-- Generating done
-- Build files have been written to: C:/Users/Nicholas/Desktop/Tonic-development
/build

It still generated though, so I tried building again.

...interesting. Probably because of the weird errors during the CMake generator. Something's definitely worse, though, because this time the build failed.

When I have more time later I might try to resolve some issues myself but as I am new to the project I don't know what state everything is in.

@andik
Copy link
Author

andik commented Jan 30, 2015

It doesn't find the topic lib, But Xcode does. @LB-- Could you please do a dir /s/b in your project root and send me that? I have windows only at work and need to know where it puts the lib.

@andik
Copy link
Author

andik commented Jan 30, 2015

Tested in my lunchbreak at work... my installed old Visual Studio doesn't compile Tonic at all... so I cannot verify anything. But I did not have these Write errors you had. May be some IO Issue not related to CMake? Maybe you should remove you whole build folder and try again? please use a Subfolder...

What I did change was using the built Tonic Lib instead of Object files in the example...

sorry to say, that I will not be available over the weekend. My girfriend visits me (mostly every weekend) and I'd rather look at her pretty face than my screen ^^

@LB--
Copy link

LB-- commented Jan 30, 2015

Maybe a six-minute video of what I am doing would help?
https://drive.google.com/file/d/0B6gYqBQuTG-9Q29PSi03bHp5Y3M/view?usp=sharing

@andik
Copy link
Author

andik commented Jan 31, 2015

Thank yo so much for pointing this out. Interesting way to share what you're dong.
I conclude: the targets builds are independent. The library has an error so the example can't be built. I oversaw the error in your old build logs. Except of the "unknown pragma" warnings all warnings are correct and hopefully will be fixed someday.

Could you please change that to

 SampleTable loadAudioFile(string path, int numChannels){
Tonic::error("loadAudioFile is currently only implemented for Apple platforms.", true);
return NULL;
}

and try to build again?

@LB--
Copy link

LB-- commented Jan 31, 2015

Not sure how that's supposed to change anything? The error is on the return NULL because two constructors of SampleTable can be used and the compiler can't decide which to use.
image
I changed it to return nullptr; instead and it compiled successfully. The example still has the same output as before.

@andik
Copy link
Author

andik commented Feb 1, 2015

Sorry for misleading you. I just didn't think enough before writing ...

Could you please look in the solition if

  __WINDOWS_WASAPI__

is defined? It defines the driver which rtaudio us using. Your log shows that rtaudio is used but somehow it's not.

@andik
Copy link
Author

andik commented Feb 1, 2015

I mean if it is defined for the standalone project

@LB--
Copy link

LB-- commented Feb 1, 2015

Yes:
image

@andik
Copy link
Author

andik commented Feb 1, 2015

okay, while this is at it should be, it's not getting easier ^^.
From looking at @Dewb 's VS Solution: Could you (please) try the following?

       cmake -DAUDIO_WINDOWS_DS=ON ..

thanks you for helping me out....

In the meantime I have updated the cmakelists a little and most important, found a way to diable the xcode warning mess. (some useless warnings still remaining, but i'll fix that later...)

@LB--
Copy link

LB-- commented Feb 2, 2015

I didn't try https://github.com/andik/Tonic/commit/fb703e7f380f22900233eb9fb059a1934710317b because it didn't look like it would change anything of importance (I can if you want me to, I just have to re-patch that return NULL; -> return nullptr; each time).

Using the -DAUDIO_WINDOWS_DS=ON flag gives me some link errors.
image
Full error log here.

@andik
Copy link
Author

andik commented Feb 2, 2015

yep, I did forgot to used the RTAudio Liblist, sorry. If you're still willing to test this out, you should download the complete package. the patch you did is included. It did compile under mingw, but without the standalone demo as I have no directX installed. other methods are currently not working. (the RTAudio libs in tonic are older than the cmake file I used and do not support WSAPI, thats why the example was not working...)

@morganpackard
Copy link
Member

I'd like to give this a try which directory do I run the cmake command
from? I see you instructions to run it from _build, but where should that
_build directory be located?

On Mon, Feb 2, 2015 at 2:41 PM, andik notifications@github.com wrote:

@morganpackard https://github.com/morganpackard
okay, I fixed the last compiler warnings (except #258
#258). If you like you can
merge it now.

Reply to this email directly or view it on GitHub
#255 (comment).

Morgan Packard
cell: (720) 891-0122
twitter: @morganpackard

@LB--
Copy link

LB-- commented Feb 2, 2015

In the root directory create a folder with any name and just run cmake .. from there. Both _build and build are fine.

@morganpackard
Copy link
Member

I"m seeing references to LazySampleTable.cpp in the xcode project. I think
we need to get those out of there before I can merge this pull request.

Also, please be patient with me. I'd like to look over all of these changes
and test carefully, which will take some time.

On Mon, Feb 2, 2015 at 3:43 PM, Morgan Packard morgan@morganpackard.com
wrote:

I'd like to give this a try which directory do I run the cmake command
from? I see you instructions to run it from _build, but where should that
_build directory be located?

On Mon, Feb 2, 2015 at 2:41 PM, andik notifications@github.com wrote:

@morganpackard https://github.com/morganpackard
okay, I fixed the last compiler warnings (except #258
#258). If you like you can
merge it now.

Reply to this email directly or view it on GitHub
#255 (comment).

Morgan Packard
cell: (720) 891-0122
twitter: @morganpackard

Morgan Packard
cell: (720) 891-0122
twitter: @morganpackard

@@ -14,9 +14,9 @@
namespace Tonic {
namespace Tonic_ {

PinkNoise_::PinkNoise_() : pinkCount_(1), pinkAccum_(0) {
PinkNoise_::PinkNoise_() :pinkAccum_(0), pinkCount_(1) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@andik Would you mind explaining the purpose of this change and the other similar changes, where the initilizer lists are reordered?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some compilers issue warnings when the initalizer lists are not in the same order as the class members' declarations. This is because in C++ members are always initialized in the order they are declared, regardless of the order they appear in initializer lists.

@andik
Copy link
Author

andik commented Feb 3, 2015

really, 100bpm is quite fast, how should your heart handle such speeds...

Well, I'm really sorry, I wrote a sampletable which can be loaded from a file before switching to the cmake case. I didn't use a clean branch. the issues in standalone main, xcode proj and the sampletable are from that. I'll try to use old versions for them.
All the other stuff, like adding newline, removing semicolons and editing initialiser lists where made to save you the heart attack when compiling and gettting 200 warnings ^^ I thougt this would have a negative influence upon the acceptance of my PR ^^

@@ -91,7 +91,7 @@ namespace Tonic {

SampleTable loadAudioFile(string path, int numChannels){
Tonic::error("loadAudioFile is currently only implemented for Apple platforms.");
return NULL;
return SampleTable();
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NULL is defined ((void*) 0) in Windows. This is of course a compiler error. If we return an empty buffer instead, we also avoid the crashing of the app which calls loadAudioFile().

@andik
Copy link
Author

andik commented Feb 3, 2015

@morganpackard
okay, looks cleaner now

@ndonald2
Copy link
Member

ndonald2 commented Feb 4, 2015

@andik Thank you SO much for putting this together. I don't ever work in Windows so it's difficult for me to verify anything that affects Windows builds, but I trust your and @morganpackard's judgement on the validity of everything in here. FWIW code changes made to reduce warnings are always welcome in my book.

@@ -0,0 +1,9 @@
#include directories helps to include header files
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not crazy about adding a non-source file to a directory called "src". Is there any way this file can be moved, so that we can keep the src directory pristine?

@morganpackard
Copy link
Member

Hey @andik. Thanks for answering my questions about your edits, and resolving that xcode project issue. Now, on to my next annoying question:

How do you propose we as library developers, and everyone who is an end user of Tonic actually use this cmake setup? The value I see in using CMake is that we wouldn't have to manually maintain three separate IDE projects evey time we add a file. The system you've set up doesn't seem to be designed to actually replace the existing xcode and visual studio project.

If your main motivation for getting cmake running is so that you can create cross-platform, that's great, and I fully support that direction Basically, I support anything you choose for setting up cross-platform tests. I'll just be really grateful to have them in any form.

If the idea with cmake is that every time someone adds a new file to the project, it gets easily incorporated into the projects for all the other platforms, I'm not sure we have a useable system in place yet.

Another thing -- is there a way we can avoid adding the cmake file to the src directory? I think, for someone coming to Tonic for the first time, it would be much nicer not to have potentially mysterious files in that directory.

@LB--
Copy link

LB-- commented Feb 6, 2015

I know I'm not the target of your questions, but I'd like to throw in my thoughts too.

What I see with most projects is that the repo only has the CMake files and no IDE-specific project files. People who work on the library keep their own customized IDE projects local to their hard drives. This way everyone gets their way and anyone can build the project.

As for the location and number of CMakeLists.txt files, this varies with projects and usually depends on personal preference. I like to have my CMakeLists.txt files match my directory structure, so there is one in every folder in the project. Other people do it differently. It depends also somewhat on the way your directory tree is already set up.

For easily adding and removing files, you can have CMake just grab all files that match a pattern, but this is generally discouraged by the CMake community because CMake will not detect that you have added or removed files until you clear the cache and run CMake again. The way CMake knows to run itself again is by checking for changes on the CMakeLists.txt files, and so you are intended to add/remove entries as you add/remove files. If you don't care about having to completely re-run CMake each time you add or remove a file, you can have it so that you don't have to edit any CMakeLists.txt files when a new file is added or removed.

This is an example project where addition and removal of source files does not require editing CMakeLists.txt:

https://github.com/cpluspluscom/ChessPlusPlus/blob/master/CMakeLists.txt#L25-L27

Note however that, addition and removal of files requires re-running the CMake command. For small projects this is fine but it can be annoying if it takes a long time to run and you are frequently adding/removing files.

@morganpackard
Copy link
Member

Thanks @LB--. It looks to me like @andik set the cmake stuff up so that it automatically adds files, which I like. Tonic is pretty small. I don't see running cmake when adding a file as a big deal.

I don't want to require end users to use cmake. I definitely want to keep the individual IDE projects in the repository, so people can just fire up xcode or visual studio and be up and running quickly. I'd definitely be interested in trying an approach which requires Tonic developers to use cmake (when adding or removing or moving files), but which doesn't require Tonic users to use it.

@andik
Copy link
Author

andik commented Feb 6, 2015

Hey Morgan, cmake is for the end user. When a C++ Dev comes along "oh this is a nice library" "oh, it builds with cmake" "oh, it works" "oh, I use it for my project".
Cmake is getting more and more the de-facto standard for C++ Projects, replacing Autotools, including such things like VST, LV Plugins etc. This is why a project really should support it. cmake also handles installation of a library on the system. (which I still need to add). This allows easy deployment through a package manager etc.
Only that these cmake files are a little complicated, because I did in fact copy, paste, adapt. And I don't know very much of cmake yet. What's not possible seems to be IOS currently.

Beside that, the cmake generated xcode project looks quite good, and I use it for working.
pastedgraphic-1

The Cmakelist file in src could be moved to lib

@Dewb
Copy link
Member

Dewb commented Feb 7, 2015

Adding my two cents: CMake can be great for the end-user, especially when a library is large and complicated (e.g. Boost.) I think there's less value for end-users for a small library like Tonic that's intended to be incorporated as source library.

I think focusing the CMake implementation initially around the developer workflow, and replacing the existing platform-specific solution files, would be great. I know I've been holding back on merging the polysynth example into master because of fuzziness around how we want to organize the cross-platform project files for example projects. Using the CMake shift as an opportunity to get a consistent plan together would be awesome.

@andik
Copy link
Author

andik commented Feb 7, 2015

I primarily saw cmake as an easy way to start with Tonic. One runs cmake and immediately is able to test the example out. Then he can copy the library into his project. I thought about it a little like openframeworks because that was the way I started to learn Tonic. That's the way I designed the cmake system.

@Dewb @morganpackard I'm completely open to all wishes, changes and improvements you have for the cmake system. Maybe we can find a solution which makes an easy start and easy development. Until then we can stall this PR. I'm not in a hurry anymore.

@morganpackard
Copy link
Member

I was able to run the cmake stuff successfully on windows. I just tried building using cmake on my mac and got the following errors:

[ 76%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/Noise.cpp.o [ 78%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/RampedValue.cpp.o [ 80%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/RectWave.cpp.o [ 81%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/Reverb.cpp.o [ 83%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/RingBuffer.cpp.o [ 85%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/SampleTable.cpp.o [ 86%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/SawtoothWave.cpp.o [ 88%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/SineWave.cpp.o [ 90%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/StereoDelay.cpp.o [ 91%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/Synth.cpp.o [ 93%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/TableLookupOsc.cpp.o [ 95%] Building CXX object src/CMakeFiles/Tonic.dir/Tonic/TonicFrames.cpp.o Linking CXX static library libTonic.a [ 95%] Built target Tonic Scanning dependencies of target tonictests [ 96%] Building CXX object tests/CMakeFiles/tonictests.dir/tonictests.cpp.o Linking CXX executable tonictests clang: error: no such file or directory: 'CoreAudio;-framework' clang: error: no such file or directory: 'Accelerate;-framework' clang: error: no such file or directory: 'AudioToolbox' make[2]: *** [tests/tonictests] Error 1 make[1]: *** [tests/CMakeFiles/tonictests.dir/all] Error 2 make: *** [all] Error 2

I'm on the branch andik/development. Any idea what the issue is?

@morganpackard
Copy link
Member

I'd be very wary of adding any additional complications/steps for a new user to use Tonic (see my error above). But if we can get a cmake workflow that works smoothly for Tonic developers, I'd be in favor of adopting that, and not editing individual platform project files by hand any more. Thanks for the two cents @Dewb. I completely agree.

@andik
Copy link
Author

andik commented Feb 7, 2015

@morganpackard I completely agree with you. But in fact I guess that a lot of people are quite familar with cmake, but providing them additional Makefiles/Xcode Projects etc. is a good Idea, I think.

would you try again, I gues I know the Issue, but I'm not sure, see the diff to see what may be wrong...
btw: use cmake -G Xcode .. to have a XCode Project out of cmake ( If you don't have done that already)

@Dewb
Copy link
Member

Dewb commented Feb 8, 2015

@morganpackard looks like something is weird with how the "-framework XXX" statements are being concatenated and escaped. Using this approach for OSX framework includes might be a better strategy: http://www.cmake.org/Wiki/CMake:HowToUseExistingOSXFrameworks

@morganpackard
Copy link
Member

@Dewb Looks like @andik resolved the issue I was having I suspect he meant "superfluous", rather than "superfluid", but I really like the idea of "superfluid quotes"!.

@Dewb
Copy link
Member

Dewb commented Feb 9, 2015

Oops, I didn't see the change. Yeah, that fix makes total sense. I also love the idea of superfluidity in punctuation!

@andik
Copy link
Author

andik commented Mar 12, 2015

I close this because of #264 will bring this too, and I need my development branch ....

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants