From 2a8065b5541668281c1ed3cfc9144c8b3ed3514c Mon Sep 17 00:00:00 2001 From: Nick Connolly Date: Fri, 26 Feb 2021 15:17:45 +0000 Subject: [PATCH] mk: add mocking for mingw cross builds On Windows there has to be a thin layer above the system calls to provide POSIX functionality. When wrapping system calls, the name needs to be prefixed with wpdk_ to ensure that the layer is called. Re-arrange the definitions to facilitate wrapping and prefix with wpdk_ for mingw. For other compilers targeting Windows, the --wrap flag is not supported and the layer above the system calls implements an alternative mechanism to enable the mocking. Tested with $(info LDFLAGS) added to spdk.mock.unittest.mk combined with visual inspection and running the unit tests. Signed-off-by: Nick Connolly Change-Id: If00504740229362c40bee4ae171d35489afb2e77 Signed-off-by: Nick Connolly Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6577 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris --- mk/spdk.mock.unittest.mk | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/mk/spdk.mock.unittest.mk b/mk/spdk.mock.unittest.mk index 90b28cf4d..8f4364da4 100644 --- a/mk/spdk.mock.unittest.mk +++ b/mk/spdk.mock.unittest.mk @@ -30,10 +30,26 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # -LDFLAGS += \ - -Wl,--wrap,calloc \ - -Wl,--wrap,pthread_mutexattr_init \ - -Wl,--wrap,pthread_mutex_init \ - -Wl,--wrap,recvmsg \ - -Wl,--wrap,sendmsg \ - -Wl,--wrap,writev +SPDK_MOCK_SYSCALLS = \ + calloc \ + pthread_mutexattr_init \ + pthread_mutex_init \ + recvmsg \ + sendmsg \ + writev + +define add_wrap_with_prefix +$(2:%=-Wl,--wrap,$(1)%) +endef + +ifeq ($(OS),Windows) +# Windows needs a thin layer above the system calls to provide POSIX +# functionality. For GCC, use the prefix wpdk_ to ensure that the layer +# is called. For other compilers, --wrap is not supported so the layer +# implements an alternative mechanism to enable mocking. +ifeq ($(CC_TYPE),gcc) +LDFLAGS += $(call add_wrap_with_prefix,wpdk_,$(SPDK_MOCK_SYSCALLS)) +endif +else +LDFLAGS += $(call add_wrap_with_prefix,,$(SPDK_MOCK_SYSCALLS)) +endif