-
Notifications
You must be signed in to change notification settings - Fork 1.4k
[main] Introduce cmdline option parser to share some code between executables #20073
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
base: master
Are you sure you want to change the base?
Conversation
Test Results 19 files 19 suites 3d 3h 52m 28s ⏱️ For more details on these failures, see this check. Results for commit c566635. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM (Beside the comments and portability issue)
Thanks a lot for the initiative! Even if it's 300 lines of code, isn't it better to rely on something external that gets auto-maintained, even if it's bigger in number of lines of code? Or to understand better the motivation, what do we gain by having a small parser for which we have to add our own tests?
|
It's mostly the last point (though the first is also somewhat important). |
On the flipside, a library that is heavily used is more likely to come across all of the weird edge cases that are going to end up making the custom implementation significantly longer eventually. When I designed CLI11, I did have ROOT in mind, and with that you could actually make it easy to have a user extend an application. That would definitely be more than 10x functionality. |
This is an unprovable assumption as of now - if we start finding such edge cases regularly then this might tilt the decision towards an external library. It's very easy to change our mind later after all, this is all "leaf code", which brings me to the second point:
I don't see the point here: the user cannot "extend" a binary like
Again, this is conjecture which can only be proven with actually trying both things. My position is: let's start with the simpler option, then if we realize it was a mistake we can easily swap the implementation later. |
We now have enough C++ executables (with more to be ported) to justify sharing some code between them, in particular option parsing.
This PR introduces a simple option parser class that covers most of our cases. Not all cases (e.g.
hadd
keeps its custom parsing because it's a bit weird), but it's already enough to coverrootls
androotbrowse
, and will in the future also coverrootcp
,rootmv
etc.The parser is documented with code examples and properly tested and it's about 300 lines of codes (about an order of magnitude less than e.g. cxxopts which in my opinion is overkill for our use case).
Checklist: