From 13d60d4f566b35033b8e5d3648c26917caf39a02 Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Mon, 7 Dec 2020 11:21:49 +0900 Subject: [PATCH 01/13] macOS - Drop support old OS version --- lightcrafts/mk/platform.mk | 13 ++-------- macosx/helpers/CrashReporter/GNUmakefile | 23 ++++++----------- macosx/helpers/JavaAppLauncher/GNUmakefile | 29 ++++++++-------------- macosx/jnisrc/jni-macosx.mk | 23 ++++++----------- 4 files changed, 29 insertions(+), 59 deletions(-) diff --git a/lightcrafts/mk/platform.mk b/lightcrafts/mk/platform.mk index b253f824fe..0a569381e5 100644 --- a/lightcrafts/mk/platform.mk +++ b/lightcrafts/mk/platform.mk @@ -62,17 +62,8 @@ RM:= rm -fr # Mac OS X ## ifeq ($(PLATFORM),MacOSX) - MACOSX_MINOR_VERSION:= $(shell sw_vers -productVersion | cut -d. -f2-2) - ifeq ($(MACOSX_MINOR_VERSION),6) # Snow Leopard - CC:= gcc - CXX:= g++ - else ifeq ($(shell expr $(MACOSX_MINOR_VERSION) \>= 12),1) # Sierra - CC:= clang - CXX:= clang++ - else - CC:= clang-omp - CXX:= clang-omp++ - endif + CC:= clang + CXX:= clang++ MACOSX_DEPLOYMENT_TARGET:= $(shell sw_vers -productVersion | cut -d. -f-2) ifndef EXECUTABLE diff --git a/macosx/helpers/CrashReporter/GNUmakefile b/macosx/helpers/CrashReporter/GNUmakefile index 0fe87b339b..c8fe549e5f 100644 --- a/macosx/helpers/CrashReporter/GNUmakefile +++ b/macosx/helpers/CrashReporter/GNUmakefile @@ -12,24 +12,17 @@ include $(COMMON_DIR)/mk/platform.mk # Uncomment to compile in debug mode. #DEBUG:= true -MACOSX_MINOR_VERSION:= $(shell sw_vers -productVersion | cut -d. -f2-2) - # Different compilers required for Objective-C sources. -ifeq ($(MACOSX_MINOR_VERSION),6) # Snow Leopard - CC= gcc - CXX= g++ +XCODE_PATH:= $(shell xcode-select -p) +ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) + # Use command line tools. + XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin else - XCODE_PATH:= $(shell xcode-select -p) - ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) - # Use command line tools. - XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin - else - # Use Xcode. - XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin - endif - CC= $(XCODE_BIN_DIR)/clang - CXX= $(XCODE_BIN_DIR)/clang++ + # Use Xcode. + XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin endif +CC= $(XCODE_BIN_DIR)/clang +CXX= $(XCODE_BIN_DIR)/clang++ ifeq ($(UNIVERSAL),1) ## diff --git a/macosx/helpers/JavaAppLauncher/GNUmakefile b/macosx/helpers/JavaAppLauncher/GNUmakefile index 6004d4e3a6..02f5c98abb 100644 --- a/macosx/helpers/JavaAppLauncher/GNUmakefile +++ b/macosx/helpers/JavaAppLauncher/GNUmakefile @@ -16,27 +16,20 @@ JARS:= $(COMMON_DIR)/products/lightcrafts.jar \ # Uncomment to compile in debug mode. #DEBUG:= true -MACOSX_MINOR_VERSION:= $(shell sw_vers -productVersion | cut -d. -f2-2) - # Different compilers required for Objective-C sources. -ifeq ($(MACOSX_MINOR_VERSION),6) # Snow Leopard - CC= gcc - CXX= g++ +MACOSX_DEPLOYMENT_TARGET:= $(shell sw_vers -productVersion | cut -d. -f-2) +SDKROOT:= $(shell xcodebuild -version -sdk macosx${MACOSX_DEPLOYMENT_TARGET} | sed -n '/^Path:/p' | sed 's/^Path: //') + +XCODE_PATH:= $(shell xcode-select -p) +ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) + # Use command line tools. + XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin else - MACOSX_DEPLOYMENT_TARGET:= $(shell sw_vers -productVersion | cut -d. -f-2) - SDKROOT:= $(shell xcodebuild -version -sdk macosx${MACOSX_DEPLOYMENT_TARGET} | sed -n '/^Path:/p' | sed 's/^Path: //') - - XCODE_PATH:= $(shell xcode-select -p) - ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) - # Use command line tools. - XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin - else - # Use Xcode. - XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin - endif - CC= $(XCODE_BIN_DIR)/clang - CXX= $(XCODE_BIN_DIR)/clang++ + # Use Xcode. + XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin endif +CC= $(XCODE_BIN_DIR)/clang +CXX= $(XCODE_BIN_DIR)/clang++ ifeq ($(UNIVERSAL),1) ## diff --git a/macosx/jnisrc/jni-macosx.mk b/macosx/jnisrc/jni-macosx.mk index d26312c901..9926b8fc0b 100644 --- a/macosx/jnisrc/jni-macosx.mk +++ b/macosx/jnisrc/jni-macosx.mk @@ -11,23 +11,16 @@ JNI_MACOSX_LDFLAGS+= -framework Cocoa ## include $(ROOT)/lightcrafts/jnisrc/jni.mk -MACOSX_MINOR_VERSION:= $(shell sw_vers -productVersion | cut -d. -f2-2) - # Different compilers required for Objective-C sources. -ifeq ($(MACOSX_MINOR_VERSION),6) # Snow Leopard - CC= gcc - CXX= g++ +XCODE_PATH:= $(shell xcode-select -p) +ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) + # Use command line tools. + XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin else - XCODE_PATH:= $(shell xcode-select -p) - ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) - # Use command line tools. - XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin - else - # Use Xcode. - XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin - endif - CC= $(XCODE_BIN_DIR)/clang - CXX= $(XCODE_BIN_DIR)/clang++ + # Use Xcode. + XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin endif +CC= $(XCODE_BIN_DIR)/clang +CXX= $(XCODE_BIN_DIR)/clang++ # vim:set noet sw=8 ts=8: From cc5ccc082fbdbbc764a855c5c5618d4d261a1afe Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Mon, 7 Dec 2020 11:25:08 +0900 Subject: [PATCH 02/13] macOS - Drop support Intel compiler --- lightcrafts/mk/platform.mk | 23 +---------------------- macosx/build.xml | 4 ---- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/lightcrafts/mk/platform.mk b/lightcrafts/mk/platform.mk index 0a569381e5..a1b9bfc672 100644 --- a/lightcrafts/mk/platform.mk +++ b/lightcrafts/mk/platform.mk @@ -71,12 +71,6 @@ ifeq ($(PLATFORM),MacOSX) endif ALTIVEC_CFLAGS:= -DLC_USE_ALTIVEC - ifdef USE_ICC_HERE - ICC_ROOT:= /opt/intel/Compiler/11.1/067 - ICC:= $(ICC_ROOT)/bin/ia32/icc - XIAR:= $(ICC_ROOT)/bin/ia32/xiar - endif - ## # Don't use := here so other makefiles can override SDKROOT. ## @@ -104,25 +98,10 @@ ifeq ($(PLATFORM),MacOSX) ## FAST_CFLAGS_PPC:= -fast -Wstrict-aliasing -Wstrict-aliasing=2 - ifdef USE_ICC_HERE - FAST_CFLAGS_X86:= -O3 -no-prec-div -xP -fp-model fast=2 -ipo -vec-report0 -fno-common # -fno-alias - ifeq ($(UNIVERSAL),1) - CC_X86:= $(ICC) - AR_X86:= $(XIAR) - CXX_X86:= $(ICC) - else - ifneq ($(PROCESSOR),powerpc) - AR:= $(XIAR) - CC:= $(ICC) - CXX:= $(ICC) - endif - endif - else - FAST_CFLAGS_X86:= -O3 \ + FAST_CFLAGS_X86:= -O3 \ -fno-trapping-math \ -fomit-frame-pointer \ -msse2 -mfpmath=sse - endif MACOSX_CFLAGS_PPC+= $(FAST_CFLAGS_PPC) MACOSX_CFLAGS_X86+= $(FAST_CFLAGS_X86) else diff --git a/macosx/build.xml b/macosx/build.xml index 189980c4be..79874b5cc3 100755 --- a/macosx/build.xml +++ b/macosx/build.xml @@ -21,9 +21,6 @@ - - - @@ -139,7 +136,6 @@ - From 290a7853d7ba9870c06f2cd67528b0bb628408fc Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Mon, 7 Dec 2020 12:32:47 +0900 Subject: [PATCH 03/13] macOS - Drop support PPC; Add support arm64 --- lightcrafts/jnisrc/jni.mk | 36 ++++++++++---------- lightcrafts/mk/platform.mk | 38 ++++++++++++---------- macosx/helpers/CrashReporter/GNUmakefile | 35 +++----------------- macosx/helpers/JavaAppLauncher/GNUmakefile | 23 ++++--------- 4 files changed, 49 insertions(+), 83 deletions(-) diff --git a/lightcrafts/jnisrc/jni.mk b/lightcrafts/jnisrc/jni.mk index 084cebe100..424b6a9469 100644 --- a/lightcrafts/jnisrc/jni.mk +++ b/lightcrafts/jnisrc/jni.mk @@ -33,8 +33,8 @@ # platform only, the makefile can replace "EXTRA" with one of "MACOSX", # "WINDOWS" or "LINUX". # -# In addition to the above, there are also JNI_PPC_CFLAGS, JNI_PPC_DEFINES, and -# JNI_PPC_LDFLAGS for PowerPC-specific directives, and JNI_X86_CFLAGS, +# In addition to the above, there are also JNI_ARM_CFLAGS, JNI_ARM_DEFINES, and +# JNI_ARM_LDFLAGS for arm64-specific directives, and JNI_X86_CFLAGS, # JNI_X86_DEFINES, and JNI_X86_LDFLAGS for Intel-specific directives. # # If a makefile needs to override how the TARGET is build, it can do: @@ -57,7 +57,7 @@ COMMON_DIR:= $(ROOT)/lightcrafts include $(COMMON_DIR)/mk/platform.mk ifeq ($(UNIVERSAL),1) - CFLAGS_PPC:= $(PLATFORM_CFLAGS_PPC) $(JNI_EXTRA_CFLAGS) + CFLAGS_ARM:= $(PLATFORM_CFLAGS_ARM) $(JNI_EXTRA_CFLAGS) CFLAGS_X86:= $(PLATFORM_CFLAGS_X86) $(JNI_EXTRA_CFLAGS) else CFLAGS:= $(PLATFORM_CFLAGS) $(JNI_EXTRA_CFLAGS) @@ -93,15 +93,15 @@ ifeq ($(PLATFORM),MacOSX) endif endif ifeq ($(UNIVERSAL),1) - CFLAGS_PPC+= $(JNI_MACOSX_CFLAGS) $(JNI_PPC_CFLAGS) + CFLAGS_ARM+= $(JNI_MACOSX_CFLAGS) $(JNI_ARM_CFLAGS) CFLAGS_X86+= $(JNI_MACOSX_CFLAGS) $(JNI_X86_CFLAGS) else CFLAGS+= $(JNI_MACOSX_CFLAGS) - ifeq ($(PROCESSOR),powerpc) - CFLAGS+= $(JNI_PPC_CFLAGS) - DEFINES+= $(JNI_PPC_DEFINES) - LDFLAGS+= $(JNI_PPC_LDFLAGS) - LINK+= $(JNI_PPC_LINK) + ifeq ($(PROCESSOR),arm64) + CFLAGS+= $(JNI_ARM_CFLAGS) + DEFINES+= $(JNI_ARM_DEFINES) + LDFLAGS+= $(JNI_ARM_LDFLAGS) + LINK+= $(JNI_ARM_LINK) endif ifeq ($(PROCESSOR),x86_64) CFLAGS+= $(JNI_X86_CFLAGS) @@ -147,9 +147,9 @@ DEFINES+= -DDEBUG endif ifeq ($(UNIVERSAL),1) - CFLAGS_PPC+= $(DEFINES) $(JNI_PPC_DEFINES) + CFLAGS_ARM+= $(DEFINES) $(JNI_ARM_DEFINES) CFLAGS_X86+= $(DEFINES) $(JNI_X86_DEFINES) - INCLUDES_PPC:= $(INCLUDES) $(JNI_PPC_INCLUDES) + INCLUDES_ARM:= $(INCLUDES) $(JNI_ARM_INCLUDES) INCLUDES_X86:= $(INCLUDES) $(JNI_X86_INCLUDES) else CFLAGS+= $(DEFINES) @@ -174,7 +174,7 @@ endif # These are always defined even when UNIVERSAL is not set so a "make disclean" # will remove them. ## -TARGET_PPC:= $(JNILIB_PREFIX)$(TARGET_BASE)-ppc$(JNILIB_EXT) +TARGET_ARM:= $(JNILIB_PREFIX)$(TARGET_BASE)-ppc$(JNILIB_EXT) TARGET_X86:= $(JNILIB_PREFIX)$(TARGET_BASE)-x86$(JNILIB_EXT) ## @@ -213,21 +213,21 @@ endif ifeq ($(UNIVERSAL),1) -$(TARGET): $(TARGET_PPC) $(TARGET_X86) +$(TARGET): $(TARGET_ARM) $(TARGET_X86) -$(MKDIR) $(TARGET_DIR) - $(LIPO) -create $(TARGET_PPC) $(TARGET_X86) -output $@ + $(LIPO) -create $(TARGET_ARM) $(TARGET_X86) -output $@ ifeq ($(PLATFORM),MacOSX) cp -p $@ $(TARGET_DIR) endif ifndef JNI_MANUAL_TARGET ifdef USE_AR_RANLIB -$(TARGET_PPC): $(OBJECTS_PPC) $(BUILT_LIBS) +$(TARGET_ARM): $(OBJECTS_ARM) $(BUILT_LIBS) ar -rc $@ *-ppc.o -ranlib $@ else -$(TARGET_PPC): $(OBJECTS_PPC) $(LOCAL_RANLIBS) $(BUILT_LIBS) - $(CC_LINK) $(CFLAGS_PPC) $(LDFLAGS) -o $@ *-ppc.o $(LINK) +$(TARGET_ARM): $(OBJECTS_ARM) $(LOCAL_RANLIBS) $(BUILT_LIBS) + $(CC_LINK) $(CFLAGS_ARM) $(LDFLAGS) -o $@ *-ppc.o $(LINK) endif ifdef USE_AR_RANLIB @@ -274,6 +274,6 @@ clean: $(RM) *.o .*.d javah *-ranlib.a *.dSYM *.res $(TARGET).dSYM $(JNI_EXTRA_CLEAN) distclean mostlyclean: clean - $(RM) $(TARGET) $(TARGET_IMPLIB) $(TARGET_PPC) $(TARGET_X86) $(POST_TARGET) $(JNI_EXTRA_DISTCLEAN) + $(RM) $(TARGET) $(TARGET_IMPLIB) $(TARGET_ARM) $(TARGET_X86) $(POST_TARGET) $(JNI_EXTRA_DISTCLEAN) # vim:set noet sw=8 ts=8: diff --git a/lightcrafts/mk/platform.mk b/lightcrafts/mk/platform.mk index a1b9bfc672..1f62cfd1a6 100644 --- a/lightcrafts/mk/platform.mk +++ b/lightcrafts/mk/platform.mk @@ -25,8 +25,8 @@ ifeq ($(PROCESSOR),$(filter $(PROCESSOR),i486 i586 i686 i86pc)) PROCESSOR:= i386 else ifeq ($(PROCESSOR),amd64) PROCESSOR:= x86_64 -else ifeq ($(PROCESSOR),"Power Macintosh") - PROCESSOR:= powerpc +else ifeq ($(PROCESSOR),$(filter $(PROCESSOR),aarch64 armv8l arm64)) + PROCESSOR:= arm64 endif TOOLS_BIN:= $(abspath $(ROOT)/lightcrafts/tools/bin) @@ -89,41 +89,43 @@ ifeq ($(PLATFORM),MacOSX) # These are to be only the bare minimum architecture-specific CFLAGS. High- # performance CFLAGS go in the FAST_CFLAGS_* variables below. ## - MACOSX_CFLAGS_PPC:= -mcpu=G4 -mtune=G5 + MACOSX_CFLAGS_ARM:= -march=armv8.3-a MACOSX_CFLAGS_X86:= -march=core2 ifdef HIGH_PERFORMANCE ## # High-performance architecture-specific CFLAGS only. ## - FAST_CFLAGS_PPC:= -fast -Wstrict-aliasing -Wstrict-aliasing=2 - + FAST_CFLAGS_ARM:= -O3 # TODO FAST_CFLAGS_X86:= -O3 \ -fno-trapping-math \ -fomit-frame-pointer \ -msse2 -mfpmath=sse - MACOSX_CFLAGS_PPC+= $(FAST_CFLAGS_PPC) + MACOSX_CFLAGS_ARM+= $(FAST_CFLAGS_ARM) MACOSX_CFLAGS_X86+= $(FAST_CFLAGS_X86) else PLATFORM_CFLAGS+= -Os endif ifeq ($(UNIVERSAL),1) - PLATFORM_CFLAGS_PPC:= $(PLATFORM_CFLAGS) -arch ppc7400 $(MACOSX_CFLAGS_PPC) - PLATFORM_CFLAGS_X86:= $(PLATFORM_CFLAGS) -arch i386 $(MACOSX_CFLAGS_X86) + PLATFORM_CFLAGS_ARM:= $(PLATFORM_CFLAGS) -arch aarch64 $(MACOSX_CFLAGS_ARM) # TODO + PLATFORM_CFLAGS_X86:= $(PLATFORM_CFLAGS) -arch x86_64 $(MACOSX_CFLAGS_X86) - ifeq ($(PROCESSOR),powerpc) - OTHER_PROCESSOR:= i386 + ifeq ($(PROCESSOR),arm64) + OTHER_PROCESSOR:= x86_64 + OTHER_VERSION:= 10.12 # Sierra + HOST_VERSION:= 11 # Big Sur else - OTHER_PROCESSOR:= powerpc + OTHER_PROCESSOR:= arm64 + OTHER_VERSION:= 11 + HOST_VERSION:= 10.12 endif - DARWIN_RELEASE:= $(shell uname -r) - CONFIG_HOST:= $(PROCESSOR)-apple-darwin$(DARWIN_RELEASE) - CONFIG_TARGET:= $(OTHER_PROCESSOR)-apple-darwin$(DARWIN_RELEASE) + CONFIG_HOST:= $(PROCESSOR)-apple-macos$(HOST_VERSION) + CONFIG_TARGET:= $(OTHER_PROCESSOR)-apple-macos$(OTHER_VERSION) else - ifeq ($(PROCESSOR),powerpc) - PLATFORM_CFLAGS+= $(MACOSX_CFLAGS_PPC) - PLATFORM_CFLAGS_PPC:= $(PLATFORM_CFLAGS) + ifeq ($(PROCESSOR),arm64) + PLATFORM_CFLAGS+= $(MACOSX_CFLAGS_ARM) + PLATFORM_CFLAGS_ARM:= $(PLATFORM_CFLAGS) else PLATFORM_CFLAGS+= $(MACOSX_CFLAGS_X86) PLATFORM_CFLAGS_X86:= $(PLATFORM_CFLAGS) @@ -243,7 +245,7 @@ ifeq ($(PLATFORM),$(filter $(PLATFORM),Linux FreeBSD SunOS)) ifeq ($(PROCESSOR),$(filter $(PROCESSOR),x86_64 i386)) PLATFORM_CFLAGS+= $(SSE_FLAGS) - else ifeq ($(PROCESSOR),$(filter $(PROCESSOR),aarch64 armv8l)) + else ifeq ($(PROCESSOR),arm64) PLATFORM_CFLAGS+= -march=armv8-a else ifeq ($(PROCESSOR),$(filter $(PROCESSOR),armhf armv7l)) PLATFORM_CFLAGS+= -march=armv7-a diff --git a/macosx/helpers/CrashReporter/GNUmakefile b/macosx/helpers/CrashReporter/GNUmakefile index c8fe549e5f..7a982c7c8c 100644 --- a/macosx/helpers/CrashReporter/GNUmakefile +++ b/macosx/helpers/CrashReporter/GNUmakefile @@ -24,28 +24,6 @@ endif CC= $(XCODE_BIN_DIR)/clang CXX= $(XCODE_BIN_DIR)/clang++ -ifeq ($(UNIVERSAL),1) - ## - # We need to build the PowerPC part with gcc/g++ 3.3 so the launcher will run - # on older versions of Mac OS X. - ## - CC_PPC:= $(CC) -arch ppc - CXX_PPC:= $(CXX) -arch ppc - CC_X86:= $(CC) -arch i386 - CXX_X86:= $(CXX) -arch i386 - - #SDKROOT_PPC:= /Developer/SDKs/MacOSX10.3.9.sdk - #SDKROOT_X86:= /Developer/SDKs/MacOSX10.4u.sdk -else - ifeq ($(PROCESSOR),powerpc) - ## - # For PowerPC-only, we want to build against 10.3.9 to support Panther. - # (Intel-only requires 10.4.) - ## - SDKROOT:= /Developer/SDKs/MacOSX10.3.9.sdk - endif -endif - CFLAGS:= -g -Os -mdynamic-no-pic INCLUDES= $(MACOSX_ISYSROOT) LDFLAGS= $(PLATFORM_LDFLAGS) -framework Cocoa @@ -54,9 +32,6 @@ TARGET:= CrashReporter ########## You shouldn't have to change anything below this line. ############# -export MACOSX_DEPLOYMENT_TARGET_ppc:= 10.3 -export MACOSX_DEPLOYMENT_TARGET_i386:= 10.5 - ifdef DEBUG DEFINES+= -DDEBUG endif @@ -74,11 +49,11 @@ all: $(TARGET) ifeq ($(UNIVERSAL),1) -$(TARGET): $(TARGET)-ppc $(TARGET)-x86 - $(LIPO) -create $(TARGET)-ppc $(TARGET)-x86 -output $@ +$(TARGET): $(TARGET)-arm $(TARGET)-x86 + $(LIPO) -create $(TARGET)-arm $(TARGET)-x86 -output $@ -$(TARGET)-ppc: $(OBJECTS_PPC) - $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *-ppc.o +$(TARGET)-arm: $(OBJECTS_ARM) + $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *-arm.o $(TARGET)-x86: $(OBJECTS_X86) $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *-x86.o @@ -110,7 +85,7 @@ clean: $(RM) *.o .*.d distclean: clean - $(RM) $(TARGET) $(TARGET)-ppc $(TARGET)-x86 $(TARGET).app + $(RM) $(TARGET) $(TARGET)-arm $(TARGET)-x86 $(TARGET).app mostlyclean: diff --git a/macosx/helpers/JavaAppLauncher/GNUmakefile b/macosx/helpers/JavaAppLauncher/GNUmakefile index 02f5c98abb..045d3454a3 100644 --- a/macosx/helpers/JavaAppLauncher/GNUmakefile +++ b/macosx/helpers/JavaAppLauncher/GNUmakefile @@ -31,17 +31,6 @@ endif CC= $(XCODE_BIN_DIR)/clang CXX= $(XCODE_BIN_DIR)/clang++ -ifeq ($(UNIVERSAL),1) - ## - # We need to build the PowerPC part with gcc/g++ 3.3 so the launcher will run - # on older versions of Mac OS X. - ## - CC_PPC:= $(CC) -arch ppc - CXX_PPC:= $(CXX) -arch ppc - CC_X86:= $(CC) -arch i386 - CXX_X86:= $(CXX) -arch i386 -endif - CFLAGS:= -Os -mdynamic-no-pic -fobjc-exceptions INCLUDES= $(MACOSX_ISYSROOT) $(JAVA_INCLUDES) \ -I$(COMMON_DIR)/jnisrc/jniutils @@ -72,11 +61,11 @@ all: $(TARGET) ifeq ($(UNIVERSAL),1) -$(TARGET): $(TARGET)-ppc $(TARGET)-x86 - $(LIPO) -create $(TARGET)-ppc $(TARGET)-x86 -output $@ +$(TARGET): $(TARGET)-arm $(TARGET)-x86 + $(LIPO) -create $(TARGET)-arm $(TARGET)-x86 -output $@ -$(TARGET)-ppc: $(OBJECTS_PPC) - $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *-ppc.o $(LINK) +$(TARGET)-arm: $(OBJECTS_ARM) + $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *-arm.o $(LINK) $(STRIP) $@ $(TARGET)-x86: $(OBJECTS_X86) @@ -93,7 +82,7 @@ endif # UNIVERSAL include $(COMMON_DIR)/mk/auto_dep.mk -main.o main-ppc.o main-x86.o: jar_md5_include +main.o main-arm.o main-x86.o: jar_md5_include jar_md5_include: $(JARS) $(COMMON_DIR)/tools/bin/lc-md5-jar -l c $(JARS) > $@ @@ -108,7 +97,7 @@ clean: $(RM) *.o .*.d jar_md5_include distclean: clean - $(RM) $(TARGET) $(TARGET)-ppc $(TARGET)-x86 + $(RM) $(TARGET) $(TARGET)-arm $(TARGET)-x86 mostlyclean: From 1d08f7fba059a31895136939d350f80691a4a341 Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Thu, 7 Jan 2021 23:32:00 +0900 Subject: [PATCH 04/13] macOS - Remove deprecated JavaVM framework Xcode 12.2 no longer contains it. --- lightcrafts/jnisrc/jni.mk | 2 +- lightcrafts/mk/platform.mk | 4 ++-- macosx/helpers/JavaAppLauncher/GNUmakefile | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lightcrafts/jnisrc/jni.mk b/lightcrafts/jnisrc/jni.mk index 424b6a9469..49d3ef647d 100644 --- a/lightcrafts/jnisrc/jni.mk +++ b/lightcrafts/jnisrc/jni.mk @@ -82,7 +82,7 @@ TARGET_DIR:= ../../products ifeq ($(PLATFORM),MacOSX) DEFINES+= $(JNI_MACOSX_DEFINES) INCLUDES:= $(MACOSX_ISYSROOT) $(INCLUDES) $(JNI_MACOSX_INCLUDES) - LDFLAGS+= -dynamiclib -framework JavaVM $(JNI_MACOSX_LDFLAGS) + LDFLAGS+= -dynamiclib $(JNI_MACOSX_LDFLAGS) LINK+= $(JNI_MACOSX_LINK) ifdef JNI_MACOSX_DYLIB JNILIB_EXT:= $(DYLIB_EXT) diff --git a/lightcrafts/mk/platform.mk b/lightcrafts/mk/platform.mk index 1f62cfd1a6..cd400cccc0 100644 --- a/lightcrafts/mk/platform.mk +++ b/lightcrafts/mk/platform.mk @@ -134,7 +134,7 @@ ifeq ($(PLATFORM),MacOSX) LIPO:= lipo - JAVA_INCLUDES= -I$(SDKROOT)/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers + JAVA_INCLUDES+= -I"$(JAVA_HOME)/include" -I"$(JAVA_HOME)/include/darwin" JNILIB_PREFIX:= lib JNILIB_EXT:= .jnilib DYLIB_PREFIX:= $(JNILIB_PREFIX) @@ -216,7 +216,7 @@ ifeq ($(PLATFORM),Windows) else PLATFORM_CFLAGS+= -O3 \ -fno-trapping-math \ - -fomit-frame-pointer + -fomit-frame-pointer endif else PLATFORM_CFLAGS+= -Os diff --git a/macosx/helpers/JavaAppLauncher/GNUmakefile b/macosx/helpers/JavaAppLauncher/GNUmakefile index 045d3454a3..6e9097f5cf 100644 --- a/macosx/helpers/JavaAppLauncher/GNUmakefile +++ b/macosx/helpers/JavaAppLauncher/GNUmakefile @@ -34,7 +34,7 @@ CXX= $(XCODE_BIN_DIR)/clang++ CFLAGS:= -Os -mdynamic-no-pic -fobjc-exceptions INCLUDES= $(MACOSX_ISYSROOT) $(JAVA_INCLUDES) \ -I$(COMMON_DIR)/jnisrc/jniutils -LDFLAGS= $(PLATFORM_LDFLAGS) -framework JavaVM -framework Cocoa +LDFLAGS= $(PLATFORM_LDFLAGS) -framework Cocoa TARGET:= JavaAppLauncher From 721dee709d92e2ab3c12e37e02351f3ee3cafecc Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Sat, 9 Jan 2021 22:41:48 +0900 Subject: [PATCH 05/13] Workaround clang compile error on arm + simde error: argument to '__builtin_neon_vshlq_n_v' must be a constant integer --- lightcrafts/jnisrc/include/dvec.h | 57 ++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/lightcrafts/jnisrc/include/dvec.h b/lightcrafts/jnisrc/include/dvec.h index 9f7114b47f..81aa086c1a 100644 --- a/lightcrafts/jnisrc/include/dvec.h +++ b/lightcrafts/jnisrc/include/dvec.h @@ -115,13 +115,16 @@ class I64vec2 : public M128 I64vec2& operator -=(const I64vec2 &a) { return *this = (I64vec2) _mm_sub_epi64(vec,a); } I64vec2 operator<<(const I64vec2 &a) { return _mm_sll_epi64(vec,a); } - I64vec2 operator<<(int count) { return _mm_slli_epi64(vec,count); } I64vec2& operator<<=(const I64vec2 &a) { return *this = (I64vec2) _mm_sll_epi64(vec,a); } - I64vec2& operator<<=(int count) { return *this = (I64vec2) _mm_slli_epi64(vec,count); } I64vec2 operator>>(const I64vec2 &a) { return _mm_srl_epi64(vec,a); } - I64vec2 operator>>(int count) { return _mm_srli_epi64(vec,count); } I64vec2& operator>>=(const I64vec2 &a) { return *this = (I64vec2) _mm_srl_epi64(vec,a); } + + #if !defined __clang__ && !defined __aarch64__ + I64vec2 operator<<(int count) { return _mm_slli_epi64(vec,count); } + I64vec2& operator<<=(int count) { return *this = (I64vec2) _mm_slli_epi64(vec,count); } + I64vec2 operator>>(int count) { return _mm_srli_epi64(vec,count); } I64vec2& operator>>=(int count) { return *this = (I64vec2) _mm_srli_epi64(vec,count); } + #endif const int64_t& operator[](int i)const { @@ -156,10 +159,12 @@ class I32vec4 : public M128 I32vec4& operator -=(const I32vec4 &a) { return *this = (I32vec4)_mm_sub_epi32(vec,a); } I32vec4 operator<<(const I32vec4 &a) { return _mm_sll_epi32(vec,a); } - I32vec4 operator<<(int count) { return _mm_slli_epi32(vec,count); } I32vec4& operator<<=(const I32vec4 &a) { return *this = (I32vec4)_mm_sll_epi32(vec,a); } - I32vec4& operator<<=(int count) { return *this = (I32vec4)_mm_slli_epi32(vec,count); } + #if !defined __clang__ && !defined __aarch64__ + I32vec4 operator<<(int count) { return _mm_slli_epi32(vec,count); } + I32vec4& operator<<=(int count) { return *this = (I32vec4)_mm_slli_epi32(vec,count); } + #endif }; inline I32vec4 cmpeq(const I32vec4 &a,const I32vec4 &b) { return _mm_cmpeq_epi32(a,b); } @@ -191,14 +196,16 @@ class Is32vec4 : public I32vec4 Is32vec4& operator -=(const I32vec4 &a) { return *this = (Is32vec4)_mm_sub_epi32(vec,a); } Is32vec4 operator<<(const M128 &a) { return _mm_sll_epi32(vec,a); } - Is32vec4 operator<<(int count) { return _mm_slli_epi32(vec,count); } Is32vec4& operator<<=(const M128 &a) { return *this = (Is32vec4)_mm_sll_epi32(vec,a); } - Is32vec4& operator<<=(int count) { return *this = (Is32vec4)_mm_slli_epi32(vec,count); } - Is32vec4 operator>>(const M128 &a) { return _mm_sra_epi32(vec,a); } - Is32vec4 operator>>(int count) { return _mm_srai_epi32(vec,count); } Is32vec4& operator>>=(const M128 &a) { return *this = (Is32vec4) _mm_sra_epi32(vec,a); } + + #if !defined __clang__ && !defined __aarch64__ + Is32vec4 operator<<(int count) { return _mm_slli_epi32(vec,count); } + Is32vec4& operator<<=(int count) { return *this = (Is32vec4)_mm_slli_epi32(vec,count); } + Is32vec4 operator>>(int count) { return _mm_srai_epi32(vec,count); } Is32vec4& operator>>=(int count) { return *this = (Is32vec4) _mm_srai_epi32(vec,count); } + #endif #if defined(_ENABLE_VEC_DEBUG) @@ -256,13 +263,16 @@ class Iu32vec4 : public I32vec4 Iu32vec4& operator -=(const I32vec4 &a) { return *this = (Iu32vec4)_mm_sub_epi32(vec,a); } Iu32vec4 operator<<(const M128 &a) { return _mm_sll_epi32(vec,a); } - Iu32vec4 operator<<(int count) { return _mm_slli_epi32(vec,count); } Iu32vec4& operator<<=(const M128 &a) { return *this = (Iu32vec4)_mm_sll_epi32(vec,a); } - Iu32vec4& operator<<=(int count) { return *this = (Iu32vec4)_mm_slli_epi32(vec,count); } Iu32vec4 operator>>(const M128 &a) { return _mm_srl_epi32(vec,a); } - Iu32vec4 operator>>(int count) { return _mm_srli_epi32(vec,count); } Iu32vec4& operator>>=(const M128 &a) { return *this = (Iu32vec4) _mm_srl_epi32(vec,a); } + + #if !defined __clang__ && !defined __aarch64__ Iu32vec4& operator>>=(int count) { return *this = (Iu32vec4) _mm_srli_epi32(vec,count); } + Iu32vec4 operator<<(int count) { return _mm_slli_epi32(vec,count); } + Iu32vec4& operator<<=(int count) { return *this = (Iu32vec4)_mm_slli_epi32(vec,count); } + Iu32vec4 operator>>(int count) { return _mm_srli_epi32(vec,count); } + #endif #if defined(_ENABLE_VEC_DEBUG) @@ -313,9 +323,12 @@ class I16vec8 : public M128 I16vec8& operator *=(const I16vec8 &a) { return *this = (I16vec8) _mm_mullo_epi16(vec,a); } I16vec8 operator<<(const M128 &a) { return _mm_sll_epi16(vec,a); } - I16vec8 operator<<(int count) { return _mm_slli_epi16(vec,count); } I16vec8& operator<<=(const M128 &a) { return *this = (I16vec8)_mm_sll_epi16(vec,a); } + + #if !defined __clang__ && !defined __aarch64__ I16vec8& operator<<=(int count) { return *this = (I16vec8)_mm_slli_epi16(vec,count); } + I16vec8 operator<<(int count) { return _mm_slli_epi16(vec,count); } + #endif }; @@ -355,14 +368,17 @@ class Is16vec8 : public I16vec8 Is16vec8& operator *=(const I16vec8 &a) { return *this = (Is16vec8) _mm_mullo_epi16(vec,a); } Is16vec8 operator<<(const M128 &a) { return _mm_sll_epi16(vec,a); } - Is16vec8 operator<<(int count) { return _mm_slli_epi16(vec,count); } Is16vec8& operator<<=(const M128 &a) { return *this = (Is16vec8)_mm_sll_epi16(vec,a); } - Is16vec8& operator<<=(int count) { return *this = (Is16vec8)_mm_slli_epi16(vec,count); } Is16vec8 operator>>(const M128 &a) { return _mm_sra_epi16(vec,a); } - Is16vec8 operator>>(int count) { return _mm_srai_epi16(vec,count); } Is16vec8& operator>>=(const M128 &a) { return *this = (Is16vec8)_mm_sra_epi16(vec,a); } + + #if !defined __clang__ && !defined __aarch64__ + Is16vec8 operator<<(int count) { return _mm_slli_epi16(vec,count); } + Is16vec8& operator<<=(int count) { return *this = (Is16vec8)_mm_slli_epi16(vec,count); } + Is16vec8 operator>>(int count) { return _mm_srai_epi16(vec,count); } Is16vec8& operator>>=(int count) { return *this = (Is16vec8)_mm_srai_epi16(vec,count); } + #endif #if defined(_ENABLE_VEC_DEBUG) @@ -440,13 +456,16 @@ class Iu16vec8 : public I16vec8 Iu16vec8& operator *=(const I16vec8 &a) { return *this = (Iu16vec8) _mm_mullo_epi16(vec,a); } Iu16vec8 operator<<(const M128 &a) { return _mm_sll_epi16(vec,a); } - Iu16vec8 operator<<(int count) { return _mm_slli_epi16(vec,count); } Iu16vec8& operator<<=(const M128 &a) { return *this = (Iu16vec8)_mm_sll_epi16(vec,a); } - Iu16vec8& operator<<=(int count) { return *this = (Iu16vec8)_mm_slli_epi16(vec,count); } Iu16vec8 operator>>(const M128 &a) { return _mm_srl_epi16(vec,a); } - Iu16vec8 operator>>(int count) { return _mm_srli_epi16(vec,count); } Iu16vec8& operator>>=(const M128 &a) { return *this = (Iu16vec8) _mm_srl_epi16(vec,a); } + + #if !defined __clang__ && !defined __aarch64__ + Iu16vec8 operator<<(int count) { return _mm_slli_epi16(vec,count); } + Iu16vec8& operator<<=(int count) { return *this = (Iu16vec8)_mm_slli_epi16(vec,count); } + Iu16vec8 operator>>(int count) { return _mm_srli_epi16(vec,count); } Iu16vec8& operator>>=(int count) { return *this = (Iu16vec8) _mm_srli_epi16(vec,count); } + #endif #if defined(_ENABLE_VEC_DEBUG) From 7084089735714381c81a03fd1664d9d8e453b4fe Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Fri, 15 Jan 2021 23:16:49 +0900 Subject: [PATCH 06/13] macOS - Support arm in Info.plist --- macosx/resources/Info.plist | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/macosx/resources/Info.plist b/macosx/resources/Info.plist index e8d4b92321..e128eead07 100755 --- a/macosx/resources/Info.plist +++ b/macosx/resources/Info.plist @@ -84,6 +84,10 @@ LightZone.icns NSHighResolutionCapable + LSArchitecturePriority + arm64e + arm64 + x86_64 From 265ab25f8224be3ad81bd83bc90d7f7005b432f0 Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Tue, 19 Jan 2021 22:34:24 +0900 Subject: [PATCH 07/13] macOS - Remove Quaqua that not support arm64 --- macosx/lib/libquaqua.jnilib | Bin 75384 -> 0 bytes macosx/lib/libquaqua64.jnilib | Bin 149520 -> 0 bytes macosx/postprocess.sh | 2 +- macosx/resources/Info.plist | 1 - .../platform/macosx/MacOSXPlatform.java | 159 ++++++------------ 5 files changed, 51 insertions(+), 111 deletions(-) delete mode 100755 macosx/lib/libquaqua.jnilib delete mode 100755 macosx/lib/libquaqua64.jnilib diff --git a/macosx/lib/libquaqua.jnilib b/macosx/lib/libquaqua.jnilib deleted file mode 100755 index 555e481259bfbb9ea4d2431677d44a63bcfd4590..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75384 zcmeIb4}6qYnJ<0@(spRml2)qJ{vou%LWKlcTGKSOfn?|a38awNsA(rdWyyraUInQ~{^FHS}f8O`~&Rc)~Ev3{fgv$_SE0qHf$-=*E zgliD+>qB^|1OJ$o`DG-Kkw8WQ83|-0kdZ(}0vQQpB#@CnMgkcLWF(N0!2i!A@V)=| zM|Aj@B30#iMnkiR3unEs`gpTH8s z*WafUAr~4FzbqBD;vP@%@oigL0-j)~eG3xPX?(%0)Ip>Zl27aByhPJrTR;PaJ&pcA ztG`XIQ`=FuR;dOQCgcK0;%8{^+T*DYhT58%x0=j!K8~(a>X&E)p`C_3?(wuYZ*OY$ zd77FVT7+gQA1`fG3e8Z2)BV`S5$TJvRaL8OSnLPLQ5k6OOJaFEzQ+ST#`MqQIk&u% zStxJk*`N#Xc$(1C(c7_<>hr!j=GB2(blX`uTO zKgRbX)8pB=dR=KE8On%w4uXMJf6hS?e;&^^e=z9X>i4wy8^FX=) z52I`@(g~-hf#P0tj%iSOTTY@Z+d?=!jiznX4r6N0X-oDNt(%0?(Qu%SLIjVeeC>wy zuCle3?Qcb5E&^cId~NrMYyGZ7g!~~Z#U}fjf}w&y)0U64d-0e5NOKb|fW!KU+uN?y zed!ZQoq!>^0%?^9{Bb;DSb(qsp#WjJ-|~+tbssY41I{KA`1~rs^-M!p^xV(pSO0qD zE&rwDrhmLHcWWVSR*lKivS4c*s$lcu!H|DjL3z`bHgDVG1#8;8+x**G+8zxStn)tR z{Xj*2gOyV70e@Stsiiqsu*&3t!nt%KNS!qk-BNGcmX_wJ>FPW~mtDcOXntAKjQp0i z)VFx2A>ho7wC3G1M zLsmUnks>G5_E|QQ+`#7grqI;1bsp$uei;d5B#@CnMgkcL{J$cBI2oy#9Q<=Qim~t&_&+(S z(_-QO{eE8cr2ML*KmEY&@jQ+4bVW|AIy=_xjJBVNR-cYk{PyXJ--iE}in>mPmc?AB zVv&;|5t|dOh{qzwHy~OakIu`Bmgi+1Da&)R>iEB6;o}$YO+g;FkjHJvSc6gVK_KrQ z&U^TwSLZJ1VsQn29{j+r@gYPF+ew~IN2@2I72`)-`-mBfjDv${MQd`%w zlarJ2D$tI)dSY@Fi%bae{#e8<$oma)e3_u_jk(5uJNLFB4UYbH?$xd^{#A6vTzjLg zK8r}Xli(9Ds^O!59Os7q~TH5L5otIP&#PU`8{AqU5Bh(pX460atE2arw+8nKEp2E z(lWERBb3{R zqbu{GRe4#_J>|%bFBD8h?|x-RwxKH(#e~VI>!?*nKsY;U)$w!87ox(wE=5h)vkZii zd@hge(Lz6F(P$MK$6_xDZ~8uphVq>8PlMVo%C$~KrIb~6#44*hY~(^ZY(1!1<&RtC zLsIu~i~n1N|5{;~|3#BWq)T`ib)B#Zc1Xb!R>5E0!G_mJLH>_s<;9OnT9u^f(kHFb zol^Q_>?P(J8q(w!P$uR&9fQ#tg7Y8i7LwJc4bJ39)V0s#m+%Jb7V^&uR{QDLj(zOO z&ZHeeuV%w89_=f|o~$J+b5 zzcos&fL=nbFoKhB#3~L&D~`wh>}4TpDNoe3KmK#9U7&O{J1<(6mlbpE2XJCc;M5E3 z^s)bjQ7aYcDJfoY!XU@Lh_WysM_hwM9(zto0P|!F_Nk&j_ROoSuKlESuYz)XyObG- zxdzaVP=nD7E;z<22BHgX#{u$3+kiU~ z63B)oxdwL+IcPP>*ulGx&fUA2O70pGjX@uMRRnX&lJ*S0p{`X&Ads-bCe^~EAzlw3=P;u|Fk%7Lsa z+@t^n`g6faDA0QaC!rHP%nk znJ=@(_L10*gH~sBLa0!W_}^l|OC%~v*qf*@)_%|?f65*jaa^kWs<3|?on*;?Hq$SJ zj7H4u8W1fSpuVx~F)5R+q_a?^qOhPw*|=?T;sruQgqDy=;nRCqq*#UW zyZ1c#dyqh%XoD=hg*L{2{a)T~;g~B-yLoBD5!X`=$m&AHzBEzA&884dZg)3pi&dX7 zHw$$_iymx)dP4MiK&7xD`owtpHsyc)A1D8@+b%->Y)6XxzbsVVzWhIea({&UuYGzC zbt9=RmY|Vn*YPO?J$FHvtq^}?*LWYIabDNhblwa(@UVAd&L@)%8iP~B8~ZlIZVZDl zbJ`}r22M3PoID~E0~VdyI(V0)^}|B34&ftNc`QUX0@lPCzeDg+CA}8(W6J;7}>cPe`8lJxErdL2o6+JTh>4iTfVZwle*M+xCVTSbaH-6|#~pP{RgwZ3sH zB`>%66-Hbmk^~cIcW?V3YaT74{1@!eR( zG0~Dj-1^iK4!COU0h(@%(-<-a#EKt}RUb==Y)_d;LGnk_^KC=Q9yjsie~N(jd;sYU zF%3AR)W-IZfmq}iM@i^`6nu%*m|A6aG4LL00Vj4bVS&n%18L}`0zDg;v7)(qzKrIX zX#-{-tl)_2G~0|(f}U^1iC6_zCr-xT*wX(z8Lc?gjdhah(P%aPpNdwG|7LEE<2P7Y zI3#{FT*$-Gii5Fdg)KNUKabv@9o^`RZqJIoD}E_Be%ke2Jzb6dxN8W59EZ5oIo*3o z(c~5KMMOQnc>#~kOnCP*aP^uw{o25HlP(|H)%22FZ=2hvV!Vecw6vY&z{D&w) za~h6_m^nO1e{st()-Cd_hVv!vBfJ{kr0BV9GQi0er`IeGRb-Tst^s*_r(x_6ihArI zTd`_uG9i8xhwULYNL*|BbTWGw-Zf0UJlB85deH^zYb~lv>g($=m`tm$u3p3HOv>uo zkNHlD_PD-)LHP^f^V}cX!y03e8!%!+L96%2+I#J)c{R)(SD0MA6x9=Q1y{6x8iI58 z{H4gHAGcUV@1IBotNZ9or|92Pw@~{1-Q9KIKKkS6x_RB*J&dl)iOxE*I-9+7WHqEt zkVO#Rjv}zBU$E;-#eQ_{w8|o_48c5!8@z($ExFwi+r#R1k20K=J?O6#fAhgSb-z$#NXs#B9$~ylNN})AQn|Hz4@vAEa!2=^MkFTx8)7BS zxnCRFJ$ls}XQF#1n0~GoH)>Nfah^3_SHz@%C`P&~!pu*Tq-!CUg>xFB;_bk6 zJP95}q&IiF!rk2*I+MlXCDWnL-ShWgD~b_s^oT6Zk;~YgWbydda;2u!MK(+s&0qAD z?lR}x-J=uHA1!$$dW_~>O2?k%LS^hFF6fbwpGP-lN4Gnp4`xL#i$A1k(o1s2qI+Q& zW6u&1!?wnKP;C5VlW$NAd&JR5@bsgoBmPbh;8bPUI9m3Re}p9LQzFXACLr{!I1}j( zIHu0W^*Thi|IE4L{gAT8`&i0&e>&Pefsu;~{>Ce$QK$W+MyN3yM}$|nmvJ*VMmo8m zUa=2r{#b5~Rqr#Cg81+P8oG#S(~L_CT^6mqLaTR%)djPhyA+5ptg#(k=?e@MQf=5& zYhPgKN|B>gWsg*eeS(!FS)JG?xP)|UjwEfi*;*(ROxVz{eYM~?js`}xw&>pF=D>@y zLDUu3TMYz9v2s7<=0KP5fi#b5#K?w$<2XNl6&An)`3fOrf08zc1bKtCSmRN-Q4i4A7?acutN;Spi zKqshib3jBp_2z)?unXE8$OpA^HV3k#Zp$T$UoQNoZ4UfgZuzv$0jCs9EVI3VlWFOj z17DN0D%wL?n5Uo9MFRpyNt7kASCB2lrr0a^C`g$5dAhxVz1X*-<8YV3n{v-!FKxwn z_6%l8T@g<9%-xM8*C&7xyM{RMx#ImeE{7!-`+5Xt#dEuMI+8MdpD;BTi`*lTgR#h)!kuNR=(+%1 z#oq!otDc{TOa{BZJ{NAAB^DrZfj9nrR;$fF*4u=$?q?Pd5zbB(__{_AlB0jD;uOY% zS2Xx`^hX#NR%PMeoT%Iw@!R1@bXN>T9nlAnoZ}iop6d`}!;E2#KVmVa1rU3Q#DRca zo1e%2QtmEK4sh?!#y?Cn@5e-Q@}KoW50?n&dwk|y6be^U_6&vUtX`09BW_Xc6saUE z+XS$qE^KJ(u9aP&YS=86xA)Oe;+ery@-Wp|E;V%mQ+i{L^ad~K85)A0lj;(?SG$Bv za*UFKBXVmnksAc2;NM8Wgava;LGjtd59CxUU($RiXW2jOaq4z(M=Dl*;@pi{MV_^y zYs(`fu_z8*!-^9pub45)ji4=#kk`&)`$TL7nHC@@gK7$l>MHt_j9)d9~|wH`?fom1Kd*=+Rj9$=$3u+LS{<=gwUY0ITBl$ zSje`opY0y6vuu6(ex7loU4u07$4GX}N6p8MVuXwO(Tb5+)-wC-y!MW+hDklxDGRp8#Wf%$UOk=v76Ce5b_A2qce5$ z{@62_rO5>Pn}R+XYqvZo@jq@92INi?6EFL?Hv0~RmQ1nl@WQJ5 zW9>M9a(H^n?&_mi|2kHBWE1<8RQ?mGJfWq3Be}R!hGfZ;`!|VA-Y{CJZ1!CI$zw>f zYz)q8%!{?>#BgNkA!qcViRg~;C|o$KIrA>kUM1IUsghkJHg=Ot+ry0ORrXlqyIc;h zh{PhdaF?JuVvROef-^I8>w#@1$I?u9SsA)RDDIufw-m%@o?wmbdt={}DGhvbxJU4z z^Z|kHxvXE@BwfGF!+c2!*jGcW*8G#y-2Z|&XB0vw>Wth--yG!A@M#T(Q8%kKdu4}M^2t4#89dy_;eF6aCU3gMTi;^Yq^qDcNt8)SM+24$7Eo4zr1`!9@hk z$~{uYfeWeQEj$EuL>yABJbIACqJpM$pHNCHDvSVIP8sUlQpp{(Wc3y1$|i<6{YQ64 zRtq%x{eo_};PKr+hj*+e`1EGcDLnnBOC7RU(4`Jpl~k})w>ZBQht2-QGlJ7D_bhcy z_JrcM2xb`w>j}Qlm8Qn@P77{M)6Dh4nKg{X$FkWFan|HNwZ)wNv-n)D4+3%@!_e3$ zG=^g@32)kg6btkhpvDQlh&H9eaQe{RVMi~d!zw_{svC~FF27moPT24z!hhPFT>I5b z6o*_Fd{7D|Jd=ql*zii==-Dw1-9Jkj*GbIDJ9_21^oOPN@z_huH60{PK7cYQezlNH z@vFlrezlN)RWR0t;YuL;!5al)}5i#G|J4yoPp4rDhr{bW{e?3u;D67OKp zn!s9ycb>3_VOv;~-9H|9!tV2+%?X5?4ds!oKQdM&mBLFH6b=&_c4Q9Q3oijUOIano z1j|f_3Op|uiJ@J42^g#4C7{e9A(!wHI)E%AIlKhq9+%uiFMdc!ao`uTJplIT1keiw z@(DpscnQk{xi99DQTjT$+Arv%f__ra;U!oGTDbkalQcy#+Dm{VaN1}z9a77S(_R8L z!TQ8YI5fSUVk!qE{iM)^w+b%-yy|{VcnP~C7YE^n6Q>Gy4TsS@vn8ti*#~i;f6DWw zL%>wA$d|d2P5<*UM3Vj|&zt6=0`b|g?)(iw!<_$qK}*c}&t66xG!Qsn6C8B+I|L`u z-6sSG-3^>iN*21?GRY#qzY`4H00*Uyba$iO=x&s`Udkl8I|^jcesni--zT|=?tWBA zncKuV`8O!t4diC2|Bv_fZaYhg#lZ452SYYP>NG{ zAXYsf-90ozcgxAce!N0JCP?URR9-5TC%XH;NbZoHw4@#%&A0i3=gwao?B{9cFTjse z6R;AgkN=&GR-B39EOX@Z7y)sdISbEvrWS8Vt8c3EXQC0mE>Ge!l!yPid%V~pG0kFV z2 zah{wDcb`ISIQ$#MZhTnQ&nu3bDRg`VYQlUYRxyfOg1p2(4h7rS}aS>A_#c1 zmLLFSZyXQ{rtJ7r@yBHs?X=tyr()q(xddM!V<#7UKaAYn!^_1c%K6U3^G%k*^Smq0 ziIN;9&o~2u0S3Hr`5jL>1=wgwz?wJ@!=H%_GTRK0V8qEgWbzHOnsDZ=_PbMxKq<~G z!pf3GRQshc8LumcEGms-%iWy6H4j5U(~{>ScaQs0#Yz6VD@KmEM&wpaj6Cot;BGB69a9sEr4o9{ zBJ^=Yz(}kFPhnVuj$#QYhW_KwNQeOn2srX_RBDnd9PriX+~7|{F`l9Wu;hOdI|=l` zvnz%g6Y|V{cO_8 zym&v`0{AJwcntq~CKvJDFq4bs%l{kXf3Ez`lmCn5|5EwCT>h_=|Aq3uSpJvD|1$aS zmjC7Qzf%5J$^RPpUn~FX2A^G1S|2yS>SpIj({|Nr$eFS8B?5QJs z8my75k9}0f*?_TT9cMGfw&*w;Gxh-;XOqU(={OrU_I@2_^Tux1aW-=7Jvz>&j=fvQ z+2FCObezo|o2BDy{Mf(0F8ojgWB;b(6vWv7&~b`m?7!(ag);WKj#D&af3M>d(AeMV zIK?#f*E&vNjeSbTDYCJrb)145ds4?KzOgnPrx3>)bey6b`;d-Ppko_!oMIhYt>YB# z*j+kK5s%#_@vZ*Q>c>O=V37*=o41AYF&F{0lngQiM((Vt2s)PQvRiO~7z}q8= z)P~Kg+CzAwM8NM2`YT&n0!&E~RFB~8Aq4?%^VWjR`khjIpV69@wyMWlQMG<8(SuE) z#!}ShtqWWQ~jgmEiI2GU+)!4pmOS88rAhIcK z^Ls;nYC7KX(i-qSz5(w_Srw}Eh8l~M&)?u}4}>bb&5&Z7YHDr@N%QWPqR4Nmr{M68 z6(;MhDQakGTkn4yy@hK0ZOm8=NfxPwrhvbCQ#lhfbyc-?&6?CcCLgU$9sWS@!6q<^ zpB9!2#2^^-jZ)rZ7bQ3{eIE$4)T<^m6@9V>)uB(M=O5&|Us}EOpxEr+PO^||GI7IZ zttJ~bgFobyC7Okc4blumRyT#Vd0Pb&Oe29cq>ComSw#uv%Ah2W75lOuX#h9&vZS@7sxIZ5A7t}X; z+Pu)IK(Mi;!QbZ5uj}!&1Uoz%H`i=#^y40BZ*6U93*~Ra4G=`n<}SQ9cio1yo;9n= zH@lQC$mhKIB>8CWdve#Uda%kCBF+VSEl zZva|ic#z97-1l2?GZgune6D8SW?a@o`Igy!=gfs`4Y3A}CULF&*@Mn}xfv zxx(AjT-Au1%2%{Kc~5NjHifETWCCR^&Cp5=ybAuR{Ok~}jl5KEB_IP|j>jM4aQg6~ z7YE+H#nQ=N&gdtc2+0H`@52kM#rxP0x)6F0_9GlXIEXNWa17xD!YPCagtG|Fb$EXp zLN3BmghGTegi3^3ghqrALKtB$LN7u;!XUz71nYMcKERpvO68jbUf)`te5V?(m*X1y zyqRA{0vQQpB#@CnMgkcLWF(N0Kt=)?31lRYkw8WQ83|l~1m1^v_VNn68yPSMAsg|x zFt`2!i@+Opyfd*1I{SmFA)k6 zFGtvf;6Z3acpTve2$!ME#s0WR!gq#asX<;?z7q6C>r$`B)2`2?U1z10&%rg{-8~O{ zS-d$wKO2GX7C(%T{^OEPJ7lp70sD}u+r*s)k@=KWKSHZZ%kDdfk6?$4_1Nno?s8Ku z12PiGNFXDDj07?g$Vea~fs6z)639p(BY}(r{&PuS07nEcm(2Q#frkwImVv_te#gKO z1OM5;lLr3Sz_@|GGVrv4|6!owIRVsnse#!BUSr^V18*`g&%oOZTyEf91{NE*+CaB~ z8w{*6@IwZA4cunn;|A_A@EHUD(!kFf_>zII82FC{{)>S>HSpI4{=vXGSR-M3uQhO? zfy)fM+d!9r4;c86flUUs8@S8BZUaAU;PVE)Xy7*uWd`ynA+LFikdQ|R33+^wkVgjzd2Eo7M+OOf z2J)yNuX#+6kVgawc|4GiM*|6YERc{#0tvee(o*)=RPu7%1{NAvY+#9jWd^zpEH|*yz$yc446HS< z&Oo1mjRpn`Y&9@sV26R728IpnGB9G`UITj!+-G2~f%^^YGqB&l0|pKlIB4KO0}mN^ z*uWtJhYdVx;4uS73_Nb&2?I|WcmvkRa?piK0j~mF49I>iHrIvby4+m5&2_E0t})jE zbKPjJ_X6T^@2m(Qo^a0UFzNi>Bh);u;TY1-Z0ytZaZ3C;Xphe|LR~{yAbC)=@|b6;=JaMIC%&# zM-tzF1S`%LEAV#&;U>iSJ=ReZ&w>zsi}+Q7YQ%)|Y&HGUZQJtp3YwtU};<6PW3vNTT4^*GaM;<-!kZc!62 zxfSv;arGX^!NR#qsnSaf{d}y;ns^@`%lV0kkKUrx5(r^aAt= zShyULRvUC2|CRcPE&Y?W^e@`t-?qi$Hhc%DfhJP$eMMXRP92xJHrvv-+2UO`oX_ew zTBp>Dw)k;d{KvNVX>^yAnMrK2Z~b3bHngYe?n=Ed3bMx1%ZLjsu=+Fn(>T*$IguM-0u(JXg3amOH?1rUengHt+ZuZE6z;g2?-Ams&8yA zZ}IvN$CDVInGd|%9^62MJRy%dlFx)(GzoqDyc7>pm~Y2kBsZI;cm(BwNR%Dr3sfs1JC#r1tEMpOx|!8rva&CHeq1UPpc)Y!bLDcDpLygPf2U-+KZ-! zPP(A7_F?ajmGcy|+<0zIk}sB-&56gh&Ka>&ABLPNJNamyJUuxDO4?I&Q((x0Z&Rfw zpURsemqy2W7;lPf{ea&T8Rqf6DRRs+WK-lMAM!ibtJ$#GSm`Os@#(@Tl9LZ2dP>)< z#<$D^e)Cjj;u@aI8hCYl@~^T5uB5*WBRrqfgoC$+0!tR)70~%GZDk1Vn9esT7%mgn z<@z~WBy7?TyfRNS5A5V4tSQM>A&#LfLBAW%8wS9{n$4vxt&fYH;mFJc(f})gmaSIG z+Mpn?r--n@zug$7HF(A~)JPw7lfQvk0K8(VzD(MFmgZxW6?|&ecmOPr#7NHtBbrS* z!niB=L?hAwl&4(yPB;`TZNh*~O^&#bwWN#wD-RgA+UEF5KuNYG59#ACIWr!J0M&bCh zHq{3o-?pVC5Dc|%S#d6n`{!ZD7v%{Rc75~@G-PcZSGgWfeNew=MdzJMW8HDEeKS_6 z0h2WBanPWDrU~HxximJOK{DDcFu_NnfR0d(BOXuLswys;Cw`P&4uS<`FJm?mWbI$C z$0m?b_f+M1yg>S3%DO$C=72}b(bGzQ{#+WA7nrCdw9_CDH?ejPR!Po713Pc312hQj zG^iIhBY=hv-aKRaHw7O($blRy3GFmY3DT%$kudrN+hK_F<#GhqrED9<;3)Db55Po-gQEE2$P3L2wGE&&ZfI}KdwAKKF5YscDZ z6X$DF(eUOXxe_~+gwxQdm-T(*%kNx1ysgMs4jP2h&}fqB6W-&3y&23;&*>9yAIf6) zRp1OX&^eec@;3#I!${5r4Z>+?pg6V^tOiX%<0Q(mEriq1XyWUpERjyZ$ChlAg>DL* zk_Pgrr-fMRTDxJrt88r*uH;7%<{}Wj6Zfj#W2+|5xJr@1W`>yD4!{6yV ziaK|ynx5xWRqxAc^I~{FJ#VVARUcD@;hn0icsJ$?U8SLL7t)_o?&8nk`uWX`g+r)+ z_bnZr{qODQeC-aCr&pEPsUUuM> zrRqR&1Nf@n>_b}yik~9Sn+~HLRp9GJr1gWZD&3aNjcCW9=4sQA#gAJR{|Zj&sXov=XlM@GXnq#u_br}{ ze*4($JR9v=L%Sx8c8!g81hn@Wo&%tN$k0D(qrVFD52OC7;(qqareonZ)!v?0R32ai zFqhZiNfnWP`sqFBr{XJ7X2@1%gn4dt58K~`Fl@^^etvrQe6tWrhH{-~%Ra!Pw(=(o z?N1~9m@WOJN#BKZ>fv6L4I@5c!x=R=4~3s|sLt8BYE@YIfY+(zsVYsGh50x1`OVW4evB~4kUTL`=`)XXLvX7rAx~o!&b=B z&HP<}xOR7bUToMx&^v%Wa)w0*FC7M*R_I*dZY6qAMwz3YGW1Kyj!Q~ezGT+|#9_y1 zyTD5TeBBAy4_c>fJe|?J-_7yNC(rcknmi5NoQ3!}!bBLs zvWuzqWwIn;Uk=QAfwm3x9O69<8xkq@)3$8PLfYQqJ(S0WTC}CntqNa3S{L|f)c5Je z9F*zN_vwcHNnI^oo1JFy; zcf>F3llIn_eyT;e8nmy9x{G)f`pbv@^mUFU`a1&NIzf}RuMYC)cdPfkgzFBZR{@5g z?;{4M4>(pk4}e}MsblZs{oiVIcb~1jxhO+@>rb@z^$i2St&}$49!GsH@{TmQrx7m) zpOwI`wAzNe0C9|77NhP6+QIw7ZP7tH%Q|5fk>^JFGUS(8?F2ue!g}QZeu#0<>du1>3e7?1V%X7ul6HHh)8OOJ2mtTUp= zxAk%KxzDZc;{CrDeE763l`l7ZEJAu1_4~ALmiHuev-}2Wzu5gd{{TEo=V(6;nR|Xd zWH~7J0{YnMGsvh8va0L+c0w1}=T;s2P{%$~-%6A}6sE4ee(5~Ob+Geu@9jW-Z71}# z^Vl6777g&e54g0uDLUv@cY2XV*;_o_K%P)P=~UTxszO>-f}YmRUYkq`k#EzxJLiC| zrFX|bzZKWiWlM%RT81lsgml=Zm0t&JGnz;~VtB9*o;$vzYy8bgRUYAKF!d_LcDd zLwk!kHh|{-LbMn7#cs9YnZccEO;vr?`}H`i<`?c%ZsfZPUsh$vU%`A^Jxf^+WV;{z zP-v@%`cP=;OCQP@dWDgl%4N|;ylnaI$;nRNbvfYU0NRi(;|cG3Js!dCF>P`Z`SdYq zlWDj60B4kQ>iz%wT#i3IJDn$bo^u}WdD%JA`=;~1hIcwg3@=8G&LOvQzz1@kF!w0r z=o~R}OuZi_aX)A|R%$sq4;Mb?Y=k`E8!cZuxYOBSlVeF_r}MuuA7g=|@J;8#g_BOt zirHv;qqIHYH*ribdRPuRt4OC0!SG2s9>y_$Sc$%QSkrVW$U|%{bkprt1!HJyox!6_ z9i(Gx7y8XP5`NQp82wge>$fuWTUoN-rmojUCl`A0FldO5iGIC|_~$L#-dAt0Uo88T+CP&y3I9&dcjM5BQ?RY0X1?2KvsEW>k4+f6bsYK{ zH~zz7=-w#wSo>V?L2&H@jXK^F(5*Vyt~$$i03Q7xA0YjP5$Ivq8gp?EV%%Q(+Tc$0 zq^%F+%HjIE$XdeeTdfp z5A)#LIDZLs)~l6O_5bo@8tpRBhR^oitARtG$!c>MuEpm4{Pe*gF6dPJP-C(hHb+Y_+cLro9ufluoU6o%2h=jJ$j zcFxHP?<91d0n7r#{LFa<5OQ^%1%zCkSf`@Cg8rM%lX_hOW8Ew22406J5vRUt|FBa0 zLo@eqtHlqoeB?RjFA86Fh6~?Rk1oe&yE{L=FbBF+iE`zgKM}vE9I|w?EYdN?EW!Pi z!Z*jG0LG(mVV{ggiFqk-KL|QLOFztb^d#!F`l<`OQ)c7v&1a#W66!7W75$d*S@c}i zY11<&^lb6HeM#A^w9(|)ME|hZ^nWq>zu4CQqqebW6y;!hoW}v7v(8h1rwSL&nRX7G zYX7u<0eY8oYJDAsz79cO4?|zS0a}NRzE;`v6~2vQ0(rwWedTyOjX&$`vEfo*4;y_g zx9Mv+^tIfkulsEJ`qxJO)K{}sS77X%b01{ild7-pxdd|PMV&p6@#Bc^x9RI&_w95F zJ+!BvI9gw+XCgyFj_;J^F~FmM2LO)&!f$i#H~QL(dIyZY9x(bk0DV0GeQ_IoEwkw> z^llO6e@^4XVoD11imF>>KWU5*yvfIP0tFU*M-*j z!a6K{WgPW>zc1P5#qeEYRrQw@8XSzTDr_5H2a|rQllSu=+D$q210DoCIGx`!_4xW$ zpY~rJHCU6a!kTPl(*Nfe?kGcjun&%!q~GeOoKim~p�Bb!)%XQ36>`;NGBYpBdb# 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 diff --git a/macosx/lib/libquaqua64.jnilib b/macosx/lib/libquaqua64.jnilib deleted file mode 100755 index 31869a13ece46847aede5773f63f4d923a0f1d35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149520 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.jar lightcrafts-apple.jar lightcrafts.jar - quaqua.jar substance-lite.jar /System/Library/Java diff --git a/macosx/src/com/lightcrafts/platform/macosx/MacOSXPlatform.java b/macosx/src/com/lightcrafts/platform/macosx/MacOSXPlatform.java index 5283244228..61cc6c38cd 100644 --- a/macosx/src/com/lightcrafts/platform/macosx/MacOSXPlatform.java +++ b/macosx/src/com/lightcrafts/platform/macosx/MacOSXPlatform.java @@ -10,9 +10,6 @@ import javax.swing.filechooser.FileSystemView; import javax.swing.*; -import ch.randelshofer.quaqua.filechooser.QuaquaFileSystemView; -import ch.randelshofer.quaqua.QuaquaLookAndFeel; - import com.lightcrafts.platform.*; import com.lightcrafts.image.color.ColorProfileInfo; import com.lightcrafts.utils.file.FileUtil; @@ -28,18 +25,14 @@ public final class MacOSXPlatform extends Platform { private final static String home = System.getProperty("user.home"); - private final static File[] SystemProfileDirs = new File[] { - new File("/Library/ColorSync/Profiles"), - new File("/System/Library/ColorSync/Profiles") - }; + private final static File[] SystemProfileDirs = new File[] { new File("/Library/ColorSync/Profiles"), + new File("/System/Library/ColorSync/Profiles") }; - private final static File UserProfileDir = new File( - home, "Library/ColorSync/Profiles" - ); + private final static File UserProfileDir = new File(home, "Library/ColorSync/Profiles"); @Override - public void bringAppToFront( String appName ) { - AppleScript.bringAppToFront( appName ); + public void bringAppToFront(String appName) { + AppleScript.bringAppToFront(appName); } @Override @@ -50,24 +43,22 @@ public AlertDialog getAlertDialog() { @Override public ICC_Profile getDisplayProfile() { try { - final String path = - MacOSXColorProfileManager.getSystemDisplayProfilePath(); - final InputStream in = new File( path ).toURL().openStream(); - return ICC_Profile.getInstance( in ); - } - catch ( IOException e ) { + final String path = MacOSXColorProfileManager.getSystemDisplayProfilePath(); + final InputStream in = new File(path).toURL().openStream(); + return ICC_Profile.getInstance(in); + } catch (IOException e) { return null; } } @Override public File getDefaultImageDirectory() { - return new File( home, "Pictures" ); + return new File(home, "Pictures"); } @Override public synchronized Collection getExportProfiles() { - if ( m_exportProfiles == null ) { + if (m_exportProfiles == null) { m_exportProfiles = new HashSet(); for (File SystemProfileDir : SystemProfileDirs) { m_exportProfiles.addAll(getColorProfiles(SystemProfileDir)); @@ -77,62 +68,25 @@ public synchronized Collection getExportProfiles() { return m_exportProfiles; } - @Override - public FileSystemView getFileSystemView() { - return QuaquaFileSystemView.getQuaquaFileSystemView(); - } - @Override public File getLightZoneDocumentsDirectory() { final String appName = Version.getApplicationName(); final String path = "Library/Application Support/" + appName; - return new File( home, path ); - } - - @Override - public LookAndFeel getLookAndFeel() { - LookAndFeel lookAndFeel = LightZoneSkin.getLightZoneLookAndFeel(); - - boolean addQuaqua = true; - - if (addQuaqua) { - QuaquaLookAndFeel quaqua = new QuaquaLookAndFeel(); - - UIDefaults quaquaDefaults = quaqua.getDefaults(); - Object[] quaquaKeys = quaquaDefaults.keySet().toArray(); - - String[] fromQuaqua = new String[] { - "FileView", - "Tree", - "MenuBar", - "RadioButtonMenuItem", - "CheckBoxMenuItem", - }; - - for (Object key : quaquaKeys) { - for (String qk : fromQuaqua) - if (key instanceof String && ((String) key).startsWith(qk)) { - Object value = quaquaDefaults.get(key); - UIManager.put(key, value); - break; - } - - } - } - return lookAndFeel; + return new File(home, path); } @Override public String[] getPathComponentsToPicturesFolder() { - return new String[]{ System.getProperty( "user.name" ), "Pictures" }; + return new String[] { System.getProperty("user.name"), "Pictures" }; } @Override public Collection getPrinterProfiles() { return getExportProfiles(); - /* return MacOSXColorProfileManager.getProfilesFor( - MacOSXColorProfileManager.CM_OUTPUT_CLASS - ); */ + /* + * return MacOSXColorProfileManager.getProfilesFor( + * MacOSXColorProfileManager.CM_OUTPUT_CLASS ); + */ } @Override @@ -141,22 +95,21 @@ public ProgressDialog getProgressDialog() { } @Override - public File isSpecialFile( File file ) { - file = FileUtil.resolveAliasFile( file ); - if ( !(file instanceof MacOSXSmartFolder) && - MacOSXSmartFolder.isSmartFolder( file ) ) - return new MacOSXSmartFolder( file ); + public File isSpecialFile(File file) { + file = FileUtil.resolveAliasFile(file); + if (!(file instanceof MacOSXSmartFolder) && MacOSXSmartFolder.isSmartFolder(file)) + return new MacOSXSmartFolder(file); return file; } @Override public void loadLibraries() throws UnsatisfiedLinkError { - System.loadLibrary( "MacOSX" ); + System.loadLibrary("MacOSX"); } @Override - public boolean moveFilesToTrash( String[] pathNames ) { - return MacOSXFileUtil.moveToTrash( pathNames ); + public boolean moveFilesToTrash(String[] pathNames) { + return MacOSXFileUtil.moveToTrash(pathNames); } @Override @@ -165,49 +118,37 @@ public void readyToOpenFiles() { } @Override - public String resolveAliasFile( File file ) { - return MacOSXFileUtil.resolveAlias( file.getAbsolutePath() ); + public String resolveAliasFile(File file) { + return MacOSXFileUtil.resolveAlias(file.getAbsolutePath()); } @Override - public void showHelpTopic( String topic ) { - MacOSXHelp.showHelpTopic( topic ); - } - -/* - public static final int WHEEL_HORIZONTAL_SCROLLg = 2; - - static class MouseWheelDispatcher implements MacOSXMightyMouse.Listener { - final JFrame frame; - final MouseWheelListener listener; - - MouseWheelDispatcher(JFrame frame, MouseWheelListener listener) { - this.frame = frame; - this.listener = listener; - } - - private int eventId = 0; - - public void mightyMouseEvent( MacOSXMightyMouse.Event e ) { - int x = e.getX(); - int y = frame.getHeight() - e.getY(); - final MouseWheelEvent event = new MouseWheelEvent(frame, eventId++, System.currentTimeMillis(), - 0, x, y, 0, false, WHEEL_HORIZONTAL_SCROLL, - 1, e.getHScrollDelta()); - EventQueue.invokeLater( - new Runnable() { - public void run() { - listener.mouseWheelMoved(event); - } - } - ); - } + public void showHelpTopic(String topic) { + MacOSXHelp.showHelpTopic(topic); } - public void registerMouseWheelListener(MouseWheelListener listener, JFrame frame) { - MacOSXMightyMouse.setListener(new MouseWheelDispatcher(frame, listener), frame); - } -*/ + /* + * public static final int WHEEL_HORIZONTAL_SCROLLg = 2; + * + * static class MouseWheelDispatcher implements MacOSXMightyMouse.Listener { + * final JFrame frame; final MouseWheelListener listener; + * + * MouseWheelDispatcher(JFrame frame, MouseWheelListener listener) { this.frame + * = frame; this.listener = listener; } + * + * private int eventId = 0; + * + * public void mightyMouseEvent( MacOSXMightyMouse.Event e ) { int x = e.getX(); + * int y = frame.getHeight() - e.getY(); final MouseWheelEvent event = new + * MouseWheelEvent(frame, eventId++, System.currentTimeMillis(), 0, x, y, 0, + * false, WHEEL_HORIZONTAL_SCROLL, 1, e.getHScrollDelta()); + * EventQueue.invokeLater( new Runnable() { public void run() { + * listener.mouseWheelMoved(event); } } ); } } + * + * public void registerMouseWheelListener(MouseWheelListener listener, JFrame + * frame) { MacOSXMightyMouse.setListener(new MouseWheelDispatcher(frame, + * listener), frame); } + */ ////////// private //////////////////////////////////////////////////////// From ba98adcf1da665dc038686584545cdcae72cc93e Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Sun, 24 Jan 2021 10:11:09 +0900 Subject: [PATCH 08/13] macOS - Update build scripts to support arm64 --- .appveyor.yml | 2 +- lightcrafts/jnisrc/jni.mk | 6 ++-- lightcrafts/jnisrc/lensfun/GNUmakefile | 6 +--- lightcrafts/mk/platform.mk | 42 +++++++++++++--------- macosx/BUILD-macosx.md | 10 +++--- macosx/helpers/JavaAppLauncher/GNUmakefile | 3 +- macosx/jnisrc/jni-macosx.mk | 16 +++++---- macosx/jnisrc/libMacOSX/LC_CocoaUtils.h | 2 +- windows/BUILD-Windows-msys2.md | 4 +-- 9 files changed, 49 insertions(+), 42 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index e15c4fc6fa..0f5a7740c1 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -41,7 +41,7 @@ for: build_script: - cmd: bash -lc "MINGW_DIR=/c/$MINGW64_PATH ant -f $ANT_SCRIPT build-installer" - cmd: bash -lc "ant -f $ANT_SCRIPT clean-native" - - cmd: bash -lc "TARGET=i686 MINGW_DIR=/c/$MINGW32_PATH ant -f $ANT_SCRIPT -Doffline=true build-installer" + - cmd: bash -lc "TARGET_ARCH=i686 MINGW_DIR=/c/$MINGW32_PATH ant -f $ANT_SCRIPT -Doffline=true build-installer" artifacts: - path: 'windows/LightZone_Installer_*.exe' diff --git a/lightcrafts/jnisrc/jni.mk b/lightcrafts/jnisrc/jni.mk index 49d3ef647d..4e9d2c8835 100644 --- a/lightcrafts/jnisrc/jni.mk +++ b/lightcrafts/jnisrc/jni.mk @@ -174,7 +174,7 @@ endif # These are always defined even when UNIVERSAL is not set so a "make disclean" # will remove them. ## -TARGET_ARM:= $(JNILIB_PREFIX)$(TARGET_BASE)-ppc$(JNILIB_EXT) +TARGET_ARM:= $(JNILIB_PREFIX)$(TARGET_BASE)-arm64$(JNILIB_EXT) TARGET_X86:= $(JNILIB_PREFIX)$(TARGET_BASE)-x86$(JNILIB_EXT) ## @@ -223,11 +223,11 @@ endif ifndef JNI_MANUAL_TARGET ifdef USE_AR_RANLIB $(TARGET_ARM): $(OBJECTS_ARM) $(BUILT_LIBS) - ar -rc $@ *-ppc.o + ar -rc $@ *-arm64.o -ranlib $@ else $(TARGET_ARM): $(OBJECTS_ARM) $(LOCAL_RANLIBS) $(BUILT_LIBS) - $(CC_LINK) $(CFLAGS_ARM) $(LDFLAGS) -o $@ *-ppc.o $(LINK) + $(CC_LINK) $(CFLAGS_ARM) $(LDFLAGS) -o $@ *-arm64.o $(LINK) endif ifdef USE_AR_RANLIB diff --git a/lightcrafts/jnisrc/lensfun/GNUmakefile b/lightcrafts/jnisrc/lensfun/GNUmakefile index 1f4c193611..50b5d839fe 100644 --- a/lightcrafts/jnisrc/lensfun/GNUmakefile +++ b/lightcrafts/jnisrc/lensfun/GNUmakefile @@ -9,11 +9,7 @@ TARGET_BASE:= LCLENSFUN JNI_EXTRA_CFLAGS:= -std=c++14 JNI_EXTRA_INCLUDES:= $(shell $(PKGCFG) --cflags lensfun) JNI_EXTRA_LINK:= $(shell $(PKGCFG) --libs-only-l lensfun) -ifneq ($(PLATFORM),MacOSX) - JNI_EXTRA_LDFLAGS:= $(shell $(PKGCFG) --libs-only-L lensfun) -endif -JNI_MACOSX_INCLUDES:= -I/usr/local/include -JNI_MACOSX_LDFLAGS:= -L/usr/local/lib +JNI_EXTRA_LDFLAGS:= $(shell $(PKGCFG) --libs-only-L lensfun) JAVAH_CLASSES:= com.lightcrafts.utils.Lensfun diff --git a/lightcrafts/mk/platform.mk b/lightcrafts/mk/platform.mk index cd400cccc0..7b7227575b 100644 --- a/lightcrafts/mk/platform.mk +++ b/lightcrafts/mk/platform.mk @@ -16,16 +16,19 @@ endif ## # Target architecture ## -ifdef TARGET - PROCESSOR:= $(TARGET) +ifdef TARGET_ARCH + PROCESSOR:= $(TARGET_ARCH) else PROCESSOR:= $(shell uname -m) endif + ifeq ($(PROCESSOR),$(filter $(PROCESSOR),i486 i586 i686 i86pc)) PROCESSOR:= i386 -else ifeq ($(PROCESSOR),amd64) +endif +ifeq ($(PROCESSOR),amd64) PROCESSOR:= x86_64 -else ifeq ($(PROCESSOR),$(filter $(PROCESSOR),aarch64 armv8l arm64)) +endif +ifeq ($(PROCESSOR),$(filter $(PROCESSOR),aarch64 armv8l arm64)) PROCESSOR:= arm64 endif @@ -71,6 +74,15 @@ ifeq ($(PLATFORM),MacOSX) endif ALTIVEC_CFLAGS:= -DLC_USE_ALTIVEC + ifeq ($(PROCESSOR),arm64) + BREW?= /opt/homebrew/bin/brew + else + BREW?= /usr/local/bin/brew + endif + LIBOMP_PATH?= $(shell $(BREW) --prefix libomp) + PLATFORM_INCLUDES+= -I$(LIBOMP_PATH)/include + PLATFORM_LDFLAGS+= -L$(LIBOMP_PATH)/lib + ## # Don't use := here so other makefiles can override SDKROOT. ## @@ -79,7 +91,7 @@ ifeq ($(PLATFORM),MacOSX) MACOSX_ISYSROOT= -isysroot $(SDKROOT) MACOSX_SYSLIBROOT= -Wl,-syslibroot,$(SDKROOT) else - SDKROOT:= + SDKROOT?= MACOSX_ISYSROOT= MACOSX_SYSLIBROOT= endif @@ -89,8 +101,8 @@ ifeq ($(PLATFORM),MacOSX) # These are to be only the bare minimum architecture-specific CFLAGS. High- # performance CFLAGS go in the FAST_CFLAGS_* variables below. ## - MACOSX_CFLAGS_ARM:= -march=armv8.3-a - MACOSX_CFLAGS_X86:= -march=core2 + MACOSX_CFLAGS_ARM:= -target arm64-apple-macos11 + MACOSX_CFLAGS_X86:= -target x86_64-apple-macos10.12 ifdef HIGH_PERFORMANCE ## @@ -108,20 +120,16 @@ ifeq ($(PLATFORM),MacOSX) endif ifeq ($(UNIVERSAL),1) - PLATFORM_CFLAGS_ARM:= $(PLATFORM_CFLAGS) -arch aarch64 $(MACOSX_CFLAGS_ARM) # TODO - PLATFORM_CFLAGS_X86:= $(PLATFORM_CFLAGS) -arch x86_64 $(MACOSX_CFLAGS_X86) + PLATFORM_CFLAGS_ARM:= $(PLATFORM_CFLAGS) $(MACOSX_CFLAGS_ARM) + PLATFORM_CFLAGS_X86:= $(PLATFORM_CFLAGS) $(MACOSX_CFLAGS_X86) ifeq ($(PROCESSOR),arm64) - OTHER_PROCESSOR:= x86_64 - OTHER_VERSION:= 10.12 # Sierra - HOST_VERSION:= 11 # Big Sur + CONFIG_HOST:= $(MACOSX_CFLAGS_ARM) + CONFIG_TARGET:= $(MACOSX_CFLAGS_X86) else - OTHER_PROCESSOR:= arm64 - OTHER_VERSION:= 11 - HOST_VERSION:= 10.12 + CONFIG_HOST:= $(MACOSX_CFLAGS_X86) + CONFIG_TARGET:= $(MACOSX_CFLAGS_ARM) endif - CONFIG_HOST:= $(PROCESSOR)-apple-macos$(HOST_VERSION) - CONFIG_TARGET:= $(OTHER_PROCESSOR)-apple-macos$(OTHER_VERSION) else ifeq ($(PROCESSOR),arm64) PLATFORM_CFLAGS+= $(MACOSX_CFLAGS_ARM) diff --git a/macosx/BUILD-macosx.md b/macosx/BUILD-macosx.md index 7ebbacf5a3..4e59fc20cb 100644 --- a/macosx/BUILD-macosx.md +++ b/macosx/BUILD-macosx.md @@ -15,22 +15,22 @@ from LightZone/macosx/resources/Info.plist and launch the MainClass defined ther ## Install required software Building the LightZone source requires the following software: -- __Java__ version 8 or later from Oracle +- __Java__ version 11 or later +- __clang__ - __git__ - __homebrew__ from http://brew.sh/ You need to install following packages using homebrew: -- __llvm__ (to correctly compile OpenMP; it includes __clang__ and __clang++__) - __ant__ version 1.9.8 or later to support nativeheaderdir parameter - __autoconf__ - __jpeg-turbo__ +- __lensfun__ +- __libomp__ - __libtiff__ "brew edit libtiff", replace all "jpeg" occurences with "jpeg-turbo", then "brew install libtiff --build-from-source" - __little-cms2__ - __pkg-config__ -On older releases of macOS, you may need to use __clang-omp__ or __gcc__ instead of __llvm__ clang. - -If you need to install gcc and git, the easiest route is to download XCode's command-line tools; the link depends on your OS X version. +If you need to install clang and git, the easiest route is to download XCode's command-line tools; the link depends on your OS X version. - Run `xcode-select --install` on OS X 10.9 or later - http://stackoverflow.com/questions/9353444/how-to-use-install-gcc-on-mac-os-x-10-8-xcode-4-4 diff --git a/macosx/helpers/JavaAppLauncher/GNUmakefile b/macosx/helpers/JavaAppLauncher/GNUmakefile index 6e9097f5cf..9d36bfc6cd 100644 --- a/macosx/helpers/JavaAppLauncher/GNUmakefile +++ b/macosx/helpers/JavaAppLauncher/GNUmakefile @@ -18,14 +18,15 @@ JARS:= $(COMMON_DIR)/products/lightcrafts.jar \ # Different compilers required for Objective-C sources. MACOSX_DEPLOYMENT_TARGET:= $(shell sw_vers -productVersion | cut -d. -f-2) -SDKROOT:= $(shell xcodebuild -version -sdk macosx${MACOSX_DEPLOYMENT_TARGET} | sed -n '/^Path:/p' | sed 's/^Path: //') XCODE_PATH:= $(shell xcode-select -p) ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) # Use command line tools. + SDKROOT:= $(XCODE_PATH)/SDKs/MacOSX${MACOSX_DEPLOYMENT_TARGET}.sdk XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin else # Use Xcode. + SDKROOT:= $(shell xcodebuild -version -sdk macosx${MACOSX_DEPLOYMENT_TARGET} | sed -n '/^Path:/p' | sed 's/^Path: //') XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin endif CC= $(XCODE_BIN_DIR)/clang diff --git a/macosx/jnisrc/jni-macosx.mk b/macosx/jnisrc/jni-macosx.mk index 9926b8fc0b..7a564b9a72 100644 --- a/macosx/jnisrc/jni-macosx.mk +++ b/macosx/jnisrc/jni-macosx.mk @@ -4,23 +4,25 @@ # Paul J. Lucas [paul@lightcrafts.com] ## -JNI_MACOSX_LDFLAGS+= -framework Cocoa - -## -# ROOT is defined by the makefile including this one. -## -include $(ROOT)/lightcrafts/jnisrc/jni.mk - # Different compilers required for Objective-C sources. XCODE_PATH:= $(shell xcode-select -p) ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) # Use command line tools. + SDKROOT:= $(XCODE_PATH)/SDKs/MacOSX${MACOSX_DEPLOYMENT_TARGET}.sdk XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin else # Use Xcode. + SDKROOT:= $(shell xcodebuild -version -sdk macosx${MACOSX_DEPLOYMENT_TARGET} | sed -n '/^Path:/p' | sed 's/^Path: //') XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin endif CC= $(XCODE_BIN_DIR)/clang CXX= $(XCODE_BIN_DIR)/clang++ +JNI_MACOSX_INCLUDES+= -I$(SDKROOT)/usr/include +JNI_MACOSX_LDFLAGS+= -framework Cocoa + +## +# ROOT is defined by the makefile including this one. +## +include $(ROOT)/lightcrafts/jnisrc/jni.mk # vim:set noet sw=8 ts=8: diff --git a/macosx/jnisrc/libMacOSX/LC_CocoaUtils.h b/macosx/jnisrc/libMacOSX/LC_CocoaUtils.h index 738ab14acd..5f683f22e4 100644 --- a/macosx/jnisrc/libMacOSX/LC_CocoaUtils.h +++ b/macosx/jnisrc/libMacOSX/LC_CocoaUtils.h @@ -5,7 +5,7 @@ // standard #include -#include +#include #ifdef __cplusplus // local diff --git a/windows/BUILD-Windows-msys2.md b/windows/BUILD-Windows-msys2.md index 634683f03f..e61fb73584 100644 --- a/windows/BUILD-Windows-msys2.md +++ b/windows/BUILD-Windows-msys2.md @@ -73,9 +73,9 @@ To start the build: cd windows ant build-installer -If you want to build a 32-bit binary on 64-bit machine, specify TARGET variable: +If you want to build a 32-bit binary on 64-bit machine, specify TARGET_ARCH variable: - TARGET=i386 ant build-installer + TARGET_ARCH=i386 ant build-installer ### Known build issues - In LightZone there are now no version information. There was a problem with rc.exe from MSSDK From 8bb314fad2be8aef8ec5ca0269ca0877329a4846 Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Sun, 24 Jan 2021 22:58:13 +0900 Subject: [PATCH 09/13] macOS - Specify PKG_CONFIG_PATH for homebrew --- lightcrafts/mk/platform.mk | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lightcrafts/mk/platform.mk b/lightcrafts/mk/platform.mk index 7b7227575b..2ea39a4fd0 100644 --- a/lightcrafts/mk/platform.mk +++ b/lightcrafts/mk/platform.mk @@ -75,11 +75,12 @@ ifeq ($(PLATFORM),MacOSX) ALTIVEC_CFLAGS:= -DLC_USE_ALTIVEC ifeq ($(PROCESSOR),arm64) - BREW?= /opt/homebrew/bin/brew + BREW_DIR?= /opt/homebrew else - BREW?= /usr/local/bin/brew + BREW_DIR?= /usr/local endif - LIBOMP_PATH?= $(shell $(BREW) --prefix libomp) + PKG_CONFIG_PATH?= $(BREW_DIR)/lib/pkgconf + LIBOMP_PATH?= $(shell $(BREW_DIR)/bin/brew --prefix libomp) PLATFORM_INCLUDES+= -I$(LIBOMP_PATH)/include PLATFORM_LDFLAGS+= -L$(LIBOMP_PATH)/lib From 53b5c61a3d3ca297ad9f23a08114f125e566ed51 Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Sun, 24 Jan 2021 23:22:33 +0900 Subject: [PATCH 10/13] macOS, universal - Migrate PowerPC/i386 to arm64/x86_64 + Drop support gcc3.3 --- lightcrafts/jnisrc/EDISON/GNUmakefile | 2 +- lightcrafts/mk/auto_dep.mk | 16 +--- lightcrafts/mk/executable.mk | 34 ++++----- lightcrafts/mk/sources.mk | 102 +++++++++----------------- 4 files changed, 55 insertions(+), 99 deletions(-) diff --git a/lightcrafts/jnisrc/EDISON/GNUmakefile b/lightcrafts/jnisrc/EDISON/GNUmakefile index 05a23db9cb..ae5032396a 100644 --- a/lightcrafts/jnisrc/EDISON/GNUmakefile +++ b/lightcrafts/jnisrc/EDISON/GNUmakefile @@ -22,7 +22,7 @@ SEGM_INCLUDES:= segm/tdef.h segm/RAList.h segm/ms.h segm/msImageProcessor.h seg SEGM_LDFLAGS:= $(PLATFORM_LDFLAGS) ifeq ($(UNIVERSAL),1) -$(TARGET_PPC) $(TARGET_X86): $(SEGM_SOURCE) $(SEGM_INCLUDES) +$(TARGET_ARM) $(TARGET_X86): $(SEGM_SOURCE) $(SEGM_INCLUDES) -$(MKDIR) $(TARGET_DIR) $(CC_LINK) $(CFLAGS) $(INCLUDES) $(SEGM_LDFLAGS) -o $@ $(SEGM_SOURCE) ifeq ($(PLATFORM),MacOSX) diff --git a/lightcrafts/mk/auto_dep.mk b/lightcrafts/mk/auto_dep.mk index d31fe9ced6..502dd32ecd 100644 --- a/lightcrafts/mk/auto_dep.mk +++ b/lightcrafts/mk/auto_dep.mk @@ -14,12 +14,12 @@ ifeq ($(UNIVERSAL),1) ## # We need to use an architecture-specific INCLUDES, but since dependencies # are generated once regardless of the number of architectures, we have to - # pick one, so we pick PPC. Strictly speaking, this isn't the right thing do - # do since it means the X86 compile will depend on PPC includes, but in + # pick one, so we pick ARM. Strictly speaking, this isn't the right thing do + # do since it means the X86 compile will depend on ARM includes, but in # practice it's OK because this is only for dependency generation, not code # generation. ## - AUTO_DEP_FLAGS+= $(INCLUDES_PPC) + AUTO_DEP_FLAGS+= $(INCLUDES_ARM) else AUTO_DEP_FLAGS+= $(INCLUDES) endif @@ -37,15 +37,7 @@ ifeq ($(PROCESSOR),powerpc) AUTO_DEP_FLAGS+= -maltivec endif -ifeq ($(findstring MacOSX10.2.8,$(AUTO_DEP_FLAGS)),MacOSX10.2.8) - ## - # There aren't gcc 4.0 headers for the 10.2.8 SDK, so use gcc 3.3 to generate - # the dependencies. - ## - AUTO_DEP_CC:= gcc-3.3 -else - AUTO_DEP_CC:= $(CC) -endif +AUTO_DEP_CC:= $(CC) MAKEDEPEND:= $(AUTO_DEP_CC) $(AUTO_DEP_FLAGS) diff --git a/lightcrafts/mk/executable.mk b/lightcrafts/mk/executable.mk index e7cb79058c..5cfdb32fd8 100644 --- a/lightcrafts/mk/executable.mk +++ b/lightcrafts/mk/executable.mk @@ -26,8 +26,8 @@ # platform only, the makefile can replace "EXTRA" with one of "MACOSX", # "WINDOWS" or "LINUX". # -# In addition to the above, there are also EXEC_PPC_CFLAGS, EXEC_PPC_DEFINES, -# and EXEC_PPC_LDFLAGS for PowerPC-specific directives, and EXEC_X86_CFLAGS, +# In addition to the above, there are also EXEC_ARM_CFLAGS, EXEC_ARM_DEFINES, +# and EXEC_ARM_LDFLAGS for arm64-specific directives, and EXEC_X86_CFLAGS, # EXEC_X86_DEFINES, and EXEC_X86_LDFLAGS for Intel-specific directives. # # If a makefile needs to override how the TARGET is build, it can do: @@ -52,7 +52,7 @@ COMMON_DIR:= $(ROOT)/lightcrafts include $(COMMON_DIR)/mk/platform.mk ifeq ($(UNIVERSAL),1) - CFLAGS_PPC:= $(PLATFORM_CFLAGS_PPC) $(EXEC_EXTRA_CFLAGS) + CFLAGS_ARM:= $(PLATFORM_CFLAGS_ARM) $(EXEC_EXTRA_CFLAGS) CFLAGS_X86:= $(PLATFORM_CFLAGS_X86) $(EXEC_EXTRA_CFLAGS) else CFLAGS:= $(PLATFORM_CFLAGS) $(EXEC_EXTRA_CFLAGS) @@ -70,16 +70,16 @@ ifeq ($(PLATFORM),MacOSX) LDFLAGS+= $(EXEC_MACOSX_LDFLAGS) LINK+= $(EXEC_MACOSX_LINK) ifeq ($(UNIVERSAL),1) - CFLAGS_PPC+= $(EXEC_MACOSX_CFLAGS) $(EXEC_PPC_CFLAGS) + CFLAGS_ARM+= $(EXEC_MACOSX_CFLAGS) $(EXEC_ARM_CFLAGS) CFLAGS_X86+= $(EXEC_MACOSX_CFLAGS) $(EXEC_X86_CFLAGS) else CFLAGS+= $(EXEC_MACOSX_CFLAGS) - ifeq ($(PROCESSOR),powerpc) - CFLAGS+= $(EXEC_PPC_CFLAGS) - DEFINES+= $(EXEC_PPC_DEFINES) - LDFLAGS+= $(EXEC_PPC_LDFLAGS) + ifeq ($(PROCESSOR),arm64) + CFLAGS+= $(EXEC_ARM_CFLAGS) + DEFINES+= $(EXEC_ARM_DEFINES) + LDFLAGS+= $(EXEC_ARM_LDFLAGS) endif - ifeq ($(PROCESSOR),i386) + ifeq ($(PROCESSOR),x86_64) CFLAGS+= $(EXEC_X86_CFLAGS) DEFINES+= $(EXEC_X86_DEFINES) LDFLAGS+= $(EXEC_X86_LDFLAGS) @@ -112,9 +112,9 @@ DEFINES+= -DDEBUG endif ifeq ($(UNIVERSAL),1) - CFLAGS_PPC+= $(DEFINES) $(EXEC_PPC_DEFINES) + CFLAGS_ARM+= $(DEFINES) $(EXEC_ARM_DEFINES) CFLAGS_X86+= $(DEFINES) $(EXEC_X86_DEFINES) - INCLUDES_PPC:= $(INCLUDES) $(EXEC_PPC_INCLUDES) + INCLUDES_ARM:= $(INCLUDES) $(EXEC_ARM_INCLUDES) INCLUDES_X86:= $(INCLUDES) $(EXEC_X86_INCLUDES) else CFLAGS+= $(DEFINES) @@ -133,7 +133,7 @@ TARGET:= $(TARGET_DIR)/$(TARGET_BASE)$(EXEC_EXT) # These are always defined even when UNIVERSAL is not set so a "make disclean" # will remove them. ## -TARGET_PPC:= $(TARGET_BASE)-ppc$(EXEC_EXT) +TARGET_ARM:= $(TARGET_BASE)-arm$(EXEC_EXT) TARGET_X86:= $(TARGET_BASE)-x86$(EXEC_EXT) ## @@ -147,13 +147,13 @@ include $(COMMON_DIR)/mk/auto_dep.mk ifeq ($(UNIVERSAL),1) -$(TARGET): $(TARGET_PPC) $(TARGET_X86) +$(TARGET): $(TARGET_ARM) $(TARGET_X86) -$(MKDIR) $(TARGET_DIR) - $(LIPO) -create $(TARGET_PPC) $(TARGET_X86) -output $@ + $(LIPO) -create $(TARGET_ARM) $(TARGET_X86) -output $@ ifndef JNI_MANUAL_TARGET -$(TARGET_PPC): $(OBJECTS_PPC) $(LOCAL_RANLIBS) $(BUILT_LIBS) - $(CC_LINK) $(CFLAGS_PPC) $(LDFLAGS) -o $@ *-ppc.o $(LINK) +$(TARGET_ARM): $(OBJECTS_ARM) $(LOCAL_RANLIBS) $(BUILT_LIBS) + $(CC_LINK) $(CFLAGS_ARM) $(LDFLAGS) -o $@ *-arm.o $(LINK) $(TARGET_X86): $(OBJECTS_X86) $(LOCAL_RANLIBS) $(BUILT_LIBS) $(CC_LINK) $(CFLAGS_X86) $(LDFLAGS) -o $@ *-x86.o $(LINK) @@ -177,6 +177,6 @@ clean: $(RM) *.o .*.d distclean mostlyclean: clean - $(RM) $(TARGET) $(TARGET_PPC) $(TARGET_X86) $(POST_TARGET) + $(RM) $(TARGET) $(TARGET_ARM) $(TARGET_X86) $(POST_TARGET) # vim:set noet sw=8 ts=8: diff --git a/lightcrafts/mk/sources.mk b/lightcrafts/mk/sources.mk index c61da960cd..4a632179d1 100644 --- a/lightcrafts/mk/sources.mk +++ b/lightcrafts/mk/sources.mk @@ -10,41 +10,33 @@ ifeq ($(UNIVERSAL),1) # If architecture-specific versions of CC, CXX, and CFLAGS aren't set, just # copy them from the architecture-neutral values. ## - ifndef CC_PPC - CC_PPC:= $(CC) + ifndef CC_ARM + CC_ARM:= $(CC) endif ifndef CC_X86 CC_X86:= $(CC) endif - ifndef CXX_PPC - CXX_PPC:= $(CXX) + ifndef CXX_ARM + CXX_ARM:= $(CXX) endif ifndef CXX_X86 CXX_X86:= $(CXX) endif - ifndef CFLAGS_PPC - CFLAGS_PPC= $(CFLAGS) + ifndef CFLAGS_ARM + CFLAGS_ARM= $(CFLAGS) endif ifndef CFLAGS_X86 CFLAGS_X86= $(CFLAGS) endif - ifndef INCLUDES_PPC - INCLUDES_PPC= $(INCLUDES) + ifndef INCLUDES_ARM + INCLUDES_ARM= $(INCLUDES) endif ifndef INCLUDES_X86 INCLUDES_X86= $(INCLUDES) endif - ## - # gcc-3.3 doesn't permit specifying -o with -c so we have to let it generate - # the default .o and then rename it. We set this variable to know whether - # we're dealing with gcc-3.3 and thus have to deal with this case. (We only - # need to use gcc-3.3 for the PowerPC-half of Mac OS X Universal builds.) - ## - GCC_33_PPC:= $(findstring 3.3,$(CC_PPC)) - endif # UNIVERSAL ## @@ -85,17 +77,17 @@ RC_OBJECTS:= $(RC_SOURCES:.rc=.res) OBJECTS:= $(C_OBJECTS) $(OC_OBJECTS) \ $(CXX_OBJECTS) $(OCXX_OBJECTS) ifeq ($(UNIVERSAL),1) - C_OBJECTS_PPC:= $(C_SOURCES:.c=-ppc.o) + C_OBJECTS_ARM:= $(C_SOURCES:.c=-arm.o) C_OBJECTS_X86:= $(C_SOURCES:.c=-x86.o) - CXX_OBJECTS_PPC:= $(CXX_SOURCES:.cpp=-ppc.o) + CXX_OBJECTS_ARM:= $(CXX_SOURCES:.cpp=-arm.o) CXX_OBJECTS_X86:= $(CXX_SOURCES:.cpp=-x86.o) - OC_OBJECTS_PPC:= $(OC_SOURCES:.m=-ppc.o) + OC_OBJECTS_ARM:= $(OC_SOURCES:.m=-arm.o) OC_OBJECTS_X86:= $(OC_SOURCES:.m=-x86.o) - OCXX_OBJECTS_PPC:= $(OCXX_SOURCES:.mm=-ppc.o) + OCXX_OBJECTS_ARM:= $(OCXX_SOURCES:.mm=-arm.o) OCXX_OBJECTS_X86:= $(OCXX_SOURCES:.mm=-x86.o) - OBJECTS_PPC:= $(C_OBJECTS_PPC) $(OC_OBJECTS_PPC) \ - $(CXX_OBJECTS_PPC) $(OCXX_OBJECTS_PPC) + OBJECTS_ARM:= $(C_OBJECTS_ARM) $(OC_OBJECTS_ARM) \ + $(CXX_OBJECTS_ARM) $(OCXX_OBJECTS_ARM) OBJECTS_X86:= $(C_OBJECTS_X86) $(OC_OBJECTS_X86) \ $(CXX_OBJECTS_X86) $(OCXX_OBJECTS_X86) endif @@ -105,17 +97,9 @@ endif # given architecture. ## ifeq ($(UNIVERSAL),1) - ifdef SDKROOT_PPC - %-ppc.o : SDKROOT:= $(SDKROOT_PPC) - %-ppc : SDKROOT:= $(SDKROOT_PPC) - ifdef GCC_33_PPC - %-ppc.o : export NEXT_ROOT:= $(SDKROOT_PPC) - %-ppc : export NEXT_ROOT:= $(SDKROOT_PPC) - %-ppc.o : MACOSX_ISYSROOT:= - %-ppc : MACOSX_ISYSROOT:= - %-ppc.o : MACOSX_SYSLIBROOT:= - %-ppc : MACOSX_SYSLIBROOT:= - endif + ifdef SDKROOT_ARM + %-arm.o : SDKROOT:= $(SDKROOT_ARM) + %-arm : SDKROOT:= $(SDKROOT_ARM) endif ifdef SDKROOT_X86 %-x86.o : SDKROOT:= $(SDKROOT_X86) @@ -131,21 +115,11 @@ endif ifeq ($(UNIVERSAL),1) -ifdef GCC_33_PPC -%-ppc.o : %.c - $(CC_PPC) -c $(CFLAGS_PPC) $(INCLUDES_PPC) $< && mv $*.o $@ -else -%-ppc.o : %.c - $(CC_PPC) -c $(CFLAGS_PPC) $(INCLUDES_PPC) -o $@ $< -endif +%-arm.o : %.c + $(CC_ARM) -c $(CFLAGS_ARM) $(INCLUDES_ARM) -o $@ $< -ifdef GCC_33_PPC -%-ppc.o : %.cpp - $(CXX_PPC) -c $(CFLAGS_PPC) $(INCLUDES_PPC) $< && mv $*.o $@ -else -%-ppc.o : %.cpp - $(CXX_PPC) -c $(CFLAGS_PPC) $(INCLUDES_PPC) -o $@ $< -endif +%-arm.o : %.cpp + $(CXX_ARM) -c $(CFLAGS_ARM) $(INCLUDES_ARM) -o $@ $< %-x86.o : %.c $(CC_X86) -c $(CFLAGS_X86) $(INCLUDES_X86) -o $@ $< @@ -166,21 +140,11 @@ endif # UNIVERSAL ## ifeq ($(UNIVERSAL),1) -ifdef GCC_33_PPC -%-ppc.o : %.m - $(CC_PPC) -c $(filter-out -fast,$(CFLAGS_PPC)) $(INCLUDES_PPC) $< && mv $*.o $@ -else -%-ppc.o : %.m - $(CC_PPC) -c $(filter-out -fast,$(CFLAGS_PPC)) $(INCLUDES_PPC) -o $@ $< -endif +%-arm.o : %.m + $(CC_ARM) -c $(filter-out -fast,$(CFLAGS_ARM)) $(INCLUDES_ARM) -o $@ $< -ifdef GCC_33_PPC -%-ppc.o : %.mm - $(CXX_PPC) -c $(filter-out -fast,$(CFLAGS_PPC)) $(INCLUDES_PPC) $< && mv $*.o $@ -else -%-ppc.o : %.mm - $(CXX_PPC) -c $(filter-out -fast,$(CFLAGS_PPC)) $(INCLUDES_PPC) -o $@ $< -endif +%-arm.o : %.mm + $(CXX_ARM) -c $(filter-out -fast,$(CFLAGS_ARM)) $(INCLUDES_ARM) -o $@ $< %-x86.o : %.m $(CC_X86) -c $(filter-out -fast,$(CFLAGS_X86)) $(INCLUDES_X86) -o $@ $< @@ -204,27 +168,27 @@ endif # UNIVERSAL ## ifeq ($(UNIVERSAL),1) - CC_LINK_PPC:= $(CC_PPC) + CC_LINK_ARM:= $(CC_ARM) CC_LINK_X86:= $(CC_X86) ifdef CXX_SOURCES - CC_LINK_PPC:= $(CXX_PPC) + CC_LINK_ARM:= $(CXX_ARM) CC_LINK_X86:= $(CXX_X86) - endif + endif ifdef OCXX_SOURCES - CC_LINK_PPC:= $(CXX_PPC) + CC_LINK_ARM:= $(CXX_ARM) CC_LINK_X86:= $(CXX_X86) endif - %-ppc : CFLAGS:= $(CFLAGS_PPC) + %-arm : CFLAGS:= $(CFLAGS_ARM) %-x86 : CFLAGS:= $(CFLAGS_X86) - %-ppc : CC_LINK:= $(CC_LINK_PPC) + %-arm : CC_LINK:= $(CC_LINK_ARM) %-x86 : CC_LINK:= $(CC_LINK_X86) - %-ppc$(JNILIB_EXT) : CFLAGS:= $(CFLAGS_PPC) + %-arm$(JNILIB_EXT) : CFLAGS:= $(CFLAGS_ARM) %-x86$(JNILIB_EXT) : CFLAGS:= $(CFLAGS_X86) - %-ppc$(JNILIB_EXT) : CC_LINK:= $(CC_LINK_PPC) + %-arm$(JNILIB_EXT) : CC_LINK:= $(CC_LINK_ARM) %-x86$(JNILIB_EXT) : CC_LINK:= $(CC_LINK_X86) else # UNIVERSAL From f1d91305909d06d24193a34e1d093f6c38365952 Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Sun, 24 Jan 2021 23:36:22 +0900 Subject: [PATCH 11/13] macOS - Remove unused crash reporter and launcher --- macosx/build.xml | 11 - .../helpers/CrashReporter/CrashController.h | 81 --- .../helpers/CrashReporter/CrashController.mm | 526 ----------------- .../CrashReporter.xcodeproj/project.pbxproj | 304 ---------- .../CrashReporter/CrashReporter_Prefix.pch | 7 - macosx/helpers/CrashReporter/GNUmakefile | 92 --- macosx/helpers/CrashReporter/Info.plist | 26 - .../CrashReporter/LC_ModalAlertSheet.h | 22 - .../CrashReporter/LC_ModalAlertSheet.mm | 36 -- .../Resources/CrashReporter.icns | Bin 45943 -> 0 bytes .../CrashReporter.nib/classes.nib | 23 - .../English.lproj/CrashReporter.nib/info.nib | 25 - .../CrashReporter.nib/keyedobjects.nib | Bin 20353 -> 0 bytes .../Resources/English.lproj/InfoPlist.strings | Bin 268 -> 0 bytes .../English.lproj/Localizable.strings | Bin 1480 -> 0 bytes .../CrashReporter/Resources/bug-80.png | Bin 8482 -> 0 bytes macosx/helpers/CrashReporter/main.m | 6 - macosx/helpers/CrashReporter/version.plist | 16 - macosx/helpers/GNUmakefile | 3 - macosx/helpers/JavaAppLauncher/GNUmakefile | 105 ---- .../helpers/JavaAppLauncher/JavaParamBlock.h | 33 -- .../helpers/JavaAppLauncher/JavaParamBlock.mm | 518 ----------------- .../helpers/JavaAppLauncher/LC_CocoaUtils.h | 86 --- .../helpers/JavaAppLauncher/LC_CocoaUtils.mm | 63 -- .../helpers/JavaAppLauncher/LC_JNIUtils.cpp | 65 --- macosx/helpers/JavaAppLauncher/LC_JNIUtils.h | 132 ----- .../JavaAppLauncher/LaunchController.mm | 546 ------------------ .../Danish.lproj/Localizable.strings | 69 --- .../Resources/Dutch.lproj/Localizable.strings | 69 --- .../English.lproj/Localizable.strings | 69 --- .../French.lproj/Localizable.strings | 69 --- .../Japanese.lproj/Localizable.strings | 69 --- .../Spanish.lproj/Localizable.strings | 69 --- .../helpers/JavaAppLauncher/SetJVMVersion.h | 15 - .../helpers/JavaAppLauncher/SetJVMVersion.mm | 142 ----- macosx/helpers/JavaAppLauncher/StartJava.mm | 133 ----- macosx/helpers/JavaAppLauncher/UI.h | 31 - macosx/helpers/JavaAppLauncher/UI.mm | 35 -- macosx/helpers/JavaAppLauncher/main.mm | 321 ---------- macosx/helpers/JavaAppLauncher/md5.c | 256 -------- macosx/helpers/JavaAppLauncher/md5.h | 59 -- macosx/oracle.xml | 3 - 42 files changed, 4135 deletions(-) delete mode 100644 macosx/helpers/CrashReporter/CrashController.h delete mode 100644 macosx/helpers/CrashReporter/CrashController.mm delete mode 100644 macosx/helpers/CrashReporter/CrashReporter.xcodeproj/project.pbxproj delete mode 100644 macosx/helpers/CrashReporter/CrashReporter_Prefix.pch delete mode 100644 macosx/helpers/CrashReporter/GNUmakefile delete mode 100644 macosx/helpers/CrashReporter/Info.plist delete mode 100644 macosx/helpers/CrashReporter/LC_ModalAlertSheet.h delete mode 100644 macosx/helpers/CrashReporter/LC_ModalAlertSheet.mm delete mode 100644 macosx/helpers/CrashReporter/Resources/CrashReporter.icns delete mode 100644 macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/classes.nib delete mode 100644 macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/info.nib delete mode 100644 macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/keyedobjects.nib delete mode 100644 macosx/helpers/CrashReporter/Resources/English.lproj/InfoPlist.strings delete mode 100644 macosx/helpers/CrashReporter/Resources/English.lproj/Localizable.strings delete mode 100644 macosx/helpers/CrashReporter/Resources/bug-80.png delete mode 100644 macosx/helpers/CrashReporter/main.m delete mode 100644 macosx/helpers/CrashReporter/version.plist delete mode 100644 macosx/helpers/GNUmakefile delete mode 100644 macosx/helpers/JavaAppLauncher/GNUmakefile delete mode 100644 macosx/helpers/JavaAppLauncher/JavaParamBlock.h delete mode 100644 macosx/helpers/JavaAppLauncher/JavaParamBlock.mm delete mode 100644 macosx/helpers/JavaAppLauncher/LC_CocoaUtils.h delete mode 100644 macosx/helpers/JavaAppLauncher/LC_CocoaUtils.mm delete mode 100644 macosx/helpers/JavaAppLauncher/LC_JNIUtils.cpp delete mode 100644 macosx/helpers/JavaAppLauncher/LC_JNIUtils.h delete mode 100644 macosx/helpers/JavaAppLauncher/LaunchController.mm delete mode 100644 macosx/helpers/JavaAppLauncher/Resources/Danish.lproj/Localizable.strings delete mode 100644 macosx/helpers/JavaAppLauncher/Resources/Dutch.lproj/Localizable.strings delete mode 100644 macosx/helpers/JavaAppLauncher/Resources/English.lproj/Localizable.strings delete mode 100644 macosx/helpers/JavaAppLauncher/Resources/French.lproj/Localizable.strings delete mode 100644 macosx/helpers/JavaAppLauncher/Resources/Japanese.lproj/Localizable.strings delete mode 100644 macosx/helpers/JavaAppLauncher/Resources/Spanish.lproj/Localizable.strings delete mode 100644 macosx/helpers/JavaAppLauncher/SetJVMVersion.h delete mode 100644 macosx/helpers/JavaAppLauncher/SetJVMVersion.mm delete mode 100644 macosx/helpers/JavaAppLauncher/StartJava.mm delete mode 100644 macosx/helpers/JavaAppLauncher/UI.h delete mode 100644 macosx/helpers/JavaAppLauncher/UI.mm delete mode 100644 macosx/helpers/JavaAppLauncher/main.mm delete mode 100644 macosx/helpers/JavaAppLauncher/md5.c delete mode 100644 macosx/helpers/JavaAppLauncher/md5.h diff --git a/macosx/build.xml b/macosx/build.xml index 79874b5cc3..6a82da3195 100755 --- a/macosx/build.xml +++ b/macosx/build.xml @@ -63,12 +63,6 @@ - - - - - - @@ -176,11 +170,6 @@ - - - - - diff --git a/macosx/helpers/CrashReporter/CrashController.h b/macosx/helpers/CrashReporter/CrashController.h deleted file mode 100644 index 662665b57b..0000000000 --- a/macosx/helpers/CrashReporter/CrashController.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 2005-2011 Fabio Riccardi */ - -#import - -/** - * Define if we're to check a web site to obtain the latest version of the - * application and, if the version that crashed is older, forbid submitting - * crash reports. - */ -/* #define FORBID_OLD_VERSIONS */ - -/** - * A CrashController is the main class for this application. - */ -@interface CrashController : NSObject -{ - IBOutlet NSTextView* descriptionText; - IBOutlet NSButton* detailsOKButton; - IBOutlet NSPanel* detailsPanel; - IBOutlet NSTextView* detailsText; - IBOutlet NSWindow* mainWindow; - IBOutlet NSProgressIndicator* progressIndicator; - IBOutlet NSButton* sendButton; - IBOutlet NSButton* showDetailsButton; - IBOutlet NSTextField* statusText; - - NSString* crashedAppName; - NSString* crashedAppBuild; - NSAppleScript* killAppleCrashReporterScript; - NSString* logContents; -#ifdef FORBID_OLD_VERSIONS - NSString* latestAppBuild; -#endif -} - -- (IBAction) hideDetails: - (id)sender; - -- (void) interactWithUser; - -- (void) quit; - -- (BOOL) readCrashedAppInfo; - -- (BOOL) readCrashLog: - (NSString*)logPath; - -- (IBAction) sendReport: - (id)sender; - -- (void) setStatusMessage: - (NSString*)message; - -- (int) showAlert: - (NSString*)msg - info:(NSString*)info - localizeInfo:(BOOL)localizeInfo - button1:(NSString*)button1 - button2:(NSString*)button2; - -- (IBAction) showDetails: - (id)sender; - -- (void) startTask: - (NSString*)message; - -- (void) stopTask; - -- (void) waitForCrashLog: - (NSTimer*)timer; - -#ifdef FORBID_OLD_VERSIONS - -- (BOOL) fetchLatestAppVersion; - -- (void) showOldVersionAlertAndQuit; - -#endif /* FORBID_OLD_VERSIONS */ - -@end -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/CrashReporter/CrashController.mm b/macosx/helpers/CrashReporter/CrashController.mm deleted file mode 100644 index c93b876371..0000000000 --- a/macosx/helpers/CrashReporter/CrashController.mm +++ /dev/null @@ -1,526 +0,0 @@ -#import "CrashController.h" -#import "LC_ModalAlertSheet.h" - -/** - * The application name we're the crash reporter for (for debugging only). - */ -#define DEBUG_APP_NAME "LightZone" - -#ifndef DEBUG -////////// Production ///////////////////////////////////////////////////////// - -#define CRASH_REPORT_URL "http://crash.lightcrafts.com/cgi-bin/crash.cgi" - -#ifdef FORBID_OLD_VERSIONS - -#define APP_DOWNLOAD_URL "http://download.lightcrafts.com/lightzone/" -#define LATEST_APP_VERSION_URL \ - "http://download.lightcrafts.com/lightzone/lc_version.plist" - -#endif /* FORBID_OLD_VERSIONS */ - -#else /* DEBUG */ -////////// Debug ////////////////////////////////////////////////////////////// - -#define CRASH_REPORT_URL "http://localhost/cgi-bin/crash.cgi" - -#ifdef FORBID_OLD_VERSIONS - -#define APP_DOWNLOAD_URL "http://www.lightcrafts.com/" -#define LATEST_APP_VERSION_URL \ - "http://www.pauljlucas.org:81/lightzone/lc_version.plist" - -#endif /* FORBID_OLD_VERSIONS */ - -#endif /* DEBUG */ -/////////////////////////////////////////////////////////////////////////////// - -int const AppleCrashReporterKillAttempts = 200; -float const AppleCrashReporterKillInterval = 0.1; - -int const CrashLogWaitAttempts = 100; -float const CrashLogWaitInterval = 0.2; -int const SendCrashReportTimeout = 60; // seconds - -#ifdef FORBID_OLD_VERSIONS -int const FetchLatestAppVersionTimeout = 60; // seconds -#endif - -@implementation CrashController - -/** - * We're done launching: start running. - */ -- (void) applicationDidFinishLaunching: - (NSNotification*)notification -{ - [statusText setStringValue:@""]; // get rid of placeholder text - - // - // First, kill off Apple's Crash Reporter. - // - [NSTimer - scheduledTimerWithTimeInterval:AppleCrashReporterKillInterval - target:self - selector:@selector(killAppleCrashReporter:) - userInfo:nil - repeats:YES - ]; - - // Display the main window. - [mainWindow makeKeyAndOrderFront:nil]; - - // - // Get the crashed app's and latest app's versions and compare. - // - [self readCrashedAppInfo]; -#ifdef FORBID_OLD_VERSIONS - if ( [self fetchLatestAppVersion] && - ![latestAppBuild isEqualToString:crashedAppBuild] ) - [self showOldVersionAlertAndQuit]; -#endif - - // - // Then wait for a crash log to appear. - // - [NSTimer - scheduledTimerWithTimeInterval:CrashLogWaitInterval - target:self - selector:@selector(waitForCrashLog:) - userInfo:nil - repeats:YES - ]; -} - -/** - * Make sure the application quits when the last window is closed. - */ -- (BOOL) applicationShouldTerminateAfterLastWindowClosed: - (NSApplication*)app -{ - return YES; -} - -/** - * Initialize a CrashController. - */ -- (id) init -{ - self = [super init]; - - crashedAppBuild = nil; - logContents = nil; -#ifdef FORBID_OLD_VERSIONS - latestAppBuild = nil; -#endif - - NSString *const script = - @"tell application \"UserNotificationCenter\" to quit"; - killAppleCrashReporterScript = - [[[NSAppleScript alloc] initWithSource:script] retain]; - - return self; -} - -/** - * Deallocate a CrashController. - */ -- (void) dealloc -{ - [crashedAppName release]; - [crashedAppBuild release]; - [killAppleCrashReporterScript release]; - [logContents release]; -#ifdef FORBID_OLD_VERSIONS - [latestAppBuild release]; -#endif - [super dealloc]; -} - -#ifdef FORBID_OLD_VERSIONS -/** - * Fetch the latest application version from our web site. - */ -- (BOOL) fetchLatestAppVersion -{ - [self startTask:NSLocalizedString(@"Getting latest version info",nil)]; - - NSURLRequest *const request = - [NSURLRequest - requestWithURL:[NSURL URLWithString:@LATEST_APP_VERSION_URL] - cachePolicy:NSURLRequestReloadIgnoringCacheData - timeoutInterval:FetchLatestAppVersionTimeout - ]; - - NSURLResponse *response; - NSError *error; - NSData *const data = - [NSURLConnection - sendSynchronousRequest:request - returningResponse:&response error:&error - ]; - - [self stopTask]; - if ( data && ![error code] ) { - NSDictionary *const latestAppVersionDict = - [NSPropertyListSerialization - propertyListFromData:data - mutabilityOption:NSPropertyListImmutable - format:nil - errorDescription:nil - ]; - id const build = [latestAppVersionDict objectForKey:@"Build"]; - if ( ![build isKindOfClass:[NSString class]] ) - return NO; - latestAppBuild = (NSString*)[build retain]; - return YES; - } - return NO; -} -#endif /* FORBID_OLD_VERSIONS */ - -/** - * Hide the crash report details sheet. - */ -- (void) hideDetails: - (id)sender -{ - [detailsPanel orderOut:self]; // roll up the sheet - [NSApp endSheet:detailsPanel returnCode:NSOKButton]; -} - -/** - * Interact with the user and wait for the user to click the Send Report - * button. - */ -- (void) interactWithUser -{ - // - // Pre-select the the default details text (the instructions to the user) - // so that when the user starts to type, it will completely replace the - // default text. - // - int const defaultDetailsTextLength = [[detailsText textStorage] length]; - [detailsText setSelectedRange:NSMakeRange( 0, defaultDetailsTextLength )]; - - [sendButton setEnabled:YES]; - [showDetailsButton setEnabled:YES]; -} - -/** - * This gets called repeatedly to try to kill Apple's default CrashReporter. - */ -- (void) killAppleCrashReporter: - (NSTimer*)timer -{ - static int killAttempts = AppleCrashReporterKillAttempts; - if ( !killAttempts-- || - ![[killAppleCrashReporterScript executeAndReturnError:nil] - booleanValue] ) - [timer invalidate]; -} - -/** - * Quit. - */ -- (void) quit -{ - [mainWindow performClose:nil]; - [NSApp terminate:nil]; -} - -/** - * Read the crashed app's version information. - */ -- (BOOL) readCrashedAppInfo -{ - NSString *const bundlePath = [[NSBundle mainBundle] bundlePath]; - // - // We assume our bundle path is like: - // - // CrashedApp.app/Contents/Resources/CrashReporter.app - // - // i.e., we're inside the Resources directory of our "parent" application. - // Hence, its version information is one level up. - // - NSDictionary const *const crashedAppInfoDict = - [NSDictionary dictionaryWithContentsOfFile: - [bundlePath stringByAppendingPathComponent:@"/" -#ifdef DEBUG - "../../../../../release/" DEBUG_APP_NAME ".app/Contents" -#else - "../.." -#endif - "/Info.plist" - ] - ]; - if ( !crashedAppInfoDict ) { - [self - showAlert:@"Unexpected" - info:@"Can't get crashed app's Info.plist" localizeInfo:YES - button1:@"Quit" button2:nil]; - [self quit]; - } - crashedAppName = [crashedAppInfoDict objectForKey:@"CFBundleName"]; - if ( !crashedAppName ) { - [self - showAlert:@"Unexpected" - info:@"Can't get crashed app's name" localizeInfo:YES - button1:@"Quit" button2:nil]; - [self quit]; - } - [crashedAppName retain]; - - NSDictionary const *const crashedAppVersionDict = - [NSDictionary dictionaryWithContentsOfFile: - [bundlePath stringByAppendingPathComponent:@"/" -#ifdef DEBUG - "../../../../../release/" DEBUG_APP_NAME ".app/Contents" -#else - ".." -#endif - "/lc_version.plist" - ] - ]; - if ( !crashedAppVersionDict ) - return NO; - id const build = [crashedAppVersionDict objectForKey:@"Build"]; - if ( ![build isKindOfClass:[NSString class]] ) - return NO; - crashedAppBuild = (NSString*)[build retain]; - return YES; -} - -/** - * Checks whether the given crash log exists and isn't empty. If so, reads it - * all in. - */ -- (BOOL) readCrashLog: - (NSString*)logPath -{ - if ( ![[NSFileManager defaultManager] fileExistsAtPath:logPath] ) - return NO; - logContents = [NSString stringWithContentsOfFile:logPath]; - if ( !(logContents && [logContents length]) ) - return NO; -#ifndef DEBUG - // - // Trash the log file so this crash is never reported again. - // - [[NSFileManager defaultManager] removeFileAtPath:logPath handler:nil]; -#endif - // - // Look for and, if found, strip off the "Thread State" and "Binary Images - // Description" -- we don't need all that. - // - NSRange range = [logContents rangeOfString:@"Thread State"]; - if ( range.location != NSNotFound ) - logContents = [logContents substringToIndex:range.location]; - - [logContents retain]; - return YES; -} - -/** - * Send the crash report. - */ -- (IBAction) sendReport: - (id)sender -{ - [showDetailsButton setEnabled:NO]; - [sendButton setEnabled:NO]; - - // - // Construct the HTTP request. - // - NSMutableURLRequest *const request = - [NSMutableURLRequest - requestWithURL:[NSURL URLWithString:@CRASH_REPORT_URL] - cachePolicy:NSURLRequestReloadIgnoringCacheData - timeoutInterval:SendCrashReportTimeout - ]; - - [request setHTTPMethod:@"POST"]; - [request - setValue:@"application/x-www-form-urlencoded" - forHTTPHeaderField:@"Content-type" - ]; - - // - // Add a custom HTTP header of the form: - // - // X-LightCrafts-CrashReport: LightZone (build) - // - NSMutableString *const crashedAppHeaderValue = - [NSMutableString stringWithString:crashedAppName]; - [crashedAppHeaderValue appendString:@" ("]; - [crashedAppHeaderValue - appendString:crashedAppBuild ? crashedAppBuild : @"unknown"]; - [crashedAppHeaderValue appendString:@")"]; - [request - addValue:crashedAppHeaderValue - forHTTPHeaderField:@"X-LightCrafts-CrashReport" - ]; - - // - // Construct the report. - // - NSMutableString *const report = - [NSMutableString stringWithString:[descriptionText string]]; - [report appendString:@"\n"]; - if ( logContents ) - [report appendString:logContents]; - - [request setHTTPBody:[report dataUsingEncoding:NSUTF8StringEncoding]]; - - // - // Try to send the report. - // - while ( true ) { - [self startTask:NSLocalizedString(@"Sending report",nil)]; - - NSURLResponse *response; - NSError *error; - [NSURLConnection - sendSynchronousRequest:request - returningResponse:&response error:&error - ]; - - [self stopTask]; - if ( [error code] ) { - int const button = - [self showAlert:@"Unable to send" - info:[error localizedDescription] localizeInfo:YES - button1:@"Retry" button2:@"Quit" - ]; - if ( button == NSAlertFirstButtonReturn ) - continue; - } - [self quit]; - } -} - -/** - * Set the status message. - */ -- (void) setStatusMessage: - (NSString*)message -{ - [statusText setStringValue:message]; - [statusText displayIfNeeded]; // force redraw now -} - -/** - * Show an alert. - */ -- (int) showAlert: - (NSString*)msg - info:(NSString*)info - localizeInfo:(BOOL)localizeInfo - button1:(NSString*)button1 - button2:(NSString*)button2 -{ - LC_ModalAlertSheet *const alert = - [[[LC_ModalAlertSheet alloc] init] autorelease]; - [alert setAlertStyle:NSCriticalAlertStyle]; - [alert setMessageText:NSLocalizedString(msg,nil)]; - if ( info ) { - if ( localizeInfo ) - info = NSLocalizedString(info,nil); - [alert setInformativeText:info]; - } - [alert addButtonWithTitle:NSLocalizedString(button1,nil)]; - if ( button2 ) - [alert addButtonWithTitle:NSLocalizedString(button2,nil)]; - return [alert showAttachedToWindow:mainWindow]; -} - -/** - * Show the crash report details sheet. - */ -- (IBAction) showDetails: - (id)sender -{ - // - // Stuff the crash log into the details text box. - // - NSAttributedString *const attCrashLogString = - [[[NSAttributedString alloc] initWithString:logContents] autorelease]; - [[detailsText textStorage] setAttributedString:attCrashLogString]; - - [NSApp - beginSheet:detailsPanel - modalForWindow:mainWindow - modalDelegate:nil - didEndSelector:nil - contextInfo:nil - ]; -} - -#ifdef FORBID_OLD_VERSIONS -/** - * Tell the user that s/he is running an older version of the crashed - * application and therefore crash reporting has been disabled and s/he should - * upgrade. - */ -- (void) showOldVersionAlertAndQuit -{ - int const button = - [self showAlert:@"Crash reporting disabled" - info: - [NSString - stringWithFormat:NSLocalizedString(@"You were running",nil), - crashedAppName] - localizeInfo:NO - button1:@"Upgrade" button2:@"Quit" - ]; - if ( [alert showAttachedToWindow:mainWindow] == NSAlertFirstButtonReturn ) - [[NSWorkspace sharedWorkspace] - openURL:[NSURL URLWithString:@APP_DOWNLOAD_URL]]; - [self quit]; -} -#endif /* FORBID_OLD_VERSIONS */ - -/** - * Set the status message and start the progress indicator. - */ -- (void) startTask: - (NSString*)message; -{ - [progressIndicator startAnimation:nil]; - [self setStatusMessage:message]; -} - -/** - * Clear the status message and stop the progress indicator. - */ -- (void) stopTask -{ - [self setStatusMessage:@""]; - [progressIndicator stopAnimation:nil]; -} - -/** - * This gets called repeatedly until a crash log shows up. - */ -- (void) waitForCrashLog: - (NSTimer*)timer -{ - static int logAttempts = CrashLogWaitAttempts; - static NSString *crashLog; - if ( !crashLog ) { - crashLog = - [[[[@"~/Library/Logs/CrashReporter" - stringByAppendingPathComponent:crashedAppName] - stringByAppendingString:@".crash.log"] - stringByExpandingTildeInPath] retain]; - } - if ( !logAttempts-- || [self readCrashLog:crashLog] ) { - [crashLog release]; - [timer invalidate]; - [self interactWithUser]; - } -} - -@end -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/CrashReporter/CrashReporter.xcodeproj/project.pbxproj b/macosx/helpers/CrashReporter/CrashReporter.xcodeproj/project.pbxproj deleted file mode 100644 index 71508246e0..0000000000 --- a/macosx/helpers/CrashReporter/CrashReporter.xcodeproj/project.pbxproj +++ /dev/null @@ -1,304 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 42; - objects = { - -/* Begin PBXBuildFile section */ - 024BDC2D08FB29C40028A0CD /* CrashController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 024BDC2C08FB29C40028A0CD /* CrashController.mm */; }; - 0262B9D509094474008BB189 /* LC_ModalAlertSheet.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0262B9D409094474008BB189 /* LC_ModalAlertSheet.mm */; }; - 029D4EE80909718400C64083 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 029D4EE60909718400C64083 /* Localizable.strings */; }; - 02A515D908FCAEE700799771 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 02A515D708FCAEE700799771 /* InfoPlist.strings */; }; - 02A515DC08FCAF4000799771 /* CrashReporter.nib in Resources */ = {isa = PBXBuildFile; fileRef = 02A515DA08FCAF4000799771 /* CrashReporter.nib */; }; - 02A5161A08FCC39900799771 /* CrashReporter.icns in Resources */ = {isa = PBXBuildFile; fileRef = 02A5161908FCC39900799771 /* CrashReporter.icns */; }; - 02E7CBE908FD7E45009E956B /* bug-80.png in Resources */ = {isa = PBXBuildFile; fileRef = 02E7CBE808FD7E45009E956B /* bug-80.png */; }; - 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; - 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 024BDC2A08FB298C0028A0CD /* CrashController.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = CrashController.h; sourceTree = ""; }; - 024BDC2C08FB29C40028A0CD /* CrashController.mm */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.objcpp; path = CrashController.mm; sourceTree = ""; }; - 0262B9D309094460008BB189 /* LC_ModalAlertSheet.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = LC_ModalAlertSheet.h; sourceTree = ""; }; - 0262B9D409094474008BB189 /* LC_ModalAlertSheet.mm */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.cpp.objcpp; path = LC_ModalAlertSheet.mm; sourceTree = ""; }; - 029D4EE70909718400C64083 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = Resources/English.lproj/Localizable.strings; sourceTree = ""; }; - 02A515D808FCAEE700799771 /* English */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.plist.strings; name = English; path = Resources/English.lproj/InfoPlist.strings; sourceTree = ""; }; - 02A515DB08FCAF4000799771 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = Resources/English.lproj/CrashReporter.nib; sourceTree = ""; }; - 02A5161908FCC39900799771 /* CrashReporter.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = CrashReporter.icns; path = Resources/CrashReporter.icns; sourceTree = ""; }; - 02E7CBE808FD7E45009E956B /* bug-80.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "bug-80.png"; path = "Resources/bug-80.png"; sourceTree = ""; }; - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; - 32CA4F630368D1EE00C91783 /* CrashReporter_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CrashReporter_Prefix.pch; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 8D1107320486CEB800E47090 /* CrashReporter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CrashReporter.app; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8D11072E0486CEB800E47090 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 024BDC2A08FB298C0028A0CD /* CrashController.h */, - 024BDC2C08FB29C40028A0CD /* CrashController.mm */, - 0262B9D309094460008BB189 /* LC_ModalAlertSheet.h */, - 0262B9D409094474008BB189 /* LC_ModalAlertSheet.mm */, - ); - name = Classes; - sourceTree = ""; - }; - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { - isa = PBXGroup; - children = ( - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, - ); - name = "Linked Frameworks"; - sourceTree = ""; - }; - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 29B97324FDCFA39411CA2CEA /* AppKit.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 8D1107320486CEB800E47090 /* CrashReporter.app */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CrashReporter */ = { - isa = PBXGroup; - children = ( - 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - name = CrashReporter; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 32CA4F630368D1EE00C91783 /* CrashReporter_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - 02E7CBE808FD7E45009E956B /* bug-80.png */, - 02A5161908FCC39900799771 /* CrashReporter.icns */, - 02A515DA08FCAF4000799771 /* CrashReporter.nib */, - 8D1107310486CEB800E47090 /* Info.plist */, - 02A515D708FCAEE700799771 /* InfoPlist.strings */, - 029D4EE60909718400C64083 /* Localizable.strings */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8D1107260486CEB800E47090 /* CrashReporter */ = { - isa = PBXNativeTarget; - buildConfigurationList = 024BDC1908FB24300028A0CD /* Build configuration list for PBXNativeTarget "CrashReporter" */; - buildPhases = ( - 8D1107290486CEB800E47090 /* Resources */, - 8D11072C0486CEB800E47090 /* Sources */, - 8D11072E0486CEB800E47090 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = CrashReporter; - productInstallPath = "$(HOME)/Applications"; - productName = CrashReporter; - productReference = 8D1107320486CEB800E47090 /* CrashReporter.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - buildConfigurationList = 024BDC1D08FB24300028A0CD /* Build configuration list for PBXProject "CrashReporter" */; - compatibilityVersion = "Xcode 2.4"; - hasScannedForEncodings = 1; - mainGroup = 29B97314FDCFA39411CA2CEA /* CrashReporter */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 8D1107260486CEB800E47090 /* CrashReporter */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8D1107290486CEB800E47090 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 02A515D908FCAEE700799771 /* InfoPlist.strings in Resources */, - 02A515DC08FCAF4000799771 /* CrashReporter.nib in Resources */, - 02A5161A08FCC39900799771 /* CrashReporter.icns in Resources */, - 02E7CBE908FD7E45009E956B /* bug-80.png in Resources */, - 029D4EE80909718400C64083 /* Localizable.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8D11072C0486CEB800E47090 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D11072D0486CEB800E47090 /* main.m in Sources */, - 024BDC2D08FB29C40028A0CD /* CrashController.mm in Sources */, - 0262B9D509094474008BB189 /* LC_ModalAlertSheet.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 029D4EE60909718400C64083 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - 029D4EE70909718400C64083 /* English */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - 02A515D708FCAEE700799771 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 02A515D808FCAEE700799771 /* English */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 02A515DA08FCAF4000799771 /* CrashReporter.nib */ = { - isa = PBXVariantGroup; - children = ( - 02A515DB08FCAF4000799771 /* English */, - ); - name = CrashReporter.nib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 024BDC1A08FB24300028A0CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CrashReporter_Prefix.pch; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Applications"; - PREBINDING = NO; - PRODUCT_NAME = CrashReporter; - WRAPPER_EXTENSION = app; - ZERO_LINK = YES; - }; - name = Debug; - }; - 024BDC1B08FB24300028A0CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - i386, - ppc, - ); - COPY_PHASE_STRIP = YES; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CrashReporter_Prefix.pch; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Applications"; - PREBINDING = NO; - PRODUCT_NAME = CrashReporter; - WRAPPER_EXTENSION = app; - ZERO_LINK = NO; - }; - name = Release; - }; - 024BDC1E08FB24300028A0CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PREPROCESSOR_DEFINITIONS = DEBUG; - }; - name = Debug; - }; - 024BDC1F08FB24300028A0CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 024BDC1908FB24300028A0CD /* Build configuration list for PBXNativeTarget "CrashReporter" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 024BDC1A08FB24300028A0CD /* Debug */, - 024BDC1B08FB24300028A0CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 024BDC1D08FB24300028A0CD /* Build configuration list for PBXProject "CrashReporter" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 024BDC1E08FB24300028A0CD /* Debug */, - 024BDC1F08FB24300028A0CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/macosx/helpers/CrashReporter/CrashReporter_Prefix.pch b/macosx/helpers/CrashReporter/CrashReporter_Prefix.pch deleted file mode 100644 index 6ed63eb6e9..0000000000 --- a/macosx/helpers/CrashReporter/CrashReporter_Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'CrashReporter' target in the 'CrashReporter' project -// - -#ifdef __OBJC__ - #import -#endif diff --git a/macosx/helpers/CrashReporter/GNUmakefile b/macosx/helpers/CrashReporter/GNUmakefile deleted file mode 100644 index 7a982c7c8c..0000000000 --- a/macosx/helpers/CrashReporter/GNUmakefile +++ /dev/null @@ -1,92 +0,0 @@ -## -# CrashReporter: a custom crash reporter. -# GNUmakefile -# -# Paul J. Lucas [paul@lightcrafts.com] -## - -ROOT:= ../../.. -COMMON_DIR:= $(ROOT)/lightcrafts -include $(COMMON_DIR)/mk/platform.mk - -# Uncomment to compile in debug mode. -#DEBUG:= true - -# Different compilers required for Objective-C sources. -XCODE_PATH:= $(shell xcode-select -p) -ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) - # Use command line tools. - XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin -else - # Use Xcode. - XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin -endif -CC= $(XCODE_BIN_DIR)/clang -CXX= $(XCODE_BIN_DIR)/clang++ - -CFLAGS:= -g -Os -mdynamic-no-pic -INCLUDES= $(MACOSX_ISYSROOT) -LDFLAGS= $(PLATFORM_LDFLAGS) -framework Cocoa - -TARGET:= CrashReporter - -########## You shouldn't have to change anything below this line. ############# - -ifdef DEBUG -DEFINES+= -DDEBUG -endif - -CFLAGS+= $(DEFINES) - -include $(ROOT)/lightcrafts/mk/sources.mk - -## -# Build rules -## - -.PHONY: all -all: $(TARGET) - -ifeq ($(UNIVERSAL),1) - -$(TARGET): $(TARGET)-arm $(TARGET)-x86 - $(LIPO) -create $(TARGET)-arm $(TARGET)-x86 -output $@ - -$(TARGET)-arm: $(OBJECTS_ARM) - $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *-arm.o - -$(TARGET)-x86: $(OBJECTS_X86) - $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *-x86.o - -else # UNIVERSAL - -$(TARGET): $(OBJECTS) - $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *.o - -endif # UNIVERSAL - -.PHONY: bundle -bundle: $(TARGET) - $(RM) $(TARGET).app - $(MKDIR) $(TARGET).app/Contents/MacOS - cp $(TARGET) $(TARGET).app/Contents/MacOS - cp -r Resources $(TARGET).app/Contents - cp Info.plist $(TARGET).app/Contents - -include $(ROOT)/lightcrafts/mk/auto_dep.mk - -## -# Utility rules -## - -.PHONY: clean distclean mostlyclean - -clean: - $(RM) *.o .*.d - -distclean: clean - $(RM) $(TARGET) $(TARGET)-arm $(TARGET)-x86 $(TARGET).app - -mostlyclean: - -# vim:set noet sw=8 ts=8: diff --git a/macosx/helpers/CrashReporter/Info.plist b/macosx/helpers/CrashReporter/Info.plist deleted file mode 100644 index cebdcab540..0000000000 --- a/macosx/helpers/CrashReporter/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - CrashReporter - CFBundleIconFile - CrashReporter - CFBundleIdentifier - com.lightcrafts.CrashReporter - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleSignature - LCCR - CFBundleVersion - 1.0.1 - NSMainNibFile - CrashReporter - NSPrincipalClass - NSApplication - - diff --git a/macosx/helpers/CrashReporter/LC_ModalAlertSheet.h b/macosx/helpers/CrashReporter/LC_ModalAlertSheet.h deleted file mode 100644 index 2949766bb9..0000000000 --- a/macosx/helpers/CrashReporter/LC_ModalAlertSheet.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 2005-2011 Fabio Riccardi */ - -#import - -/** - * An LC_ModalAlertSheet is-an NSAlert that displays an alert as a sheet, but - * acts like a modal dialog, i.e., a call to showAttachedToWindow() blocks - * until the user clicks a button. - */ -@interface LC_ModalAlertSheet : NSAlert { -} - -/** - * Show an alert attached to the given window and block until the user clicks - * a button. - * Returns the button clicked. - */ -- (int) showAttachedToWindow: - (NSWindow*)window; - -@end -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/CrashReporter/LC_ModalAlertSheet.mm b/macosx/helpers/CrashReporter/LC_ModalAlertSheet.mm deleted file mode 100644 index 5970deb922..0000000000 --- a/macosx/helpers/CrashReporter/LC_ModalAlertSheet.mm +++ /dev/null @@ -1,36 +0,0 @@ -#import "LC_ModalAlertSheet.h" - -@implementation LC_ModalAlertSheet - -/** - * This is the delegate that gets called by Cocoa when the user clicks a button - * in the sheet. - */ -- (void) alertEnded: - (NSAlert*)alert - returnCode:(int)returnCode - contextInfo:(void*)contextInfo -{ - [[alert window] orderOut:self]; // roll up the sheet - [NSApp stopModalWithCode:returnCode]; -} - -/** - * Show an alert attached to the given window and block until the user clicks - * a button. - * Returns the button clicked. - */ -- (int) showAttachedToWindow: - (NSWindow*)window -{ - [self - beginSheetModalForWindow:window - modalDelegate:self - didEndSelector:@selector(alertEnded:returnCode:contextInfo:) - contextInfo:nil - ]; - return [NSApp runModalForWindow:[self window]]; -} - -@end -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/CrashReporter/Resources/CrashReporter.icns b/macosx/helpers/CrashReporter/Resources/CrashReporter.icns deleted file mode 100644 index baab9383f1d984afb2156b69cdcf073d9f5a0a2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45943 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 Kd-uO>f&T;Iwr+a> diff --git a/macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/classes.nib b/macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/classes.nib deleted file mode 100644 index 8d96c08f42..0000000000 --- a/macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/classes.nib +++ /dev/null @@ -1,23 +0,0 @@ -{ - IBClasses = ( - { - ACTIONS = {hideDetails = id; sendReport = id; showDetails = id; }; - CLASS = CrashController; - LANGUAGE = ObjC; - OUTLETS = { - descriptionText = NSTextView; - detailsOKButton = NSButton; - detailsPanel = NSPanel; - detailsText = NSTextView; - mainWindow = NSWindow; - progressIndicator = NSProgressIndicator; - sendButton = NSButton; - showDetailsButton = NSButton; - statusText = NSTextField; - }; - SUPERCLASS = NSObject; - }, - {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; } - ); - IBVersion = 1; -} \ No newline at end of file diff --git a/macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/info.nib b/macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/info.nib deleted file mode 100644 index 04714561fa..0000000000 --- a/macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/info.nib +++ /dev/null @@ -1,25 +0,0 @@ - - - - - IBDocumentLocation - 69 14 356 240 0 0 1280 832 - IBEditorPositions - - 287 - 44 478 287 44 0 0 1280 832 - - IBFramework Version - 439.0 - IBOldestOS - 3 - IBOpenObjects - - 264 - 287 - 21 - - IBSystem Version - 8C46 - - diff --git a/macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/keyedobjects.nib b/macosx/helpers/CrashReporter/Resources/English.lproj/CrashReporter.nib/keyedobjects.nib deleted file mode 100644 index 7160441251720867dd8086a38617ee92cc60638c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20353 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 W3$o;|K1?iOoyOGqpJe>Q&-(#;2`%9O diff --git a/macosx/helpers/CrashReporter/Resources/English.lproj/Localizable.strings b/macosx/helpers/CrashReporter/Resources/English.lproj/Localizable.strings deleted file mode 100644 index 377fd07867ba99e7d1b0671e8bf2f8e27d1dcec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1480 zcmb_c+fKqj6r5+iVnbp`e83MdCK4WuiHWyp;v>)kO<+q(EAaE`%(m+;sDQ?h()RRR zX6Br;Z|^w6DGVk^VR;o8V8-`T+FNMj9u+c_d@{J;6VB6;v_qh$t_W(ocpRyw*>lyZ;MiBDt^D;yjW2m=E=u3XtM2f|> zcw;nIIaatOiezU;dJdU1=s8vVKF3q1omY-+BwnG!O_t{v?{=8#V- zUC|ZM*=B!(ZihUz4>|{O$6VRIZhOvMH#os1x6|Ox=^?(VTe0^OMrlVw|4O%~hfWcl zLY8||$4#9|@xB^&I&4^F%KSQmgm&f_tDe3LY1ORgM9i?}bMkqHXtrW>L6u!QRs8^y C-1ij# diff --git a/macosx/helpers/CrashReporter/Resources/bug-80.png b/macosx/helpers/CrashReporter/Resources/bug-80.png deleted file mode 100644 index a862d0a59faa481ab1b05d8528bea46687487f57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8482 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 - -int main( int argc, char *argv[] ) { - return NSApplicationMain( argc, (const char**)argv ); -} -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/CrashReporter/version.plist b/macosx/helpers/CrashReporter/version.plist deleted file mode 100644 index df8c3dc7d1..0000000000 --- a/macosx/helpers/CrashReporter/version.plist +++ /dev/null @@ -1,16 +0,0 @@ - - - - - BuildVersion - 92 - CFBundleVersion - 1.0 - ProductBuildVersion - 7K571 - ProjectName - NibPBTemplates - SourceVersion - 1200000 - - diff --git a/macosx/helpers/GNUmakefile b/macosx/helpers/GNUmakefile deleted file mode 100644 index e81c519f30..0000000000 --- a/macosx/helpers/GNUmakefile +++ /dev/null @@ -1,3 +0,0 @@ -include ../../lightcrafts/mk/recurse.mk - -# vim:set noet sw=8 ts=8: diff --git a/macosx/helpers/JavaAppLauncher/GNUmakefile b/macosx/helpers/JavaAppLauncher/GNUmakefile deleted file mode 100644 index 9d36bfc6cd..0000000000 --- a/macosx/helpers/JavaAppLauncher/GNUmakefile +++ /dev/null @@ -1,105 +0,0 @@ -## -# JavaAppLauncher: a simple Java application launcher for Mac OS X. -# GNUmakefile -# -# Paul J. Lucas [paul@lightcrafts.com] -## - -ROOT:= ../../.. -COMMON_DIR:= $(ROOT)/lightcrafts -MACOSX_DIR:= ../.. -include $(COMMON_DIR)/mk/platform.mk - -JARS:= $(COMMON_DIR)/products/lightcrafts.jar \ - $(MACOSX_DIR)/products/lightcrafts-apple.jar - -# Uncomment to compile in debug mode. -#DEBUG:= true - -# Different compilers required for Objective-C sources. -MACOSX_DEPLOYMENT_TARGET:= $(shell sw_vers -productVersion | cut -d. -f-2) - -XCODE_PATH:= $(shell xcode-select -p) -ifeq ($(findstring CommandLineTools,$(XCODE_PATH)),CommandLineTools) - # Use command line tools. - SDKROOT:= $(XCODE_PATH)/SDKs/MacOSX${MACOSX_DEPLOYMENT_TARGET}.sdk - XCODE_BIN_DIR= $(XCODE_PATH)/usr/bin -else - # Use Xcode. - SDKROOT:= $(shell xcodebuild -version -sdk macosx${MACOSX_DEPLOYMENT_TARGET} | sed -n '/^Path:/p' | sed 's/^Path: //') - XCODE_BIN_DIR= $(XCODE_PATH)/Toolchains/XcodeDefault.xctoolchain/usr/bin -endif -CC= $(XCODE_BIN_DIR)/clang -CXX= $(XCODE_BIN_DIR)/clang++ - -CFLAGS:= -Os -mdynamic-no-pic -fobjc-exceptions -INCLUDES= $(MACOSX_ISYSROOT) $(JAVA_INCLUDES) \ - -I$(COMMON_DIR)/jnisrc/jniutils -LDFLAGS= $(PLATFORM_LDFLAGS) -framework Cocoa - -TARGET:= JavaAppLauncher - -########## You shouldn't have to change anything below this line. ############# - -ifdef DEBUG - CFLAGS+= -g - DEFINES+= -DDEBUG - STRIP:= echo >/dev/null -else - STRIP:= strip -endif - -CFLAGS+= $(DEFINES) - -include $(COMMON_DIR)/mk/sources.mk - -## -# Build rules -## - -.PHONY: all -all: $(TARGET) - -ifeq ($(UNIVERSAL),1) - -$(TARGET): $(TARGET)-arm $(TARGET)-x86 - $(LIPO) -create $(TARGET)-arm $(TARGET)-x86 -output $@ - -$(TARGET)-arm: $(OBJECTS_ARM) - $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *-arm.o $(LINK) - $(STRIP) $@ - -$(TARGET)-x86: $(OBJECTS_X86) - $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *-x86.o $(LINK) - $(STRIP) $@ - -else # UNIVERSAL - -$(TARGET): $(OBJECTS) - $(CC_LINK) $(CFLAGS) $(LDFLAGS) -o $@ *.o $(LINK) - $(STRIP) $@ - -endif # UNIVERSAL - -include $(COMMON_DIR)/mk/auto_dep.mk - -main.o main-arm.o main-x86.o: jar_md5_include - -jar_md5_include: $(JARS) - $(COMMON_DIR)/tools/bin/lc-md5-jar -l c $(JARS) > $@ - -## -# Utility rules -## - -.PHONY: clean distclean mostlyclean - -clean: - $(RM) *.o .*.d jar_md5_include - -distclean: clean - $(RM) $(TARGET) $(TARGET)-arm $(TARGET)-x86 - -mostlyclean: - -# vim:set noet sw=8 ts=8: diff --git a/macosx/helpers/JavaAppLauncher/JavaParamBlock.h b/macosx/helpers/JavaAppLauncher/JavaParamBlock.h deleted file mode 100644 index c1cfd2f3aa..0000000000 --- a/macosx/helpers/JavaAppLauncher/JavaParamBlock.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 2005-2011 Fabio Riccardi */ - -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * JavaParamBlock.h - * - * Paul J. Lucas [paul@lightcrafts.com] - */ - -#ifndef JavaParamBlock_H -#define JavaParamBlock_H - -// standard -#include /* for JavaVMInitArgs */ - -/** - * This contains the parameters from the Java dictionary in Info.plist. - */ -struct JavaParamBlock { - char* jvm_version; - JavaVMInitArgs jvm_args; - char* main_className; - int main_argc; - char** main_argv; -}; - -/** - * Initialize the given JavaParamBlock. - */ -void initJavaParamBlock( JavaParamBlock* ); - -#endif /* JavaParamBlock_H */ -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/JavaParamBlock.mm b/macosx/helpers/JavaAppLauncher/JavaParamBlock.mm deleted file mode 100644 index 540c41a801..0000000000 --- a/macosx/helpers/JavaAppLauncher/JavaParamBlock.mm +++ /dev/null @@ -1,518 +0,0 @@ -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * JavaParamBlock.mm - * - * Paul J. Lucas [paul@lightcrafts.com] - * - * This code is heavily based on: - * http://developer.apple.com/samplecode/JavaSplashScreen/JavaSplashScreen.html - */ - -#import /* for getenv(3) */ -#import -#import /* for chdir(2) */ -#import -#import /* for NXGetLocalArchInfo(3) */ -#import /* for sysctl(3) */ - -#import "JavaParamBlock.h" -#import "LC_CocoaUtils.h" -#import "SetJVMVersion.h" -#import "UI.h" - -using namespace std; -using namespace LightCrafts; - -/** - * If there is no previously set user preference for the maximum amount of - * memory to use, then this is the percentage of the physical memory that - * should be used. - */ -float const DefaultMaxMemoryPercentage = 0.3; - -/** - * Insist on at least this much RAM. - */ -int const JavaMinMemoryInMB = 512; - -/** - * Limit the JVM heap size because we now use non-heap memory for things like - * tile caches. - */ -#ifdef __LP64__ -int const JavaMaxMemoryInMB = 32768; -#else -int const JavaMaxMemoryInMB = 2048; -#endif - -extern cpu_type_t lc_cpuType; - -/** - * Copy a C string to a newly allocated C buffer. - */ -static void new_strcpy( char **dest, char const *src ) { - if ( src ) { - *dest = new char[ ::strlen( src ) + 1 ]; - if ( !*dest ) - LC_die( @"Unexpected", @"Could not allocate memory" ); - ::strcpy( *dest, src ); - } else { - *dest = new char[1]; - if ( !*dest ) - LC_die( @"Unexpected", @"Could not allocate memory" ); - **dest = '\0'; - } -} - -/** - * Convert/copy an NSString to a newly allocated C string. - */ -static void new_strcpy( char **dest, NSString const *src ) { - if ( src ) - new_strcpy( dest, [src UTF8String] ); - else - new_strcpy( dest, static_cast( 0 ) ); -} - -/** - * Allocate and copy a JVM option string. - */ -inline void newJVMOption( JavaVMOption *jvm_opt, char const *s ) { - new_strcpy( &jvm_opt->optionString, s ); - jvm_opt->extraInfo = 0; -} - -/** - * Allocate and copy a JVM option string. - */ -static void newJVMOption( JavaVMOption *jvm_opt, NSString const *s ) { - if ( s ) - newJVMOption( jvm_opt, [s UTF8String] ); - else - newJVMOption( jvm_opt, static_cast( 0 ) ); -} - -/** - * Resolve all references to $APP_PACKAGE, $JAVAROOT, and $LC_JVM_VERSION. - */ -static NSString* resolveString( NSString *in, NSDictionary const *javaDict ) { - if ( in == nil ) - return in; - - // Make a mutable copy of the string to work on. - NSMutableString *const temp = [NSMutableString string]; - [temp appendString:in]; - - // - // First do $APP_PACKAGE. - // - NSString *const appPackage = [[NSBundle mainBundle] bundlePath]; - if ( appPackage ) - [temp replaceOccurrencesOfString:@"$APP_PACKAGE" withString:appPackage - options:NSLiteralSearch range:NSMakeRange( 0, [temp length] )]; - - // - // Next do $JAVAROOT. - // - NSMutableString *const javaRoot = [NSMutableString string]; - NSString *const javaRootProp = [javaDict objectForKey:@"$JAVAROOT"]; - if ( javaRootProp ) - [javaRoot appendString:javaRootProp]; - else - [javaRoot appendString:@"Contents/Resources/Java"]; - [temp replaceOccurrencesOfString:@"$JAVAROOT" withString:javaRoot - options:NSLiteralSearch range:NSMakeRange( 0, [temp length] )]; - - // - // Finally, $LC_JVM_VERSION. - // - NSString *const jvmVersion = - [NSString stringWithUTF8String: ::getenv( "JAVA_JVM_VERSION" )]; - [temp replaceOccurrencesOfString:@"$LC_JVM_VERSION" withString:jvmVersion - options:NSLiteralSearch range:NSMakeRange( 0, [temp length] )]; - - return temp; -} - -/** - * Set the given JVM option string. - */ -inline void setJVMOption( JavaVMOption *jvm_opt, char const *s ) { - jvm_opt->optionString = const_cast( s ); - jvm_opt->extraInfo = 0; -} - -/** - * Set the given JVM option string. - */ -static void setJVMOption( JavaVMOption *jvm_opt, NSString const *s ) { - if ( s ) - setJVMOption( jvm_opt, [s UTF8String] ); - else - setJVMOption( jvm_opt, static_cast( 0 ) ); -} - -/** - * Gets the class path from the "ClassPath" key of the Java dictionary in the - * application's Info.plist file. - */ -static NSString* getClassPath( NSDictionary const *javaDict ) { - id classPathProp = [javaDict objectForKey:@"ClassPath"]; - if ( classPathProp == nil ) - return nil; - - // - // The class path must be passed to the JVM using the java.class.path - // property. The JVM doesn't accept either the -cp or -classpath options. - // - NSMutableString *const javaClassPath = [NSMutableString string]; - [javaClassPath appendString:@"-Djava.class.path="]; - - if ( [classPathProp isKindOfClass:[NSString class]] ) { - // - // It's just a single string. - // - [javaClassPath appendString:classPathProp]; - } else if ( [classPathProp isKindOfClass:[NSArray class]] ) { - // - // It's an array of strings. - // - int const n = [classPathProp count]; - for ( int i = 0; i < n; ++i ) { - if ( i > 0 ) - [javaClassPath appendString:@":"]; - [javaClassPath appendString:[classPathProp objectAtIndex:i]]; - } - } else - LC_die( @"Corrupted", @"Bad ClassPath" ); - - return resolveString( javaClassPath, javaDict ); -} - -/** - * Gets the working directory from the "WorkingDirectory" key, if any, of the - * Java dictionary in the application's Info.plist file. - * - * Also sets the current working directory to "WorkingDirectory" if specified - * or the application bundle's path if not. - */ -static NSString* getCWD( NSDictionary const *javaDict ) { - // - // First check to see if the key WorkingDirectory is defined in the Java - // dictionary. - // - NSString *cwd = [javaDict objectForKey:@"WorkingDirectory"]; - - if ( cwd ) - cwd = resolveString( cwd, javaDict ); - else // Default to the path to the application's bundle. - cwd = [[NSBundle mainBundle] bundlePath]; - - if ( ::chdir( [cwd fileSystemRepresentation] ) != 0 ) - LC_die( @"Unexpected", @"Set CWD failed" ); - - return cwd; -} - -/** - * Add the VM options for the given key. - */ -static void addVMOptions( NSMutableArray *options, - NSDictionary const *javaDict, - NSString const *vmOptionsKey ) { - if ( id const vmArgs = [javaDict objectForKey:vmOptionsKey] ) - if ( [vmArgs isKindOfClass:[NSString class]] ) - [options addObject:vmArgs]; - else if ( [vmArgs isKindOfClass:[NSArray class]] ) - [options addObjectsFromArray:vmArgs]; - else - LC_die( @"Corrupted", @"Bad VMOptions" ); -} - -/** - * Allocate and initialize an array of JavaVMOption data structures from the - * Java dictionary in the application's Info.plist file. - */ -static int getJVMOptions( JavaVMOption **jvm_options, - NSDictionary const *javaDict ) { - NSMutableArray *const options = [NSMutableArray arrayWithCapacity:1]; - - // - // Process the VMOptions. - // - addVMOptions( options, javaDict, @"VMOptions" ); - switch ( lc_cpuType ) { - case CPU_TYPE_I386: - addVMOptions( options, javaDict, @"LC_VMOptionsX86" ); - break; - case CPU_TYPE_POWERPC: - addVMOptions( options, javaDict, @"LC_VMOptionsPPC" ); - break; - } - - // - // Add the java.class.path property. - // - NSString *const classPath = getClassPath( javaDict ); - if ( classPath ) - [options addObject:classPath]; - - // - // Set the working directory (pwd). - // - NSMutableString *const userDir = [NSMutableString string]; - [userDir appendString:@"-Duser.dir="]; - [userDir appendString:getCWD( javaDict )]; - [userDir appendString:@"/"]; - [options addObject:userDir]; - - // - // Add the properties defined in Properties dictionary. - // - NSDictionary const *const propDict = [javaDict objectForKey:@"Properties"]; - if ( propDict ) { - NSArray const *const keys = [propDict allKeys]; - int const n = [keys count]; - for ( int i = 0; i < n; ++i ) { - NSString *const key = [keys objectAtIndex:i]; - NSMutableString *const prop = [NSMutableString string]; - [prop appendString:@"-D"]; - [prop appendString:key]; - [prop appendString:@"="]; - [prop appendString: - resolveString( [propDict objectForKey:key], javaDict )]; - [options addObject:prop]; - } - } - - // - // Convert the NSMutableArray into an array of JavaVMOptions. - // - int const n = [options count]; - if ( n > 0 ) { - *jvm_options = new JavaVMOption[ n ]; - for ( int i = 0; i < n; ++i ) - newJVMOption( &(*jvm_options)[i], [options objectAtIndex:i] ); - } else - *jvm_options = 0; - - return n; -} - -/** - * Gets the desired Java version from the "JVMVersion" key of the Java - * dictionary in the application's Info.plist file. - */ -static void getJVMVersion( char **dest, NSDictionary const *javaDict ) { - NSString const *const jvmVersion = [javaDict objectForKey:@"JVMVersion"]; - if ( !jvmVersion ) - LC_die( @"Corrupted", @"Missing JVMVersion" ); - new_strcpy( dest, jvmVersion ); -} - -/** - * Get the arguments to main() from the "Arguments" key of the Java dictionary - * in the application's Info.plist file. - */ -static int getMainArgs( char ***main_argv, NSDictionary const *javaDict ) { - int n; - id const args = [javaDict objectForKey:@"Arguments"]; - if ( args ) { - if ( [args isKindOfClass:[NSString class]] ) { - // - // The "Arguments" key has only a single string value. - // - n = 1; - *main_argv = new char*[1]; - if ( !*main_argv ) - LC_die( @"Unexpected", @"Could not allocate main() array" ); - new_strcpy( &(*main_argv)[0], args ); - } else if ( [args isKindOfClass:[NSArray class]] ) { - // - // The "Arguments" key is an array of strings. - // - n = [args count]; - *main_argv = new char*[n]; - if ( !*main_argv ) - LC_die( @"Unexpected", @"Could not allocate main() array" ); - for ( int i = 0; i < n; ++i ) { - id const arg = [args objectAtIndex:i]; - if ( ![arg isKindOfClass:[NSString class]] ) - LC_die( @"Corrupted", @"Bad argument array" ); - new_strcpy( &(*main_argv)[i], arg ); - } - } else - LC_die( @"Corrupted", @"Bad Arguments" ); - } else { - *main_argv = 0; - n = 0; - } - return n; -} - -/** - * Get the name of the class whose main() is to be executed from the Java - * dictionary in the application's Info.plist file. - */ -static void getMainClassName( char **dest, NSDictionary const *javaDict ) { - NSString const *const mainClassName = [javaDict objectForKey:@"MainClass"]; - if ( !mainClassName ) - LC_die( @"Corrupted", @"Missing MainClass" ); - new_strcpy( dest, mainClassName ); - // - // Convert a class name of the form com.foo.bar to com/foo/bar because the - // latter is how FindClass() wants it. Curiously, this step isn't in - // Apple's sample code. Hmmm.... - // - for ( char *c = *dest; *c; ++c ) - if ( *c == '.' ) - *c = '/'; -} - -/** - * Read the maxmemory preference from Java. - */ -static int getMaxMemoryFromPreference() { - // - // TODO: this should be replaced with the proper Cocoa API for accessing - // user preferences since the path ~/Library/Preferences is probably in the - // user's native language. - // - char const *const home = ::getenv( "HOME" ); - if ( !home ) - return 0; - NSMutableString *const prefFile = - [NSMutableString stringWithUTF8String:home]; - [prefFile appendString:@"/Library/Preferences/com.lightcrafts.app.plist"]; - NSDictionary const *const plistDict = - [NSDictionary dictionaryWithContentsOfFile:prefFile]; - if ( !plistDict ) - return 0; - NSDictionary const *const appDict = - [plistDict objectForKey:@"/com/lightcrafts/app/"]; - if ( !appDict ) - return 0; - NSString const *const maxMemory = [appDict objectForKey:@"MaxMemory"]; - if ( !maxMemory ) - return 0; - return (int)::strtol( [maxMemory UTF8String], NULL, 10 ); -} - -/** - * Get the value of the MaxMemory user preference in megabytes; if none, - * default to some percentage of physical memory (but do not exceed what the - * JVM can handle). - */ -static int getMaxMemory() { - int memInMB = getMaxMemoryFromPreference(); - if ( !memInMB ) { - int sysParam[] = { CTL_HW, HW_MEMSIZE }; - // - // Be defensive and allow for the possibility that sysctl(3) might - // return either a 32- or 64-bit result by using a union and checking - // the size of the result and using the correct union member. - // - // See: - // http://www.cocoabuilder.com/archive/message/cocoa/2004/5/6/106388 - // - union { - uint32_t ui32; - uint64_t ui64; - } result; - size_t resultSize = sizeof( result ); - - ::sysctl( sysParam, 2, &result, &resultSize, NULL, 0 ); - memInMB = (int)( - ( resultSize == sizeof( result.ui32 ) ? - (result.ui32 / 1048576) : (result.ui64 / 1048576) - ) * DefaultMaxMemoryPercentage - ); - } - - if ( memInMB < JavaMinMemoryInMB ) - return JavaMinMemoryInMB; - if ( memInMB > JavaMaxMemoryInMB ) - return JavaMaxMemoryInMB; - return memInMB; -} - -/** - * Replace any -Xmx option that may have been specified in the Info.plist file - * with one generated from the user preference. - */ -static void replaceXmxOption( JavaVMInitArgs *jvm_args ) { - NSString const *const jvmXmxOption = - [NSString stringWithFormat:@"-Xmx%dm", getMaxMemory()]; - if ( jvm_args->nOptions ) { - // - // There is at lease one JVM option: loop through them all looking for - // an -Xmx option. If found, replace it. - // - for ( int i = 0; i < jvm_args->nOptions; ++i ) { - char **const optionString = &jvm_args->options[i].optionString; - if ( ::strncmp( *optionString, "-Xmx", 4 ) == 0 ) { - delete[] *optionString; - new_strcpy( optionString, jvmXmxOption ); - return; - } - } - // - // No existing -Xmx option was found: we need to append one. - // - int const new_nOptions = jvm_args->nOptions + 1; - JavaVMOption *const new_options = new JavaVMOption[ new_nOptions ]; - int i; - for ( i = 0; i < jvm_args->nOptions; ++i ) - setJVMOption( &new_options[i], jvm_args->options[i].optionString ); - newJVMOption( &new_options[i], jvmXmxOption ); - delete[] jvm_args->options; - jvm_args->options = new_options; - jvm_args->nOptions = new_nOptions; - } else { - // - // There are no JVM options: create one for the -Xmx option. - // - jvm_args->nOptions = 1; - jvm_args->options = new JavaVMOption[1]; - newJVMOption( &jvm_args->options[0], jvmXmxOption ); - } -} - -/** - * Initialize the given JavaParamBlock from the application's Info.plist file. - */ -void initJavaParamBlock( JavaParamBlock *jpb ) { - auto_obj pool; - - NSDictionary const *const javaDict = - [[[NSBundle mainBundle] infoDictionary] objectForKey:@"Java"]; - if ( !javaDict ) - LC_die( @"Corrupted", @"Missing Java dictionary" ); - - // - // Set-up the desired JVM version. - // - getJVMVersion( &jpb->jvm_version, javaDict ); - setJVMVersion( jpb->jvm_version ); - - // - // Set-up the JVM initialization options. - // - jpb->jvm_args.version = JNI_VERSION_1_4; - jpb->jvm_args.nOptions = getJVMOptions( &jpb->jvm_args.options, javaDict ); - jpb->jvm_args.ignoreUnrecognized = JNI_TRUE; - - // - // We need to replace any -Xmx option that may have been specified in the - // Info.plist file with one generated from the user preference. - // - replaceXmxOption( &jpb->jvm_args ); - - // - // Set-up the main class name and main()'s arguments. - // - getMainClassName( &jpb->main_className, javaDict ); - jpb->main_argc = getMainArgs( &jpb->main_argv, javaDict ); -} - -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/LC_CocoaUtils.h b/macosx/helpers/JavaAppLauncher/LC_CocoaUtils.h deleted file mode 100644 index 8b65cf32d8..0000000000 --- a/macosx/helpers/JavaAppLauncher/LC_CocoaUtils.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (C) 2005-2011 Fabio Riccardi */ - -#ifndef LC_CocoaUtils_H -#define LC_CocoaUtils_H - -// standard -#include -#include - -// local -#include "LC_CPPUtils.h" /* for auto_obj */ - -namespace LightCrafts { - - /** - * An auto_obj is a specialization of auto_obj for - * NSAutoreleasePool that guarantees that an instance will be released - * when it goes out of scope. - */ - template<> class auto_obj { - public: - auto_obj() : m_pool( [[NSAutoreleasePool alloc] init] ) { - } - - void release() { - [m_pool release]; - m_pool = nil; - } - - ~auto_obj() { - release(); - } - private: - NSAutoreleasePool *m_pool; - }; - - /** - * An auto_CFRef guarantees that a Core Foundation Reference will be - * released when it goes out of scope. - */ - template class auto_CFRef { - public: - typedef T value_type; - - auto_CFRef( void *p ) : m_ref( (T)p ) { } - - auto_CFRef( void const *p ) : m_ref( (T)p ) { } - - void release() { - if ( m_ref ) { - ::CFRelease( m_ref ); - m_ref = 0; - } - } - - ~auto_CFRef() { - release(); - } - - operator value_type() const { - return m_ref; - } - - bool operator!() const { - return !m_ref; - } - private: - T m_ref; - }; - -} - -/** - * Given a Java AWT component, return its NSWindow*. - */ -NSWindow* LC_getNSWindowFromAWTComponent( JNIEnv*, jobject awtComponent ); - -/** - * Convert an NSString* to a jstring. - */ -inline jstring LC_NSStringTojstring( JNIEnv *env, NSString const *s ) { - return s ? env->NewStringUTF( [s UTF8String] ) : NULL; -} - -#endif /* LC_CocoaUtils_H */ -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/LC_CocoaUtils.mm b/macosx/helpers/JavaAppLauncher/LC_CocoaUtils.mm deleted file mode 100644 index 07951f3063..0000000000 --- a/macosx/helpers/JavaAppLauncher/LC_CocoaUtils.mm +++ /dev/null @@ -1,63 +0,0 @@ -// standard -#import -#ifdef LC_USE_JAWT -#import -#else -#import -#endif - -// local -#import "LC_CocoaUtils.h" -#import "LC_JNIUtils.h" - -using namespace LightCrafts; - -/** - * Given a Java component, return an NSWindow*. The component must have been - * made visible first otherwise this function crashes. - */ -NSWindow* LC_getNSWindowFromAWTComponent( JNIEnv *env, jobject awtComponent ) { - if ( !awtComponent ) - return nil; - -#ifdef LC_USE_JAWT - JAWT awt; - awt.version = JAWT_VERSION_1_4; - if ( !JAWT_GetAWT( env, &awt ) ) - return nil; - - JAWT_DrawingSurface *const ds = awt.GetDrawingSurface( env, awtComponent ); - if ( !ds ) - return nil; - - NSWindow *nsWindow = nil; - - jint const lock = ds->Lock( ds ); - if ( lock & JAWT_LOCK_ERROR ) - goto error_1; - else { - JAWT_DrawingSurfaceInfo *const dsi = ds->GetDrawingSurfaceInfo( ds ); - if ( !dsi ) - goto error_2; - - { // local scope - JAWT_MacOSXDrawingSurfaceInfo const *const dsiMac = - static_cast( - dsi->platformInfo - ); - nsWindow = [dsiMac->cocoaViewRef window]; - } - - ds->FreeDrawingSurfaceInfo( dsi ); - } -error_2: - ds->Unlock( ds ); -error_1: - awt.FreeDrawingSurface( ds ); - return nsWindow; -#else - return [[NSApplication sharedApplication] keyWindow]; -#endif /* LC_USE_JAWT */ -} - -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/LC_JNIUtils.cpp b/macosx/helpers/JavaAppLauncher/LC_JNIUtils.cpp deleted file mode 100644 index c5794bed4a..0000000000 --- a/macosx/helpers/JavaAppLauncher/LC_JNIUtils.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (C) 2005-2011 Fabio Riccardi */ - -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * LC_JNIUtils.cpp - * - * Paul J. Lucas [paul@lightcrafts.com] - */ - -// standard -#include -#include - -// local -#include "LC_JNIUtils.h" - -using namespace std; - -extern JavaVM *g_jvm; - -/** - * Attach to the current JVM thread. - */ -JNIEnv* LC_attachCurrentThread() { - JNIEnv *env; - if ( g_jvm->AttachCurrentThread( (void**)&env, NULL ) != 0 ) { - cerr << "AttachCurrentThread() failed" << endl; - ::exit( 1 ); - } - return env; -} - -/** - * Check to see if Java threw an exception: if so, report it, then clear it. - */ -bool LC_exceptionOccurred( JNIEnv *env ) { - bool const exceptionOccurred = env->ExceptionCheck(); - if ( exceptionOccurred ) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } - return exceptionOccurred; -} - -/** - * Gets the JNI env for the current thread. - */ -JNIEnv* LC_getJNIEnv( int *mustDetach ) { - JNIEnv *env; - switch ( g_jvm->GetEnv( (void**)&env, JNI_VERSION_1_4 ) ) { - case JNI_OK: - if ( mustDetach ) - *mustDetach = false; - return env; - case JNI_EDETACHED: - if ( mustDetach ) - *mustDetach = true; - return LC_attachCurrentThread(); - default: - cerr << "GetEnv() failed" << endl; - ::exit( 1 ); - } -} - -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/LC_JNIUtils.h b/macosx/helpers/JavaAppLauncher/LC_JNIUtils.h deleted file mode 100644 index 3c44990f5c..0000000000 --- a/macosx/helpers/JavaAppLauncher/LC_JNIUtils.h +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (C) 2005-2011 Fabio Riccardi */ - -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * LC_JNIUtils.h - * - * Paul J. Lucas [paul@lightcrafts.com] - */ - -#ifndef LC_JNIUtils_H -#define LC_JNIUtils_H - -// standard -#include /* for JNIEnv */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Attach to the current JVM thread. - */ -JNIEnv* LC_attachCurrentThread(); - -/** - * Check to see if Java threw an exception: if so, report it, then clear it. - */ -bool LC_exceptionOccurred( JNIEnv* ); - - -/** - * Gets the JNI env for the current thread. - */ -JNIEnv* LC_getJNIEnv( int *mustDetach ); - -extern JavaVM *g_jvm; - -#ifdef __cplusplus -} - -// local -#include - -namespace LightCrafts { - - /** - * Ensure we detach from the current JVM thread. - */ - class auto_JNIEnv { - public: - auto_JNIEnv() : m_env( LC_getJNIEnv( &m_mustDetach ) ) { } - ~auto_JNIEnv() { - if ( m_mustDetach ) - g_jvm->DetachCurrentThread(); - } - operator JNIEnv*() const { - return m_env; - } - JNIEnv* operator->() const { - return m_env; - } - private: - JNIEnv *const m_env; - int m_mustDetach; - }; - - /** - * Ensure a Java local reference is destroyed. - */ - template class auto_local_ref { - public: - typedef T value_type; - - auto_local_ref( JNIEnv *env, value_type ref ) : - m_env( env ), m_ref( ref ) - { - } - - auto_local_ref& operator=( value_type ref ) { - if ( ref != m_ref ) { - m_env->DeleteLocalRef( m_ref ); - m_ref = ref; - } - return *this; - } - - void release() { - m_env->DeleteLocalRef( m_ref ); - m_ref = 0; - } - - ~auto_local_ref() { - release(); - } - - operator value_type() const { - return m_ref; - } - - bool operator!() const { - return !m_ref; - } - private: - JNIEnv *const m_env; - value_type m_ref; - }; - - /** - * Get an jobject's jclass and ensure the local reference thereto is - * destroyed. - */ - class auto_jclass : public auto_local_ref { - public: - typedef auto_local_ref base_type; - - auto_jclass( JNIEnv *env, jobject jObject ) : - base_type( env, env->GetObjectClass( jObject ) ) - { - } - }; - - /** - * Ensure a jstring is destroyed. - */ - typedef auto_local_ref auto_jstring; - -} // namespace - -#endif /* __cplusplus */ - -#endif /* LC_JNIUtils_H */ -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/LaunchController.mm b/macosx/helpers/JavaAppLauncher/LaunchController.mm deleted file mode 100644 index 4947220213..0000000000 --- a/macosx/helpers/JavaAppLauncher/LaunchController.mm +++ /dev/null @@ -1,546 +0,0 @@ -// standard -#import -#import -#import -#import -#import -#import - -// local -#include "JavaParamBlock.h" -#include "LC_CocoaUtils.h" -#include "LC_JNIUtils.h" -#include "UI.h" - -using namespace std; -using namespace LightCrafts; - -static JavaParamBlock jpb; - -struct FileToOpen { - AliasHandle m_fileHandle; - OSType m_senderSig; - - FileToOpen( AliasHandle fileHandle, OSType senderSig ) : - m_fileHandle( fileHandle ), - m_senderSig( senderSig ) - { - } -}; - -static queue g_filesToOpen; -bool g_javaIsReady; - -static jclass jLauncher_class; -static jmethodID jOpenFile_methodID; -static jmethodID jQuit_methodID; -static jmethodID jShowAbout_methodID; -static jmethodID jShowPreferences_methodID; - -////////// Objective-C interface ////////////////////////////////////////////// - -/** - * A LaunchController is the controlling object for the launcher. - */ -@interface LaunchController : NSObject { -} - -- (void) handleOpenDocumentEvent: - (NSAppleEventDescriptor*)event - withReplyEvent:(NSAppleEventDescriptor*)replyEvent; - -- (OSErr) parseOpenDocumentEvent: - (NSAppleEventDescriptor const*)aeDesc - senderSig:(OSType)senderSig; - -- (OSErr) queueFile: - (AliasHandle)fileHandle - fromSender:(OSType)senderSig; - -- (IBAction) quit: - (id)sender; - -- (IBAction) showAbout: - (id)sender; - -- (IBAction) showPreferences: - (id)sender; - -@end - -////////// Local functions //////////////////////////////////////////////////// - -/** - * Get the bundle signature from a PSN. - */ -static OSType getSigFromPSN( ProcessSerialNumber const *psn ) { - ProcessInfoRec info; - info.processInfoLength = sizeof( info ); - info.processName = NULL; -#ifdef __LP64__ - info.processAppRef = NULL; -#else - info.processAppSpec = NULL; -#endif - if ( ::GetProcessInformation( psn, &info ) == noErr ) - return info.processSignature; - return 0; -} - -/** - * Get the bundle signature from an AppleEvent. - */ -static OSType getSigFromEvent( NSAppleEventDescriptor const *event ) { - NSData const *const data = - [[[event attributeDescriptorForKeyword:keyAddressAttr] - coerceToDescriptorType:typeProcessSerialNumber] data]; - if ( data && [data length] == sizeof( ProcessSerialNumber ) ) - return getSigFromPSN( - static_cast( [data bytes] ) - ); - return 0; -} - -/** - * Get the bundle signature from the parent PSN. - */ -static OSType getSigFromParentPSN( ProcessSerialNumber const *psn ) { - auto_CFRef dict( - ::ProcessInformationCopyDictionary( - psn, kProcessDictionaryIncludeAllInformationMask - ) - ); - if ( dict ) { - CFNumberRef const parentPSN = static_cast( - ::CFDictionaryGetValue( dict, CFSTR("ParentPSN") ) - ); - if ( parentPSN ) { - ProcessSerialNumber ppsn; - ::CFNumberGetValue( parentPSN, kCFNumberLongLongType, &ppsn ); - return getSigFromPSN( &ppsn ); - } - } - return 0; -} - -/** - * Initialize the Java call-back methods. - */ -extern "C" void initJavaCallbacks() { -#ifdef DEBUG - cout << "*** In initJavaCallbacks()" << endl; -#endif - auto_JNIEnv env; - - jOpenFile_methodID = env->GetStaticMethodID( - jLauncher_class, "openFile", - "(Ljava/lang/String;Ljava/lang/String;)V" - ); - if ( !jOpenFile_methodID ) - LC_die( @"Corrupted", @"Missing openFile() method" ); - - jQuit_methodID = env->GetStaticMethodID( - jLauncher_class, "quit", "()V" - ); - if ( !jQuit_methodID ) - LC_die( @"Corrupted", @"Missing quit() method" ); - - jShowAbout_methodID = env->GetStaticMethodID( - jLauncher_class, "showAbout", "()V" - ); - if ( !jShowAbout_methodID ) - LC_die( @"Corrupted", @"Missing showAbout() method" ); - - jShowPreferences_methodID = env->GetStaticMethodID( - jLauncher_class, "showPreferences", "()V" - ); - if ( !jShowPreferences_methodID ) - LC_die( @"Corrupted", @"Missing showPreferences() method" ); -} - -/** - * Open the given file. - */ -static OSErr openFile( AliasHandle fileHandle, OSType senderSig ) { -#ifdef DEBUG - cout << "*** In openFile()" << endl; -#endif - auto_obj pool; - - FSRef fsRef; - Boolean wasChanged; - OSErr err = ::FSResolveAliasWithMountFlags( - NULL, fileHandle, &fsRef, &wasChanged, kResolveAliasFileNoUI - ); - ::DisposeHandle( (Handle)fileHandle ); - if ( err == noErr ) { - CFURLRef resolvedURL = ::CFURLCreateFromFSRef( NULL, &fsRef ); - NSString const *const resolvedPath = reinterpret_cast( - ::CFURLCopyFileSystemPath( resolvedURL, kCFURLPOSIXPathStyle ) - ); - ::CFRelease( resolvedURL ); - - UInt32 senderSigBigEndian = EndianU32_NtoB( senderSig ); - NSString const *const senderSigString = - [[NSString alloc] - initWithBytes:&senderSigBigEndian - length:sizeof senderSigBigEndian - encoding:NSASCIIStringEncoding]; - -#ifdef DEBUG - cout << "*** senderSig=" << [senderSigString UTF8String] << endl; -#endif - - JNIEnv *const env = LC_attachCurrentThread(); - env->CallStaticVoidMethod( - jLauncher_class, jOpenFile_methodID, - LC_NSStringTojstring( env, resolvedPath ), - LC_NSStringTojstring( env, senderSigString ) - ); - } - return err; -} - -////////// Objective-C implementation ///////////////////////////////////////// - -@implementation LaunchController - -/** - * This gets called by the Cocoa framework when the application has finished - * launching. It's time to fire up the JVM. - */ -- (void) applicationDidFinishLaunching: - (NSNotification*)notification -{ -#ifdef DEBUG - cout << "*** In applicationDidFinishLaunching()" << endl; -#endif - initJavaParamBlock( &jpb ); - -#ifdef DEBUG - cout << "JVMVersion=" << jpb.jvm_version << endl; - cout << "JVM args:" << endl; - for ( int i = 0; i < jpb.jvm_args.nOptions; ++i ) - cout << " " << jpb.jvm_args.options[i].optionString << endl; - cout << "MainClass=" << jpb.main_className << endl; - cout << "main() args:" << endl; - for ( int i = 0; i < jpb.main_argc; ++i ) - cout << " " << jpb.main_argv[i] << endl; -#endif - - // - // The JVM must be started in a seperate thread. - // - [NSThread - detachNewThreadSelector:@selector(startJava:) - toTarget:self withObject:nil]; - - // - // Start a timer to poll for when the Java application is ready to open - // files. - // - [NSTimer - scheduledTimerWithTimeInterval:0.5 // seconds - target:self selector:@selector(isJavaReady:) - userInfo:nil repeats:YES]; -} - -/** - * This gets called by the Cocoa framework when the application is about to - * finish launching. This is the right time to install custom event handlers. - */ -- (void) applicationWillFinishLaunching: - (NSNotification*)notification -{ -#ifdef DEBUG - cout << "*** In applicationWillFinishLaunching()" << endl; -#endif - [[NSAppleEventManager sharedAppleEventManager] - setEventHandler:self - andSelector:@selector(handleOpenDocumentEvent:withReplyEvent:) - forEventClass:kCoreEventClass andEventID:kAEOpenDocuments]; -} - -/** - * This is called by the Cocoa framework just after our main NIB is fully - * loaded. - */ -- (void) awakeFromNib -{ -#ifdef DEBUG - cout << "*** In awakeFromNib()" << endl; -#endif - [[NSApplication sharedApplication] setDelegate:self]; -} - -/** - * Handle an "open document" AppleEvent. - */ -- (void) handleOpenDocumentEvent: - (NSAppleEventDescriptor*)event - withReplyEvent:(NSAppleEventDescriptor*)replyEvent -{ -#ifdef DEBUG - cout << "*** In handleOpenDocumentEvent()" << endl; -#endif - - ////////// Figure out the process that sent us the message //////////////// - - // - // First, get our PSN and out signature for reference. - // - ProcessSerialNumber ourPSN; - ::GetCurrentProcess( &ourPSN ); - OSType const ourSig = getSigFromPSN( &ourPSN ); - - // - // Next, try to get the sender's signature from the event. - // - OSType senderSig = getSigFromEvent( event ); - - // - // If we didn't get a signature or the signature is our own signature - // (which is the case if we were just launched as opposed to already - // running), get the signature from our parent PSN. - // - if ( !senderSig || senderSig == ourSig ) - senderSig = getSigFromParentPSN( &ourPSN ); - -#if 0 - if ( senderSig == 'dock' ) { - // - // Unfortunately, if the user drags & drops from another application - // onto our icon in the Dock, we get 'dock' as the sender and the event - // contains no information as to who the original sender is. - // - // As a hack work-around, iterate through all processes looking for one - // we know about. If we find more than one, abort. - // -#ifdef DEBUG - cout << "*** sender is Dock" << endl; -#endif - senderSig = 0; - ProcessSerialNumber psn = { kNoProcess, kNoProcess }; - while ( ::GetNextProcess( &psn ) != procNotFound ) { - OSType sig = getSigFromPSN( &psn ); - switch ( sig ) { - case 'AgHg': // Lightroom - case 'Brdg': // Bridge - case 'fstp': // Aperture - case 'iPho': // iPhoto - if ( senderSig ) { - senderSig = 0; - goto done; - } - senderSig = sig; - } - } -done: ; - } -#endif - - ////////// Open the file(s) /////////////////////////////////////////////// - - OSErr err = - [self - parseOpenDocumentEvent:[event descriptorForKeyword:keyDirectObject] - senderSig:senderSig]; - - ////////// Report any error back ////////////////////////////////////////// - - if ( err != noErr ) { - NSAppleEventDescriptor *const errNumDesc = - [NSAppleEventDescriptor descriptorWithInt32:err]; - [replyEvent setParamDescriptor:errNumDesc forKeyword:keyErrorNumber]; - - NSAppleEventDescriptor *const errStrDesc = - [NSAppleEventDescriptor descriptorWithString:@"Complain"]; - [replyEvent setParamDescriptor:errStrDesc forKeyword:keyErrorString]; - } -} - -/** - * Periodically check whether the Java application is ready, i.e., has - * initialized itself sufficiently and is ready to open files. - */ -- (void) isJavaReady: - (NSTimer*)timer -{ -#ifdef DEBUG - cout << "*** In isJavaReady()" << endl; -#endif - if ( !jLauncher_class ) { - // - // The thread that is starting the JVM hasn't done so yet (otherwise - // the jLauncher_class variable wouldn't be null). - // - return; - } - - static pthread_once_t once = PTHREAD_ONCE_INIT; - ::pthread_once( &once, initJavaCallbacks ); - - @synchronized ( self ) { - if ( g_javaIsReady ) { - [timer invalidate]; -#ifdef DEBUG - cout << "------------> Java is ready!" << endl; -#endif - // - // Open any files that have been queued between the time the - // application launched and the time the Java application became - // ready to open files. - // - while ( !g_filesToOpen.empty() ) { - FileToOpen const &fto = g_filesToOpen.front(); - openFile( fto.m_fileHandle, fto.m_senderSig ); - g_filesToOpen.pop(); - } - } - } -} - -/** - * Parses an Open Document (odoc) Apple Event. - */ -- (OSErr) parseOpenDocumentEvent: - (NSAppleEventDescriptor const*)aeDesc - senderSig:(OSType)senderSig -{ -#ifdef DEBUG - cout << "*** In parseOpenDocumentEvent()" << endl; -#endif - DescType const descType = [aeDesc descriptorType]; - OSErr err = noErr; - - if ( descType == typeAlias ) { - // - // Open a single file specified as an alias. - // - NSData const *const data = [aeDesc data]; - AliasHandle const fileHandle = - reinterpret_cast( ::NewHandle( [data length] ) ); - if ( fileHandle ) { - [data getBytes:*fileHandle]; - err = [self queueFile:fileHandle fromSender:senderSig]; - } - } else if ( descType == typeBookmarkData ) { - // - // Open a single file specified as a bookmark (Mac OS X 10.6 or later). - // - BOOL isStale; - NSError *nsError = nil; - NSURL const *const url = - [NSURL - URLByResolvingBookmarkData:[aeDesc data] - options: - (NSURLBookmarkResolutionWithoutUI | - NSURLBookmarkResolutionWithoutMounting) - relativeToURL:nil bookmarkDataIsStale:&isStale error:&nsError]; - if ( isStale ) - return fnfErr; - if ( nsError ) { - if ( [[nsError domain] isEqualToString:NSOSStatusErrorDomain] ) - return [nsError code]; - return errAECoercionFail; - } - FSRef fsRef; - if ( !::CFURLGetFSRef( (CFURLRef)url, &fsRef ) ) - return memFullErr; - AliasHandle fileHandle; - err = ::FSNewAlias( NULL, &fsRef, &fileHandle ); - if ( err == noErr ) - err = [self queueFile:fileHandle fromSender:senderSig]; - } else if ( descType == typeAEList ) { - // - // Open multiple files. - // - int const numItems = [aeDesc numberOfItems]; - for ( int i = 1; i <= numItems; ++i ) { - err = [self - parseOpenDocumentEvent:[aeDesc descriptorAtIndex:i] - senderSig:senderSig]; - if ( err != noErr ) - break; - } - } - return err; -} - -/** - * Queue a file to be opened. - */ -- (OSErr) queueFile: - (AliasHandle)fileHandle - fromSender:(OSType)senderSig -{ -#ifdef DEBUG - cout << "*** In queueFile()" << endl; -#endif - @synchronized ( self ) { - if ( g_javaIsReady ) { - // - // The Java application is ready to open files: open the file - // immediately and don't bother to queue it. - // - return openFile( fileHandle, senderSig ); - } - FileToOpen const fileToOpen( fileHandle, senderSig ); - g_filesToOpen.push( fileToOpen ); - } - return noErr; -} - -/** - * This is called when the user selects "Quit" from the application menu. - */ -- (IBAction) quit: - (id)sender -{ - JNIEnv *const env = LC_attachCurrentThread(); - env->CallStaticVoidMethod( jLauncher_class, jQuit_methodID ); -} - -/** - * This is called when the user selects "About ..." from the application menu. - */ -- (IBAction) showAbout: - (id)sender -{ - JNIEnv *const env = LC_attachCurrentThread(); - env->CallStaticVoidMethod( jLauncher_class, jShowAbout_methodID ); -} - -/** - * This is called when the user selects "Preferences..." from the applicaiton - * menu. - */ -- (IBAction) showPreferences: - (id)sender -{ - JNIEnv *const env = LC_attachCurrentThread(); - env->CallStaticVoidMethod( jLauncher_class, jShowPreferences_methodID ); -} - -/** - * Fire up the JVM. This method must be called in its own thread. - */ -- (void) startJava: - (id)userData -{ - extern void startJava( JavaParamBlock const*, jclass* ); - auto_obj pool; - - // - // Start the JVM: this call will block until the JVM exits. - // - startJava( &jpb, &jLauncher_class ); - - // - // Now that the JVM has shut down cleanly, quit. - // - [[NSApplication sharedApplication] terminate:self]; -} - -@end -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/Resources/Danish.lproj/Localizable.strings b/macosx/helpers/JavaAppLauncher/Resources/Danish.lproj/Localizable.strings deleted file mode 100644 index 3e97c8d55b..0000000000 --- a/macosx/helpers/JavaAppLauncher/Resources/Danish.lproj/Localizable.strings +++ /dev/null @@ -1,69 +0,0 @@ -/* general */ -"Corrupted" = "Corrupted application"; -"Unexpected" = "Unexpected failure"; - -/* checkCPUType() */ -"Newer CPU required" = "Newer CPU required"; -"CPU requirements" = "LightZone requires a PowerPC G4, G5, or Intel processor."; - -/* checkJars */ -"Bad Jar" = "A jar file is corrupt."; -"Missing Jar" = "A jar file is missing."; - -/* checkOSXVersion() */ -"Newer Mac OS X required" = "Newer Mac OS X required"; -"OS requirements" = "LightZone requires Mac OS X version 10.4.3 or later."; - -/* convertMainArgs() */ -"Could not allocate main() string" = "Could not allocate main() argument string."; -"Missing java.lang.String" = "Could not find java.lang.String class."; - -/* getClassPath() */ -"Bad ClassPath" = "ClassPath in Info.plist is not a String or an Array."; - -/* getCWD() */ -"Set CWD failed" = "Failed to set current working directory."; - -/* getJVMOptions() */ -"Bad VMOptions" = "VMOptions in Info.plist is not String or Array."; - -/* getMainArgs() */ -"Bad argument array" = "Element of argument array isn't a string."; -"Bad Arguments" = "Arguments in Info.plist is not String or Array."; -"Could not allocate main() array" = "Could not allocate main() argument array."; - -/* getMainClassName() */ -"Missing MainClass" = "MainClass not specified in Info.plist."; - -/* getJVMVersion() */ -"Missing JVMVersion" = "JVMVersion not specified in Info.plist."; - -/* initJavaParamBlock() */ -"Missing Java dictionary" = "Java dictionary not specified in Info.plist."; - -/* initMightyMouseJNI() */ -"Missing MightyMouse class" = "Could not find MightyMouse class."; -"Missing handleEvent method" = "Could not find handleEvent method."; - -/* LC_die() */ -"Quit" = "Quit"; - -/* new_strcpy() */ -"Could not allocate memory" = "Could not allocate memory."; - -/* redirectOutput() */ -"Missing CFBundleName" = "CFBundleName not specified in Info.plist."; - -/* setJVMVersion() */ -"Missing Java" = "Java appears not to be installed correctly on this computer."; -"Couldn't read Versions directory" = "The Java Versions directory could not be read."; -"Reuired Java version not found" = "Required Java version not found"; -"Couldn't match Java version" = "Couldn't find Java %s. Select Software Update to get the required Java version from Apple."; - -/* startJava() */ -"Could not detach thread" = "Could not detach thread."; -"Error starting JVM" = "Error starting Java virtual machine."; -"Missing main()" = "Could not find main class."; -"Missing main() method" = "Main class has no main() method."; -"main() threw exception" = "The main() method threw an exception."; -"RegisterNatives() failed" = "The RegisterNatives() method failed."; diff --git a/macosx/helpers/JavaAppLauncher/Resources/Dutch.lproj/Localizable.strings b/macosx/helpers/JavaAppLauncher/Resources/Dutch.lproj/Localizable.strings deleted file mode 100644 index 3e97c8d55b..0000000000 --- a/macosx/helpers/JavaAppLauncher/Resources/Dutch.lproj/Localizable.strings +++ /dev/null @@ -1,69 +0,0 @@ -/* general */ -"Corrupted" = "Corrupted application"; -"Unexpected" = "Unexpected failure"; - -/* checkCPUType() */ -"Newer CPU required" = "Newer CPU required"; -"CPU requirements" = "LightZone requires a PowerPC G4, G5, or Intel processor."; - -/* checkJars */ -"Bad Jar" = "A jar file is corrupt."; -"Missing Jar" = "A jar file is missing."; - -/* checkOSXVersion() */ -"Newer Mac OS X required" = "Newer Mac OS X required"; -"OS requirements" = "LightZone requires Mac OS X version 10.4.3 or later."; - -/* convertMainArgs() */ -"Could not allocate main() string" = "Could not allocate main() argument string."; -"Missing java.lang.String" = "Could not find java.lang.String class."; - -/* getClassPath() */ -"Bad ClassPath" = "ClassPath in Info.plist is not a String or an Array."; - -/* getCWD() */ -"Set CWD failed" = "Failed to set current working directory."; - -/* getJVMOptions() */ -"Bad VMOptions" = "VMOptions in Info.plist is not String or Array."; - -/* getMainArgs() */ -"Bad argument array" = "Element of argument array isn't a string."; -"Bad Arguments" = "Arguments in Info.plist is not String or Array."; -"Could not allocate main() array" = "Could not allocate main() argument array."; - -/* getMainClassName() */ -"Missing MainClass" = "MainClass not specified in Info.plist."; - -/* getJVMVersion() */ -"Missing JVMVersion" = "JVMVersion not specified in Info.plist."; - -/* initJavaParamBlock() */ -"Missing Java dictionary" = "Java dictionary not specified in Info.plist."; - -/* initMightyMouseJNI() */ -"Missing MightyMouse class" = "Could not find MightyMouse class."; -"Missing handleEvent method" = "Could not find handleEvent method."; - -/* LC_die() */ -"Quit" = "Quit"; - -/* new_strcpy() */ -"Could not allocate memory" = "Could not allocate memory."; - -/* redirectOutput() */ -"Missing CFBundleName" = "CFBundleName not specified in Info.plist."; - -/* setJVMVersion() */ -"Missing Java" = "Java appears not to be installed correctly on this computer."; -"Couldn't read Versions directory" = "The Java Versions directory could not be read."; -"Reuired Java version not found" = "Required Java version not found"; -"Couldn't match Java version" = "Couldn't find Java %s. Select Software Update to get the required Java version from Apple."; - -/* startJava() */ -"Could not detach thread" = "Could not detach thread."; -"Error starting JVM" = "Error starting Java virtual machine."; -"Missing main()" = "Could not find main class."; -"Missing main() method" = "Main class has no main() method."; -"main() threw exception" = "The main() method threw an exception."; -"RegisterNatives() failed" = "The RegisterNatives() method failed."; diff --git a/macosx/helpers/JavaAppLauncher/Resources/English.lproj/Localizable.strings b/macosx/helpers/JavaAppLauncher/Resources/English.lproj/Localizable.strings deleted file mode 100644 index a6f786d4c2..0000000000 --- a/macosx/helpers/JavaAppLauncher/Resources/English.lproj/Localizable.strings +++ /dev/null @@ -1,69 +0,0 @@ -/* general */ -"Corrupted" = "Aplicacion corrupta"; -"Unexpected" = "Fallo inexperado"; - -/* checkCPUType() */ -"Newer CPU required" = "Nuevo tipo de CPU requerido"; -"CPU requirements" = "LightZone requiere un PowerPC G4, G5, o un procesador Intel."; - -/* checkJars */ -"Bad Jar" = "Un archivo jar esta corrupto."; -"Missing Jar" = "Un archivo jar no se encuentra."; - -/* checkOSXVersion() */ -"Newer Mac OS X required" = "Nuevo Mac OS X requerido"; -"OS requirements" = "LightZone requiere Mac OS X version 10.4.3 o posterior."; - -/* convertMainArgs() */ -"Could not allocate main() string" = "No se puede asignar principal() argumento de cadena."; -"Missing java.lang.String" = "No se encuentra java.lang.Argumento de clase."; - -/* getClassPath() */ -"Bad ClassPath" = "ClassPath en Info.plist no es una cadena o matriz."; - -/* getCWD() */ -"Set CWD failed" = "Fallo al asignar directorio de trabajo actual."; - -/* getJVMOptions() */ -"Bad VMOptions" = "VMOptions en Info.plist no es una Cadena o Matriz."; - -/* getMainArgs() */ -"Bad argument array" = "Elemento del argumento de matriz no es una cadena."; -"Bad Arguments" = "Argumentos en Info.plist no es una Cadena o Matriz."; -"Could not allocate main() array" = "No se puede asignar principal() argumento de matriz."; - -/* getMainClassName() */ -"Missing MainClass" = "MainClass no especificada en Info.plist."; - -/* getJVMVersion() */ -"Missing JVMVersion" = "JVMVersion no especificada en Info.plist."; - -/* initJavaParamBlock() */ -"Missing Java dictionary" = "Diccionario Java no especificado en Info.plist."; - -/* initMightyMouseJNI() */ -"Missing MightyMouse class" = "No se encuentra la clase MightyMouse."; -"Missing handleEvent method" = "No se encuentra el metodo handleEvent."; - -/* LC_die() */ -"Quit" = Salir - -/* new_strcpy() */ -"Could not allocate memory" = No se puede asignar suficiente memoria - -/* redirectOutput() */ -"Missing CFBundleName" = "CFBundleName no especificada en Info.plist."; - -/* setJVMVersion() */ -"Missing Java" = "Java parece no estar instalado correctamente en este ordenador."; -"Couldn't read Versions directory" = "El directorio de la version de Java no se puede leer."; -"Reuired Java version not found" = "La version Java requerida no se encuentra"; -"Couldn't match Java version" = "No se encuentra Java %s. Seleccionar Actualizacion de Software para obetener la version de Java requerida desde Apple."; - -/* startJava() */ -"Could not detach thread" = "No se puede separar el hilo."; -"Error starting JVM" = "Error iniciando maquina virtual Java."; -"Missing main()" = "No se encuentra la clase principal."; -"Missing main() method" = "La clase principal no tiene metodo principal()."; -"main() threw exception" = "El metodo principal() arrojo una excepcion."; -"RegisterNatives() failed" = "El metodo RegisterNatives() falló."; diff --git a/macosx/helpers/JavaAppLauncher/Resources/French.lproj/Localizable.strings b/macosx/helpers/JavaAppLauncher/Resources/French.lproj/Localizable.strings deleted file mode 100644 index 3e97c8d55b..0000000000 --- a/macosx/helpers/JavaAppLauncher/Resources/French.lproj/Localizable.strings +++ /dev/null @@ -1,69 +0,0 @@ -/* general */ -"Corrupted" = "Corrupted application"; -"Unexpected" = "Unexpected failure"; - -/* checkCPUType() */ -"Newer CPU required" = "Newer CPU required"; -"CPU requirements" = "LightZone requires a PowerPC G4, G5, or Intel processor."; - -/* checkJars */ -"Bad Jar" = "A jar file is corrupt."; -"Missing Jar" = "A jar file is missing."; - -/* checkOSXVersion() */ -"Newer Mac OS X required" = "Newer Mac OS X required"; -"OS requirements" = "LightZone requires Mac OS X version 10.4.3 or later."; - -/* convertMainArgs() */ -"Could not allocate main() string" = "Could not allocate main() argument string."; -"Missing java.lang.String" = "Could not find java.lang.String class."; - -/* getClassPath() */ -"Bad ClassPath" = "ClassPath in Info.plist is not a String or an Array."; - -/* getCWD() */ -"Set CWD failed" = "Failed to set current working directory."; - -/* getJVMOptions() */ -"Bad VMOptions" = "VMOptions in Info.plist is not String or Array."; - -/* getMainArgs() */ -"Bad argument array" = "Element of argument array isn't a string."; -"Bad Arguments" = "Arguments in Info.plist is not String or Array."; -"Could not allocate main() array" = "Could not allocate main() argument array."; - -/* getMainClassName() */ -"Missing MainClass" = "MainClass not specified in Info.plist."; - -/* getJVMVersion() */ -"Missing JVMVersion" = "JVMVersion not specified in Info.plist."; - -/* initJavaParamBlock() */ -"Missing Java dictionary" = "Java dictionary not specified in Info.plist."; - -/* initMightyMouseJNI() */ -"Missing MightyMouse class" = "Could not find MightyMouse class."; -"Missing handleEvent method" = "Could not find handleEvent method."; - -/* LC_die() */ -"Quit" = "Quit"; - -/* new_strcpy() */ -"Could not allocate memory" = "Could not allocate memory."; - -/* redirectOutput() */ -"Missing CFBundleName" = "CFBundleName not specified in Info.plist."; - -/* setJVMVersion() */ -"Missing Java" = "Java appears not to be installed correctly on this computer."; -"Couldn't read Versions directory" = "The Java Versions directory could not be read."; -"Reuired Java version not found" = "Required Java version not found"; -"Couldn't match Java version" = "Couldn't find Java %s. Select Software Update to get the required Java version from Apple."; - -/* startJava() */ -"Could not detach thread" = "Could not detach thread."; -"Error starting JVM" = "Error starting Java virtual machine."; -"Missing main()" = "Could not find main class."; -"Missing main() method" = "Main class has no main() method."; -"main() threw exception" = "The main() method threw an exception."; -"RegisterNatives() failed" = "The RegisterNatives() method failed."; diff --git a/macosx/helpers/JavaAppLauncher/Resources/Japanese.lproj/Localizable.strings b/macosx/helpers/JavaAppLauncher/Resources/Japanese.lproj/Localizable.strings deleted file mode 100644 index 3e97c8d55b..0000000000 --- a/macosx/helpers/JavaAppLauncher/Resources/Japanese.lproj/Localizable.strings +++ /dev/null @@ -1,69 +0,0 @@ -/* general */ -"Corrupted" = "Corrupted application"; -"Unexpected" = "Unexpected failure"; - -/* checkCPUType() */ -"Newer CPU required" = "Newer CPU required"; -"CPU requirements" = "LightZone requires a PowerPC G4, G5, or Intel processor."; - -/* checkJars */ -"Bad Jar" = "A jar file is corrupt."; -"Missing Jar" = "A jar file is missing."; - -/* checkOSXVersion() */ -"Newer Mac OS X required" = "Newer Mac OS X required"; -"OS requirements" = "LightZone requires Mac OS X version 10.4.3 or later."; - -/* convertMainArgs() */ -"Could not allocate main() string" = "Could not allocate main() argument string."; -"Missing java.lang.String" = "Could not find java.lang.String class."; - -/* getClassPath() */ -"Bad ClassPath" = "ClassPath in Info.plist is not a String or an Array."; - -/* getCWD() */ -"Set CWD failed" = "Failed to set current working directory."; - -/* getJVMOptions() */ -"Bad VMOptions" = "VMOptions in Info.plist is not String or Array."; - -/* getMainArgs() */ -"Bad argument array" = "Element of argument array isn't a string."; -"Bad Arguments" = "Arguments in Info.plist is not String or Array."; -"Could not allocate main() array" = "Could not allocate main() argument array."; - -/* getMainClassName() */ -"Missing MainClass" = "MainClass not specified in Info.plist."; - -/* getJVMVersion() */ -"Missing JVMVersion" = "JVMVersion not specified in Info.plist."; - -/* initJavaParamBlock() */ -"Missing Java dictionary" = "Java dictionary not specified in Info.plist."; - -/* initMightyMouseJNI() */ -"Missing MightyMouse class" = "Could not find MightyMouse class."; -"Missing handleEvent method" = "Could not find handleEvent method."; - -/* LC_die() */ -"Quit" = "Quit"; - -/* new_strcpy() */ -"Could not allocate memory" = "Could not allocate memory."; - -/* redirectOutput() */ -"Missing CFBundleName" = "CFBundleName not specified in Info.plist."; - -/* setJVMVersion() */ -"Missing Java" = "Java appears not to be installed correctly on this computer."; -"Couldn't read Versions directory" = "The Java Versions directory could not be read."; -"Reuired Java version not found" = "Required Java version not found"; -"Couldn't match Java version" = "Couldn't find Java %s. Select Software Update to get the required Java version from Apple."; - -/* startJava() */ -"Could not detach thread" = "Could not detach thread."; -"Error starting JVM" = "Error starting Java virtual machine."; -"Missing main()" = "Could not find main class."; -"Missing main() method" = "Main class has no main() method."; -"main() threw exception" = "The main() method threw an exception."; -"RegisterNatives() failed" = "The RegisterNatives() method failed."; diff --git a/macosx/helpers/JavaAppLauncher/Resources/Spanish.lproj/Localizable.strings b/macosx/helpers/JavaAppLauncher/Resources/Spanish.lproj/Localizable.strings deleted file mode 100644 index 3e97c8d55b..0000000000 --- a/macosx/helpers/JavaAppLauncher/Resources/Spanish.lproj/Localizable.strings +++ /dev/null @@ -1,69 +0,0 @@ -/* general */ -"Corrupted" = "Corrupted application"; -"Unexpected" = "Unexpected failure"; - -/* checkCPUType() */ -"Newer CPU required" = "Newer CPU required"; -"CPU requirements" = "LightZone requires a PowerPC G4, G5, or Intel processor."; - -/* checkJars */ -"Bad Jar" = "A jar file is corrupt."; -"Missing Jar" = "A jar file is missing."; - -/* checkOSXVersion() */ -"Newer Mac OS X required" = "Newer Mac OS X required"; -"OS requirements" = "LightZone requires Mac OS X version 10.4.3 or later."; - -/* convertMainArgs() */ -"Could not allocate main() string" = "Could not allocate main() argument string."; -"Missing java.lang.String" = "Could not find java.lang.String class."; - -/* getClassPath() */ -"Bad ClassPath" = "ClassPath in Info.plist is not a String or an Array."; - -/* getCWD() */ -"Set CWD failed" = "Failed to set current working directory."; - -/* getJVMOptions() */ -"Bad VMOptions" = "VMOptions in Info.plist is not String or Array."; - -/* getMainArgs() */ -"Bad argument array" = "Element of argument array isn't a string."; -"Bad Arguments" = "Arguments in Info.plist is not String or Array."; -"Could not allocate main() array" = "Could not allocate main() argument array."; - -/* getMainClassName() */ -"Missing MainClass" = "MainClass not specified in Info.plist."; - -/* getJVMVersion() */ -"Missing JVMVersion" = "JVMVersion not specified in Info.plist."; - -/* initJavaParamBlock() */ -"Missing Java dictionary" = "Java dictionary not specified in Info.plist."; - -/* initMightyMouseJNI() */ -"Missing MightyMouse class" = "Could not find MightyMouse class."; -"Missing handleEvent method" = "Could not find handleEvent method."; - -/* LC_die() */ -"Quit" = "Quit"; - -/* new_strcpy() */ -"Could not allocate memory" = "Could not allocate memory."; - -/* redirectOutput() */ -"Missing CFBundleName" = "CFBundleName not specified in Info.plist."; - -/* setJVMVersion() */ -"Missing Java" = "Java appears not to be installed correctly on this computer."; -"Couldn't read Versions directory" = "The Java Versions directory could not be read."; -"Reuired Java version not found" = "Required Java version not found"; -"Couldn't match Java version" = "Couldn't find Java %s. Select Software Update to get the required Java version from Apple."; - -/* startJava() */ -"Could not detach thread" = "Could not detach thread."; -"Error starting JVM" = "Error starting Java virtual machine."; -"Missing main()" = "Could not find main class."; -"Missing main() method" = "Main class has no main() method."; -"main() threw exception" = "The main() method threw an exception."; -"RegisterNatives() failed" = "The RegisterNatives() method failed."; diff --git a/macosx/helpers/JavaAppLauncher/SetJVMVersion.h b/macosx/helpers/JavaAppLauncher/SetJVMVersion.h deleted file mode 100644 index a52a461dd6..0000000000 --- a/macosx/helpers/JavaAppLauncher/SetJVMVersion.h +++ /dev/null @@ -1,15 +0,0 @@ -/* Copyright (C) 2005-2011 Fabio Riccardi */ - -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * SetJVMVersion.h - * - * Paul J. Lucas [paul@lightcrafts.com] - */ - -/** - * Set the preferred JVM version via the JAVA_JVM_VERSION environment variable. - */ -void setJVMVersion( char const *jvmVersion ); - -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/SetJVMVersion.mm b/macosx/helpers/JavaAppLauncher/SetJVMVersion.mm deleted file mode 100644 index df2db69a15..0000000000 --- a/macosx/helpers/JavaAppLauncher/SetJVMVersion.mm +++ /dev/null @@ -1,142 +0,0 @@ -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * SetJVMVersion.mm - * - * Paul J. Lucas [paul@lightcrafts.com] - */ - -// standard -#import -#ifdef DEBUG -#import -#endif -#import -#import - -// local -#import "LC_CocoaUtils.h" -#import "UI.h" - -using namespace std; -using namespace LightCrafts; - -/** - * Set the preferred JVM version via the JAVA_JVM_VERSION environment variable. - */ -void setJVMVersion( char const *jvmVersion ) { - auto_obj pool; - - enum match_mode_t { - // - // Must exactly match the specified version. - // - MatchSpecifiedOnly, - - // - // Must match the specified version or any later version, but within - // the same minor revision, e.g., "1.4.2" is a match for "1.4*" but - // "1.5" is not. - // - MatchSpecifiedOrLater, - - // - // Must match the specified version or any later version. - // - MatchSpecifiedOrLatest - }; - match_mode_t matchMode; - - // - // Determine the match mode we should use. - // - int const len = ::strlen( jvmVersion ); - switch ( jvmVersion[ len - 1 ] ) { - case '*': - matchMode = MatchSpecifiedOrLater; - break; - case '+': - matchMode = MatchSpecifiedOrLatest; - break; - default: - matchMode = MatchSpecifiedOnly; - } - - // - // Get the path to the Java Versions directory. - // - NSBundle *const javaBundle = - [NSBundle bundleWithIdentifier:@"com.apple.JavaVM"]; - if ( !javaBundle ) - LC_die( @"Unexpected", @"Missing Java" ); - NSString *const javaVersionsPath = - [[javaBundle bundlePath] stringByAppendingPathComponent:@"Versions"]; - - // - // Read the names of all the subdirectories (or symbolic links thereto) - // that list the Java versions available and look for the best match. - // - DIR *const dir = ::opendir( [javaVersionsPath fileSystemRepresentation] ); - if ( !dir ) - LC_die( @"Unexpected", @"Couldn't read Versions directory" ); - - int jvmMajor, jvmMinor = 0, jvmPoint = 0; - ::sscanf( jvmVersion, "%d.%d.%d", &jvmMajor, &jvmMinor, &jvmPoint ); - - char bestJVMVersion[ 16 ]; // more than enough - *bestJVMVersion = '\0'; - int bestMajor = 0, bestMinor = 0, bestPoint = 0; - - for ( struct dirent const *entry; entry = ::readdir( dir ); ) { - if ( !isdigit( *entry->d_name ) ) - continue; - int dirMajor, dirMinor, dirPoint; - ::sscanf( entry->d_name, "%d.%d.%d", &dirMajor, &dirMinor, &dirPoint ); - switch ( matchMode ) { - - case MatchSpecifiedOnly: - if ( dirMajor == jvmMajor && dirMinor == jvmMinor && - dirPoint == jvmPoint - ) { - ::strcpy( bestJVMVersion, entry->d_name ); - goto done; - } - break; - - case MatchSpecifiedOrLater: - if ( dirMajor == jvmMajor && dirMinor == jvmMinor && - dirPoint >= jvmPoint && dirPoint >= bestPoint - ) { - ::strcpy( bestJVMVersion, entry->d_name ); - bestPoint = dirPoint; - } - break; - - case MatchSpecifiedOrLatest: - if ( dirMajor >= jvmMajor && dirMinor >= jvmMinor && - dirPoint >= jvmPoint - ) { - ::strcpy( bestJVMVersion, entry->d_name ); - bestMajor = dirMajor; - bestMinor = dirMinor; - bestPoint = dirPoint; - } - break; - } - } - -done: - ::closedir( dir ); - if ( !*bestJVMVersion ) - LC_dieWithoutLocalizedInfo( @"Required Java version not found", - [NSString stringWithFormat: - NSLocalizedString( @"Couldn't match Java version", nil ), - jvmVersion] - ); - -#ifdef DEBUG - cout << "Setting JAVA_JVM_VERSION=" << bestJVMVersion << endl; -#endif - ::setenv( "JAVA_JVM_VERSION", bestJVMVersion, 1 ); -} - -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/StartJava.mm b/macosx/helpers/JavaAppLauncher/StartJava.mm deleted file mode 100644 index 135f15b81e..0000000000 --- a/macosx/helpers/JavaAppLauncher/StartJava.mm +++ /dev/null @@ -1,133 +0,0 @@ -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * StartJava.cpp - * - * Paul J. Lucas [paul@lightcrafts.com] - * - * This code is based on: - * http://developer.apple.com/samplecode/simpleJavaLauncher/simpleJavaLauncher.html - * http://developer.apple.com/samplecode/JavaSplashScreen/JavaSplashScreen.html - */ - -// standard -#include -#include -#include -#include /* for getrlimit(2) */ -#ifdef DEBUG -#include -#endif - -// local -#include "JavaParamBlock.h" -#include "LC_JNIUtils.h" -#include "UI.h" - -using namespace std; -using namespace LightCrafts; - -JavaVM *g_jvm; - -/** - * Convert the array of char* pointers of the main() arguments to a Java - * String[]. - */ -static jobjectArray convertMainArgs( JNIEnv *env, JavaParamBlock const *jpb ) { - jclass jString_class = env->FindClass( "java/lang/String" ); - if ( !jString_class ) - LC_die( @"Unexpected", @"Missing java.lang.String" ); - - jobjectArray jArgs = - env->NewObjectArray( jpb->main_argc, jString_class, 0 ); - if ( !jArgs ) - LC_die( @"Unexpected", @"Could not allocate main() array" ); - if ( jpb->main_argc ) { - for ( int i = 0; i < jpb->main_argc; ++i ) { - auto_jstring jArg( env, env->NewStringUTF( jpb->main_argv[i] ) ); - if ( !jArg ) - LC_die( @"Unexpected", @"Could not allocate main() string" ); - env->SetObjectArrayElement( jArgs, i, jArg ); - } - } else { - // - // No "Arguments" key was found so leave the array empty and use that - // for "no arguments" to main(). - // - } - - return jArgs; -} - -/** - * This method is called when the Java application is ready to open files. - */ -JNIEXPORT void JNICALL readyToOpenFiles( JNIEnv*, jclass ) { -#ifdef DEBUG - cout << "*** In readyToOpenFiles()" << endl; -#endif - extern bool g_javaIsReady; - g_javaIsReady = true; -} - -/** - * Start the JVM. This must be called in its own thread. - */ -void startJava( JavaParamBlock const *jpb, jclass *pLauncher_class ) { - // - // Start a JVM. - // - JNIEnv *env; - if ( JNI_CreateJavaVM( &g_jvm, (void**)&env, (void*)&jpb->jvm_args ) != 0 ) - LC_die( @"Unexpected", @"Error starting JVM" ); - - // - // Find the application's main class. - // - *pLauncher_class = env->FindClass( jpb->main_className ); - if ( LC_exceptionOccurred( env ) || !*pLauncher_class ) - LC_die( @"Corrupted", @"Missing main()" ); - *pLauncher_class = (jclass)env->NewGlobalRef( *pLauncher_class ); - - // - // Find the main class's main() method. - // - jmethodID const jMain_methodID = env->GetStaticMethodID( - *pLauncher_class, "main", "([Ljava/lang/String;)V" - ); - if ( LC_exceptionOccurred( env ) || !jMain_methodID ) - LC_die( @"Corrupted", @"Missing main() method" ); - - // - // Register native methods. - // - JNINativeMethod const jMethod = { - "readyToOpenFiles", "()V", reinterpret_cast( &readyToOpenFiles ) - }; - if ( env->RegisterNatives( *pLauncher_class, &jMethod, 1 ) < 0 ) - LC_die( @"Unexpected", @"RegisterNatives() failed" ); - - // - // Call the main class's main() method. - // - env->CallStaticVoidMethod( - *pLauncher_class, jMain_methodID, convertMainArgs( env, jpb ) - ); - if ( LC_exceptionOccurred( env ) ) - LC_die( @"Unexpected", @"main() threw exception" ); - - // - // Detach the current thread so that it appears to have exited when the - // Java application's main() method exits. - // - if ( g_jvm->DetachCurrentThread() != 0 ) - LC_die( @"Unexpected", @"Could not detach thread" ); - - // - // Unloads a Java VM and reclaims its resources. Only this thread can - // unload the VM. This call blocks until this thread is only remaining - // user thread before it destroys the VM. - // - g_jvm->DestroyJavaVM(); -} - -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/UI.h b/macosx/helpers/JavaAppLauncher/UI.h deleted file mode 100644 index 7e76f9f423..0000000000 --- a/macosx/helpers/JavaAppLauncher/UI.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (C) 2005-2011 Fabio Riccardi */ - -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * UI.h - * - * Paul J. Lucas [paul@lightcrafts.com] - */ - -#ifndef UI_H -#define UI_H - -// standard -#import - -/** - * Show an alert dialog box with the given message in it and quit. Only the - * msg string is localized first. - */ -void LC_dieWithoutLocalizedInfo( NSString *msg, NSString *info = 0 ); - -/** - * Show an alert dialog box with the given message in it and quit. Both the - * msg and info strings are localized first. - */ -inline void LC_die( NSString *msg, NSString *info = 0 ) { - LC_dieWithoutLocalizedInfo( msg, info ? NSLocalizedString(info,nil) : nil ); -} - -#endif /* UI_H */ -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/UI.mm b/macosx/helpers/JavaAppLauncher/UI.mm deleted file mode 100644 index 7bebab6c57..0000000000 --- a/macosx/helpers/JavaAppLauncher/UI.mm +++ /dev/null @@ -1,35 +0,0 @@ -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * UI.mm - * - * Paul J. Lucas [paul@lightcrafts.com] - */ - -// standard -#import /* for exit(3) */ - -// local -#include "LC_CocoaUtils.h" -#include "UI.h" - -using namespace std; -using namespace LightCrafts; - -/** - * Show an alert dialog box with the given message in it and quit. Only the - * msg string is localized first. - */ -void LC_dieWithoutLocalizedInfo( NSString *msg, NSString *info ) { - [NSApplication sharedApplication]; - auto_obj pool; - // - // We don't use NSAlert because it's not in Mac OS X until 10.3. - // - NSRunCriticalAlertPanel( - NSLocalizedString(msg,nil), info ? info : nil, - NSLocalizedString(@"Quit",nil), nil, nil, nil - ); - ::exit( 1 ); -} - -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/main.mm b/macosx/helpers/JavaAppLauncher/main.mm deleted file mode 100644 index 2031615e80..0000000000 --- a/macosx/helpers/JavaAppLauncher/main.mm +++ /dev/null @@ -1,321 +0,0 @@ -/* - * JavaAppLauncher: a simple Java application launcher for Mac OS X. - * main.mm - * - * Paul J. Lucas [paul@lightcrafts.com] - * - * This code is based on: - * http://developer.apple.com/samplecode/simpleJavaLauncher/simpleJavaLauncher.html - */ - -/** - * Undefine to cause this application to crash immediately to test the Crash - * Reporter application. - */ -/* #define TEST_CRASH_REPORTER */ - -// standard -#import -#import -#import -#import -#import -#import /* for open(2) */ -#import -#import -#import /* for NXGetLocalArchInfo(3) */ -#import -#import -#import - -// local -#import "JavaParamBlock.h" -#import "SetJVMVersion.h" -#import "LC_CocoaUtils.h" -#import "md5.h" -#import "UI.h" - -using namespace std; -using namespace LightCrafts; - -/** - * The path relative to the application bundle of where the Crash Reporter - * application is. - */ -#define CRASH_REPORTER_PATH "/Contents/Resources/CrashReporter.app" - -/** - * The full path to where the current Mac OS X version information is. - */ -#define SYSTEM_VERSION_PLIST \ - "/System/Library/CoreServices/SystemVersion.plist" - -// -// Obfuscate function names in object code. -// -#define checkCPUType cC -#define checkJar cJ -#define checkJars cJs -#define checkOSXVersion cO -#define rot47 r - -cpu_type_t lc_cpuType; - -////////// Local functions //////////////////////////////////////////////////// - -/** - * This is a do-nothing call-back function needed to ensure the CFRunLoop - * doesn't exit right away. This call-back is called when the source has - * fired. - */ -extern "C" void doNothing( void* ) { - // do nothing -} - -/** - * Catch a signal and launch our custom Crash Reporter. - */ -extern "C" void catchSignal( int sigID ) { - NSString *const bundlePath = [[NSBundle mainBundle] bundlePath]; - NSString *const crashReporterPath = - [bundlePath stringByAppendingPathComponent:@CRASH_REPORTER_PATH]; - - [[NSWorkspace sharedWorkspace] - openFile:bundlePath withApplication:crashReporterPath - ]; - ::exit( -1 ); -} - -/** - * Check the CPU type. - */ -static void checkCPUType() { - NXArchInfo const *const arch = NXGetLocalArchInfo(); - if ( !arch ) { - // - // This should never return null (how can the info not be available?), - // but the manual page arch(3) says it's possible. So err on the side - // of allowing the application to run and hope for the best. - // - return; - } - lc_cpuType = arch->cputype; - switch ( arch->cputype ) { - case CPU_TYPE_I386: - cout << "CPU = i386" << endl; - return; - case CPU_TYPE_POWERPC: - if ( arch->cpusubtype >= CPU_SUBTYPE_POWERPC_7400 ) { - cout << "CPU = ppc" << endl; - return; - } - } - LC_die( @"Newer CPU required", @"CPU requirements" ); -} - -/** - * Check a jar to see if its hash still matches what it did at the time it was - * built. - */ -static void checkJar( char const *jarPath, char const *correctMD5 ) { - typedef unsigned char UCHAR; - typedef UCHAR const UCHARC; - - int const MD5_BUF_SIZE = 16; // MD5 encodes to 128 bits or 16 bytes - - // - // The "salt" is the secret key. First, it's broken into two big pieces - // because it's better cryptographically speaking to put a salt both before - // and after the actual data to be encrypted by MD5 since, even if you know - // what the salt is, you don't know where the "split" between the two - // pieces is. (A null separates the 2 pieces.) - // - // Second, it's broken into 4-character chunks so the output of the Unix - // "strings" command on the library shows at most the chunks and not the - // entire salt as a single string. - // - char const *const SALT[] = { - "Quid", "quid", " lat", "ine ", "dict", "um", 0, - " sit", " alt", "um v", "idit", "ur", 0 - }; - - // - // This SEASON macro is used to add salt to the MD5 data. - // Season ... salt: get it? :-) - // -# define SEASON(STR) MD5Update( &md5_ctx, (UCHARC*)(STR), ::strlen( STR ) ) - - MD5Context md5_ctx; - MD5Init( &md5_ctx ); - - char const *const *salt; - for ( salt = SALT; *salt; ++salt ) - SEASON( *salt ); - - ifstream ifs( jarPath ); - if ( !ifs ) - LC_die( @"Corrupted", @"Missing Jar" ); - char buf[ 8192 ]; - while ( !ifs.eof() ) { - ifs.read( buf, sizeof buf ); - MD5Update( &md5_ctx, (UCHARC*)buf, ifs.gcount() ); - } - - for ( ++salt; *salt; ++salt ) - SEASON( *salt ); - - UCHAR md5_buf[ MD5_BUF_SIZE ]; - MD5Final( md5_buf, &md5_ctx ); - - char md5_char_buf[ MD5_BUF_SIZE * 2 + 1 ]; - char *p = md5_char_buf; - for ( int i = 0; i < MD5_BUF_SIZE; ++i, p += 2 ) - sprintf( p, "%02x", md5_buf[i] ); - *p = '\0'; - - if ( ::strcmp( md5_char_buf, correctMD5 ) != 0 ) - LC_die( @"Corrupted", @"Bad Jar" ); -} - -/** - * ROT-47 cipher. - */ -static char* rot47( char *s, char const *s47 ) { - char *const s0 = s; - do { - char c = *s47; - if ( c >= '!' && c <= '~' ) - c = (c - '!' + 47) % 94 + '!'; - *s++ = c; - } while ( *s47++ ); - return s0; -} - -/** - * Ensure the jars haven't been altered since build-time. - */ -static void checkJars() { - auto_obj pool; - NSString const *const javaPath = - [[[NSBundle mainBundle] bundlePath] - stringByAppendingPathComponent:@"/Contents/Resources/Java"]; - - char const *const jar_md5[] = { -# include "jar_md5_include" - 0 - }; - for ( char const *const *s = jar_md5; *s; s += 2 ) { - char jar_buf[ 50 ]; - NSString const *const jarPath = - [javaPath stringByAppendingPathComponent: - [NSString stringWithUTF8String:rot47( jar_buf, s[0] )]]; - checkJar( [jarPath UTF8String], s[1] ); - } -} - -/** - * Check the Mac OS X version. - */ -static void checkOSXVersion() { - auto_obj pool; - NSDictionary *const versionDict = - [NSDictionary dictionaryWithContentsOfFile:@SYSTEM_VERSION_PLIST]; - if ( !versionDict ) - return; - NSString *const osVersion = [versionDict objectForKey:@"ProductVersion"]; - if ( !osVersion ) - return; - cout << "This is Mac OS X " << [osVersion UTF8String] << endl; - int major, minor = 0, point = 0; - ::sscanf( [osVersion UTF8String], "%d.%d.%d", &major, &minor, &point ); - switch ( minor ) { - case 0: // Cheetah - case 1: // Puma - case 2: // Jaguar - case 3: // Panther - break; - case 4: // Tiger - if ( point >= 3 ) - return; - break; - default: // Assume any future Mac OS X is OK. - return; - } - LC_die( @"Newer Mac OS X required", @"OS requirements" ); -} - -/** - * Redirect standard output and standard error to a log file. The name of the - * log file is .log. - */ -static void redirectOutput() { - auto_obj pool; - - NSString *const bundleName = - [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; - if ( !bundleName ) - LC_die( @"Corrupted", @"Missing CFBundleName" ); - - NSString const *const logFile = - [[[[NSString stringWithString:@"~/Library/Logs"] - stringByAppendingPathComponent:bundleName] - stringByAppendingString:@".log"] - stringByExpandingTildeInPath]; - - int const logFD = - ::open( [logFile UTF8String], O_WRONLY | O_CREAT | O_TRUNC, 0644 ); - if ( logFD == -1 ) { - // - // If for whatever reason we couldn't open the log file, just return - // and sacrifice logging rather than prevent the application from - // running. - // - return; - } - ::close( STDOUT_FILENO ); - ::dup( logFD ); // stdout -> log - ::close( logFD ); - ::dup2( STDOUT_FILENO, STDERR_FILENO ); // stderr -> log -} - -////////// main /////////////////////////////////////////////////////////////// - -/** - * Fire up the app. - */ -int main( int argc, char const **argv ) { - // - // Set up to catch nasty signals. - // - ::signal( SIGILL , &catchSignal ); - ::signal( SIGTRAP, &catchSignal ); - ::signal( SIGEMT , &catchSignal ); - ::signal( SIGFPE , &catchSignal ); - ::signal( SIGBUS , &catchSignal ); - ::signal( SIGSEGV, &catchSignal ); - ::signal( SIGSYS , &catchSignal ); - ::signal( SIGPIPE, SIG_IGN ); - -#ifdef TEST_CRASH_REPORTER - // - // We want to test the Crash Reporter application, so do something to make - // this application crash. Writing to memory location 0 works. - // - int *p = 0; - *p = 0; -#endif - - redirectOutput(); - -#ifdef DEBUG - ::setenv( "AEDebugSends", "1", 1 ); - ::setenv( "AEDebugReceives", "1", 1 ); -#endif - - checkCPUType(); - checkOSXVersion(); - checkJars(); - - return NSApplicationMain( argc, argv ); -} -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/md5.c b/macosx/helpers/JavaAppLauncher/md5.c deleted file mode 100644 index 0674749689..0000000000 --- a/macosx/helpers/JavaAppLauncher/md5.c +++ /dev/null @@ -1,256 +0,0 @@ -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - */ - -/* Brutally hacked by John Walker back from ANSI C to K&R (no - prototypes) to maintain the tradition that Netfone will compile - with Sun's original "cc". */ - -#include /* for memcpy() */ -#include "md5.h" - -#ifndef HIGHFIRST -#define byteReverse(buf, len) /* Nothing */ -#else -/* - * Note: this code is harmless on little-endian machines. - */ -static void byteReverse(buf, longs) - unsigned char *buf; unsigned longs; -{ - uint32_t t; - do { - t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 | - ((unsigned) buf[1] << 8 | buf[0]); - *(uint32_t *) buf = t; - buf += 4; - } while (--longs); -} -#endif - -/* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -void MD5Init(ctx) - struct MD5Context *ctx; -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bits[0] = 0; - ctx->bits[1] = 0; -} - -/* - * Update context to reflect the concatenation of another buffer full - * of bytes. - */ -void MD5Update(ctx, buf, len) - struct MD5Context *ctx; unsigned char const *buf; unsigned len; -{ - uint32_t t; - - /* Update bitcount */ - - t = ctx->bits[0]; - if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) - ctx->bits[1]++; /* Carry from low to high */ - ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - - /* Handle any leading odd-sized chunks */ - - if (t) { - unsigned char *p = (unsigned char *) ctx->in + t; - - t = 64 - t; - if (len < t) { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (uint32_t *) ctx->in); - buf += t; - len -= t; - } - /* Process data in 64-byte chunks */ - - while (len >= 64) { - memcpy(ctx->in, buf, 64); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (uint32_t *) ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - - memcpy(ctx->in, buf, len); -} - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -void MD5Final(digest, ctx) - unsigned char digest[16]; struct MD5Context *ctx; -{ - unsigned count; - unsigned char *p; - - /* Compute number of bytes mod 64 */ - count = (ctx->bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = ctx->in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset(p, 0, count); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (uint32_t *) ctx->in); - - /* Now fill the next block with 56 bytes */ - memset(ctx->in, 0, 56); - } else { - /* Pad block to 56 bytes */ - memset(p, 0, count - 8); - } - byteReverse(ctx->in, 14); - - /* Append length in bits and transform */ - ((uint32_t *) ctx->in)[14] = ctx->bits[0]; - ((uint32_t *) ctx->in)[15] = ctx->bits[1]; - - MD5Transform(ctx->buf, (uint32_t *) ctx->in); - byteReverse((unsigned char *) ctx->buf, 4); - memcpy(digest, ctx->buf, 16); - memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ -} - - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f, w, x, y, z, data, s) \ - ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -void MD5Transform(buf, in) - uint32_t buf[4]; uint32_t in[16]; -{ - register uint32_t a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/helpers/JavaAppLauncher/md5.h b/macosx/helpers/JavaAppLauncher/md5.h deleted file mode 100644 index 80f19a9bb1..0000000000 --- a/macosx/helpers/JavaAppLauncher/md5.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2005-2011 Fabio Riccardi */ - -#ifndef MD5_H -#define MD5_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* The following tests optimise behaviour on little-endian - machines, where there is no need to reverse the byte order - of 32 bit words in the MD5 computation. By default, - HIGHFIRST is defined, which indicates we're running on a - big-endian (most significant byte first) machine, on which - the byteReverse function in md5.c must be invoked. However, - byteReverse is coded in such a way that it is an identity - function when run on a little-endian machine, so calling it - on such a platform causes no harm apart from wasting time. - If the platform is known to be little-endian, we speed - things up by undefining HIGHFIRST, which defines - byteReverse as a null macro. Doing things in this manner - insures we work on new platforms regardless of their byte - order. */ - -#define HIGHFIRST - -#ifdef __i386__ -#undef HIGHFIRST -#endif - -struct MD5Context { - uint32_t buf[4]; - uint32_t bits[2]; - unsigned char in[64]; -}; - - -void MD5Init( struct MD5Context* ); -void MD5Update( struct MD5Context*, unsigned char const*, unsigned len ); -void MD5Final( unsigned char digest[16], struct MD5Context* ); -void MD5Transform( uint32_t[4], uint32_t[16] ); - -/* - * This is needed to make RSAREF happy on some MS-DOS compilers. - */ -typedef struct MD5Context MD5_CTX; - -/* Define CHECK_HARDWARE_PROPERTIES to have main.c verify - byte order and uint32_t settings. */ -#define CHECK_HARDWARE_PROPERTIES - -#ifdef __cplusplus -} -#endif - -#endif /* !MD5_H */ -/* vim:set et sw=4 ts=4: */ diff --git a/macosx/oracle.xml b/macosx/oracle.xml index 22d5130b5d..cc66cba056 100755 --- a/macosx/oracle.xml +++ b/macosx/oracle.xml @@ -114,9 +114,6 @@ - - - From b713c49c9dea1b26cd190851d44709b80b6d15bd Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Mon, 25 Jan 2021 11:14:40 +0900 Subject: [PATCH 12/13] Refactor makefiles --- lightcrafts/jnisrc/jpeg/GNUmakefile | 4 ---- lightcrafts/jnisrc/jpeg/lcjpeg.mk | 9 ++------- lightcrafts/jnisrc/lensfun/GNUmakefile | 8 +------- lightcrafts/jnisrc/tiff/GNUmakefile | 4 ---- lightcrafts/jnisrc/tiff/lctiff.mk | 9 ++------- lightcrafts/mk/platform.mk | 5 +++-- 6 files changed, 8 insertions(+), 31 deletions(-) diff --git a/lightcrafts/jnisrc/jpeg/GNUmakefile b/lightcrafts/jnisrc/jpeg/GNUmakefile index b7dc574cfb..14643d57af 100644 --- a/lightcrafts/jnisrc/jpeg/GNUmakefile +++ b/lightcrafts/jnisrc/jpeg/GNUmakefile @@ -1,7 +1,3 @@ -ROOT:= ../../.. -COMMON_DIR:= $(ROOT)/lightcrafts -include $(COMMON_DIR)/mk/platform.mk - ## # Build rules ## diff --git a/lightcrafts/jnisrc/jpeg/lcjpeg.mk b/lightcrafts/jnisrc/jpeg/lcjpeg.mk index b827e1e080..0352641d99 100644 --- a/lightcrafts/jnisrc/jpeg/lcjpeg.mk +++ b/lightcrafts/jnisrc/jpeg/lcjpeg.mk @@ -1,7 +1,3 @@ -ROOT:= ../../.. -COMMON_DIR:= $(ROOT)/lightcrafts -include $(COMMON_DIR)/mk/platform.mk - HIGH_PERFORMANCE:= 1 TARGET_BASE:= LCJPEG @@ -10,9 +6,7 @@ TARGET_BASE:= LCJPEG #DEBUG:= true JNI_EXTRA_CFLAGS:= -fexceptions -std=c++0x -JNI_EXTRA_INCLUDES:= $(shell $(PKGCFG) --cflags libjpeg) -JNI_EXTRA_LINK:= $(shell $(PKGCFG) --libs-only-l libjpeg) -JNI_EXTRA_LDFLAGS:= $(shell $(PKGCFG) --libs-only-L libjpeg) +JNI_EXTRA_PKGCFG:= libjpeg JNI_WINDOWS_LINK:= -lLCJNI JNI_LINUX_LINK:= -lLCJNI JNI_MACOSX_LINK:= ../jniutils/libLCJNI.a @@ -22,6 +16,7 @@ JNI_MACOSX_INCLUDES:= -I/usr/local/opt/jpeg-turbo/include JAVAH_CLASSES:= com.lightcrafts.image.libs.LCJPEGReader \ com.lightcrafts.image.libs.LCJPEGWriter +ROOT:= ../../.. include ../jni.mk # vim:set noet sw=8 ts=8: diff --git a/lightcrafts/jnisrc/lensfun/GNUmakefile b/lightcrafts/jnisrc/lensfun/GNUmakefile index 50b5d839fe..ee3f895e3a 100644 --- a/lightcrafts/jnisrc/lensfun/GNUmakefile +++ b/lightcrafts/jnisrc/lensfun/GNUmakefile @@ -1,15 +1,9 @@ HIGH_PERFORMANCE:= 1 -ROOT:= ../../.. -COMMON_DIR:= $(ROOT)/lightcrafts -include $(COMMON_DIR)/mk/platform.mk - TARGET_BASE:= LCLENSFUN JNI_EXTRA_CFLAGS:= -std=c++14 -JNI_EXTRA_INCLUDES:= $(shell $(PKGCFG) --cflags lensfun) -JNI_EXTRA_LINK:= $(shell $(PKGCFG) --libs-only-l lensfun) -JNI_EXTRA_LDFLAGS:= $(shell $(PKGCFG) --libs-only-L lensfun) +JNI_EXTRA_PKGCFG:= lensfun JAVAH_CLASSES:= com.lightcrafts.utils.Lensfun diff --git a/lightcrafts/jnisrc/tiff/GNUmakefile b/lightcrafts/jnisrc/tiff/GNUmakefile index f4ed5372f5..6bf0fd132c 100644 --- a/lightcrafts/jnisrc/tiff/GNUmakefile +++ b/lightcrafts/jnisrc/tiff/GNUmakefile @@ -1,7 +1,3 @@ -ROOT:= ../../.. -COMMON_DIR:= $(ROOT)/lightcrafts -include $(COMMON_DIR)/mk/platform.mk - ## # Build rules ## diff --git a/lightcrafts/jnisrc/tiff/lctiff.mk b/lightcrafts/jnisrc/tiff/lctiff.mk index 5acd829d82..ba053a0a7a 100644 --- a/lightcrafts/jnisrc/tiff/lctiff.mk +++ b/lightcrafts/jnisrc/tiff/lctiff.mk @@ -1,7 +1,3 @@ -ROOT:= ../../.. -COMMON_DIR:= $(ROOT)/lightcrafts -include $(COMMON_DIR)/mk/platform.mk - HIGH_PERFORMANCE:= 1 ifeq ($(PLATFORM),MacOSX) USE_ICC_HERE:= 1 @@ -12,9 +8,7 @@ TARGET_BASE:= LCTIFF # Uncomment to compile in debug mode. #DEBUG:= true -JNI_EXTRA_INCLUDES:= $(shell $(PKGCFG) --cflags libtiff-4) -JNI_EXTRA_LINK:= $(shell $(PKGCFG) --libs-only-l libtiff-4) -JNI_EXTRA_LDFLAGS:= $(shell $(PKGCFG) --libs-only-L libtiff-4) +JNI_EXTRA_PKGCFG:= libtiff-4 JNI_WINDOWS_LINK:= -Wl,-Bdynamic -lLCJNI -Wl,-Bstatic -lstdc++ JNI_LINUX_LINK:= -lLCJNI -lstdc++ JNI_MACOSX_LINK:= ../jniutils/libLCJNI.a @@ -27,6 +21,7 @@ JAVAH_CLASSES:= com.lightcrafts.image.libs.LCTIFFCommon \ com.lightcrafts.image.libs.LCTIFFReader \ com.lightcrafts.image.libs.LCTIFFWriter +ROOT:= ../../.. include ../jni.mk # vim:set noet sw=8 ts=8: diff --git a/lightcrafts/mk/platform.mk b/lightcrafts/mk/platform.mk index 2ea39a4fd0..ac02f38f97 100644 --- a/lightcrafts/mk/platform.mk +++ b/lightcrafts/mk/platform.mk @@ -40,7 +40,6 @@ CLASSPATH_SEP:= : # The default C and C++ compilers for Linux, FreeBSD, or OpenIndiana CC?= gcc CXX?= g++ -PKGCFG:= pkg-config # Unset USE_ICC_HERE if the overall USE_ICC flags != 1. ifneq ($(USE_ICC),1) @@ -79,7 +78,7 @@ ifeq ($(PLATFORM),MacOSX) else BREW_DIR?= /usr/local endif - PKG_CONFIG_PATH?= $(BREW_DIR)/lib/pkgconf + PKGCFG:= $(BREW_DIR)/bin/pkg-config LIBOMP_PATH?= $(shell $(BREW_DIR)/bin/brew --prefix libomp) PLATFORM_INCLUDES+= -I$(LIBOMP_PATH)/include PLATFORM_LDFLAGS+= -L$(LIBOMP_PATH)/lib @@ -278,6 +277,8 @@ ifeq ($(PLATFORM),$(filter $(PLATFORM),Linux FreeBSD SunOS)) DYLIB_PREFIX:= $(JNILIB_PREFIX) DYLIB_EXT:= $(JNILIB_EXT) + PKGCFG:= pkg-config + ifeq ($(PLATFORM),Linux) JAVA_INCLUDES:= -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux NUM_PROCESSORS:= $(shell grep '^processor' /proc/cpuinfo | wc -l) From 10a15d7ae32a7c1f94596731384faf52ade1a5d8 Mon Sep 17 00:00:00 2001 From: Masahiro Kitagawa Date: Mon, 25 Jan 2021 22:43:12 +0900 Subject: [PATCH 13/13] Update .appveyor.yml --- .appveyor.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 0f5a7740c1..726076eb78 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,8 +1,8 @@ version: 4.2.2.{build}-{branch} image: +- macos - Visual Studio 2019 -- macos-mojave - Ubuntu2004 clone_depth: 1 @@ -42,7 +42,7 @@ for: - cmd: bash -lc "MINGW_DIR=/c/$MINGW64_PATH ant -f $ANT_SCRIPT build-installer" - cmd: bash -lc "ant -f $ANT_SCRIPT clean-native" - cmd: bash -lc "TARGET_ARCH=i686 MINGW_DIR=/c/$MINGW32_PATH ant -f $ANT_SCRIPT -Doffline=true build-installer" - + artifacts: - path: 'windows/LightZone_Installer_*.exe' name: windows installer @@ -50,7 +50,7 @@ for: - matrix: only: - - image: macos-mojave + - image: macos init: - sh: export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home @@ -81,4 +81,3 @@ for: build_script: - sh: ant -f linux/build.xml -Doffline=true -