On Wed, Mar 17, 2021 at 11:56:12PM -0400, Josh Rickmar wrote:
> Here is an ugly hack, but it solves an issue I hit while testing
> portgen(1).
>
> A project I was testing a port for uses a repo structure where the
> project's primary executable package is contained in the root of the
> repo, with some optional and auxiliary executables found under a "cmd"
> directory.
>
> go.port.mk does not work well with this project layout, because the
> do-build target notices the cmd directory exists and will only install
> "${ALL_TARGET}/cmd/...". The port builds, but is missing the
> executable that should be installed by the port. Even if I modify my
> ALL_TARGET, it will still never build the right thing.
>
> The only workaround is to redefine do-build, and I think we can do
> better than that.
>
> The 'go list' command can be used to tell if any packages defined in
> ALL_TARGET are a main package. The patch below will run an additional
> 'go install' command to build ALL_TARGET if this is the case.
>
> The patch also tries to keep the existing "cmd" behavior. In addition
> to building ALL_TARGET if it has main packages, if the cmd directory
> exists, ./cmd/... will also be built. Note that this is no longer
> concatenating ALL_TARGET to 'cmd/...', as this will obviously break if
> ALL_TARGET is multiple words (many packages can be listed together,
> separated by spaces), or ALL_TARGET itself ends in '...'.
>
> Personally, I am not a fan of the "cmd" behavior being done here, and
> would prefer each port Makefile to set ALL_TARGET to ./cmd/... if that
> is what should be built. If this were to change though, then all
> ports relying on this behavior would need updates, and it's not
> immediately obvious which ports would be broken by this change.
>
> On to the patch itself, you will see that I'm grepping the output of
> 'go list' to find if there are any main packages. The search pattern
> used here should be '^main$', but this was causing a variable
> expansion and an unquoted string, so the patch is only using ^main for
> now. I'm definitely open to suggestions on how to better deal with
> this.
>
> diff 6eaf30816f4def2f40cb2b765a3aa33ae11ae4a8 /usr/ports
> blob - 3c137447b5e134aea6cbb3f9ad5d8dccfd27e234
> file + lang/go/go.port.mk
> --- lang/go/go.port.mk
> +++ lang/go/go.port.mk
> @@ -52,11 +52,13 @@ MAKE_ENV += GOCACHE="${MODGO_GOCACHE}"
>
> MODGO_CMD ?= ${SETENV} ${MAKE_ENV} go
> MODGO_BUILD_CMD = ${MODGO_CMD} install ${MODGO_FLAGS}
> +MODGO_LIST_CMD = ${MODGO_CMD} list ${MODGO_FLAGS}
> MODGO_TEST_CMD = ${MODGO_CMD} test ${MODGO_FLAGS} ${MODGO_TEST_FLAGS}
> MODGO_BINDIR ?= bin
>
> .if ! empty(MODGO_LDFLAGS)
> MODGO_BUILD_CMD += -ldflags="${MODGO_LDFLAGS}"
> +MODGO_LIST_CMD += -ldflags="${MODGO_LDFLAGS}"
> MODGO_TEST_CMD += -ldflags="${MODGO_LDFLAGS}"
> .endif
>
> @@ -153,12 +155,13 @@ do-build:
> cd ${WRKSRC} && \
> ${MODGO_BUILD_TARGET}
> . else
> + cd ${WRKSRC} && \
> + ${MODGO_LIST_CMD} -f '{{.Name}}' ${ALL_TARGET} 2>/dev/null \
> + | grep ^main >/dev/null && \
Not tested, but does below help?
| grep -qe '^main$$' && \
> + ${MODGO_BUILD_CMD} ${ALL_TARGET} ; \
> if [ -d ${WRKSRC}/cmd ]; then \
> cd ${WRKSRC} && \
> - ${MODGO_BUILD_CMD} ${ALL_TARGET}/cmd/... ; \
> - else \
> - cd ${WRKSRC} && \
> - ${MODGO_BUILD_CMD} ${ALL_TARGET} ; \
> + ${MODGO_BUILD_CMD} ./cmd/... ; \
> fi;
> . endif
> . endif
>
--
Regards,
Mikolaj