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