OpenBSD "make" does not correctly apply single-suffix inference rules to paths containing slashes. Double-suffix inference rules work correctly in this situation. Here's a little demonstration, starting with a double-suffix inference rule and a sub-directory:
$ mkdir a $ touch a/foo.abc $ cat > Makefile .SUFFIXES: .abc .xyz a/foo.xyz: a/foo.abc .abc.xyz: cp $< $@ ^D $ make cp a/foo.abc a/foo.xyz $ The inference rule was correctly applied to the a/foo.xyz target. So far so good. Next, a single-suffix inference rule without a directory: $ touch bar.abc $ cat > Makefile .SUFFIXES: .abc bar: bar.abc .abc: cp $< $@ ^D $ make cp bar.abc bar $ Also correct. But now apply the same situation to a sub-directory: $ mkdir b $ touch b/baz.abc $ cat > Makefile .SUFFIXES: .abc b/baz: b/baz.abc .abc: cp $< $@ ^D $ make $ The inference rule does not fire and nothing is built. It looks like this bug has been fixed, probably by accident, in other forks of bmake, such as in FreeBSD (which works correctly for all three examples).