diff options
| -rw-r--r-- | exports/Makefile | 4 | ||||
| -rw-r--r-- | exports/common.mk | 44 | ||||
| -rw-r--r-- | exports/platform.mk | 33 | ||||
| -rw-r--r-- | wrappers/csharp/Makefile | 11 | ||||
| -rw-r--r-- | wrappers/csharp/README.md | 4 | ||||
| -rw-r--r-- | wrappers/java/Makefile | 9 | ||||
| -rw-r--r-- | wrappers/java/README.md | 3 | ||||
| -rw-r--r-- | wrappers/php/Makefile | 38 | ||||
| -rw-r--r-- | wrappers/php/README.md | 2 | ||||
| -rw-r--r-- | wrappers/python/Makefile | 15 | ||||
| -rw-r--r-- | wrappers/python/README.md | 2 | ||||
| -rw-r--r-- | wrappers/swift/Makefile | 21 | ||||
| -rw-r--r-- | wrappers/swift/README.md | 7 |
13 files changed, 85 insertions, 108 deletions
diff --git a/exports/Makefile b/exports/Makefile index 67ddc61..cfb9604 100644 --- a/exports/Makefile +++ b/exports/Makefile @@ -1,6 +1,6 @@ .PHONY: build copy-to clean -include platform.mk +include common.mk ifeq ($(LIB_SUFFIX),.so) # Add SONAME as cgo does not currently do this. Mostly for Android, see https://stackoverflow.com/a/48291044 @@ -11,7 +11,7 @@ endif build: lib/$(GOOS)/$(GOARCH)/$(LIB_FILE) # Build shared library and remove lib prefix (if any) from header name -# GOOS and GOARCH envvars are set by platform.mk +# GOOS and GOARCH envvars are set by common.mk # This extra target prevents unnecessary rebuild lib/$(GOOS)/$(GOARCH)/$(LIB_FILE): exports.go ../verify.go CGO_ENABLED=1 go build -o $@ -buildmode=c-shared $< diff --git a/exports/common.mk b/exports/common.mk new file mode 100644 index 0000000..f2757c2 --- /dev/null +++ b/exports/common.mk @@ -0,0 +1,44 @@ +# Prevent executing `go env ...` multiple times for the same property +# export is needed for this and also to pass the values on to the Go compiler +ifndef GOOS +export GOOS != go env GOHOSTOS +endif +ifndef GOARCH +export GOARCH != go env GOHOSTARCH +endif + +ifeq (windows,$(GOOS)) +LIB_PREFIX ?= +LIB_SUFFIX ?= .dll +else ifeq (darwin,$(GOOS)) +LIB_PREFIX ?= lib +LIB_SUFFIX ?= .dylib +else +LIB_PREFIX ?= lib +LIB_SUFFIX ?= .so +endif + +# Library name without prefixes/suffixes +LIB_NAME ?= eduvpn_common +# Library file name +LIB_FILE ?= $(LIB_PREFIX)$(LIB_NAME)$(LIB_SUFFIX) + +# Get exports/ directory when included from a wrapper +EXPORTS_PATH = $(dir $(lastword $(MAKEFILE_LIST))) +# Remove trailing slash +EXPORTS_PATH := $(EXPORTS_PATH:/=) + +EXPORTS_LIB_PATH ?= $(EXPORTS_PATH)/lib +EXPORTS_LIB_SUBFOLDER_PATH ?= $(EXPORTS_LIB_PATH)/$(GOOS)/$(GOARCH) + +# Add library to dynamic linker path for running tests +ifeq (Windows_NT,$(OS)) +export PATH := $(abspath $(EXPORTS_LIB_SUBFOLDER_PATH)):$(PATH) +else +export LD_LIBRARY_PATH := $(abspath $(EXPORTS_LIB_SUBFOLDER_PATH)):$(LD_LIBRARY_PATH) +endif + +.try_build_lib: +ifneq ($(wildcard $(EXPORTS_PATH)/Makefile),) + $(MAKE) -C $(EXPORTS_PATH) +endif diff --git a/exports/platform.mk b/exports/platform.mk deleted file mode 100644 index cd1248b..0000000 --- a/exports/platform.mk +++ /dev/null @@ -1,33 +0,0 @@ -# Prevent executing `go env ...` multiple times for the same property -# export is needed for this and also to pass the values on to the Go compiler -ifndef GOOS -export GOOS != go env GOHOSTOS -endif -ifndef GOARCH -export GOARCH != go env GOHOSTARCH -endif - -ifeq (windows,$(GOOS)) -LIB_PREFIX = -LIB_SUFFIX = .dll -else ifeq (darwin,$(GOOS)) -LIB_PREFIX = lib -LIB_SUFFIX = .dylib -else -LIB_PREFIX = lib -LIB_SUFFIX = .so -endif - -# Library name without prefixes/suffixes -LIB_NAME = eduvpn_common -# Library file name -LIB_FILE = $(LIB_PREFIX)$(LIB_NAME)$(LIB_SUFFIX) - -# Get exports/ directory when included from a wrapper -exports_dir = $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) -# Add library to dynamic linker path for running tests -ifeq (Windows_NT,$(OS)) -export PATH := $(exports_dir)/lib/$(GOOS)/$(GOARCH):$(PATH) -else -export LD_LIBRARY_PATH := $(exports_dir)/lib/$(GOOS)/$(GOARCH):$(LD_LIBRARY_PATH) -endif diff --git a/wrappers/csharp/Makefile b/wrappers/csharp/Makefile index 29f9682..e120c7a 100644 --- a/wrappers/csharp/Makefile +++ b/wrappers/csharp/Makefile @@ -1,8 +1,10 @@ .PHONY: build pack test clean EXPORTS_PATH ?= ../../exports +include $(EXPORTS_PATH)/common.mk + # Export, see EduVpnCommon.props -export EXPORTS_LIB_PATH ?= $(EXPORTS_PATH)/lib +export EXPORTS_LIB_PATH build: dotnet publish EduVpnCommon.csproj --configuration Release @@ -10,12 +12,7 @@ build: pack: dotnet pack EduVpnCommon.csproj --configuration Release -test: -ifneq ($(EXPORTS_PATH),) -ifneq ($(wildcard $(EXPORTS_PATH)/Makefile),) - $(MAKE) -C "$(EXPORTS_PATH)" -endif -endif +test: .try_build_lib dotnet test clean: diff --git a/wrappers/csharp/README.md b/wrappers/csharp/README.md index 32d2330..553b123 100644 --- a/wrappers/csharp/README.md +++ b/wrappers/csharp/README.md @@ -22,8 +22,8 @@ Build as nupkg, including shared Go library for all platforms built in `exports/ make pack ``` -If you do not build this as part of the full repository, specify `EXPORTS_PATH="" EXPORTS_LIB_PATH="path/to/lib-folder"` -when calling make. +If you do not build this as part of the full repository, specify `EXPORTS_PATH="path/to/exports-folder"` +when calling make. This folder must contain `common.mk` and the `lib/` folder with built libraries. The wrapper targets .NET Standard 2.0, which means that it can be referenced by projects using either .NET Framework 4.6.1+, .NET Core 2.0+, or .NET 5+. diff --git a/wrappers/java/Makefile b/wrappers/java/Makefile index a63aef7..ebb8103 100644 --- a/wrappers/java/Makefile +++ b/wrappers/java/Makefile @@ -1,7 +1,7 @@ .PHONY: build pack test clean EXPORTS_PATH ?= ../../exports -EXPORTS_LIB_PATH ?= $(EXPORTS_PATH)/lib +include $(EXPORTS_PATH)/common.mk build: mvn --no-transfer-progress compile -DEXPORTS_LIB_PATH="$(EXPORTS_LIB_PATH)" @@ -9,12 +9,7 @@ build: pack: mvn --no-transfer-progress package -DEXPORTS_LIB_PATH="$(EXPORTS_LIB_PATH)" -test: -ifneq ($(EXPORTS_PATH),) -ifneq ($(wildcard $(EXPORTS_PATH)/Makefile),) - $(MAKE) -C "$(EXPORTS_PATH)" -endif -endif +test: .try_build_lib mvn --no-transfer-progress test -DEXPORTS_LIB_PATH="$(EXPORTS_LIB_PATH)" clean: diff --git a/wrappers/java/README.md b/wrappers/java/README.md index b72d90e..e19075b 100644 --- a/wrappers/java/README.md +++ b/wrappers/java/README.md @@ -24,6 +24,9 @@ make pack The JAR will include all versions of the library that are built in the `exports` folder. +If you do not build this as part of the full repository, specify `EXPORTS_PATH="path/to/exports-folder"` +when calling make. This folder must contain `common.mk` and the `lib/` folder with built libraries. + Test: ```shell diff --git a/wrappers/php/Makefile b/wrappers/php/Makefile index e0262e9..5384d92 100644 --- a/wrappers/php/Makefile +++ b/wrappers/php/Makefile @@ -1,31 +1,21 @@ .PHONY: install-header test install-dev-dependencies clean EXPORTS_PATH ?= ../../exports -EXPORTS_LIB_PATH ?= $(EXPORTS_PATH)/lib - -ifneq ($(MAKECMDGOALS),clean) -include $(EXPORTS_PATH)/platform.mk +include $(EXPORTS_PATH)/common.mk # Add phpunit to PATH export PATH := $(abspath vendor/bin):$(PATH) -endif ifeq ($(COPY_LIB),1) -COPY_LIB_DIR = lib +COPY_LIB_DIR ?= lib endif - ifneq ($(COPY_LIB_DIR),) COPY_LIB_DIR := $(COPY_LIB_DIR)/ endif # Strip / replace elements confusing PHP's limited C parser: __SIZE_TYPE__, _Complex, extern "C" # Also add FFI_LIB library name, see https://www.php.net/manual/en/ffi.load -install-header: -ifneq ($(EXPORTS_PATH),) -ifneq ($(wildcard $(EXPORTS_PATH)/Makefile),) - $(MAKE) -C "$(EXPORTS_PATH)" -endif -endif +install-header: .try_build_lib mkdir -p src/headers sed --null-data \ -e 's/DO NOT EDIT/Modified for PHP/' \ @@ -36,25 +26,25 @@ endif \ -e 's/^/#define FFI_LIB "$(subst /,\/,$(COPY_LIB_DIR))$(LIB_FILE)"\n\n/' \ \ - "$(EXPORTS_LIB_PATH)/$(GOOS)/$(GOARCH)/$(LIB_NAME).h" > src/headers/$(LIB_NAME)_php.h -ifeq ($(COPY_LIB),1) - install "$(EXPORTS_LIB_PATH)/$(GOOS)/$(GOARCH)/$(LIB_FILE)" -Dt "$(COPY_LIB_DIR)" + "$(EXPORTS_LIB_SUBFOLDER_PATH)/$(LIB_NAME).h" >src/headers/$(LIB_NAME)_php.h +ifneq ($(COPY_LIB_DIR),) + install "$(EXPORTS_LIB_SUBFOLDER_PATH)/$(LIB_FILE)" -Dt "$(COPY_LIB_DIR)" endif test: install-header install-dev-dependencies phpunit +composers = composer composer.phar ./composer ./composer.phar +# Find first composer from list above, default to 'composer' +find_composer = $(firstword $(foreach bin,$(composers),$(if $(shell command -v $(bin)),$(bin),)) composer) +# Lazy variable: https://blog.jgc.org/2016/07/lazy-gnu-make-variables.html +COMPOSER ?= $(eval COMPOSER := $(find_composer))$(COMPOSER) + # Try: composer, composer.phar, ./composer.phar, ./composer # check-platform-reqs is needed because of config.platform in composer.json, see https://getcomposer.org/doc/06-config.md#platform install-dev-dependencies: - if command -v composer; then \ - composer install && composer check-platform-reqs; \ - elif command -v composer.phar; then \ - composer.phar install && composer.phar check-platform-reqs; \ - else \ - ./composer.phar install && ./composer.phar check-platform-reqs || \ - ./composer install && ./composer check-platform-reqs; \ - fi + $(COMPOSER) install + $(COMPOSER) check-platform-reqs clean: rm -rf vendor/ .phpunit* src/headers/*.h lib/* diff --git a/wrappers/php/README.md b/wrappers/php/README.md index b5cafa2..01e4d3e 100644 --- a/wrappers/php/README.md +++ b/wrappers/php/README.md @@ -32,4 +32,4 @@ When using this library, you will need to make sure that the linker can find the pass `COPY_LIB=1` to `make install-header` to copy the library over to this folder and load it via this relative path. If you do not build this as part of the full repository, specify `EXPORTS_PATH="path/to/exports-folder"` when calling -make. This folder must contain `platform.mk` and the `lib/` folder with built libraries and headers. +make. This folder must contain `common.mk` and the `lib/` folder with built libraries and headers. diff --git a/wrappers/python/Makefile b/wrappers/python/Makefile index ba4cf5f..f46f06d 100644 --- a/wrappers/python/Makefile +++ b/wrappers/python/Makefile @@ -1,11 +1,7 @@ .PHONY: pack test clean EXPORTS_PATH ?= ../../exports -EXPORTS_LIB_PATH ?= $(EXPORTS_PATH)/lib - -ifneq ($(MAKECMDGOALS),clean) -include $(EXPORTS_PATH)/platform.mk -endif +include $(EXPORTS_PATH)/common.mk ifdef PLAT_NAME SETUP_ARGS += --plat-name=$(PLAT_NAME) @@ -15,13 +11,8 @@ endif pack: ./setup.py bdist_wheel $(SETUP_ARGS) --exports-lib-path="$(EXPORTS_LIB_PATH)" -test: -ifneq ($(EXPORTS_PATH),) -ifneq ($(wildcard $(EXPORTS_PATH)/Makefile),) - $(MAKE) -C "$(EXPORTS_PATH)" -endif -endif - install "$(EXPORTS_LIB_PATH)/$(GOOS)/$(GOARCH)/$(LIB_FILE)" -Dt "eduvpncommon/lib" +test: .try_build_lib + install "$(EXPORTS_LIB_SUBFOLDER_PATH)/$(LIB_FILE)" -Dt "eduvpncommon/lib" python3 -m unittest test_discovery rm eduvpncommon/lib/* diff --git a/wrappers/python/README.md b/wrappers/python/README.md index bce492e..6f0bec1 100644 --- a/wrappers/python/README.md +++ b/wrappers/python/README.md @@ -34,7 +34,7 @@ You could also reference the discovery module directly and copy the library for folder. If you do not build this as part of the full repository, specify `EXPORTS_PATH="path/to/exports-folder"` when calling -make. This folder must contain `platform.mk` and the `lib/` folder with built libraries. +make. This folder must contain `common.mk` and the `lib/` folder with built libraries. Test: diff --git a/wrappers/swift/Makefile b/wrappers/swift/Makefile index b46a177..6dca0ef 100644 --- a/wrappers/swift/Makefile +++ b/wrappers/swift/Makefile @@ -1,33 +1,22 @@ .PHONY: build test install-header clean EXPORTS_PATH ?= ../../exports -EXPORTS_LIB_PATH ?= $(EXPORTS_PATH)/lib - -ifneq ($(MAKECMDGOALS),clean) -include $(EXPORTS_PATH)/platform.mk - -LIB_DIR = $(EXPORTS_LIB_PATH)/$(GOOS)/$(GOARCH) +include $(EXPORTS_PATH)/common.mk ifeq ($(OS),Windows_NT) SWIFT = ./swift.cmd else SWIFT = swift endif -endif build: install-header - $(SWIFT) build --configuration release -Xlinker -L"$(LIB_DIR)" + $(SWIFT) build --configuration release -Xlinker -L"$(EXPORTS_LIB_SUBFOLDER_PATH)" test: install-header - $(SWIFT) test --parallel -Xlinker -L"$(LIB_DIR)" + $(SWIFT) test --parallel -Xlinker -L"$(EXPORTS_LIB_SUBFOLDER_PATH)" -install-header: -ifneq ($(EXPORTS_PATH),) -ifneq ($(wildcard $(EXPORTS_PATH)/Makefile),) - $(MAKE) -C "$(EXPORTS_PATH)" -endif -endif - install "$(LIB_DIR)/$(LIB_NAME).h" -Dt CEduVpnCommon/Sources/CEduVpnCommon/Headers # Copy header for modulemap +install-header: .try_build_lib + install "$(EXPORTS_LIB_SUBFOLDER_PATH)/$(LIB_NAME).h" -Dt CEduVpnCommon/Sources/CEduVpnCommon/Headers # Copy header for modulemap clean: rm -rf .build/ CEduVpnCommon/Sources/CEduVpnCommon/Headers/*.h diff --git a/wrappers/swift/README.md b/wrappers/swift/README.md index f28b028..9b0fdfe 100644 --- a/wrappers/swift/README.md +++ b/wrappers/swift/README.md @@ -21,11 +21,12 @@ make GOOS=linux GOARCH=amd64 When using this library, you will need to make sure that the linker can find the shared Go library. -<small>On Windows, you will also need to generate a .lib import library for the .dll. You can +<details><summary>Windows</summary><small> +On Windows, you will also need to generate a .lib import library for the .dll. You can use `exports/generate_lib.ps1` for this, passing in the path to the DLL file. Execute this from a Visual Studio Developer shell before building the Swift project. Alternatively, you could use `objdump` and `llvm-dlltool`. You only need to update this if the list of -exported symbols changes.</small> +exported symbols changes.</small></details> If you just want to copy over the C header file to the right directory for the modulemap in `CEduVpnCommon`, run: @@ -34,7 +35,7 @@ make install-header ``` If you do not build this as part of the full repository, specify `EXPORTS_PATH="path/to/exports-folder"` when calling -make. This folder must contain `platform.mk` and the `lib/` folder with built libraries and headers. +make. This folder must contain `common.mk` and the `lib/` folder with built libraries and headers. Test: |
