https://github.com/ctrlcctrlv/bsdmakefile
GNUmakefile which makes guaranteeting BSD (and macOS presumably) support easy on GNU/Linux
https://github.com/ctrlcctrlv/bsdmakefile
Last synced: 4 months ago
JSON representation
GNUmakefile which makes guaranteeting BSD (and macOS presumably) support easy on GNU/Linux
- Host: GitHub
- URL: https://github.com/ctrlcctrlv/bsdmakefile
- Owner: ctrlcctrlv
- License: other
- Created: 2022-12-24T21:30:57.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-12-24T21:43:32.000Z (over 3 years ago)
- Last Synced: 2025-10-11T04:28:43.302Z (8 months ago)
- Language: Makefile
- Size: 2.93 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# BSDmakefile v1.0
Makes testing Makefile is (Free|Open)BSDmake compatible easier on GNU/Linux
## How to use this in your own projects
* Copy `GNUmakefile` and the directory `mk` to your project directory.
* Copy `Makefile.EXAMPLE` to your project directory as `Makefile`.
## Benefits
`GNUmakefile` is a file that is only understood by GNU Make. So, when `make` is run, if you are on GNU/Linux, (or using `gmake` on another system,) it will attempt to run all common commands through Busybox to make sure your `Makefile` works with stripped down non-GNU coreutils.
However, when run on a system with only `bsdmake` (`bmake` on GNU/Linux), the file is totally ignored and `busybox` is not used.
## Writing the `Makefile`
All of your recipes must be written as:
```make
myrecipe:
$(DOBEFORE) && (\
# …
)
# …
.include
```
Furthermore, it is highly recommended to enforce:
```make
SHELL=/bin/sh
```
At the top of the `Makefile`. This ensures compatibility with POSIX shells,
such as those in use by default on *BSD.
## Accessing BSD-compatible coreutils
By default `sed` and `awk` will use generic versions, with their paths at `$SED` and `$AWK`, either through Busybox or through the system coreutils as appropriate. You can add any program `busybox` supports by editing the `all` recipe in `GNUmakefile`, and adding more `$(MAKE) test_busybox_has` lines. E.g., to add `cat` as `$CAT`, add the line:
```make
all:
# …
$(eval export $(shell $(MAKE) WHAT=cat test_busybox_has))
# …
```
## Full project example
I got this idea while working on [yeslogic/glyph-names№3](https://github.com/yeslogic/glyph-names/pull/3) and added `BSDmakefile` to that project in [yeslogic/glyph-names№2](https://github.com/yeslogic/glyph-names/pull/2).
## LICENSE
```plain
###############################################################################
#- BSDmakefile © 2022 Fredrick R. Brennan -#
###############################################################################
#- Permission is hereby granted, free of charge, to any person obtaining a #
#- copy of this software and associated documentation files (the "Software"), #
#- to deal in the Software without restriction, including without limitation #
#- the rights to use, copy, modify, merge, publish, distribute, sublicense, #
#- and/or sell copies of the Software, and to permit persons to whom the #
#- Software is furnished to do so, subject to the following conditions: #
#- #
#- The above copyright notice and this permission notice shall be included in #
#- all copies or substantial portions of the Software. #
#- #
#- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
#- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
#- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
#- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
#- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
#- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
#- DEALINGS IN THE SOFTWARE. #
###############################################################################
```