diff --git a/mkproj.1 b/mkproj.1 new file mode 100644 index 0000000..ccce279 --- /dev/null +++ b/mkproj.1 @@ -0,0 +1,276 @@ +.Dd December 27, 2024 +.Dt mkproj 1 +.Os +.Sh NAME +.Nm mkproj +.Nd Create C++ project directory with predefined templates +.\" .Sh LIBRARY +.\" For sections 2, 3, and 9 only. +.\" Not used in OpenBSD. +.Sh SYNOPSIS +.Nm +.Fl v +.Nm +.Op Fl f | Fl l | Fl s +.Oo +.Op Fl d +.Fl g Ar gitroot +.Oc +.Op Fl t Ar tplroot +.Ar project +.Sh DESCRIPTION +The +.Nm +script creates a C++ project directory structure with some predefined +boilerplate files, ready to be built using +.Xr make 1 . +.Nm +can create a directory for a simple project using a single source file; a +general project suitable for many source files; a general project setup as a +standard UNIX filter; and a library project, setup to create a static as well as +a shared library. +.Pp +It will also setup the project for use with +.Xr git 1 , +and do a first commit for the project's files. +.Pp +The main.cpp source files for the general and filter projects already have code +in place to do complete option handling, for long and short options. It can also +display a version string, containing the +.Xr git 1 +commit hash, after you have built the tool at least once. +.Pp +The options are as follows: +.Ss General Options +.Bl -tag -width Ds +.It Fl \-version, v +Print version info and exit. +.It Fl \-gitroot Ar gitroot , Fl g Ar gitroot +Clone a +.Xr git 1 +repo from the supplied git URL. +When combined with the +.Fl \-default +or +.Fl d +option, the supplied git URL will be saved into the +.Nm +configuration file. +.It Fl \-gitfav , Fl G +Use the git URL saved earlier to clone a repo from. +.It Fl \-tplroot Ar tplroot , Fl t Ar tplroot +Specify the root directory where the project templates can be found. +This option is useful when you want to use a modified set of files to base your +projects on. +.El +.Ss Project Type Options +.Bl -tag -width Ds +.It Fl \-filter, f +Create a filter project. +.It Fl \-library, l +Create a library project. +.It Fl \-simple, s +Create a simple project. +.El +.Pp +Without any +.Sx Project Type Options , +A general project for a command line tool with multiple source files will be +created. +.Pp +The +.Sx Project Type Options +are mutually exclusive. +.\" .Sh CONTEXT +.\" For section 9 functions only. +.\" .Sh IMPLEMENTATION NOTES +.\" Not used in OpenBSD. +.\" .Sh RETURN VALUES +.\" For sections 2, 3, and 9 function return values only. +.\" .Sh ENVIRONMENT +.\" For sections 1, 6, 7, and 8 only. +.\" .Sh FILES +.Sh EXIT STATUS +.\" For sections 1, 6, and 8 only. +.Nm +exits 0 on success, and 1 if an error occurs. +.\" .Sh EXAMPLES +.\" .Sh DIAGNOSTICS +.\" For sections 1, 4, 6, 7, 8, and 9 printf/stderr messages only. +.\" .Sh ERRORS +.\" For sections 2, 3, 4, and 9 errno settings only. +.Sh PROJECT DESCRIPTION +The project created by +.Nm +has the following features. +.Ss Without Project Type Options +Without any options, a full-featured project for a tool will be created, with +the following layout: +.Bd -literal +mytool +├── Makefile +├── man +│   └── man1 +│   └── mytool.1 +├── premake.make +├── src +│   ├── main.cpp +│   ├── precomp.hpp +│   ├── version.cpp +│   └── version.hpp +└── tests + ├── Makefile -> ../Makefile + ├── postmake.make + ├── premake.make + └── src + ├── main.cpp + └── precomp.hpp -> ../../src/precomp.hpp +.Ed +.Pp +In this example, the project name is "mytool". +.Pp +Description: +.Bl -tag -width Ds +.It Makefile +This is a universal Makefile, which should not be edited. +All customization should be done in premake.make, and, optionally, +postmake.make. +The idea is that you should be able to replace it, at any time, with a newer +version, without affecting the overall functionality. +See +.Sx Makefile targets +below for more details about what's possible here. +.It man directories +Contains a boilerplate man page, ready to be edited with relevant content. +If the project needs multiple man pages, possibly also for man chapter 3 and/or +5, they can be added here. +The structure will be merged into a man directory hierarchy at install time. +.It premake.make +This file will be included by the Makefile, as a first action. +In it, several important project-related Makefile variables can and will be +defined. +.Bl -tag -width Ds +.It LDLIBS +Initially empty, this is where you can specify library dependencies, like +-lsqlite3, or -lpthread. +.It PROJ +By default, this will evaluate to the project directory's name. +Alter only if you really want another name for the tool you'll build. +Defined here, so you can use it inside the premake.make, should you need to +derive other variables from it. +.It UNAME_S +Should not be changed; here as a convenience to be able to conditionally define +Makefile rules, dependent on the type of operating system. +Defined here, so you can use it inside the premake.make. +.It PRODUCT +Only two values allowed: "tool", or "lib". +Used by the Makefile to do the right thing for either type of project. +.It MAJOR, MINOR, PATCH +Together, they form the version for your project. +Important: this is the single source of truth for the version numbering, and +will be used in the Makefile as well as in the preinstalled sources. +.It CXXFLAGS +This is where the C++ standard is defined. +Change if needed for your project. +Note the "+=" operator here, so a possibly defined $CXXFLAGS environment +variable will be honored. +.It PRECOMPILE +The project can generate and use a precompiled header. +By default, the precomp.hpp file contains the C++ Standard Library headers, but +you could add more to that file, if you like (for example, other library +headers). +By default, it is switched off. +Set to 1 if you want to switch it on. +.It PLUGINS +If your project supports plugins of any type, define the directory name(s) here. +The Makefile will then automatically build and install plugins as well. +Leave empty if your project does not use any plugins. +.El +.It src directory +Subdirectory for headers and source files. +The file already present can be used to compile and build the tool, providing +some nice features out of the box. +See +.Sx Tool Features +below for more information. +.It tests directory +Subdirectory for unit tests, using the Boost Unit Test Framework. +.El +.Ss Filter Project Type +The filter project has an identical structure as the normal type, but adds some +functionality to make the tool behave as a real UNIX filter. +See +.Sx Tool Features +below for more information. +.Ss Library Project Type +The library project has been set up to produce a static and dynamic library from +your sources. +Its directory structure is almost identical to that of a tool. +The only differences are, that the man page is for man chapter 3, and there is +no main.cpp source file. +.Pp +When building the library, a static and dynamic library are produced, containing +by default a single function which can return a version string. +.Pp +TODO describe lib header generation, honoring @exclude + +.Ss Simple Project Type +The simple project is just a directory with a single source file and a Makefile. +The idea is that you use this for simple, quick proof-of-concept tools. +Here, the source file has the same name as the project, and is almost empty, so +nothing is in the way to make it do what you want. +The Makefile is very simple, can do a "make" as well as a "make clean", but no +more. +Possible library dependencies should be added to the Makefile. +.Ss Makefile targets +.Bl -tag -width Ds +.It make +Use this to compile and link your tool. +When doing this with for the first time, or after doing a "make dist-clean", a +"build" subdirectory will be created. +Inside it, an "obj" subdirectory appears, which will contain all object files +(*.o), and all dependency files (*.dep), used by the Makefile. +Also, either a "debug" or "release" subdirectory will appear, depending on the +definition of the "DEBUG" environment variable. +This is the place where your tool or libraries will appear. +For convenience, a symlink is created on the top level of your project, pointing +to the executable, if it's a tool. +That way, you can simply do "./mytool" to run it. +.It make test +This will build and run a test tool from the tests directory. +You are expected to add your tests to the tests/src/main.cpp file, using +assertions from the Boost Unit Test Framework. +Running tests will report successes and failures. +.It make install +When installing your tool and its man page outside your home directory, prefix +with "sudo", or "doas", depending on your system. +.It make clean +This will remove compiled object files and dependency files, but keep the +previously built tool and precompiled header intact. +.It make dist-clean +This brings the project directory back to a pristine state, removing everything +that is generated using the various "make" invocations. +.It make uninstall +Remove the files that are installed by the `make install' invocation. +Please note that no dependency checks are done, so removal could break other +tools or libraries that depend on the removed files. +.El +.Ss Tool Features, out of the box +TODO describe main.cpp and version.cpp here. +.Sh SEE ALSO +.Xr make 1 , +.Xr git 1 . +.\" .Xr foobar 1 +.\" .Sh STANDARDS +.\" .Sh HISTORY +.Sh AUTHORS +Bob Polis +.\" .Sh CAVEATS +.Sh BUGS +.Nm +does no error checking for using multiple +.Sx Project Type Options +at once. +You are at the mercy of the script which type will be created in that case. +.\" .Sh SECURITY CONSIDERATIONS +.\" Not used in OpenBSD.