diff --git a/.github/labeler.yml b/.github/labeler.yml index 2120719f4f3..8a9a307d29f 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -96,7 +96,7 @@ Windows: macOS: - changed-files: - any-glob-to-any-file: - - macosx/** + - macos/** Linux: - changed-files: - any-glob-to-any-file: diff --git a/.gitignore b/.gitignore index 49317acf642..192fad55de8 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ config.status* error.log grass.pc autom4te.cache/ +macos/cache/* # ignore specific file generated during make gui/wxpython/menustrings.py diff --git a/macos/Makefile b/macos/Makefile deleted file mode 100644 index 059a04f8b42..00000000000 --- a/macos/Makefile +++ /dev/null @@ -1,125 +0,0 @@ -MODULE_TOPDIR = .. - -include $(MODULE_TOPDIR)/include/Make/Vars.make - -SUBDIRS = -ifeq ($(MACOSX_APP),1) -SUBDIRS = app -endif - -include $(MODULE_TOPDIR)/include/Make/Dir.make - -MACOSX_APP_NAME = GRASS-${GRASS_VERSION_MAJOR}.${GRASS_VERSION_MINOR}.app -MACOSX_APPDIR = ${MACOSX_APP_NAME}/Contents/MacOS -INST_DIR_MACOSX = ${prefix}/${MACOSX_APPDIR} -MACOSX_SUPPDIR = /Library/GRASS/${GRASS_VERSION_MAJOR}.${GRASS_VERSION_MINOR} -MACOSX_BUNDLE_PREFIX = ${GRASS_HOME}/macosx/dist/${MACOSX_APPDIR} -VER_MINOR_REL = `printf "%d0%d" ${GRASS_VERSION_MINOR} ${GRASS_VERSION_RELEASE}` -VER_DATE = `date +"%g%m%d"` -MAKE_DIR_CMD = mkdir -p -m 755 -LN = /bin/ln -sf -LN_DIR = /bin/ln -sfh -# get python version - use python in path, should be config'd python -PYVER = `python -V 2>&1 | cut -d \ -f 2 | cut -d . -f 1,2` - -# packagemaker location, options and behaviour changed in xcode 3 -ifeq ($(findstring darwin8,$(ARCH)),darwin8) -XCODE_VER = xcode2 -PACKAGEMAKER = /Developer/Tools/packagemaker -PKG_INST_DIR = ${prefix}/${MACOSX_APP_NAME} -else -XCODE_VER = xcode3 -PACKAGEMAKER = /Developer/usr/bin/packagemaker -PKG_INST_DIR = ${prefix} -endif - -default: subdirs - -include bundle.make - -# Duplicated, mostly, from the top-level makefile. - -install-macosx: INST_DIR_TARGET = ${INST_DIR} -install-macosx: PREFIX_TARGET = ${prefix} -install-macosx: install-macosxapp install-basic-macosx macosx-support-dir bundle-macosx - echo ${ARCH_DISTDIR}/${MACOSX_APP_NAME} - -# create a packagemaker installer package. -# pretty much the same as install, but needs intermediate install location -# to assemble package parts. - -bindist-macosx: INST_DIR_TARGET = ${MACOSX_BUNDLE_PREFIX} -bindist-macosx: PREFIX_TARGET = ${GRASS_HOME}/macosx/dist -bindist-macosx: install-macosxapp install-basic-macosx bundle-macosx - @# installer pkg resources - ${MAKE_DIR_CMD} dist/resources - -sed -e "s#@INST_DIR@#${INST_DIR}#g" \ - -e "s#@MACOSX_SUPPDIR@#${MACOSX_SUPPDIR}#g" \ - -e "s#@GRASS_VER@#${GRASS_VERSION_MAJOR}.${GRASS_VERSION_MINOR}#g" \ - -e "s#@PYVER@#${PYVER}#g" \ - pkg/resources/postflight.in > dist/resources/postflight - -chmod a+rx dist/resources/postflight - -sed -e "s#@GRASS_VER@#${GRASS_VERSION_MAJOR}.${GRASS_VERSION_MINOR}#g" \ - pkg/resources/Description.plist.in > dist/Description.plist - -sed -e "s#@GRASS_VERSION_MAJOR@#${GRASS_VERSION_MAJOR}#g" \ - -e "s#@GRASS_VERSION_MINOR@#${GRASS_VERSION_MINOR}#g" \ - -e "s#@GRASS_VERSION_RELEASE@#${GRASS_VERSION_RELEASE}#g" \ - -e "s#@VER_MINOR_REL@#${VER_MINOR_REL}#g" \ - -e "s#@VER_DATE@#${VER_DATE}#g" \ - -e "s#@PKG_INST_DIR@#${PKG_INST_DIR}#g" \ - pkg/resources/Info.plist.in > dist/Info.plist - -${INSTALL_DATA} pkg/resources/License.rtf dist/resources - -${INSTALL_DATA} pkg/resources/ReadMe.rtf dist/resources - @# build the package -ifeq ($(XCODE_VER),xcode3) - ${PACKAGEMAKER} --target 10.4 --root-volume-only --id org.osgeo.grass --root dist/${MACOSX_APP_NAME} --info dist/Info.plist --out "GRASS-${GRASS_VERSION_MAJOR}.${GRASS_VERSION_MINOR}.pkg" --resources dist/resources - rm -f "GRASS-${GRASS_VERSION_MAJOR}.${GRASS_VERSION_MINOR}.pkg/Contents/Resources/TokenDefinitions.plist" -else - ${PACKAGEMAKER} -build -ds -p "GRASS-${GRASS_VERSION_MAJOR}.${GRASS_VERSION_MINOR}.pkg" -f dist/${MACOSX_APP_NAME} -r dist/resources -i dist/Info.plist -d dist/Description.plist -endif - -install-macosxapp: - -$(MAKE_DIR_CMD) ${INST_DIR_TARGET}/bin - -$(MAKE_DIR_CMD) ${INST_DIR_TARGET}/etc - -$(MAKE_DIR_CMD) ${PREFIX_TARGET}/${MACOSX_APP_NAME}/Contents/Resources/Scripts - -$(MAKE_DIR_CMD) ${PREFIX_TARGET}/${MACOSX_APP_NAME}/Contents/Resources/English.lproj/MainMenu.nib - $(INSTALL) app/build_html_user_index.sh ${INST_DIR_TARGET}/etc - $(INSTALL) app/build_gui_user_menu.sh ${INST_DIR_TARGET}/etc - $(INSTALL) app/python_wrapper ${INST_DIR_TARGET}/bin/python - $(INSTALL_DATA) app/AppIcon.icns ${PREFIX_TARGET}/${MACOSX_APP_NAME}/Contents/Resources - $(INSTALL_DATA) app/GRASSDocument_gxw.icns ${PREFIX_TARGET}/${MACOSX_APP_NAME}/Contents/Resources - $(INSTALL_DATA) app/${OBJDIR}/Info.plist ${PREFIX_TARGET}/${MACOSX_APP_NAME}/Contents - $(INSTALL_DATA) app/PkgInfo ${PREFIX_TARGET}/${MACOSX_APP_NAME}/Contents - $(INSTALL) app/${OBJDIR}/GRASS.scpt ${PREFIX_TARGET}/${MACOSX_APP_NAME}/Contents/Resources/Scripts/ - $(INSTALL) app/${OBJDIR}/grass.sh ${INST_DIR_TARGET} - $(INSTALL) app/${OBJDIR}/GRASS ${INST_DIR_TARGET} - $(INSTALL_DATA) app/English.lproj/MainMenu.nib/* ${PREFIX_TARGET}/${MACOSX_APP_NAME}/Contents/Resources/English.lproj/MainMenu.nib - -install-basic-macosx: - -tar cBCf $(GISBASE) - . | tar xBCf $(INST_DIR_TARGET) - 2>/dev/null - -sed -e 's#'$(GISBASE)'#'$(INST_DIR)'#g' \ - ${GISBASE}/etc/fontcap > ${INST_DIR_TARGET}/etc/fontcap - -sed -e 's#'$(GISBASE)'#'$(INST_DIR)'#g' \ - ${GISBASE}/demolocation/.grassrc$(GRASS_VERSION_MAJOR)$(GRASS_VERSION_MINOR) > ${INST_DIR_TARGET}/demolocation/.grassrc$(GRASS_VERSION_MAJOR)$(GRASS_VERSION_MINOR) - sed -e 's#^\(GRASS_HOME.[^=]*\).*#\1= $(INST_DIR)#g' \ - -e 's#$(GISBASE)#$(INST_DIR)#g' \ - -e "s#-isysroot /.*MacOSX.*\.sdk##g" \ - ${GISBASE}/include/Make/Platform.make > ${INST_DIR_TARGET}/include/Make/Platform.make - sed -e 's#^\(ARCH_DISTDIR.[^=]*\).*#\1= $(INST_DIR)#g' \ - -e 's#^\(ARCH_BINDIR.[^=]*\).*#\1= $(UNIX_BIN)#g' \ - ${GISBASE}/include/Make/Grass.make > ${INST_DIR_TARGET}/include/Make/Grass.make - -sed -e 's#'@GISBASE@'#'$(INST_DIR)'#g' \ - -e 's#'@LD_LIBRARY_PATH_VAR@'#'$(LD_LIBRARY_PATH_VAR)'#g' \ - -e 's#'@CONFIG_PROJSHARE@'#'$(PROJSHARE)'#g' \ - $(ARCH_DISTDIR)/$(GRASS_NAME).tmp > $(INST_DIR_TARGET)/$(GRASS_NAME) - -chmod a+x $(INST_DIR_TARGET)/$(GRASS_NAME) - -rm -f $(INST_DIR_TARGET)/$(GRASS_NAME).tmp - -chmod -R a+rX ${PREFIX_TARGET}/${MACOSX_APP_NAME} 2>/dev/null - -touch ${PREFIX_TARGET}/${MACOSX_APP_NAME} - -macosx-support-dir: - ${MAKE_DIR_CMD} "${MACOSX_SUPPDIR}" - ${MAKE_DIR_CMD} "${MACOSX_SUPPDIR}/Modules/bin" - ${MAKE_DIR_CMD} "${MACOSX_SUPPDIR}/Modules/docs/html" - ${MAKE_DIR_CMD} "${MACOSX_SUPPDIR}/Modules/etc" - ${MAKE_DIR_CMD} "${MACOSX_SUPPDIR}/Modules/lib" diff --git a/macos/ReadMe.md b/macos/ReadMe.md index 2e9e05e4620..b7a1a853e99 100644 --- a/macos/ReadMe.md +++ b/macos/ReadMe.md @@ -1,703 +1,148 @@ -# GRASS GIS Mac OS X Build +# Build GRASS GIS with Anaconda -(and other Mac notes) +This is a script package for automated build of GRASS GIS as a macOS +application bundle (GRASS-x.x.app). -## Table of Contents +The building script `build_grass_app.bash` will do all the steps – creating App +bundle, installing Conda dependencies (using the package manager Miniforge), +to patching, compiling and installing GRASS GIS – to end up with an +installed GRASS.app in `/Applications`. It can also create a compressed dmg +file if so wished. -| :exclamation: Instructions below are not up-to-date. Update in progress. | -|---------------------------------------------------------------------------| +Usage: -- Quickstart -- About -- Building GRASS - - Optimization - - Configure Example - - Leopard Notes - - Building an Installer Package - - Bundling Libraries and Programs -- Developer Notes -- Help Files -- Addon Modules -- Dependency Build Notes - - Universal Aqua Tcl/Tk - - Universal GPSBabel - - Universal NetPBM - - Universal FFMPEG +```text +./build_grass_app.bash [arguments] -## Quickstart +Arguments: + -s + --sdk [path] MacOS SDK - full path, spaces in path not allowed. + -t + --target [target] Set deployment target version (MACOSX_DEPLOYMENT_TARGET), + e.g. "10.14", optional, default is set from SDK. + -o + --dmg-out-dir [path] Output directory path for DMG file creation + This is a requirement for creating .dmg files. + -c + --conda-file [path] Conda package requirement file, optional. + --with-liblas Include libLAS support, optional, default is no support. + -u + --update-conda-stable Update the stable explicit conda requirement file. This + is only allowed if conda-requirements-dev-[arm64|x86_64].txt + is used (with --conda-file), to keep the two files in sync. + -r + --repackage Recreate dmg file from previously built app, + setting [-o | --dmg-out-dir] is a requirement. + --notarize Code sign and notarize app and dmg for distribution + Setting Apple developer ID, keychain profile, and + provisionprofile is a prerequisite. + -h + --help Usage information. -To build a Mac OS X application, add this to your configure options: - -`--prefix=/Applications --enable-macosx-app` - -## About - -This builds GRASS as a Mac OS X application, more or less. - -The startup wrapper is a simple AppleScript that fires up a custom -grass.sh (instead of the standard grass6x) and quits, leaving grass.sh -running in a new Terminal window. The custom grass.sh takes care of some -default and required environment settings (so the user doesn't have to -fiddle with .bash_profile), makes sure X11 in running, then starts -init.sh. - -## Building GRASS - -Building GRASS as a Mac OS X application is pretty much the same as for -a unix build (see the [INSTALL.md](../INSTALL.md) document for details). For an -application, just add this option to configure: - -`--enable-macosx-app` - -With this option, the `--prefix` specified is the path where GRASS.app -will be installed. The default GRASS prefix is `/usr/local`, but for a Mac -OS X application it should be `/Applications`. It is not possible to have -alternative default prefixes in configure, so you must set -`--prefix=/Applications` yourself for configure. - -The makefile tries to figure out the location of the GDAL programs, from -the configured GDAL libs. This is set in grass.sh, and if it doesn't -correctly figure it out (some GRASS commands fail to find needed GDAL -commands), set `GDAL_BIN` before running make: - -`export GDAL_BIN=[/path/to/gdal/bin]` - -### Universal Build - -The GRASS build system is very friendly to a Universal build (unlike -libtool-based builds). *This applies to a standard unix build as well as -the app build.* First, a couple things to check: - -**• The Universal SDK**. *This is only needed when building on OSX 10.4 -PPC - the Intel system is all Universal, and so is 10.5 for both -architectures (though you may still want to use an SDK).* Using the SDK -forces GCC to use an alternate root for everything, so if a dependency -is not in the SDK (/usr/local is NOT in the SDK), you will get -configure, compile and link errors about missing stuff. To fix this, -create symlinks in the SDK to where you have your extra dependencies. -The SDKs in Leopard are mostly taken care of. - -For example, /usr/local: - -```sh -sudo ln -s /usr/local /Developer/SDKs/MacOSX10.4u.sdk/usr/local ``` -For Leopard, there may be problems locating bin programs. Add the -following: +## Requirements -```sh -sudo ln -s /usr/local/bin /Developer/SDKs/MacOSX10.4u.sdk/usr/local/bin -sudo ln -s /usr/local/bin /Developer/SDKs/MacOSX10.5.sdk/usr/local/bin -``` +- Apple's Command Line Tools -If there are subfolders involved that are not already in the SDK, add -them first. Say you have some libraries in /Users/Shared/unix (I put my -static libraries there): +You need to install Apple's Command Line Tools (CLT), with or without Xcode. +Installing CLT is possible with following terminal command: ```sh -sudo mkdir -p /Developer/SDKs/MacOSX10.4u.sdk/Users/Shared -ln -s /Users/Shared/unix /Developer/SDKs/MacOSX10.4u.sdk/Users/Shared/unix +xcode-select --install ``` -For /Library/Frameworks: - -```sh -sudo mkdir -p /Developer/SDKs/MacOSX10.4u.sdk/Library -sudo ln -s /Library/Frameworks \ -/Developer/SDKs/MacOSX10.4u.sdk/Library/Frameworks -``` +Xcode is available for download at Apple's App Store. -**• Universal Dependencies**. Make sure all your extra dependencies are -Universal. +CLT will typically install SDKs in `/Library/Developer/CommandLineTools/SDKs/`, +while finding Xcode's default SDK can be achieved with e.g. +`xcrun --show-sdk-path`. (See `man xcrun` for more functions.) -**• Tiger+**. This will NOT work on anything less than OSX 10.4. +**Note**: Compiling GRASS (C/C++ based) addon extensions with the resulting +GRASS.app requires CLT installation too. -If those check OK, here's what to do. Simply add the universal flags to -all compile and link commands. This is done by setting CFLAGS, CXXFLAGS -and LDFLAGS before configuring the build. The basic flags are: - -`-arch ppc -arch i386` - -If you are building on OSX 10.4 PPC only, also add this: - -`-isysroot /Developer/SDKs/MacOSX10.4u.sdk` - -Put it all together, for an Intel Mac on OSX 10.4 or any Mac on 10.5+: - -```sh -export CFLAGS="-arch ppc -arch i386" -export CXXFLAGS="-arch ppc -arch i386" -export LDFLAGS="-arch ppc -arch i386" -``` - -Or for OSX 10.4 PPC: +## Instructions ```sh -export SDKROOT=/Developer/SDKs/MacOSX10.4u.sdk -export CFLAGS="-arch ppc -arch i386 -isysroot $SDKROOT" -export CXXFLAGS="-arch ppc -arch i386 -isysroot $SDKROOT" -export LDFLAGS="-arch ppc -arch i386 -isysroot $SDKROOT" -``` - -For OSX 10.5, you can also build for 64bit (all processors except the -first Intel Core Duo), just add: - -`-arch ppc64 -arch x86_64` - -### Optimization - -By default, GRASS configures with debugging symbols turned on (the -"-g" flag), and level 2 optimization ("-O2"). If you don't want -debugging on (it greatly increases the binary size) or want to use a -different optimization, just add an optimization flag to the above -CFLAGS and CXXFLAGS exports. Specifying an optimization disables -debugging. Some common optimizations are (see the gcc man page for -complete details): - -- `-O2` most optimizations, a common default -- `-O3` high -- `-Os` optimize for speed, also keep the binary size small (the Apple standard) - -If you want debugging with a different optimization flag, use one of the above -optimization flags plus "-g". - -Remember to separate all flags with spaces. - -### Configure Example - -As an example, to build GRASS using my frameworks and Tcl/Tk as built in -the build notes below, this should work *(for a standard unix build, -just remove the `--prefix` and `--enable-macosx-app` flags)*: - -```bash -./configure \ - --enable-macosx-app \ - --prefix=/Applications \ - --with-cxx \ - --with-fftw-includes=/Library/Frameworks/FFTW3.framework/unix/include \ - --with-fftw-libs=/Library/Frameworks/FFTW3.framework/unix/lib \ - --with-freetype \ - --with-freetype-includes= \ - "/Library/Frameworks/FreeType.framework/unix/include/freetype2 \ - /Library/Frameworks/FreeType.framework/unix/include" \ - --with-freetype-libs=/Library/Frameworks/FreeType.framework/unix/lib \ - --with-gdal=/Library/Frameworks/GDAL.framework/Programs/gdal-config \ - --with-geos=/Library/Frameworks/GEOS.framework/Programs/geos-config \ - --with-jpeg-includes=/Library/Frameworks/UnixImageIO.framework/unix/include \ - --with-jpeg-libs=/Library/Frameworks/UnixImageIO.framework/unix/lib \ - --with-odbc \ - --with-opengl=aqua \ - --with-png-includes=/Library/Frameworks/UnixImageIO.framework/unix/include \ - --with-png-libs=/Library/Frameworks/UnixImageIO.framework/unix/lib \ - --with-proj \ - --with-proj-includes=/Library/Frameworks/PROJ.framework/unix/include \ - --with-proj-libs=/Library/Frameworks/PROJ.framework/unix/lib \ - --with-proj-share=/Library/Frameworks/PROJ.framework/Resources/proj \ - --with-sqlite \ - --with-sqlite-includes=/Library/Frameworks/SQLite3.framework/unix/include \ - --with-sqlite-libs=/Library/Frameworks/SQLite3.framework/unix/lib \ - --with-tcltk-includes="/Library/Frameworks/Tcl.framework/Headers \ - /Library/Frameworks/Tk.framework/Headers \ - /Library/Frameworks/Tk.framework/PrivateHeaders" \ - --with-tcltk-libs=/usr/local/lib \ - --with-tiff-includes=/Library/Frameworks/UnixImageIO.framework/unix/include \ - --with-tiff-libs=/Library/Frameworks/UnixImageIO.framework/unix/lib \ - --with-x \ - --without-glw \ - --without-motif \ - --without-mysql \ - --without-postgres \ - --without-readline -``` - -That's a long line, but you have to be very explicit in the GRASS configure -(and yes, the UnixImageIO framework is used multiple times). - -If you don't have the PROJ framework programs folder in your shell -PATH, it will fail to find nad2bin. To correct this set NAD2BIN before -running configure: - -`export NAD2BIN=/Library/Frameworks/PROJ.framework/Programs/nad2bin` - -Sometimes, for mysterious reasons so far, the automatic check for X11 -fails. Depending on various conditions, you may immediately notice this -because configure stops. If X11 isn't found automatically, add this to -the configure line *(this applies to both the unix build and app -build)*: +cd [grass-source-dir] -`--x-includes=/usr/X11R6/include --x-libraries=/usr/X11R6/lib` - -To install the new Python GUI (see [REQUIREMENTS.md](../REQUIREMENTS.md) -and [gui/wxpython/README](../gui/wxpython/README), wxpython installer -available at [wxpython.org](https://wxpython.org/)), add this to configure (fill -in the correct version at x.x.x.x for the wxpython you have installed): - -```bash ---with-python ---with-wxwidgets=/usr/local/lib/wxPython-unicode-x.x.x.x/bin/wx-config +./macos/build_grass_app.bash ``` -Note: as of wxpython 2.8.8.0 you can use an external wxpython with the -system Python on Leopard. - -If you want ffmpeg support (see build instructions below), add this: - -```bash ---with-ffmpeg \ ---with-ffmpeg-includes="/usr/local/include \ - /usr/local/include/libavcodec /usr/local/include/libavdevice \ - /usr/local/include/libavformat /usr/local/include/libavutil \ - /usr/local/include/libswscale" \ ---with-ffmpeg-libs=/usr/local/lib -``` - -For cairo support (see build -instructions at -[kyngchaos.com](https://web.archive.org/web/20161112052733/http://www.kyngchaos.com/macosx/build/cairo/)), -add this: - -```bash ---with-cairo \ ---with-cairo-includes=/usr/local/include/cairo \ ---with-cairo-libs=/usr/local/lib \ ---with-cairo-ldflags=-lcairo -``` - -### Leopard Notes - -• Linker Problem - -The linker in Leopard's GCC from Xcode 3.0 has a bit of a problem with -some libraries, notably X11's libGL. When trying to link libGL (for -example), it spits back an error: - -`ld: cycle in dylib re-exports with /usr/X11/lib/libGL.dylib for -architecture i386` - -Xcode 3.1 does not have this problem. In other words, make sure to -install the latest Xcode. - -### Building an Installer Package - -After running make, make bindist will assemble an installer package. -This will have the name "GRASS-[version].pkg" and will be found in -the macosx folder in the GRASS source. On Tiger, there **will be** some -**non-fatal errors** - *this is normal* and the installer package is -still generated correctly. - -The installer takes care of binary installation, and creating the -/Library/GRASS support folder and Help Viewer link. - -This installer currently does NOT do any verification of installed -dependencies or system version. - -### Bundling Libraries and Programs - -Additional dependent libraries and programs can be bundled with the -application package to make a more portable and easily installed GRASS -application. See `macosx/pkg/bundle.make` for details. - -GRASS uses `DYLD_LIBRARY_PATH`, which is set to the application's lib -folder, so it will find any libraries that are there that are not found -in their expected locations. It also adds the application bin folder to -the `PATH`, so helper programs installed there will be found. - -There is NO need to bundle *everything*. Bundling readily available libraries -and programs installed in standard locations is not necessary. Some things -you might want to bundle include: - -- GPSBabel (CLI) -- NetPBM programs (just what is used in GRASS) -- other support CLI programs for script modules -- ffmpeg libraries -- Postgres library (libpq) - -Things to leave out: - -- applications that duplicate the above items (ie GPSBabel.app) -- /Library/Frameworks stuff - -## Developer Notes - -The applescript startup and grass.sh can be customized if desired, ie -for a more complex startup that might give the user a dialog for startup -options. They just provide the basic core to build upon. - -## Help Files - -Help files are linked into the OSX help system. Independent of what -browser you choose to open help files (`GRASS_HTML_BROWSER`), you can -open Help Viewer from almost any application's Help menu (it's best to -use Mac Help from the Finder Help menu), and GRASS Help will be -available in the Library menu. - -Since they are linked to the help system, if GRASS.app is moved or -renamed, the link will be broken. This may change in the future. - -## Addon Modules - -modbuild deprecated (not installed now). Makefile changes in progress to -allow compiling external modules. - -## Dependency Build Notes - -They apply to any OSX build, not just an application package build: - -### Universal Aqua Tcl/Tk - -The simplest way to install Tcl/Tk Aqua is to download -[ActiveTcl](https://www.activestate.com/products/tcl/) from -ActiveState. This will give you a universal 32bit Tcl/Tk Aqua (64bit is -currently not possible). Make sure to run the *convenience* commands -below. - -To make it easier to configure for GRASS (and other software), run these -commands in a Terminal: +There is one required variable: full path to MacOS SDK. By default +this is attempted to be set by `xcrun --show-sdk-path`. Alternatively, +it can be set either through editing the +`$HOME/.config/grass/configure-build-[arm64|x86_64].sh` file, +or by giving it as argument to the main script: `./build_grass_app.bash`. ```sh -sudo ln -sf /Library/Frameworks/Tcl.framework/Versions/8.5/Tcl \ - /usr/local/lib/libtcl.dylib -sudo ln -sf /Library/Frameworks/Tcl.framework/Versions/8.5/Tcl \ - /usr/local/lib/libtcl8.5.dylib -sudo ln -sf \ - /Library/Frameworks/Tcl.framework/Versions/8.5/libtclstub8.5.a \ - /usr/local/lib/libtclstub8.5.a -sudo ln -sf /Library/Frameworks/Tk.framework/Versions/8.5/Tk \ - /usr/local/lib/libtk.dylib -sudo ln -sf /Library/Frameworks/Tk.framework/Versions/8.5/Tk \ - /usr/local/lib/libtk8.5.dylib -sudo ln -sf /Library/Frameworks/Tk.framework/Versions/8.5/libtkstub8.5.a \ - /usr/local/lib/libtkstub8.5.a +./macos/build_grass_app.bash \ + --sdk /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk ``` -### Universal GPSBabel - -A universal GPSBabel CLI executable is now included in the OSX binary -from [www.gpsbabel.org](https://www.gpsbabel.org/). This does not need to -be 64bit. - -### Universal NetPBM - -NetPBM is not too hard to build, it's just weird. These instructions -use my UnixImageIO framework for the tiff, jpeg, png and jasper -libraries. - -First, grab the [NetPBM](http://netpbm.sourceforge.net/) source and -unzip it. Now it gets strange - it's an interactive configuration, and -the various stages don't communicate with each other. Cd to the source -folder in a Terminal and: - -`./configure` ↵ - -`Platform [darwin] ==>` ↵ - -`Netpbm shared library directory [default] ==>` **`/usr/local`** - -choose where you will install it -default is NOT /usr/local or any location at all, so you MUST set this - -`regular or merge [regular] ==>` ↵ +Argument given to `./build_grass_app.bash` will override settings in +`configure-build-[arm64|x86_64].sh`. You can also do +`./build_grass_app.bash --help` for info on possible configurations. -`static or shared [shared] ==>` ↵ +Required settings: -could use static, since GRASS only needs a few of the progs +- SDK full path to the SDK that will be set to -isysroot (path may **not** + contain spaces) -`'#include' argument or NONE [] ==>` ↵ - -`What is your JPEG (graphics format) library?` -`library filename or 'none' [libjpeg.so] ==>` - **`/Library/Frameworks/UnixImageIO.framework/unix/lib/libjpeg.dylib`** - -`JPEG header directory [default] ==>` -**`/Library/Frameworks/UnixImageIO.framework/Headers`** - -`What is your TIFF (graphics format) library?` -`library filename or 'none' [libtiff.so] ==>` - **`/Library/Frameworks/UnixImageIO.framework/unix/lib/libtiff.dylib`** - -`TIFF header directory [default] ==>` - **`/Library/Frameworks/UnixImageIO.framework/Headers`** - -`What is your PNG (graphics format) library?` -`library filename or 'none' [libpng.so] ==>` - **`/Library/Frameworks/UnixImageIO.framework/unix/lib/libpng.dylib`** - -`PNG header directory [default] ==>` - **`/Library/Frameworks/UnixImageIO.framework/Headers`** - -`What is your Z (compression) library?` -`library filename or 'none' [libz.so] ==>` **`-lz`** - -`Z header directory [default] ==>` ↵ - -`Documentation URL [http://netpbm.sourceforge.net/doc/] ==>` ↵ - -ignore warning about libz - -```sh -echo "JASPERLIB = \ - /Library/Frameworks/UnixImageIO.framework/unix/lib/libjasper.dylib" \ - >> Makefile.config -echo "JASPERHDR_DIR = /Library/Frameworks/UnixImageIO.framework/Headers" \ - >> Makefile.config -``` - -For Tiger: - -```sh -echo "CC = /usr/bin/gcc -arch ppc -arch i386 \ - -isysroot /Developer/SDKs/MacOSX10.4u.sdk" \ - >> Makefile.config -``` - -For Leopard: - -```sh -echo "CC = /usr/bin/gcc -arch ppc -arch i386 -arch ppc64 -arch x86\_64" \ - >> Makefile.config -``` - -```sh -make -make package pkgdir=/path/to/some/temp/dir -``` - -it will create the folder and copy all binaries there - -`sudo ./installnetpbm` - -then answer some more questions: - -`Where is the install package you created with 'make package'?` -`package directory (/tmp/netpbm) ==>` **`/path/to/some/temp/dir`** - -same location as specified in the make package step (lack of - inter-communication!) - -`install prefix (/usr/local/netpbm) ==>` **`/usr/local`** - -same location used for the Netpbm shared library directory (again, -lack of inter-communication!) -(it may ask you if you want to create the dir) - -It'll ask for subfolders for bin, lib, data, headers, man - -For data, type: **`/usr/local/share/netpbm`** - -For man, type: **`/usr/local/share/man`** - -For the rest, use the defaults - -don't create the manweb.conf file - -And that's it. - -### Universal FFMPEG - -version: [0.5](http://www.ffmpeg.org/download.html) - -FFMPEG is constantly changing, and release versions are rare. For -simplicity use the 0.5 release version. If you know anything about SVN -you can try for a more up-to-date FFMPEG. Some options used below are -not in more recent SVN versions, so if configure complains about an -invalid option, just remove it. - -This will build a basic FFMPEG as dynamic libraries for use with GRASS. -The default static libraries don't work now because of reloc errors and -the need for extra link flags. No extra formats are included, such as -mp3lame and xvid. None of the ffmpeg programs are included either (GRASS -doesn't need them). - -It's a multi-step build, 1 for each architecture. Create a folder -inside the source for each arch: - -```sh -mkdir build-i386 -mkdir build-ppc -``` - -and also for Leopard: - -```sh -mkdir build-x86_64 -mkdir build-ppc64 -``` - -For i386 and ppc arches, if building on Tiger, you must add the -following to extra-cflags and extra-ldflags in the configure command: - -`-isysroot /Developer/SDKs/MacOSX10.4u.sdk` - -For i386: - -```sh -cd build-i386 -../configure \ - --arch=i386 \ - --disable-amd3dnow \ - --disable-debug \ - --disable-ffmpeg \ - --disable-ffplay \ - --disable-ffserver \ - --disable-network \ - --disable-static \ - --disable-vhook \ - --enable-gpl \ - --enable-pthreads \ - --enable-shared \ - --enable-swscale \ - --extra-cflags="-arch i386" \ - --extra-ldflags="-arch i386" -``` - -If you are building *on* a PPC Mac, you need to add the flag -"`--enable-cross-compile`" to the above configure command. - -```sh -make -sudo make install -``` - -Install at this point installs everything. We don't care about the -installed libraries yet, we just need the headers there. - -Now, the PPC build: - -```sh -cd ../build-ppc -../configure \ - --arch=ppc \ - --disable-debug \ - --disable-ffmpeg \ - --disable-ffplay \ - --disable-ffserver \ - --disable-network \ - --disable-static \ - --disable-vhook \ - --enable-altivec \ - --enable-gpl \ - --enable-pthreads \ - --enable-shared \ - --enable-swscale \ - --extra-cflags="-arch ppc" \ - --extra-ldflags="-arch ppc" -make -``` - -Don't install this one, there is no need. - -If you are building for Leopard, also do the 64bit varieties, otherwise -skip to the lipo step below. - -For x86_64: +Example by executing with arguments: ```sh -cd build-x86_64 -../configure \ - --arch=x86_64 \ - --disable-amd3dnow \ - --disable-debug \ - --disable-ffmpeg \ - --disable-ffplay \ - --disable-ffserver \ - --disable-network \ - --disable-static \ - --disable-vhook \ - --enable-gpl \ - --enable-pthreads \ - --enable-shared \ - --enable-swscale \ - --extra-cflags="-arch x86\_64" \ - --extra-ldflags="-arch x86_64" +./macos/build_grass_app.bash \ + --sdk /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk \ + --target 10.14 ``` -Again, if you are building *on* a PPC Mac, you need to add the flag -"`--enable-cross-compile`" to the above configure command. - -`make` - -And ppc64: +Example of building and creating dmg by executing with arguments: ```sh -cd ../build-ppc64 -../configure \ - --arch=ppc64 \ - --disable-debug \ - --disable-ffmpeg \ - --disable-ffplay \ - --disable-ffserver \ - --disable-network \ - --disable-static \ - --disable-vhook \ - --enable-altivec \ - --enable-gpl \ - --enable-pthreads \ - --enable-shared \ - --enable-swscale \ - --extra-cflags="-arch ppc64" \ - --extra-ldflags="-arch ppc64" +./macos/build_grass_app.bash \ + --sdk /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk \ + --conda-file ./Desktop/requirement.txt \ + --dmg-out-dir ~/Desktop ``` -Here, if you are building *on* an Intel Mac, you need to add the flag -"`--enable-cross-compile`" to the above configure command. Also, it -will fail to completely identify it as 64bit, so you need to fix 2 -files. - -In **config.h**, find the `HAVE_PPC64` define and set it to 1: +## Build Target Architecture -`#define HAVE_PPC64 1` +Building GRASS on a x86_64 (Intel) machine can create a binary *only* for the +x86_64 architecture. On an Apple silicon based machine, a binary can be created +for *either* x86_64 or arm64 (creating Universal Binary is at the moment *not* +possible). -In **config.mak**, add this line to the end of the file: +The building target architecture depends ultimately on the result of `uname -m` +in the Terminal running the `build_grass_app.bash` script. Building on Apple silicon +machines by opening the Terminal in Rosetta mode, creates a x86_64 binary. -`HAVE_PPC64=yes` +## Settings -Then finish: +By default a conda environment will be created by an explicit conda requirement +file (`files/conda-requirements-stable-[arm64|x86_64].txt`). It was created by +executing `conda list --explicit` on an environment created by the file +`files/conda-requirements-dev-[arm64|x86_64].txt`. This enables reproducibility +and stability. It is also possible to use a customized conda requirement file, +set as an argument (or in `configure-build-[arm64|x86_64].sh`). -`make` - -Now use lipo to merge them together, first drop down to the ffmpeg -source folder: - -`cd ..` - -For each of the libraries: - -libavcodec -libavdevice -libavformat -libavutil -libswscale - -run the following lipo command (fill in the **`[LIBNAME]`** in all -places). For Leopard: +To be able to bump dependency versions and/or add/remove dependencies for the +`files/conda-requirements-stable-[arm64|x86_64].txt` file the command flag +`--update-conda-stable` can be added. A requirement for this is that +`files/conda-requirements-dev-[arm64|x86_64].txt` is used for `--conda-file`. +This function is primarily intended to be used for updating this git repo. ```sh -sudo lipo -create \ - build-ppc/[LIBNAME]/[LIBNAME].dylib \ - build-i386/[LIBNAME]/[LIBNAME].dylib \ - build-ppc64/[LIBNAME]/[LIBNAME].dylib \ - build-x86_64/[LIBNAME]/[LIBNAME].dylib \ - -output /usr/local/lib/[LIBNAME].dylib +./macos/build_grass_app.bash --update-conda-stable ``` -For Tiger: +GRASS build configure settings can be set in configure files located in +`$HOME/.config/grass` (or `$XDG_CONFIG_HOME/grass` if set), e.g.: ```sh -sudo lipo -create \ - build-ppc/[LIBNAME]/[LIBNAME].dylib \ - build-i386/[LIBNAME]/[LIBNAME].dylib \ - -output /usr/local/lib/[LIBNAME].dylib +mkdir -p $HOME/.config/grass +cp macos/files/configure-build.sh.in $HOME/.config/grass/configure-build-arm64.sh +cp macos/files/configure-build.sh.in $HOME/.config/grass/configure-build-x86_64.sh ``` -Done. - -© 2006-2008 by the GRASS Development Team - -This program is free software under the GNU General Public License (>=v2). - -\- William Kyngesburye - - - - +Edit the configure file(s) to your needs. diff --git a/macos/build_grass_app.bash b/macos/build_grass_app.bash new file mode 100755 index 00000000000..848b767e1bf --- /dev/null +++ b/macos/build_grass_app.bash @@ -0,0 +1,743 @@ +#!/bin/bash + +############################################################################ +# +# TOOL: build_grass_app.bash +# AUTHOR(s): Nicklas Larsson +# PURPOSE: Build and bundle GRASS GIS app for macOS +# COPYRIGHT: (c) 2020-2025 Nicklas Larsson and the GRASS Development Team +# (c) 2020 Michael Barton +# (c) 2018 Eric Hutton, Community Surface Dynamics Modeling +# System +# +# This package is written by Nicklas Larsson and is heavily based +# on work by Eric Hutton with contributions by Michael Barton. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +############################################################################# + +this_script=$(basename "$0") +this_script_dir=$(cd "$(dirname "$0")" || exit; pwd) +arch=$(uname -m) +cache_dir="${this_script_dir}/cache" +config_home="${HOME}/.config" +sdk= +grassdir=$(cd "${this_script_dir}/.." || exit; pwd) +deployment_target= +grass_version="" +grass_version_major="" +grass_version_minor="" +grass_version_release= +grass_version_date= +patch_dir= +grass_app_name="" +grass_app_bundle="" +conda_stable_file="${this_script_dir}/files/conda-requirements-stable-${arch}.txt" +conda_dev_file="${this_script_dir}/files/conda-requirements-dev-${arch}.txt" +conda_req_file="$conda_stable_file" +conda_temp_dir=$(mktemp -d -t GRASS) +conda_bin="${conda_temp_dir}/bin/mamba" +conda_update_stable=0 +miniconda_url="https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-${arch}.sh" +dmg_title= +dmg_name= +dmg_out_dir= +bundle_version= +repackage=0 +with_liblas=0 +cs_entitlements="${this_script_dir}/files/grass.entitlements" +cs_ident= +cs_keychain_profile= +cs_provisionprofile= +notarize=0 + +bash=/bin/bash +codesign=/usr/bin/codesign +ditto=/usr/bin/ditto +install_name_tool=/usr/bin/install_name_tool +xcrun=/usr/bin/xcrun + +# patch needed for GRASS 8.0+ +IFS='' read -r -d '' inst_dir_patch <<'EOF' +--- include/Make/Platform.make.in.orig ++++ include/Make/Platform.make.in +@@ -37,7 +37,7 @@ + exec_prefix = @exec_prefix@ + ARCH = @host@ + UNIX_BIN = @BINDIR@ +-INST_DIR = @INSTDIR@ ++INST_DIR = @exec_prefix@ + + GRASS_HOME = @GRASS_HOME@ + RUN_GISBASE = @GISBASE@ +EOF + + +# read in configurations +if [ -n "$XDG_CONFIG_HOME" ]; then + config_home="$XDG_CONFIG_HOME" +fi +if [ -f "${config_home}/grass/configure-build-${arch}.sh" ]; then + source "${config_home}/grass/configure-build-${arch}.sh" +fi + +############################################################################# +# Functions +############################################################################# + +function display_usage () { cat <<- _EOF_ + +GRASS GIS build script for Anaconda. + +Description... + +Usage: $this_script [arguments] +Arguments: + -s + --sdk [path] MacOS SDK - full path to the SDK, which will be set as + -isysroot, required, spaces in path not allowed + -t + --target [target] Set deployment target version (MACOSX_DEPLOYMENT_TARGET), + e.g. "10.14", optional, default is set from SDK + -o + --dmg-out-dir [path] Output directory path for DMG file creation + This is a requirement for creating .dmg files. + -c + --conda-file [path] Conda package requirement file, optional. + --with-liblas Include libLAS support, optional, default is no support. + -u + --update-conda-stable Update the stable explicit conda requirement file. This + is only allowed if conda-requirements-dev-[arm64|x86_64].txt + is used (with --conda-file), to keep the two files in sync. + -r + --repackage Recreate dmg file from previously built app, + setting [-o | --dmg-out-dir] is a requirement. + --notarize Code sign and notarize app and dmg for distribution + Setting Apple developer ID, keychain profile, and + provisionprofile is a prerequisite. + -h + --help Usage information + +Example: + ./$this_script + ./$this_script -s /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk + +_EOF_ +} + +function printtag() { + # GitHub Actions tag format + [[ "$CI" == "true" ]] && echo "::$1::${2-}" +} + +function begingroup() { + printtag "group" "$1" +} + +function endgroup() { + printtag "endgroup" +} + +function exit_nice () { + error_code=$1 + if [[ "$#" -eq 2 && $2 = "cleanup" ]]; then + rm -rf "$conda_temp_dir" + fi + exit "$error_code" +} + +function read_grass_version () { + begingroup "Read GRASS version" + local versionfile="${grassdir}/include/VERSION" + local arr=() + while read -r line; do + arr+=("$line") + done < "$versionfile" + grass_version_major=${arr[0]} + grass_version_minor=${arr[1]} + grass_version_release=${arr[2]} + grass_version_date=${arr[3]} + grass_version="${grass_version_major}.${grass_version_minor}.${grass_version_release}" + patch_dir="${this_script_dir}/patches/${grass_version}" + grass_app_name="GRASS-${grass_version_major}.${grass_version_minor}.app" + grass_app_bundle="/Applications/${grass_app_name}" + dmg_title="GRASS-GIS-${grass_version}" + dmg_name="grass-${grass_version}-${arch}.dmg" + echo "GRASS_VERSION: ${grass_version}" + endgroup +} + +# This set the build version for CFBundleVersion, in case of dev version the +# git short commit hash number is added. +function set_bundle_version () { + begingroup "Set bundle version" + pushd "$grassdir" > /dev/null || exit + bundle_version=$grass_version + + local is_git_repo + is_git_repo=$(git rev-parse --is-inside-work-tree 2> /dev/null) + if [[ ! $? -eq 0 && ! "$is_git_repo" = "true" ]]; then + popd > /dev/null || exit + return + fi + + if [[ "$grass_version_release" = *"dev"* ]]; then + local git_commit + git_commit=$(git rev-parse --short HEAD) + bundle_version="${bundle_version} \(${git_commit}\)" + fi + popd > /dev/null || exit + echo "BUNDLE_VERSION: ${bundle_version}" + endgroup +} + +function make_app_bundle_dir () { + begingroup "Make app bundle dir" + local contents_dir="${grass_app_bundle}/Contents" + local resources_dir="${contents_dir}/Resources" + local macos_dir="${contents_dir}/MacOS" + local grass_bin_in="grass.sh.in" + mkdir -p "$resources_dir" + chmod 0755 "$grass_app_bundle" "$contents_dir" "$resources_dir" + mkdir -m 0755 "$macos_dir" + + local info_plist_in="${grassdir}/macos/files/Info.plist.in" + + sed "s|@GRASS_VERSION_DATE@|${grass_version_date}|g" "$info_plist_in" | \ + sed "s|@GRASS_VERSION_MAJOR@|${grass_version_major}|g" | \ + sed "s|@GRASS_VERSION_MINOR@|${grass_version_minor}|g" | \ + sed "s|@GRASS_VERSION_RELEASE@|${grass_version_release}|g" | \ + sed "s|@BUNDLE_VERSION@|${bundle_version}|g" | \ + sed "s|@DEPLOYMENT_TARGET@|${deployment_target}|g" \ + > "$contents_dir/Info.plist" + + local grassbin="grass" + sed "s|@GRASSBIN@|$grassbin|g" \ + "${this_script_dir}/files/$grass_bin_in" > "${macos_dir}/grass.sh" + cp -p "${this_script_dir}/files/grass.scpt" "${macos_dir}/grass.scpt" + cp -p "${grassdir}/macos/files/AppIcon.icns" "${resources_dir}/AppIcon.icns" + cp -p "${grassdir}/macos/files/GRASSDocument_gxw.icns" \ + "${resources_dir}/GRASSDocument_gxw.icns" + + chmod 0644 "${contents_dir}/Info.plist" + chmod 0755 "${macos_dir}/grass.sh" + chmod 0644 "${resources_dir}/AppIcon.icns" + chmod 0644 "${resources_dir}/GRASSDocument_gxw.icns" + + # swiftc -v "${this_script_dir}/files/main.swift" \ + # -sdk "$sdk" \ + # -target "${arch}-apple-macos${deployment_target}" \ + # -o "${macos_dir}/GRASS" + clang -x objective-c "-mmacosx-version-min=${deployment_target}" \ + -target "${arch}-apple-macos${deployment_target}" \ + -mmacosx-version-min="$deployment_target" \ + -isysroot "$sdk" -fobjc-arc -Os \ + -o "${macos_dir}/GRASS" "${this_script_dir}/files/main.m" || exit_nice 1 + echo "GRASS_APP_BUNDLE created: $grass_app_bundle" + endgroup +} + +function patch_grass () { + begingroup "Apply patches" + echo "$inst_dir_patch" | patch -d "$grassdir" -p0 + endgroup +} + +function reset_grass_patches () { + begingroup "Reverting patches" + echo "Reverting patches..." + echo "$inst_dir_patch" | patch -d "$grassdir" -p0 -R + echo "Reverting patches done." + endgroup +} + +function set_up_conda () { + begingroup "Set up Conda" + mkdir -p "$cache_dir" + # move existing miniconda script to new external directory + if [ -f "${this_script_dir}/miniconda3.sh" ]; then + mv "${this_script_dir}/miniconda3.sh" "${cache_dir}/miniconda3.sh" + fi + + # download miniconda if not already existing + local miniconda="${cache_dir}/miniconda3-${arch}.sh" + if [ ! -f "$miniconda" ]; then + curl -L "$miniconda_url" --output "$miniconda" || exit_nice 1 cleanup + fi + + $bash "$miniconda" -b -f -p "$conda_temp_dir" + if [ ! -f "$conda_bin" ]; then + echo "Error, could not find conda binary file at ${conda_bin}" + exit_nice 1 cleanup + fi + + $conda_bin create --yes -p "${grass_app_bundle}/Contents/Resources" \ + --file="${conda_req_file}" -c conda-forge || exit_nice 1 cleanup + + export PATH="${grass_app_bundle}/Contents/Resources/bin:$PATH" + + # remove, causing Notarization issues + rm -rf "${grass_app_bundle}/Contents/Resources/share/gdb" + endgroup +} + +function install_grass_session () { + begingroup "Install grass-session" + local python_bin="${grass_app_bundle}/Contents/Resources/bin/python" + $python_bin -m pip install --upgrade pip + $python_bin -m pip install grass-session + endgroup +} + +function create_dmg () { + begingroup "Create dmg" + echo + echo "Create dmg file of $grass_app_bundle ..." + + if [ ! -d "$grass_app_bundle" ]; then + echo "Error, attempt to create dmg file, but no app could be found" + exit_nice 1 + fi + + local dmg_size + local dmg_tmpfile + local exact_app_size + local tmpdir + + if [[ "$CI" == "true" ]]; then + tmpdir="$RUNNER_TEMP" + else + tmpdir=$(mktemp -d /tmp/org.osgeo.grass.XXXXXX) + fi + dmg_tmpfile=${tmpdir}/grass-tmp-$$.dmg + exact_app_size=$(du -ks "$grass_app_bundle" | cut -f 1) + dmg_size=$((exact_app_size*120/100)) + + if [[ "$CI" == "true" ]] + then + # workaround for sometimes failed attempts on macos-13 (x86_64) runner + local max_attempts=10 + local i=0 + until hdiutil create -srcfolder "$grass_app_bundle" \ + -volname "$dmg_title" \ + -fs HFS+ \ + -fsargs "-c c=64,a=16,e=16" \ + -format UDRW \ + -size ${dmg_size}k "$dmg_tmpfile" + do + if [ $i -eq $max_attempts ]; then + echo "Error: hdiutil failed after ${max_attempts} attempts." + exit 1 + fi + i=$((i+1)) + done + else + if ! hdiutil create -srcfolder "$grass_app_bundle" \ + -volname "$dmg_title" \ + -fs HFS+ \ + -fsargs "-c c=64,a=16,e=16" \ + -format UDRW \ + -size ${dmg_size}k "$dmg_tmpfile" + then + rm -rf "$tmpdir" + exit_nice 1 + fi + fi + + if [[ "$CI" != "true" ]]; then + DEVICE=$(hdiutil attach -readwrite -noverify -noautoopen "${dmg_tmpfile}" | grep -E '^/dev/' | sed -e "s/^\/dev\///g" -e 1q | awk '{print $1}') + hdiutil attach "$dmg_tmpfile" || error "Can't attach temp DMG" + + mkdir -p "/Volumes/${dmg_title}/.background" + cp -p "${this_script_dir}/files/dmg-background.png" \ + "/Volumes/${dmg_title}/.background/background.png" + + osascript << EOF +tell application "Finder" + tell disk "$dmg_title" + open + set current view of container window to icon view + set toolbar visible of container window to false + set statusbar visible of container window to false + set the bounds of container window to {400, 100, 1040, 460} + set theViewOptions to the icon view options of container window + set arrangement of theViewOptions to not arranged + set icon size of theViewOptions to 100 + set background picture of theViewOptions to file ".background:background.png" + make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} + set position of item "$grass_app_name" of container window to {187, 163} + set position of item "Applications" of container window to {452, 163} + update without registering applications + delay 5 + close + end tell +end tell +EOF + + sync + sync + sleep 3 + hdiutil detach "$DEVICE" + fi + + DMG_FILE="${dmg_out_dir}/${dmg_name}" + + if ! hdiutil convert "${dmg_tmpfile}" \ + -format UDZO -imagekey zlib-level=9 -o "${DMG_FILE}" + then + [[ "$CI" != "true" ]] && rm -rf "$tmpdir" + exit_nice 1 + fi + + [[ "$CI" != "true" ]] && rm -rf "$tmpdir" + + echo + [[ "$CI" == "true" ]] && echo "DMG_NAME=${dmg_name}" >> "$GITHUB_ENV" + [[ "$CI" == "true" ]] && echo "DMG_FILE=${DMG_FILE}" >> "$GITHUB_ENV" + endgroup +} + +function remove_dmg () { + local disk + if [ -d "/Volumes/${dmg_title}" ]; then + disk=$(diskutil list | grep "$dmg_title" | awk -F\ '{print $NF}') + diskutil unmount "$disk" + fi + rm -rf "${dmg_out_dir:?}/${dmg_name:?}" +} + +function codesign_app () { + local bins + local grass_libs + local libs + begingroup "Code sign app" + pushd "${grass_app_bundle}/Contents" > /dev/null || exit $? + + # remove build stage rpaths from grass libraries + + grass_libs=$(find ./Resources -type f \( -name "*libgrass_*.dylib" \)) + + while IFS= read -r file || [[ -n $file ]]; do + rpath=$(otool -l "$file" | grep "dist.*/lib" | awk '{$1=$1};1' | cut -d " " -f 2) + if [[ -n "$rpath" ]]; then + "$install_name_tool" -delete_rpath "$rpath" "$file" + fi + done < <(printf '%s\n' "$grass_libs") + + # codesign embedded libraries + + libs=$(find ./Resources -type f \( -name "*.so" -or -name "*.dylib" \)) + + while IFS= read -r file || [[ -n $file ]]; do + "$codesign" --sign "${cs_ident}" --force --verbose --timestamp "${file}" & + done < <(printf '%s\n' "$libs") + wait + + # codesign embedded binaries + + bins=$(find ./Resources -type f -perm +111 ! \( -name "*.so" -or -name "*.dylib" -or -name "*.a" \ + -or -name "*.py" -or -name "*.sh" \) -exec file '{}' \; | \ + grep "x86_64\|arm64" | \ + cut -d ":" -f 1 | \ + grep -v "for architecture") + wait + + while IFS= read -r file || [[ -n $file ]]; do + "$codesign" --sign "${cs_ident}" --force --verbose --timestamp --options runtime \ + --entitlements "$cs_entitlements" "${file}" & + done < <(printf '%s\n' "$bins") + wait + + # codesign "extra" files in ./MacOS directory + + "$codesign" --sign "${cs_ident}" --force --verbose --timestamp --options runtime \ + --entitlements "$cs_entitlements" "./MacOS/grass.sh" + "$codesign" --sign "${cs_ident}" --force --verbose --timestamp --options runtime \ + --entitlements "$cs_entitlements" "./MacOS/grass.scpt" + + cp "$cs_provisionprofile" embedded.provisionprofile + # xattr -r -d com.apple.FinderInfo embedded.provisionprofile + + popd > /dev/null || exit $? + + # codesign the app bundle + + "$codesign" --force --verbose --timestamp --sign "$cs_ident" --options runtime \ + --entitlements "$cs_entitlements" "$grass_app_bundle" + endgroup +} + +function codesign_dmg () { + begingroup "Code sign dmg" + "$codesign" --force --verbose --timestamp --sign "$cs_ident" --options runtime \ + --entitlements "$cs_entitlements" "${dmg_out_dir}/${dmg_name}" + endgroup +} + +function notarize_app () { + local tmpdir + local zip_tmpfile + + begingroup "Notarize app" + tmpdir=$(mktemp -d /tmp/org.osgeo.grass.XXXXXX) + zip_tmpfile="${tmpdir}/${grass_app_name}.zip" + + "$ditto" -c -k --keepParent "$grass_app_bundle" "$zip_tmpfile" + + "$xcrun" notarytool submit "$zip_tmpfile" \ + --keychain-profile "$cs_keychain_profile" --wait + + "$xcrun" stapler staple "$grass_app_bundle" + "$xcrun" stapler validate "$grass_app_bundle" + + rm -rf "$tmpdir" + endgroup +} + +function notarize_dmg () { + begingroup "Notarize dmg" + "$xcrun" notarytool submit "${dmg_out_dir}/${dmg_name}" \ + --keychain-profile "$cs_keychain_profile" --wait + + "$xcrun" stapler staple "${dmg_out_dir}/${dmg_name}" + endgroup +} + +############################################################################# +# Read script arguments +############################################################################# + +while [ "$1" != "" ]; do + case $1 in + -s | --sdk ) shift + sdk=$1 + ;; + -t | --target ) shift + deployment_target=$1 + ;; + -o | --dmg-out-dir ) shift + dmg_out_dir=$1 + ;; + -c | --conda-file ) shift + conda_req_file=$1 + ;; + --with-liblas ) + with_liblas=1 + ;; + -r | --repackage ) + repackage=1 + ;; + -u | --update-conda-stable ) + conda_update_stable=1 + ;; + --notarize ) + notarize=1 + ;; + -h | --help ) + display_usage + exit 0 + ;; + *) + # unknown option + echo "ERROR" + display_usage + exit 1 + ;; + esac + shift +done + +############################################################################# +# Check arguments and files +############################################################################# + +# make full path of CONDA_REQ_FILE +conda_req_file=$(cd "$(dirname "${conda_req_file}")" && pwd)/$(basename "$conda_req_file") + +if [[ ! -d "$sdk" && -f "$xcrun" ]]; then + sdk=$("$xcrun" --show-sdk-path) +fi + +if [ ! -f "${sdk}/SDKSettings.plist" ]; then + echo "Error, could not find valid MacOS SDK at $sdk" + display_usage + exit_nice 1 +fi + +# if DEPLOYMENT_TARGET hasn't been set, extract from SDK +if [ -z "$deployment_target" ]; then + deployment_target=$(plutil -extract DefaultProperties.MACOSX_DEPLOYMENT_TARGET xml1 \ +-o - "${sdk}/SDKSettings.plist" | awk -F '[<>]' '/string/{print $3}') +fi + +read_grass_version +set_bundle_version + +if [[ ! -d "$patch_dir" && "${grass_version_major}${grass_version_minor}" -le 80 ]]; then + echo "Error, no patch directory \"$patch_dir\" found" + exit_nice 1 +fi + +if [[ -n "$dmg_out_dir" && ! -d "$dmg_out_dir" ]]; then + echo "Error, dmg output directory \"${dmg_out_dir}\" does not exist." + exit_nice 1 +fi + +if [[ -n "$dmg_out_dir" && -f "${dmg_out_dir}/${dmg_name}" ]]; then + echo "Warning, there exists a dmg file \"${dmg_name}\" in \"${dmg_out_dir}\"." + while true; do + read -r -p "Do you wish to delete it (y|n)? " yn + case $yn in + [Yy]* ) remove_dmg; break;; + [Nn]* ) exit_nice 0;; + * ) echo "Please answer yes or no.";; + esac + done +fi + +if [[ "$repackage" -eq 1 && ! -d "$grass_app_bundle" ]]; then + echo "Error, attempt to repackage a non-existing \"$grass_app_bundle\" app bundle." + exit_nice 1 +fi + +# updating the stable conda explicit requirement file is only allowed if +# files/conda-requirements-dev-[arm64|x86_64].txt is used, to keep the two files in sync +if [[ "$conda_update_stable" -eq 1 ]]; then + if [ "$conda_req_file" != "$conda_dev_file" ]; then + echo "Note, conda requirement file used is ${conda_dev_file}!" + conda_req_file="$conda_dev_file" + fi + grass_app_bundle=$(mktemp -d /tmp/org.osgeo.grass.XXXXXX) +fi + +# check if destination app bundle exists, with option to cancel if true +if [[ -d "$grass_app_bundle" && "$repackage" -eq 0 && "$conda_update_stable" -eq 0 ]]; then + echo "Warning, \"${grass_app_bundle}\" already exists." + while true; do + read -r -p "Do you wish to delete it (y|n)? " yn + case $yn in + [Yy]* ) rm -rf "$grass_app_bundle"; break;; + [Nn]* ) exit_nice 0;; + * ) echo "Please answer yes or no.";; + esac + done +fi + +if [[ "$notarize" -eq 1 && ( -z $cs_ident || -z $cs_keychain_profile || -z $cs_provisionprofile ) ]]; then + echo "Error, attempt to notarize the app without setting necessary" + echo "code signing identity, provision profile and keychain profile." + exit_nice 1 +fi + +if [[ "$notarize" -eq 1 && ! -f $cs_provisionprofile ]]; then + echo "Error, the provisioning profile file can not be found." + exit_nice 1 +fi + +############################################################################# +# Start setting up and compiling procedures +############################################################################# + +# only create a new dmg file of existing app bundle +if [[ -n "$dmg_out_dir" && "$repackage" -eq 1 ]]; then + create_dmg + if [[ "$notarize" -eq 1 ]]; then + codesign_dmg + notarize_dmg + fi + exit_nice 0 +fi + +make_app_bundle_dir + +set_up_conda + +# update the stable conda explicit (stable) requirement file and exit +if [[ "$conda_update_stable" -eq 1 ]]; then + $conda_bin list -p "${grass_app_bundle}/Contents/Resources" \ + --explicit > "$conda_stable_file" + rm -rf "$grass_app_bundle"; + exit_nice 0 +fi + +install_grass_session + +if [[ "$with_liblas" -eq 1 ]]; then + begingroup "Build and install libLAS" + source "${this_script_dir}/files/liblas-install.sh" + endgroup +fi + +patch_grass + +begingroup "Build and install GRASS GIS" +# configure and compile GRASS GIS + +pushd "$grassdir" > /dev/null || exit + +echo "Starting \"make distclean\"..." +make distclean &>/dev/null +echo "Finished \"make distclean\"" + +source "${this_script_dir}/files/configure-grass.sh" + +if ! make -j"$(sysctl -n hw.ncpu)" +then + echo "Compilation failed, you may need to reset the GRASS git repository." + echo "This can be made with: \"cd [grass-source-dir] && git reset --hard\"." + echo + popd > /dev/null || exit + exit_nice 1 +fi + +echo +echo "Start installation..." +if ! make install +then + echo "Installation failed, you may need to reset the GRASS git repository." + echo "This can be made with: \"cd [grass-source-dir] && git reset --hard\"." + echo + popd > /dev/null || exit + exit_nice 1 +fi +echo "Finished installation." + +popd > /dev/null || exit +endgroup + +reset_grass_patches + +# replace SDK with a unversioned one of Command Line Tools +file="${grass_app_bundle}/Contents/Resources/include/Make/Platform.make" +sed -i .bak "s|-isysroot ${sdk}|-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk|g" "$file" \ + || rm -f "${file}.bak" + +begingroup "List of installed packages" +# print list of installed packages +echo "=================================================================" +echo +$conda_bin list -p "${grass_app_bundle}/Contents/Resources" +if [[ "$with_liblas" -eq 1 ]]; then + liblas_version=$("${grass_app_bundle}/Contents/Resources/bin/liblas-config" --version) + echo "libLAS ${liblas_version}" +fi +echo +echo "=================================================================" +endgroup + +if [[ "$notarize" -eq 1 ]]; then + codesign_app + notarize_app +fi + +# create dmg file +if [[ -n "$dmg_out_dir" ]]; then + create_dmg + if [[ "$notarize" -eq 1 ]]; then + codesign_dmg + notarize_dmg + fi +fi + +exit_nice 0 cleanup diff --git a/macos/bundle.make b/macos/bundle.make deleted file mode 100644 index 4b3c26bb6ea..00000000000 --- a/macos/bundle.make +++ /dev/null @@ -1,24 +0,0 @@ -# extra binaries and data to bundle into the GRASS.app package -# -# use ${INSTALL} to copy binaries. -# use ${INSTALL_DATA} for headers and other non-executables. -# use ${MAKE_DIR_CMD} to create a subfolder if needed. -# use ${LN} and ${LN_DIR} to symlink files and folders respectively. -# -# Destinations include: bin and lib and should be prefixed by -# ${INST_DIR_TARGET}/ -# Includes should not normally be needed. -# -# For libraries, make sure to make symlinks if the symlink is the linked name. -# ie, libfoo.1.0.dylib is the library file, but libfoo.1.dylib is the link name: -# ${LN} libfoo.1.0.dylib ${INST_DIR_TARGET}/lib/libfoo.1.dylib -# If you're not sure, make all symlinks for a library. -# -# use one line per file after the "bundle-macosx:" line, indented with a tab. -# ie: -# ${INSTALL} /usr/local/bin/gpsbabel ${INST_DIR_TARGET}/bin -# ${INSTALL} /usr/local/pgsql/lib/libpq.5.1.dylib ${INST_DIR_TARGET}/lib -# ${LN} libpq.5.1.dylib ${INST_DIR_TARGET}/lib/libpq.5.dylib - -bundle-macosx: - @# add custom bundle commands here: diff --git a/macos/files/English.lproj/MainMenu.nib/classes.nib b/macos/files/English.lproj/MainMenu.nib/classes.nib deleted file mode 100644 index 96de588392f..00000000000 --- a/macos/files/English.lproj/MainMenu.nib/classes.nib +++ /dev/null @@ -1,4 +0,0 @@ -{ - IBClasses = ({CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }); - IBVersion = 1; -} diff --git a/macos/files/English.lproj/MainMenu.nib/data.dependency b/macos/files/English.lproj/MainMenu.nib/data.dependency deleted file mode 100644 index 82ceab424f5..00000000000 --- a/macos/files/English.lproj/MainMenu.nib/data.dependency +++ /dev/null @@ -1,10 +0,0 @@ - - - - - IBPaletteDependency - - ASKPalette - - - diff --git a/macos/files/English.lproj/MainMenu.nib/info.nib b/macos/files/English.lproj/MainMenu.nib/info.nib deleted file mode 100644 index 4dbdc3731c6..00000000000 --- a/macos/files/English.lproj/MainMenu.nib/info.nib +++ /dev/null @@ -1,19 +0,0 @@ - - - - - IBDocumentLocation - 157 110 356 240 0 0 1280 778 - IBEditorPositions - - 29 - 319 537 269 44 0 0 1280 778 - - IBFramework Version - 446.1 - IBOldestOS - 3 - IBSystem Version - 8R2232 - - diff --git a/macos/files/English.lproj/MainMenu.nib/keyedobjects.nib b/macos/files/English.lproj/MainMenu.nib/keyedobjects.nib deleted file mode 100644 index 9f6db0def40..00000000000 Binary files a/macos/files/English.lproj/MainMenu.nib/keyedobjects.nib and /dev/null differ diff --git a/macos/files/GRASS.applescript b/macos/files/GRASS.applescript deleted file mode 100644 index fccf61f86b7..00000000000 --- a/macos/files/GRASS.applescript +++ /dev/null @@ -1,69 +0,0 @@ --- Created by William Kyngesburye on 2006-12-12. --- GRASS Applescript startup --- COPYRIGHT: (C) 2006-2008 by the GRASS Development Team --- This program is free software under the GPL (>=v2) --- Read the file COPYING that comes with GRASS for details. - --- note: handler order on launch: --- 1-will finish launching (good place to check prefs; no nibs loaded yet) --- 2-launched (good place to show initial windows or dialogs) --- 2.5-open? --- 3-idle (waits for user action) --- --- idle is supposed to be last, but open seems to cause it to think --- it's not idle, so we can process drag-n-drop before idling. No docs --- say explicitly that this is the case, so speed of Mac and process load --- could affect this. - -property grassMap : "" -property grassGui : "" -property grassLaunched : false - -on will finish launching theObject - set grassLaunched to false - -- eventually, catch modifier key here? to show gui choice -end will finish launching - ---on launch theObject ---end launch - -on open maps - --display dialog (count of maps) - if count of maps is 1 then - if (folder of (info for (item 1 of maps))) then - set grassMap to " " & (quoted form of (POSIX path of (item 1 of maps))) - end if - end if - launchgrass() -end open - -on idle theObject - if not grassLaunched then - launchgrass() - end if -end launched - -on launchgrass() - set grassLaunched to true - set grass_path to (posix path of (path to me as string)) & "Contents/MacOS/" - set grass_startup to (quoted form of (grass_path & "grass.sh")) - set grassRun to grass_startup & grassGui & grassMap & "; exit" - - set TerminalRunning to false - try - if ((do shell script "ps -axc | grep '\\bTerminal\\b'") is not null) then - set TerminalRunning to true - end if - end try - - tell application "Terminal" - activate - if TerminalRunning then - do script (grassRun) - else - do script (grassRun) in window 1 - end if - end tell - - tell me to quit -end launchgrass diff --git a/macos/files/Makefile b/macos/files/Makefile deleted file mode 100644 index 1299dcacad8..00000000000 --- a/macos/files/Makefile +++ /dev/null @@ -1,108 +0,0 @@ -# Makefile for building Mac OS X app startup - -MODULE_TOPDIR = ../.. - -include $(MODULE_TOPDIR)/include/Make/Vars.make -MOD_OBJS = - -EXTRA_INC = -EXTRA_CFLAGS = -EXTRA_LDFLAGS = -framework Cocoa -framework AppleScriptKit -ifndef MACOSX_APP_NAME -MACOSX_APP_NAME = GRASS-${GRASS_VERSION_MAJOR}.${GRASS_VERSION_MINOR}.app -endif -APPDIR = $(ARCH_DISTDIR)/${MACOSX_APP_NAME}/Contents -MAKE_DIR_CMD = mkdir -p -m 755 -GRASS_VERSION_BUILD = `/bin/date "+%y%m%d"` - -BUNDLE_VERSION := ${GRASS_VERSION_NUMBER} -# add git commit hash to bundle version if it is a development release -ifneq (,$(findstring dev,$(GRASS_VERSION_RELEASE))) -BUNDLE_VERSION := ${GRASS_VERSION_NUMBER} (${GRASS_VERSION_GIT}) -endif - -# Figure out version for MACOSX_DEPLOYMENT_TARGET, with following order: -# - if MACOSX_SDK is set then it will be used -# - the result of `xcrun --show-sdk-path` -# - check if Command Line Tools' SDKs is present, and use the default version -# - use the MacOS version of building machine -SDK_CMD = "" -ifeq ($(strip $(MACOSX_SDK)),) -SDK_CMD = xcrun --show-sdk-path -else -SDK_CMD = echo "${MACOSX_SDK}" | cut -d \ -f 2 -endif -SDK := $(shell $(SDK_CMD)) - -ifeq ($(SDK),) -ifneq ($(wildcard /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/.*),) -SDK = /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -endif -endif - -ifneq ($(SDK),) -DEPLOYMENT_TARGET_CMD = plutil -extract DefaultProperties.MACOSX_DEPLOYMENT_TARGET \ - xml1 -o - $(SDK)/SDKSettings.plist | awk -F '[<>]' '/string/{print $$3}' -else -DEPLOYMENT_TARGET_CMD = sw_vers -productVersion | cut -d . -f 1,2 -endif - -DEPLOYMENT_TARGET := $(shell $(DEPLOYMENT_TARGET_CMD)) - -# ugly hack - assume gdal prefix starts with -L flag -ifndef GDAL_BIN -GDAL_BIN = `echo "${GDALLIBS}" | sed -e "s,-L,," -e "s,/lib.*$$,/bin:,"` -endif -# ugly hack - extract path to PROJ bin from nad2bin -ifndef PROJ_BIN -PROJ_BIN = `echo "${NAD2BIN}" | sed -e "s,.=,," -e "s,/nad2bin,:,"` -endif -# get python version - use python in path, should be config'd python -PYVER = `python -V 2>&1 | cut -d \ -f 2 | cut -d . -f 1,2` -ifneq ($(filter ppc64 x86_64,$(MACOSX_ARCHS_WXPYTHON)),) -WX64BIT = 1 -else -WX64BIT = 0 -endif - -FILES = \ - $(OBJDIR)/GRASS \ - $(OBJDIR)/Info.plist \ - $(OBJDIR)/GRASS.scpt \ - $(OBJDIR)/grass.sh - -default: $(FILES) - -$(OBJDIR)/main.o: main.m - $(MAKE_DIR_CMD) $(OBJDIR) - $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(EXTRA_INC) -o $@ -c $< - -$(OBJDIR)/GRASS: $(OBJDIR)/main.o - $(MAKE_DIR_CMD) $(OBJDIR) - $(CC) $(LDFLAGS) -o $@ $< $(EXTRA_LDFLAGS) - -$(OBJDIR)/Info.plist: Info.plist.in - $(MAKE_DIR_CMD) $(OBJDIR) - sed -e "s,@GRASS_VERSION_MAJOR@,$(GRASS_VERSION_MAJOR),g" \ - -e "s,@GRASS_VERSION_MINOR@,$(GRASS_VERSION_MINOR),g" \ - -e "s,@GRASS_VERSION_DATE@,$(GRASS_VERSION_DATE),g" \ - -e "s,@BUNDLE_VERSION@,$(BUNDLE_VERSION),g" \ - -e "s,@DEPLOYMENT_TARGET@,$(DEPLOYMENT_TARGET),g" \ - $< > $@ - -$(OBJDIR)/GRASS.scpt: GRASS.applescript - $(MAKE_DIR_CMD) $(OBJDIR) - osacompile -d -x -i /System/Library/Frameworks/AppleScriptKit.framework -o $@ $< - -$(OBJDIR)/grass.sh: grass.sh.in - $(MAKE_DIR_CMD) $(OBJDIR) - sed -e "s,@GDAL_BIN_PATH@,$(GDAL_BIN)," \ - -e "s,@PROJ_BIN_PATH@,$(PROJ_BIN)," \ - -e "s,@X11@,$(USE_X11),g" \ - -e "s,@PYVER@,$(PYVER),g" \ - -e "s,@WX64BIT@,$(WX64BIT),g" \ - -e "s,@GRASS_NAME@,$(GRASS_NAME),g" \ - $< > $@ - -clean: - -rm -rf $(OBJDIR) $(EXTRA_CLEAN_DIRS) $(EXTRA_CLEAN_FILES) diff --git a/macos/files/PkgInfo b/macos/files/PkgInfo deleted file mode 100644 index 6f749b0f376..00000000000 --- a/macos/files/PkgInfo +++ /dev/null @@ -1 +0,0 @@ -APPL???? diff --git a/macos/files/build_gui_user_menu.sh b/macos/files/build_gui_user_menu.sh deleted file mode 100755 index e4bc6e7f250..00000000000 --- a/macos/files/build_gui_user_menu.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/sh - -# Build addon menu files, from the global /Library/GRASS/$GRASS_MMVER/Modules -# and the user's $HOME/Library/GRASS/$GRASS_MMVER/Modules. - -# test files to make sure they are appropriate for adding to the GUI menu. -# Using 'file', assume executable binaries OK. Check scripts to see if they -# have GRASS options configured - a simple grep for #%Module. -# Other script languages may need their own test. - -# addon commands can't have spaces in them or sh for loop messes up. -# may be my limited knowledge of sh scripting and there could be a way. - -GRASS_MMVER=`cut -d . -f 1-2 "$GISBASE/etc/VERSIONNUMBER"` -BINDIR="$GISBASE_USER/Modules/bin" -SCRIPTDIR="$GISBASE_USER/Modules/scripts" -BINDIRG="$GISBASE_SYSTEM/Modules/bin" -SCRIPTDIRG="$GISBASE_SYSTEM/Modules/scripts" -MENUDIR="$GISBASE_USER/Modules/etc" - -echo "Rebuilding Addon menu..." - -# just to make sure (startup should have created it) -mkdir -p "$MENUDIR" -echo "# generated by grass startup" > "$MENUDIR/xtnmenu.dat" - -# global addons: -if [ -d "$BINDIRG" ] ; then - cd "$BINDIRG" - CMDLISTG=`ls -1 2> /dev/null` -else - CMDLISTG="" -fi -if [ -d "$SCRIPTDIRG" ] ; then - cd "$SCRIPTDIRG" - CMDLISTG="$CMDLISTG"$'\n'"`ls -1 2> /dev/null`" -fi -CMDLISTG=`echo "$CMDLISTG" | sort -u` -CMDGFOUND="" - -if [ "$CMDLISTG" != "" ] ; then - for i in $CMDLISTG - do - if [ -f "$BINDIRG/$i" ] ; then - ftype="`file $BINDIRG/$i`" - else - ftype="`file $SCRIPTDIRG/$i`" - fi - if [ "`echo $ftype | grep 'Mach-O'`" ] || [ "`grep '#% *Module' $BINDIRG/$i 2> /dev/null`" ] || [ "`grep '#% *Module' $SCRIPTDIRG/$i 2> /dev/null`" ] ; then - echo "main:$i:$i:$i" >> "$MENUDIR/xtnmenu.dat" - CMDGFOUND="1" - fi - done -fi - -# user addons: -CMDFIRST="1" -cd "$BINDIR" -CMDLIST=`ls -1 2> /dev/null` -if [ -d "$SCRIPTDIR" ] ; then - cd "$SCRIPTDIR" - CMDLIST="$CMDLIST"$'\n'"`ls -1 2> /dev/null`" -fi -CMDLIST=`echo "$CMDLIST" | sort -u` - -if [ "$CMDLIST" != "" ] ; then - for i in $CMDLIST - do - if [ -f "$BINDIR/$i" ] ; then - ftype="`file $BINDIR/$i`" - else - ftype="`file $SCRIPTDIR/$i`" - fi - if [ "`echo $ftype | grep 'Mach-O'`" ] || [ "`grep '#% *Module' $BINDIR/$i 2> /dev/null`" ] || [ "`grep '#% *Module' $SCRIPTDIR/$i 2> /dev/null`" ] ; then - if [ "$CMDFIRST" ] && [ "$CMDGFOUND" ] ; then - echo "separator" >> "$MENUDIR/xtnmenu.dat" - CMDFIRST="" - fi - echo "main:$i:$i:$i" >> "$MENUDIR/xtnmenu.dat" - fi - done -fi diff --git a/macos/files/build_html_user_index.sh b/macos/files/build_html_user_index.sh deleted file mode 100755 index 0dd7271f0b0..00000000000 --- a/macos/files/build_html_user_index.sh +++ /dev/null @@ -1,190 +0,0 @@ -#!/bin/sh - -#generates user addon HTML man pages docs/html/index.html -# Markus Neteler, 2003, 2004, 2005, 2006 - -# William Kyngesburye: -# This one builds the addon index, from both the global -# /Library/GRASS/$GRASS_MMVER/Modules and the user's -# $HOME/Library/$GRASS_MMVER/GRASS/Modules -# Each is in their own section, in the same index file. -# -# global help pages are symlinked to the user dir, so user doesn't need perms -# to write there for redirects. -# main and section indexes from GRASS.app are redirected from user dir, not -# symlinked, so relative paths stay valid. - -############# nothing to configure below ############ - -# $1 is current path to GRASS.app/Contents/MacOS, defaults to /Applications -if [ "$1" != "" ] ; then - GISBASE=$1 -else - GISBASE="/Applications/GRASS-$GRASS_MMVER.app/Contents/MacOS" -fi - -GRASS_MMVER=`cut -d . -f 1-2 "$GISBASE/etc/VERSIONNUMBER"` -GRASSVERSION=`cat "$GISBASE/etc/VERSIONNUMBER"` -HTMLDIR="$GISBASE_USER/Modules/docs/html" -HTMLDIRG="$GISBASE_SYSTEM/Modules/docs/html" - -write_html_header() -{ -# $1: filename -# $2: page title -# $3: is it main index - -echo " - - - $2 - - " > $1 -if [ "$3" ] ; then - echo " - - " >> $1 -fi -echo " - - - -\"GRASS -
- -

GRASS GIS $GRASSVERSION Reference Manual

- -

Geographic Resources Analysis Support System, commonly referred to as -GRASS, -is a Geographic Information System (GIS) used for geospatial data management -and analysis, image processing, graphics/maps production, spatial modeling, -and visualization. GRASS is currently used in academic and commercial settings -around the world, as well as by many governmental agencies and environmental -consulting companies.

- -

This reference manual details the use of modules distributed with -Geographic Resources Analysis Support System (GRASS), an open source (GNU -GPL'ed), image processing and geographic information system (GIS).

- -" >> $1 -} - -write_html_footer() -{ -# $1: filename -echo "
" >> $1 -echo "

Help Index | Full Index | Addon Index
" >> $1 -echo "© 2003-2008 GRASS Development Team

" >> $1 -echo "" >> $1 -echo "" >> $1 -} - -FULLINDEX=addon_index.html - -################ -echo "Rebuilding Addon HTML manual pages index..." - -#copy over CSS: -cp -f "$GISBASE/docs/html/grassdocs.css" "$HTMLDIR/" -#copy over GRASS logo: -cp -f "$GISBASE/docs/html/grass_logo.png" "$HTMLDIR/" -cp -f "$GISBASE/docs/html/grass_icon.png" "$HTMLDIR/" - -#process all global HTML pages: -if [ -d "$HTMLDIRG" ] ; then -cd "$HTMLDIRG" - -#get list of available GRASS modules: -CMDLISTG=`ls -1 *.*.html 2> /dev/null | grep -v index.html | cut -d'.' -f1 | sort -u` -else -CMDLISTG="" -fi - -#process all user HTML pages: -cd "$HTMLDIR" - -# don't really need to delete these, as removed global modules won't get indexed, -# though old symlinks will accumulate. I'm just worried about wildcard deletes. -#rm -f global_*.html - -#get list of available GRASS modules: -CMDLIST=`ls -1 *.*.html 2> /dev/null | grep -v index.html | cut -d'.' -f1 | sort -u` - -#write main index: -#echo "Generating HTML manual pages index (help system)..." -write_html_header $FULLINDEX "GRASS GIS $GRASSVERSION Addon Reference Manual" 1 -echo "

Command guide:

" >> $FULLINDEX -echo "" >> $FULLINDEX -echo "" >> $FULLINDEX -echo "" >> $FULLINDEX -echo "" >> $FULLINDEX -echo "" >> $FULLINDEX -echo "" >> $FULLINDEX -echo "
  d.* display commands  ps.* postscript commands
  db.* database commands  r.* raster commands
  g.* general commands  r3.* raster3D commands
  i.* imagery commands  v.* vector commands
  m.* miscellaneous commands
" >> $FULLINDEX - -# global commands: -echo "

Global addon command index:

" >> $FULLINDEX -echo "" >> $FULLINDEX -if [ "$CMDLISTG" = "" ] ; then - echo "" >> $FULLINDEX -else - for i in $CMDLISTG - do - cd "$HTMLDIRG" - CMDLISTI="`ls -1 $i.*.html`" - cd "$HTMLDIR" - for i in $CMDLISTI - do - BASENAME=`basename $i .html` - SHORTDESC="`cat "$HTMLDIRG/$i" | awk '/NAME/,/SYNOPSIS/' | grep '' | cut -d'-' -f2- | sed 's+^ ++g' | grep -vi 'SYNOPSIS' | head -n 1`" -# echo "" >> $FULLINDEX - # make them local to user to simplify page links - echo "" >> $FULLINDEX - ln -sf "$HTMLDIRG/$i" global_$i - done - done -fi -echo "
[There are no global addon help pages.]
$BASENAME $SHORTDESC
$BASENAME $SHORTDESC
" >> $FULLINDEX - -# user commands: -echo "

User addon command index:

" >> $FULLINDEX -echo "" >> $FULLINDEX -if [ "$CMDLIST" = "" ] ; then - echo "" >> $FULLINDEX -else - for i in $CMDLIST - do - for i in `ls -1 $i.*.html` - do - BASENAME=`basename $i .html` - SHORTDESC="`cat $i | awk '/NAME/,/SYNOPSIS/' | grep '' | cut -d'-' -f2- | sed 's+^ ++g' | grep -vi 'SYNOPSIS' | head -n 1`" - echo "" >> $FULLINDEX - done - done -fi -echo "
[There are no user addon help pages.]
$BASENAME $SHORTDESC
" >> $FULLINDEX - -write_html_footer $FULLINDEX -# done full index - -# user redirects to app dir for main index files - -for i in index full_index display database general imagery misc postscript raster raster3D vector -do -echo " - - - - - - - - -" > $i.html -done - -# add Help Viewer links in user docs folder - -mkdir -p $HOME/Library/Documentation/Help/ -ln -sfh ../../GRASS/$GRASS_MMVER/Modules/docs/html $HOME/Library/Documentation/Help/GRASS-$GRASS_MMVER-addon -ln -sfh $GISBASE/docs/html $HOME/Library/Documentation/Help/GRASS-$GRASS_MMVER diff --git a/macos/files/conda-requirements-dev-arm64.txt b/macos/files/conda-requirements-dev-arm64.txt new file mode 100644 index 00000000000..83d600fe17c --- /dev/null +++ b/macos/files/conda-requirements-dev-arm64.txt @@ -0,0 +1,49 @@ +boost +cairo +clangxx_osx-arm64 +clang_osx-arm64 +cmake +expat +fftw +flex +freetype +geos +gettext +ghostscript +giflib +git +krb5 +lastools +libgdal-arrow-parquet +libgdal-core +libgdal-hdf4 +libgdal-hdf5 +libgdal-netcdf +libgdal-pdf +libgdal-pg +libgdal-postgisraster +libgdal-tiledb +libiconv +libjpeg-turbo +libpng +libsvm +libtiff +lld +llvm-openmp +matplotlib +numpy +openblas +pandoc +pdal +pillow +pkg-config +ply +postgresql +proj +python.app +python<3.13 +setuptools +six +sqlite +wxpython=4.2.2 +zstd diff --git a/macos/files/conda-requirements-dev-x86_64.txt b/macos/files/conda-requirements-dev-x86_64.txt new file mode 100644 index 00000000000..b94a8e0e3e5 --- /dev/null +++ b/macos/files/conda-requirements-dev-x86_64.txt @@ -0,0 +1,49 @@ +boost +cairo +clangxx_osx-64 +clang_osx-64 +cmake +expat +fftw +flex +freetype +geos +gettext +ghostscript +giflib +git +krb5 +lastools +libgdal-arrow-parquet +libgdal-core +libgdal-hdf4 +libgdal-hdf5 +libgdal-netcdf +libgdal-pdf +libgdal-pg +libgdal-postgisraster +libgdal-tiledb +libiconv +libjpeg-turbo +libpng +libsvm +libtiff +lld +llvm-openmp +matplotlib +numpy +openblas +pandoc +pdal +pillow +pkg-config +ply +postgresql +proj +python.app +python<3.13 +setuptools +six +sqlite +wxpython=4.2.2 +zstd diff --git a/macos/files/conda-requirements-stable-arm64.txt b/macos/files/conda-requirements-stable-arm64.txt new file mode 100644 index 00000000000..fd9951679a6 --- /dev/null +++ b/macos/files/conda-requirements-stable-arm64.txt @@ -0,0 +1,279 @@ +# This file may be used to create an environment using: +# $ conda create --name --file +# platform: osx-arm64 +# created-by: conda 24.11.2 +@EXPLICIT +https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.6.2-hce30654_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda +https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.4-h5505292_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/json-c-0.18-he4178ee_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.85.0-hce30654_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libfabric1-2.0.0-h5505292_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libntlm-1.8-h5505292_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.9.0-h5505292_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-19.1.6-hdb05f8b_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h93a5062_1001.conda +https://conda.anaconda.org/conda-forge/osx-arm64/m4-1.4.18-h642e427_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/metis-5.1.0-h15f6cfe_1007.conda +https://conda.anaconda.org/conda-forge/osx-arm64/mpi-1.0-openmpi.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda +https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda +https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda +https://conda.anaconda.org/conda-forge/osx-arm64/rav1e-0.6.6-h69fbcac_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.5-h7ab814d_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/tzcode-2024b-hd74edd7_0.conda +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/draco-1.5.7-h2ffa867_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.4-h286801f_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/flex-2.6.4-h1474e2a_1004.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/fmt-11.0.2-h420ef59_0.conda +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.13.0-hf9b8971_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda +https://conda.anaconda.org/conda-forge/osx-arm64/ghostscript-10.04.0-hf9b8971_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda +https://conda.anaconda.org/conda-forge/osx-arm64/lastools-v2.0.2-hebf3989_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.3-hebf3989_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.22.5-h8414b35_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.6-h6dc3340_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libde265-1.0.15-h2ffa867_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libfabric-2.0.0-hce30654_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8414b35_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-devel-5.6.3-h39f12f2_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.45-h3783ad8_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libsvm-335-hf9b8971_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/nitro-2.7.dev8-h13dd4ca_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.36-h5833ebf_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.44-h297a79d_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.44.2-h2f9eb0b_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda +https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-2.3.0-hf24288c_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1300.6.5-h03f4b80_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.8-h00cdb27_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/x265-3.5-hbc6ce65_3.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.2.5-h92fc2f4_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/xz-gpl-tools-5.6.3-h9a6d368_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/xz-tools-5.6.3-h39f12f2_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hd74edd7_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/capnproto-1.0.2-h221ca0e_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/cpd-0.5.5-h420ef59_2.conda +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/gettext-tools-0.22.5-h8414b35_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.7.7-h3b16cec_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-devel-0.22.5-h8414b35_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libavif16-1.1.1-h45b7238_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.22.5-h8414b35_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.82.2-h07bd6cf_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.11.2-default_hbce5d74_1001.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8414b35_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-he250239_1021.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.6-hc4b4ae8_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha2cf0f4_17.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libxslt-1.1.39-h223e5b9_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.11.2-h1336266_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/minizip-4.0.7-hff1a8ea_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.107-hc555b47_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.8-hc22306f_1_cpython.conda +https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/spdlog-1.15.0-h096ffd4_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.47.2-hd7222ec_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.6.3-h9a6d368_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_5.conda +https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hd74edd7_2.conda +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/cyrus-sasl-2.1.27-h60b93bd_7.conda +https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda +https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.15.0-h1383a14_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/freexl-2.0.0-h3ab3353_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.7-py312h6142ec9_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-951.9-hb91ea2e_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libboost-1.85.0-hf763ba5_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.6-default_hf90f093_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-devel-0.22.5-h8414b35_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libheif-1.19.5-gpl_h297b2c4_100.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpmix-5.0.6-h6500a5a_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libsuitesparseconfig-7.8.3-ss783_h714a54a.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/lld-19.1.6-hc093e66_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.6-h87a4c7e_0.conda +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-hde07d2e_1009.conda +https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/python.app-1.4-py312h830b0dc_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py312hea69d52_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-16.0.0-py312hea69d52_0.conda +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.2-h6a3b0d2_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.6-default_hf90f093_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/cmake-3.31.4-ha25475f_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.55.3-py312h998013c_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.22.5-h8414b35_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/git-2.47.1-pl5321hd71a902_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_ha698983_108.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libamd-3.3.3-ss783_h6dbf161.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libboost-devel-1.85.0-hf450f58_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libbtf-2.3.2-ss783_h6c9afe8.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libcamd-3.3.3-ss783_h6c9afe8.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libccolamd-3.3.4-ss783_h6c9afe8.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libcolamd-3.3.4-ss783_h6c9afe8.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libcxsparse-4.4.1-ss783_hbf61d5d.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libldl-3.3.2-ss783_h6c9afe8.conda +https://conda.anaconda.org/conda-forge/osx-arm64/librbio-4.3.4-ss783_h6c9afe8.conda +https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.6-hd2aecb6_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/openblas-0.3.28-openmp_hea878ba_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/openldap-2.6.9-hbe55e7a_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/openmpi-5.0.6-hc946d3c_101.conda +https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py312h50aef2c_0.conda +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.5.1-h1318a7e_0.conda +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/wxwidgets-3.2.6-h6a86719_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.0-hfc2798a_16.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda +https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1010.6-h3f5b1a0_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.6-default_h474c9e2_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/fgt-0.4.11-h745860c_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/geotiff-1.7.3-h82bf549_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.33.0-hdbe95d5_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-26_osxarm64_openblas.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.9.2-nompi_h610d594_116.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpq-17.2-ha9b7db8_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-hf92fc0a_12.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libspex-3.2.1-ss783_h30f3287.conda +https://conda.anaconda.org/conda-forge/osx-arm64/poppler-24.12.0-ha29e788_2.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.7-h1be5864_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-19.1.6-default_h1ffe849_0.conda +https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.6-h7969c41_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libcholmod-5.3.0-ss783_h87d6651.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.10.1-h9ef0d2d_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.33.0-h7081f7f_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.2.1-py312h41c6370_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/postgresql-17.2-h0e1cb1d_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.8-h23176ea_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda +https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.6-hd2aecb6_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.1-py312hb23fbb9_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-1.85.0-py312hffe1f2a_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-hdf4-3.10.1-hd589a83_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-hdf5-3.10.1-h8e86020_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-pdf-3.10.1-hb9cf988_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-pg-3.10.1-h98ad515_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-postgisraster-3.10.1-h98ad515_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libklu-2.3.5-ss783_h4a7adf4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-core-2.8.3-ha226718_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libspqr-4.3.4-ss783_h93d26d6.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libumfpack-6.3.5-ss783_h852ec90.conda +https://conda.anaconda.org/conda-forge/osx-arm64/wxpython-4.2.2-py312hd8f9ff3_3.conda +https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.458-h794939a_5.conda +https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.6-h253acbe_23.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libboost-python-devel-1.85.0-py312ha814d7c_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-netcdf-3.10.1-h3ef4abb_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libparu-1.0.0-ss783_hf1d7083.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-cpd-2.8.3-h286801f_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-draco-2.8.3-h286801f_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-e57-2.8.3-he43c3ef_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-icebridge-2.8.3-h137fbe7_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-nitf-2.8.3-h61de071_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-pgpointcloud-2.8.3-h8f22ee4_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.0-py312hdbc7e53_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/python-pdal-3.4.5-py312h6f04bcc_13.conda +https://conda.anaconda.org/conda-forge/osx-arm64/boost-1.85.0-ha814d7c_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-19.1.6-h07b0088_23.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-18.1.0-hf3eb8e5_8_cpu.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-hdf-2.8.3-h137fbe7_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.0-py312h1f38498_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/suitesparse-7.8.3-ss783_h3b2878a.conda +https://conda.anaconda.org/conda-forge/osx-arm64/tiledb-2.27.0-h088f2a8_4.conda +https://conda.anaconda.org/conda-forge/osx-arm64/ceres-solver-2.2.0-h30efb5c_5.conda +https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.6-h3e0e5ee_23.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-18.1.0-hf07054f_8_cpu.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-tiledb-3.10.1-h3b22183_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-18.1.0-h636d7b7_8_cpu.conda +https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-19.1.6-h07b0088_23.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-18.1.0-hf07054f_8_cpu.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-tiledb-2.8.3-hb24f26d_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-trajectory-2.8.3-h0cbbbd6_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-arrow-parquet-3.10.1-h43e3b2e_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-arrow-2.8.3-h35fe574_0.conda +https://conda.anaconda.org/conda-forge/osx-arm64/libpdal-2.8.3-hce30654_0.conda +https://conda.anaconda.org/conda-forge/noarch/pdal-2.8.3-hd8ed1ab_0.conda diff --git a/macos/files/conda-requirements-stable-x86_64.txt b/macos/files/conda-requirements-stable-x86_64.txt new file mode 100644 index 00000000000..6c7bb7f5e64 --- /dev/null +++ b/macos/files/conda-requirements-stable-x86_64.txt @@ -0,0 +1,279 @@ +# This file may be used to create an environment using: +# $ conda create --name --file +# platform: osx-64 +# created-by: conda 24.11.2 +@EXPLICIT +https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.6.2-h694c41f_0.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.10.6-h6e16a3a_0.conda +https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda +https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.4-hf13058a_0.conda +https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda +https://conda.anaconda.org/conda-forge/osx-64/dav1d-1.2.1-h0dc2134_0.conda +https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda +https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda +https://conda.anaconda.org/conda-forge/osx-64/json-c-0.18-hc62ec3d_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.85.0-h694c41f_4.conda +https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h00291cd_2.conda +https://conda.anaconda.org/conda-forge/osx-64/libcxx-19.1.6-hf95d169_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.23-he65b83e_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda +https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libfabric1-2.0.0-h6e16a3a_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda +https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda +https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.6.3-hd471939_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libntlm-1.8-h6e16a3a_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.9.0-h6e16a3a_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libuv-1.49.2-hd79239c_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.5.0-h6cf52b4_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda +https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-19.1.6-ha54dae1_0.conda +https://conda.anaconda.org/conda-forge/osx-64/lzo-2.10-h10d778d_1001.conda +https://conda.anaconda.org/conda-forge/osx-64/m4-1.4.18-haf1e3a3_1001.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/metis-5.1.0-h3023b02_1007.conda +https://conda.anaconda.org/conda-forge/osx-64/mpi-1.0-openmpi.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_2.conda +https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda +https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda +https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda +https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.12-5_cp312.conda +https://conda.anaconda.org/conda-forge/osx-64/rav1e-0.6.6-h7205ca4_2.conda +https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.5-ha44c9a9_0.conda +https://conda.anaconda.org/conda-forge/osx-64/tzcode-2024b-h00291cd_0.conda +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda +https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h6e16a3a_0.conda +https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h00291cd_0.conda +https://conda.anaconda.org/conda-forge/osx-64/aom-3.9.1-hf036a51_0.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.0-hc0df2db_5.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.2.2-hc0df2db_0.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.2-hc0df2db_4.conda +https://conda.anaconda.org/conda-forge/osx-64/draco-1.5.7-h7728843_0.conda +https://conda.anaconda.org/conda-forge/osx-64/eigen-3.4.0-h1c7c39f_0.conda +https://conda.anaconda.org/conda-forge/osx-64/expat-2.6.4-h240833e_0.conda +https://conda.anaconda.org/conda-forge/osx-64/flex-2.6.4-hcc69e7b_1004.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/fmt-11.0.2-h3c5361c_0.conda +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/geos-3.13.0-hac325c4_0.conda +https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda +https://conda.anaconda.org/conda-forge/osx-64/ghostscript-10.04.0-hac325c4_0.conda +https://conda.anaconda.org/conda-forge/osx-64/gmp-6.3.0-hf036a51_2.conda +https://conda.anaconda.org/conda-forge/osx-64/hdf4-4.2.15-h8138101_7.conda +https://conda.anaconda.org/conda-forge/osx-64/lastools-20171231-h046ec9c_1002.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/libabseil-20240722.0-cxx17_h0e468a2_4.conda +https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.3-h73e2aa4_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.22.5-hdfe23c8_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h00291cd_2.conda +https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h00291cd_2.conda +https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/libcxx-devel-19.1.6-h7c275be_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libde265-1.0.15-h7728843_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20240808-pl5321ha958ccf_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libfabric-2.0.0-h694c41f_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-hdfe23c8_3.conda +https://conda.anaconda.org/conda-forge/osx-64/liblzma-devel-5.6.3-hd471939_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.45-h3c4a55f_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.47.2-hdb6dae5_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libsvm-335-hac325c4_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.13.5-hebb159f_1.conda +https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.10.0-h240833e_1.conda +https://conda.anaconda.org/conda-forge/osx-64/nitro-2.7.dev8-he965462_0.conda +https://conda.anaconda.org/conda-forge/osx-64/nspr-4.36-h97d8b74_0.conda +https://conda.anaconda.org/conda-forge/osx-64/openssl-3.4.0-hc426f3f_1.conda +https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.44-h7634a1b_2.conda +https://conda.anaconda.org/conda-forge/osx-64/pixman-0.44.2-h1fd1274_0.conda +https://conda.anaconda.org/conda-forge/osx-64/pkg-config-0.29.2-hf7e621a_1009.conda +https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda +https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda +https://conda.anaconda.org/conda-forge/osx-64/snappy-1.2.1-haf3c120_1.conda +https://conda.anaconda.org/conda-forge/osx-64/svt-av1-2.3.0-h97d8b74_0.conda +https://conda.anaconda.org/conda-forge/osx-64/tapi-1300.6.5-h390ca13_0.conda +https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda +https://conda.anaconda.org/conda-forge/osx-64/uriparser-0.9.8-h6aefe2f_0.conda +https://conda.anaconda.org/conda-forge/osx-64/x265-3.5-hbb4e6a2_3.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.2.5-h197e74d_2.conda +https://conda.anaconda.org/conda-forge/osx-64/xz-gpl-tools-5.6.3-h357f2ed_1.conda +https://conda.anaconda.org/conda-forge/osx-64/xz-tools-5.6.3-hd471939_1.conda +https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda +https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.6-h915ae27_0.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.8.1-hc0df2db_3.conda +https://conda.anaconda.org/conda-forge/osx-64/blosc-1.21.6-hd145fbb_1.conda +https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h00291cd_2.conda +https://conda.anaconda.org/conda-forge/osx-64/capnproto-1.0.2-h1c0ecac_3.conda +https://conda.anaconda.org/conda-forge/osx-64/cpd-0.5.5-h3c5361c_2.conda +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda +https://conda.anaconda.org/conda-forge/osx-64/gettext-tools-0.22.5-hdfe23c8_3.conda +https://conda.anaconda.org/conda-forge/osx-64/glog-0.7.1-h2790a97_0.conda +https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.7.7-h1a33361_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libasprintf-devel-0.22.5-hdfe23c8_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libavif16-1.1.1-h71406da_2.conda +https://conda.anaconda.org/conda-forge/osx-64/libevent-2.1.12-ha90c15b_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.22.5-hdfe23c8_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libglib-2.82.2-hb6ef654_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libhwloc-2.11.2-default_h4cdd727_1001.conda +https://conda.anaconda.org/conda-forge/osx-64/libintl-devel-0.22.5-hdfe23c8_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libkml-1.3.0-h9ee1731_1021.conda +https://conda.anaconda.org/conda-forge/osx-64/libllvm19-19.1.6-hc29ff6c_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.64.0-hc7306c3_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-5.28.3-h6401091_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2024.07.02-h0e468a2_2.conda +https://conda.anaconda.org/conda-forge/osx-64/librttopo-1.1.0-hdfb80b9_17.conda +https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-h3dc7d44_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.0-hb77a491_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libxslt-1.1.39-h03b04e6_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libzip-1.11.2-h31df5bb_0.conda +https://conda.anaconda.org/conda-forge/osx-64/minizip-4.0.7-hfb7a1ec_3.conda +https://conda.anaconda.org/conda-forge/osx-64/mpfr-4.2.1-haed47dc_3.conda +https://conda.anaconda.org/conda-forge/osx-64/nss-3.107-h81a00e3_0.conda +https://conda.anaconda.org/conda-forge/osx-64/python-3.12.8-h9ccd52b_1_cpython.conda +https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/spdlog-1.15.0-h0ec5880_0.conda +https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.47.2-h2e4c9dc_0.conda +https://conda.anaconda.org/conda-forge/osx-64/xz-5.6.3-h357f2ed_1.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.15.3-h7bd4489_5.conda +https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h00291cd_2.conda +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda +https://conda.anaconda.org/conda-forge/osx-64/cyrus-sasl-2.1.27-hf9bab2b_7.conda +https://conda.anaconda.org/conda-forge/osx-64/fftw-3.3.10-nompi_h292e606_110.conda +https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.15.0-h37eeddb_1.conda +https://conda.anaconda.org/conda-forge/osx-64/freexl-2.0.0-h3183152_2.conda +https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.7-py312hc5c4d5f_0.conda +https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda +https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-951.9-h9d2de3d_2.conda +https://conda.anaconda.org/conda-forge/osx-64/libboost-1.85.0-hcca3243_4.conda +https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp19.1-19.1.6-default_h3571c67_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.11.1-h5dec5d8_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-devel-0.22.5-hdfe23c8_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libheif-1.19.5-gpl_hc62a4a2_100.conda +https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.28-openmp_hbf64a52_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libpmix-5.0.6-h2a508f7_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libsuitesparseconfig-7.8.3-ss783_he344b7b.conda +https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.21.0-h75589b3_0.conda +https://conda.anaconda.org/conda-forge/osx-64/lld-19.1.6-hcd1802e_0.conda +https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19-19.1.6-he90a8e3_0.conda +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 +https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.3-h7fd6d84_0.conda +https://conda.anaconda.org/conda-forge/osx-64/orc-2.0.3-h85ea3fe_2.conda +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda +https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda +https://conda.anaconda.org/conda-forge/osx-64/python.app-1.4-py312hb553811_4.conda +https://conda.anaconda.org/conda-forge/osx-64/re2-2024.07.02-ha5e900a_2.conda +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda +https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4.2-py312h01d7ebd_0.conda +https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-16.0.0-py312h01d7ebd_0.conda +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.0-h8236443_11.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.9.2-h5492b4a_4.conda +https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.14.0-h9a36307_0.conda +https://conda.anaconda.org/conda-forge/osx-64/cairo-1.18.2-h950ec3b_1.conda +https://conda.anaconda.org/conda-forge/osx-64/clang-19-19.1.6-default_h3571c67_0.conda +https://conda.anaconda.org/conda-forge/osx-64/cmake-3.31.4-h477996e_0.conda +https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.55.3-py312h3520af0_1.conda +https://conda.anaconda.org/conda-forge/osx-64/gettext-0.22.5-hdfe23c8_3.conda +https://conda.anaconda.org/conda-forge/osx-64/git-2.47.1-pl5321h0e333bc_0.conda +https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.3-nompi_h1607680_108.conda +https://conda.anaconda.org/conda-forge/osx-64/libamd-3.3.3-ss783_hd70f86c.conda +https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-26_osx64_openblas.conda +https://conda.anaconda.org/conda-forge/osx-64/libboost-devel-1.85.0-h2b186f8_4.conda +https://conda.anaconda.org/conda-forge/osx-64/libbtf-2.3.2-ss783_ha7556f6.conda +https://conda.anaconda.org/conda-forge/osx-64/libcamd-3.3.3-ss783_ha7556f6.conda +https://conda.anaconda.org/conda-forge/osx-64/libccolamd-3.3.4-ss783_ha7556f6.conda +https://conda.anaconda.org/conda-forge/osx-64/libcolamd-3.3.4-ss783_ha7556f6.conda +https://conda.anaconda.org/conda-forge/osx-64/libcxsparse-4.4.1-ss783_h6325aac.conda +https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.67.1-h4896ac0_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libldl-3.3.2-ss783_ha7556f6.conda +https://conda.anaconda.org/conda-forge/osx-64/librbio-4.3.4-ss783_ha7556f6.conda +https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-19.1.6-h3fe3016_0.conda +https://conda.anaconda.org/conda-forge/osx-64/openblas-0.3.28-openmp_h30af337_1.conda +https://conda.anaconda.org/conda-forge/osx-64/openldap-2.6.9-hd8a590d_0.conda +https://conda.anaconda.org/conda-forge/osx-64/openmpi-5.0.6-ha3b7a7e_101.conda +https://conda.anaconda.org/conda-forge/osx-64/pillow-11.1.0-py312hd9f36e3_0.conda +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda +https://conda.anaconda.org/conda-forge/osx-64/proj-9.5.1-h5273da6_0.conda +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda +https://conda.anaconda.org/conda-forge/osx-64/wxwidgets-3.2.6-h482b343_1.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.8.0-h6661f4c_16.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.11.0-h3488609_12.conda +https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.10.0-ha4e2ba9_0.conda +https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.8.0-h1ccc5ac_1.conda +https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-1010.6-hadbd6bd_2.conda +https://conda.anaconda.org/conda-forge/osx-64/clang-19.1.6-default_h576c50e_0.conda +https://conda.anaconda.org/conda-forge/osx-64/fgt-0.4.11-hf719765_1.conda +https://conda.anaconda.org/conda-forge/osx-64/geotiff-1.7.3-h2b6e260_3.conda +https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-26_osx64_openblas.conda +https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.33.0-h7000a09_1.conda +https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-26_osx64_openblas.conda +https://conda.anaconda.org/conda-forge/osx-64/libnetcdf-4.9.2-nompi_hf3c7182_116.conda +https://conda.anaconda.org/conda-forge/osx-64/libpq-17.2-h639cf83_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libspatialite-5.1.0-h74337a0_12.conda +https://conda.anaconda.org/conda-forge/osx-64/libspex-3.2.1-ss783_h2c43358.conda +https://conda.anaconda.org/conda-forge/osx-64/poppler-24.12.0-hcc361ce_2.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.7.7-ha6e97d4_0.conda +https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.13.0-h3d2f5f1_1.conda +https://conda.anaconda.org/conda-forge/osx-64/clangxx-19.1.6-default_heb2e8d1_0.conda +https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-19.1.6-hc6f8467_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libcholmod-5.3.0-ss783_h7fe8f01.conda +https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.10.1-ha746336_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.33.0-h3f2b517_1.conda +https://conda.anaconda.org/conda-forge/osx-64/numpy-2.2.1-py312h22eab8f_0.conda +https://conda.anaconda.org/conda-forge/osx-64/postgresql-17.2-h9d4d8b1_1.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.29.8-he4e532f_1.conda +https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.12.0-h86941f0_1.conda +https://conda.anaconda.org/conda-forge/osx-64/compiler-rt-19.1.6-h52031e2_0.conda +https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.3.1-py312hc47a885_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libboost-python-1.85.0-py312h44e70fa_4.conda +https://conda.anaconda.org/conda-forge/osx-64/libgdal-hdf4-3.10.1-hf89130c_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libgdal-hdf5-3.10.1-h953d8a0_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libgdal-pdf-3.10.1-h8f2cad4_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libgdal-pg-3.10.1-hebcac8f_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libgdal-postgisraster-3.10.1-hebcac8f_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libklu-2.3.5-ss783_hdf6d925.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-core-2.8.2-hc5073cc_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libspqr-4.3.4-ss783_h0b03d82.conda +https://conda.anaconda.org/conda-forge/osx-64/libumfpack-6.3.5-ss783_h53c776b.conda +https://conda.anaconda.org/conda-forge/osx-64/wxpython-4.2.2-py312h97a8bdf_3.conda +https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.458-h991d4cc_5.conda +https://conda.anaconda.org/conda-forge/osx-64/clang_impl_osx-64-19.1.6-h5cba23b_23.conda +https://conda.anaconda.org/conda-forge/osx-64/libboost-python-devel-1.85.0-py312h0be7463_4.conda +https://conda.anaconda.org/conda-forge/osx-64/libgdal-netcdf-3.10.1-hb143bf5_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libparu-1.0.0-ss783_hd366fff.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-cpd-2.8.2-h9a36bc9_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-draco-2.8.2-h9a36bc9_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-e57-2.8.2-hce94de9_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-icebridge-2.8.2-h8a15d71_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-nitf-2.8.2-ha2ed768_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-pgpointcloud-2.8.2-h6c51b8f_1.conda +https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.0-py312h535dea3_0.conda +https://conda.anaconda.org/conda-forge/osx-64/python-pdal-3.4.5-py312h759e574_13.conda +https://conda.anaconda.org/conda-forge/osx-64/boost-1.85.0-h0be7463_4.conda +https://conda.anaconda.org/conda-forge/osx-64/clang_osx-64-19.1.6-h7e5c614_23.conda +https://conda.anaconda.org/conda-forge/osx-64/libarrow-18.1.0-h419a0db_8_cpu.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-hdf-2.8.2-h8a15d71_1.conda +https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.0-py312hb401068_0.conda +https://conda.anaconda.org/conda-forge/osx-64/suitesparse-7.8.3-ss783_h8b3df4c.conda +https://conda.anaconda.org/conda-forge/osx-64/tiledb-2.27.0-h043df88_4.conda +https://conda.anaconda.org/conda-forge/osx-64/ceres-solver-2.2.0-he6a300e_5.conda +https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-19.1.6-hdf8cba3_23.conda +https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-18.1.0-ha6338a2_8_cpu.conda +https://conda.anaconda.org/conda-forge/osx-64/libgdal-tiledb-3.10.1-h2d0d9f7_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libparquet-18.1.0-h3e22b07_8_cpu.conda +https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-19.1.6-h7e5c614_23.conda +https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-18.1.0-ha6338a2_8_cpu.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-tiledb-2.8.2-h36a597b_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-trajectory-2.8.2-h3c2bd59_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libgdal-arrow-parquet-3.10.1-h0a3f151_0.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-arrow-2.8.2-h1b45f5b_1.conda +https://conda.anaconda.org/conda-forge/osx-64/libpdal-2.8.2-h57a307c_1.conda +https://conda.anaconda.org/conda-forge/noarch/pdal-2.8.2-hd8ed1ab_0.conda diff --git a/macos/files/configure-build.sh.in b/macos/files/configure-build.sh.in new file mode 100755 index 00000000000..88bae79cb49 --- /dev/null +++ b/macos/files/configure-build.sh.in @@ -0,0 +1,16 @@ +#!/bin/bash + +# full path to the SDK to build with +# sdk="/Library/Developer/CommandLineTools/SDKs/MacOSX10.13.sdk" + +# setting DEPLOYMENT_TARGET here is optional (MACOSX_DEPLOYMENT_TARGET +# of the SDK is the default) this will set MACOSX_DEPLOYMENT_TARGET +deployment_target=10.13 + +# setting CONDA_REQ_FILE here is optional (files/conda-requirements-stable[arm64|x86_64].txt +# is used by default) +# conda_req_file="${this_script_dir}/files/conda-requirements-dev-x86_64.txt" + +cs_ident="" +cs_keychain_profile="" +cs_provisionprofile="" diff --git a/macos/files/configure-grass.sh b/macos/files/configure-grass.sh new file mode 100755 index 00000000000..4ddd787e825 --- /dev/null +++ b/macos/files/configure-grass.sh @@ -0,0 +1,101 @@ +#!/bin/bash + +############################################################################ +# +# TOOL: configure-grass.sh +# AUTHOR(s): Nicklas Larsson +# PURPOSE: Sets up configure and compiler flags and configures GRASS GIS +# COPYRIGHT: (c) 2020-2025 Nicklas Larsson and the GRASS Development Team +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +############################################################################# + +PREFIX=$(python3 -c 'import sys; print(sys.prefix)') +export PREFIX +export PATH=${PREFIX}/bin:/usr/bin:/bin:/usr/sbin:/etc:/usr/lib +GRASS_PYTHON=$(which pythonw) +export GRASS_PYTHON +export CC=${PREFIX}/bin/clang +export CXX=${PREFIX}/bin/clang++ +export MACOSX_DEPLOYMENT_TARGET=$deployment_target + +export LDFLAGS="-fuse-ld=lld -Wl,-rpath,${PREFIX}/lib" +export CFLAGS="-O2 -pipe -arch ${arch} -DGL_SILENCE_DEPRECATION" +export CXXFLAGS="-O2 -pipe -stdlib=libc++ -arch ${arch}" + +CONFIGURE_FLAGS="\ + --with-macosx-sdk=${sdk} \ + --with-opengl=aqua \ + --with-openmp \ + --prefix=${PREFIX} \ + --without-x \ + --with-freetype \ + --with-freetype-includes=${PREFIX}/include/freetype2 \ + --with-freetype-libs=${PREFIX}/lib \ + --with-gdal=${PREFIX}/bin/gdal-config \ + --with-proj-includes=${PREFIX}/include \ + --with-proj-libs=${PREFIX}/lib \ + --with-proj-share=${PREFIX}/share/proj \ + --with-geos=${PREFIX}/bin/geos-config \ + --with-libpng=${PREFIX}/bin/libpng-config \ + --with-tiff-includes=${PREFIX}/include \ + --with-tiff-libs=${PREFIX}/lib \ + --with-postgres=yes \ + --with-postgres-includes=${PREFIX}/include \ + --with-postgres-libs=${PREFIX}/lib \ + --without-mysql \ + --with-sqlite \ + --with-sqlite-libs=${PREFIX}/lib \ + --with-sqlite-includes=${PREFIX}/include \ + --with-fftw-includes=${PREFIX}/include \ + --with-fftw-libs=${PREFIX}/lib \ + --with-cxx \ + --with-cairo \ + --with-cairo-includes=${PREFIX}/include/cairo \ + --with-cairo-libs=${PREFIX}/lib \ + --with-cairo-ldflags="-lcairo" \ + --with-zstd \ + --with-zstd-libs=${PREFIX}/lib \ + --with-zstd-includes=${PREFIX}/include \ + --with-bzlib \ + --with-bzlib-libs=${PREFIX}/lib \ + --with-bzlib-includes=${PREFIX}/include \ + --with-netcdf=${PREFIX}/bin/nc-config \ + --with-netcdf=${PREFIX}/bin/nc-config \ + --with-nls \ + --with-libsvm \ + --with-libs=${PREFIX}/lib \ + --with-includes=${PREFIX}/include \ + --with-pdal=${PREFIX}/bin/pdal-config \ + --with-readline \ + --with-readline-includes=${PREFIX}/include/readline \ + --with-readline-libs=${PREFIX}/lib +" + +if [ "$grass_version_major$grass_version_minor" -ge 85 ]; then + CONFIGURE_FLAGS="\ + ${CONFIGURE_FLAGS} \ + --with-blas=openblas \ + --with-lapack=openblas + " +else + CONFIGURE_FLAGS="\ + ${CONFIGURE_FLAGS} \ + --with-blas \ + --with-blas-libs=${PREFIX}/lib \ + --with-blas-includes=${PREFIX}/include \ + --with-lapack \ + --with-lapack-includes=${PREFIX}/include \ + --with-lapack-libs=${PREFIX}/lib + " +fi + +if [[ "$with_liblas" -eq 1 ]]; then + CONFIGURE_FLAGS="\ + ${CONFIGURE_FLAGS} \ + --with-liblas=${PREFIX}/bin/liblas-config + " +fi + +./configure $CONFIGURE_FLAGS diff --git a/macos/files/dmg-background.png b/macos/files/dmg-background.png new file mode 100644 index 00000000000..08add9408f8 Binary files /dev/null and b/macos/files/dmg-background.png differ diff --git a/macos/files/grass.entitlements b/macos/files/grass.entitlements new file mode 100644 index 00000000000..8cc185af8d7 --- /dev/null +++ b/macos/files/grass.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.cs.disable-library-validation + + + diff --git a/macos/files/grass.scpt b/macos/files/grass.scpt new file mode 100755 index 00000000000..ba9a4c47e60 --- /dev/null +++ b/macos/files/grass.scpt @@ -0,0 +1,7 @@ +tell application "Terminal" + set this_scpt to (POSIX path of (path to me as string)) + set grass_path to characters 1 thru -((offset of "/" in (reverse of items of this_scpt as string)) + 1) of this_scpt as string + set grass_startup to (quoted form of (grass_path & "/grass.sh")) + set grassRun to grass_startup & "; exit" + do script grassRun +end tell diff --git a/macos/files/grass.sh.in b/macos/files/grass.sh.in index 07bb58fdc83..87c3dce0e76 100755 --- a/macos/files/grass.sh.in +++ b/macos/files/grass.sh.in @@ -1,59 +1,43 @@ -#! /bin/sh +#!/bin/bash + ############################################################################# # -# MODULE: GRASS Initialization -# AUTHOR(S): Justin Hickey - Thailand - jhickey@hpcc.nectec.or.th +# MODULE: GRASS Initialization +# AUTHOR(S): Justin Hickey - Thailand - jhickey@hpcc.nectec.or.th # William Kyngesburye - kyngchaos@kyngchaos.com -# PURPOSE: The source file for this shell script is in -# macosx/app/grass.sh.in and is the grass startup script for -# the Mac OS X application build. -# COPYRIGHT: (C) 2000-2008 by the GRASS Development Team +# Eric Hutton +# Michael Barton - michael.barton@asu.edu +# PURPOSE: The GRASS GIS startup script for the macOS application. +# COPYRIGHT: (c) 2000-2025 by the GRASS Development Team # -# This program is free software under the GNU General Public -# License (>=v2). Read the file COPYING that comes with GRASS -# for details. +# SPDX-License-Identifier: GPL-2.0-or-later # ############################################################################# +# script_dir=$(dirname "$(dirname "$0")") +app_dir="$(cd "$(dirname "$0")/../.."; pwd -P)" + # Mac app only startup shell - complete rewrite for starting from a GRASS.app # in Mac OS X. Sets defaults for unset env, adds some Mac-only config. trap "echo 'User break!' ; exit" 2 3 9 15 -# dummy for now - just saying we're starting GRASS.app on OSX -GRASS_OS_STARTUP="Mac.app" -export GRASS_OS_STARTUP - -SYSARCH=`uname -p` -SYSVER=`uname -r | cut -d . -f 1` - -GISBASE=`dirname "$0"` -export GISBASE -grass_ver=`cut -d . -f 1-2 "$GISBASE/etc/VERSIONNUMBER"` +export GISBASE=$app_dir/Contents/Resources +grass_ver=$(cut -d . -f 1-2 "$GISBASE/etc/VERSIONNUMBER") -#override config dir. -GRASS_CONFIG_DIR="Library/Preferences/GRASS/$grass_Ver" - -GISBASE_USER="$HOME/Library/GRASS/$grass_ver" -export GISBASE_USER -GISBASE_SYSTEM="/Library/GRASS/$grass_ver" -export GISBASE_SYSTEM - -# for extra utils -# ideally user should have these in their PATH, but make sure here -PATH="@GDAL_BIN_PATH@@PROJ_BIN_PATH@$PATH" -export PATH +export GISBASE_USER="$HOME/Library/GRASS/$grass_ver" +export GISBASE_SYSTEM="/Library/GRASS/$grass_ver" # add some OS X style app support paths, and create user one if missing. -mkdir -p "$GISBASE_USER/Modules/bin" -mkdir -p "$GISBASE_USER/Modules/scripts" +mkdir -p "$GISBASE_USER/Addons/bin" +mkdir -p "$GISBASE_USER/Addons/scripts" if [ ! "$GRASS_ADDON_BASE" ] ; then - GRASS_ADDON_BASE="$GISBASE_USER/Modules" + GRASS_ADDON_BASE="$GISBASE_USER/Addons" fi export GRASS_ADDON_BASE -mkdir -p "$GISBASE_USER/Modules/etc" -addpath="$GISBASE_USER/Modules/etc:$GISBASE_SYSTEM/Modules/etc" +mkdir -p "$GISBASE_USER/Addons/etc" +addpath="$GISBASE_USER/Addons/etc:$GISBASE_SYSTEM/Addons/etc" if [ "$GRASS_ADDON_ETC" ] ; then GRASS_ADDON_ETC="$GRASS_ADDON_ETC:$addpath" else @@ -61,162 +45,20 @@ else fi export GRASS_ADDON_ETC -mkdir -p "$GISBASE_USER/Modules/lib" -addpath="$GISBASE_USER/Modules/lib:$GISBASE_SYSTEM/Modules/lib" -if [ "$DYLD_LIBRARY_PATH" ] ; then - DYLD_LIBRARY_PATH="$addpath:$DYLD_LIBRARY_PATH" -else - DYLD_LIBRARY_PATH="$addpath" -fi -export DYLD_LIBRARY_PATH - -mkdir -p "$GISBASE_USER/Modules/docs/html" - -# rebuild addon html index and gui menus -"$GISBASE/etc/build_html_user_index.sh" "$GISBASE" -"$GISBASE/etc/build_gui_user_menu.sh" +mkdir -p "$GISBASE_USER/Addons/lib" +mkdir -p "$GISBASE_USER/Addons/docs/html" # user fontcap files if [ ! "$GRASS_FONT_CAP" ] ; then - GRASS_FONT_CAP="$GISBASE_USER/Modules/etc/fontcap" + GRASS_FONT_CAP="$GISBASE_USER/Addons/etc/fontcap" fi export GRASS_FONT_CAP -# default xterm Terminal emulator -# note: only app startup defaults this way, CLI build still defaults to xterm -if [ ! "$GRASS_XTERM" ] ; then - GRASS_XTERM="$GISBASE/etc/grass-xterm-mac" - export GRASS_XTERM -fi - -# determine current term application (when grass.sh is run directly by the user) -# use osascript so we can get name of term app, not shell process -USERTERM=`osascript -e 'tell application "System Events" to item 1 of (get name of processes whose frontmost is true)'` -if [ ! "$USERTERM" ] ; then - USERTERM="Terminal" -fi - -### X11 stuff - -x11="" -if [ "@X11@" ] ; then - -# start X11 if not running -# some users may be annoyed by this, but X11 required for some stuff for now -if [ -d "/Applications/Utilities/X11.app" ] ; then - # no need to start Leopard X11.app - if [ ! -d "/usr/X11" ] ; then - # check if running anyways, even though not necessary with "open" - if [ ! "`ps -axc | grep 'X11$'`" ] ; then - open /Applications/Utilities/X11.app - fi - x11="tig" - else - x11="leo" - fi -fi - -# make sure X11 is in PATH -pathX11=`echo "$PATH" | grep '/usr/X11\(R6\)\?/bin'` -if [ ! "$pathX11" ] ; then - if [ -d "/usr/X11" ] ; then - PATH="$PATH:/usr/X11/bin" - export PATH - elif [ -d "/usr/X11R6" ] ; then - PATH="$PATH:/usr/X11R6/bin" - export PATH - fi -fi - -# make sure there is a DISPLAY set -if [ ! "$DISPLAY" ] ; then - DISPLAY=:0.0 - export DISPLAY -fi - -fi # X11 - -### end X11 block - -# for bundling wxpython -# change GRASS_WXBUNDLED and pyver_want here from bundle.make, or manually -GRASS_WXBUNDLED= -export GRASS_WXBUNDLED -pyexe="pythonw" -GRASS_PYTHONWX="$pyexe" -pyver_want="@PYVER@" -GRASS_WX64BIT="@WX64BIT@" -export GRASS_WX64BIT -# make sure python version used matches what wxpython wants -py="" -# did user set GRASS_PYTHON already? check it (must have pythonw) -if [ "$GRASS_PYTHON" ] ; then - py=`echo "$GRASS_PYTHON" | grep pythonw` - if [ "$py" ] ; then - case $GRASS_PYTHON in - /*) py="$GRASS_PYTHON" ;; - *) py=`type -p $GRASS_PYTHON` - esac - pyver=`$py -V 2>&1 | grep " $pyver_want"` - if [ ! "$pyver" ] ; then - py="" - fi - else - py="" - fi -fi # GRASS_PYTHON -# try in shell path -if [ ! "$py" ] ; then - py=`type -p pythonw$pyver_want` - if [ "$py" ] ; then - pyver=`$py -V 2>&1 | grep " $pyver_want"` - if [ ! "$pyver" ] ; then - py="" - fi - fi -fi -# try standard framework -if [ ! "$py" ] ; then - py="/Library/Frameworks/Python.framework/Versions/$pyver_want/bin/python" - if [ ! -x "$py" ] ; then - py="" - fi -fi -# try system (may be the same as in shell path) -if [ ! "$py" ] ; then - py="/usr/bin/pythonw$pyver_want" - pyver=`$py -V 2>&1 | grep " $pyver_want"` - if [ ! "$pyver" ] ; then - py="" - fi -fi - -if [ "$py" ] ; then - echo "$pyver found." - GRASS_PYTHONWX="$py" -else - echo "Warning: No Python $pyver_want found, needed by wxPython." - echo " The wxPython GUI may not work properly." -fi -export GRASS_PYTHONWX -# we will execute python scripts from the python wrapper script -GRASS_PYTHON="python" -export GRASS_PYTHON +# location of epsg database and other files needed by GDAL +export GDAL_DATA="$GISBASE/share/gdal" -# if grassrc has text startup, switch back to Terminal (gotta duplicate some init.sh stuff) -# only applies to Tiger - Leopard X11 opens automatically as needed -GRASSRC="$HOME/$GRASS_CONFIG_DIR/rc" -if [ ! "$GRASS_GUI" ] ; then - if [ -f "$GRASSRC" ] ; then - GRASS_GUI=`awk '/GRASS_GUI/ {print $2}' "$GRASSRC"` - fi - if [ ! "$GRASS_GUI" ] ; then - GRASS_GUI="wxpython" - fi -fi -if [ "$GRASS_GUI" = "text" ] && [ "$x11" = "tig" ] ; then - osascript -e "tell application \"$USERTERM\" to activate" -fi +# set Python +export GRASS_PYTHON="$GISBASE/python.app/Contents/MacOS/python" -# use the python wrapper to start grass -exec "$GISBASE/bin/python" "$GISBASE/@GRASS_NAME@" "$@" +# start GRASS +"$GRASS_PYTHON" "$GISBASE/bin/@GRASSBIN@" "--gui" "$@" diff --git a/macos/files/liblas-install.sh b/macos/files/liblas-install.sh new file mode 100755 index 00000000000..4d633917c70 --- /dev/null +++ b/macos/files/liblas-install.sh @@ -0,0 +1,135 @@ +#!/bin/bash + +############################################################################ +# +# TOOL: liblas-install.sh +# AUTHOR(s): Nicklas Larsson +# PURPOSE: Downloads, compiles and installs libLAS. +# COPYRIGHT: (c) 2021-2025 Nicklas Larsson and the GRASS Development Team +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +############################################################################# + +liblas_commit="6ada875661c46842433a13f28637f8d3d2c393bc" +liblas_zipfile_name="libLAS_${liblas_commit}.zip" +liblas_zipfile_url="https://github.com/libLAS/libLAS/archive/${liblas_commit}.zip" +liblas_source_dir_name="libLAS-${liblas_commit}" +liblas_build_dir_name=libLAS-build + +liblas_zipfile="${cache_dir}/${liblas_zipfile_name}" +liblas_source_dir="${cache_dir}/${liblas_source_dir_name}" +liblas_build_dir="${cache_dir}/${liblas_build_dir_name}" + +PREFIX=$(python3 -c 'import sys; print(sys.prefix)') +export PREFIX +export PATH="${PREFIX}/bin:/usr/bin:/bin:/usr/sbin:/etc:/usr/lib" +export CC="${PREFIX}/bin/clang" +export CXX="${PREFIX}/bin/clang++" +export MACOSX_DEPLOYMENT_TARGET="$deployment_target" +export CFLAGS="-O2 -pipe -arch ${arch}" +export CXXFLAGS="-O2 -pipe -arch ${arch} -stdlib=libc++" +export LDFLAGS="-fuse-ld=lld" + +cmake="${PREFIX}/bin/cmake" + +if [ ! -f "$liblas_zipfile" ]; then + echo "Downloading libLAS..." + curl -L "$liblas_zipfile_url" --output "$liblas_zipfile" || exit 1 +fi + +rm -rf "$liblas_source_dir" +rm -rf "$liblas_build_dir" +mkdir -p "$liblas_source_dir" +mkdir -p "$liblas_build_dir" + +unzip "$liblas_zipfile" -d "$cache_dir" &> /dev/null + +# patch needed for using now outdated GDAL api +patch -d "$liblas_source_dir" -p0 << EOF +--- src/gt_wkt_srs.cpp.orig 2020-12-14 19:56:40.000000000 +0100 ++++ src/gt_wkt_srs.cpp 2021-03-27 19:31:30.000000000 +0100 +@@ -299,7 +299,6 @@ + oSRS.SetFromUserInput(pszWKT); + oSRS.SetExtension( "PROJCS", "PROJ4", + "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs" ); +- oSRS.FixupOrdering(); + CPLFree(pszWKT); + pszWKT = NULL; + oSRS.exportToWkt(&pszWKT); +@@ -505,7 +504,6 @@ + { + char *pszWKT; + oSRS.morphFromESRI(); +- oSRS.FixupOrdering(); + if( oSRS.exportToWkt( &pszWKT ) == OGRERR_NONE ) + return pszWKT; + } +@@ -1107,7 +1105,6 @@ + /* ==================================================================== */ + char *pszWKT; + +- oSRS.FixupOrdering(); + + if( oSRS.exportToWkt( &pszWKT ) == OGRERR_NONE ) + return pszWKT; + +EOF + +# patch for missing architecture in endian detection +patch -d "$liblas_source_dir" -p0 << EOF +--- include/liblas/detail/endian.hpp.orig 2021-01-20 18:24:39.000000000 +0100 ++++ include/liblas/detail/endian.hpp 2022-09-27 18:21:23.000000000 +0200 +@@ -88,6 +88,7 @@ + || defined(_M_ALPHA) || defined(__amd64) \\ + || defined(__amd64__) || defined(_M_AMD64) \\ + || defined(__x86_64) || defined(__x86_64__) \\ ++ || defined(__arm64) || defined(__arm64__) \\ + || defined(_M_X64) + + # define LIBLAS_LITTLE_ENDIAN +EOF + +LIBLAS_CONFIGURE_FLAGS=" + -DCMAKE_OSX_SYSROOT=${sdk} \ + -DCMAKE_INCLUDE_PATH=${PREFIX}/include \ + -DCMAKE_INSTALL_PREFIX=${PREFIX} \ + -DCMAKE_MACOSX_RPATH=ON \ + -DCMAKE_INSTALL_RPATH=${PREFIX} \ + -DWITH_GEOTIFF=ON \ + -DGEOTIFF_INCLUDE_DIR=${PREFIX}/include \ + -DGEOTIFF_LIBRARY=${PREFIX}/lib/libgeotiff.dylib \ + -DWITH_GDAL=ON \ + -DGDAL_CONFIG=${PREFIX}/bin/gdal-config \ + -DPROJ4_INCLUDE_DIR=${PREFIX}/include/proj \ + -DPROJ4_LIBRARY=${PREFIX}/lib/proj7 \ + -DWITH_LASZIP=OFF \ + -DWITH_PKGCONFIG=OFF +" + +pushd "$liblas_build_dir" > /dev/null + +echo +echo "Configuring libLAS..." +"$cmake" -G "Unix Makefiles" $LIBLAS_CONFIGURE_FLAGS "$liblas_source_dir" + +echo "Compiling and installing libLAS..." +if ! make &> "${cache_dir}/libLAS_install.log" +then + echo "...libLAS compilation failed. See ${cache_dir}/libLAS_install.log." + popd > /dev/null + exit_nice 1 +fi + +if ! make install &> "${cache_dir}/libLAS_install.log" +then + echo "...libLAS installations failed. See ${cache_dir}/libLAS_install.log." + popd > /dev/null + exit_nice 1 +fi +echo "...libLAS installed successfully." + +popd > /dev/null + +export CFLAGS="" +export CXXFLAGS="" diff --git a/macos/files/main.m b/macos/files/main.m index 4192b270e7b..0ac2799f97d 100644 --- a/macos/files/main.m +++ b/macos/files/main.m @@ -1,8 +1,50 @@ -extern void ASKInitialize(); -extern int NSApplicationMain(int argc, const char *argv[]); +// +// grass-launcher-objc +// +// Created by Nicklas Larsson on 2024-02-27. +// (c) 2024-2025 Nicklas Larsson and the GRASS Development Team +// SPDX-License-Identifier: GPL-2.0-or-later + +#import +#import + +NSURL *mainExecutableParentDir(void) { + NSURL *url; + char *buf = (char *)malloc(sizeof(char) * MAXPATHLEN); + uint32_t bufSize = sizeof(buf); + if (_NSGetExecutablePath(buf, &bufSize) < 0) { + free(buf); + char *buf = (char *)malloc(sizeof(char) * bufSize); + if (_NSGetExecutablePath(buf, &bufSize) < 0) { + free(buf); + return nil; + } + url = [NSURL fileURLWithFileSystemRepresentation:buf + isDirectory:NO + relativeToURL:nil]; + free(buf); + } else { + url = [NSURL fileURLWithFileSystemRepresentation:buf + isDirectory:NO + relativeToURL:nil]; + free(buf); + } + return url.URLByDeletingLastPathComponent; +} int main(int argc, const char *argv[]) { - ASKInitialize(); + @autoreleasepool { + NSURL *script_path = mainExecutableParentDir(); + if (!script_path) { + return 1; + } + script_path = [script_path URLByAppendingPathComponent:@"grass.scpt"]; - return NSApplicationMain(argc, argv); + NSTask *task = [[NSTask alloc] init]; + task.executableURL = [NSURL fileURLWithPath:@"/usr/bin/osascript" + isDirectory:NO]; + task.arguments = @[ script_path.path ]; + [task launch]; + } + return 0; } diff --git a/macos/files/main.swift b/macos/files/main.swift new file mode 100644 index 00000000000..343cf6e22a5 --- /dev/null +++ b/macos/files/main.swift @@ -0,0 +1,30 @@ +// +// grass-launcher +// +// Created by Nicklas Larsson on 2024-02-21. +// (c) 2024-2025 Nicklas Larsson and the GRASS Development Team +// SPDX-License-Identifier: GPL-2.0-or-later + + +import Foundation + +func mainExecutableParentDir() -> URL { + var buf = [CChar](repeating: 0, count: Int(MAXPATHLEN)) + var bufSize = UInt32(buf.count) + let success = _NSGetExecutablePath(&buf, &bufSize) >= 0 + if !success { + buf = [CChar](repeating: 0, count: Int(bufSize)) + let success2 = _NSGetExecutablePath(&buf, &bufSize) >= 0 + guard success2 else { fatalError() } + } + return URL(fileURLWithFileSystemRepresentation: buf, isDirectory: false, + relativeTo: nil).deletingLastPathComponent() +} + +var script_path = mainExecutableParentDir() +script_path.appendPathComponent("grass.scpt") + +let task = Process() +task.launchPath = "/usr/bin/osascript" +task.arguments = [script_path.path] +try task.run() diff --git a/macos/files/python_wrapper b/macos/files/python_wrapper deleted file mode 100755 index 66655417f3a..00000000000 --- a/macos/files/python_wrapper +++ /dev/null @@ -1,45 +0,0 @@ -#! /bin/sh -############################################################################# -# -# MODULE: python wrapper -# AUTHOR(S): William Kyngesburye - kyngchaos@kyngchaos.com -# PURPOSE: handle arch options on OSX for running python. -# COPYRIGHT: (C) 2000-2008 by the GRASS Development Team -# -# This program is free software under the GNU General Public -# License (>=v2). Read the file COPYING that comes with GRASS -# for details. -# -############################################################################# - -# wxpython-based scripts must be started from pythonw. And depending on the -# installed wxpython, it may only be available in 32bits, while python may -# at the same time run 64bit by default. Newer systems may also reexec python -# as pythonw automatically as needed, except they don't respond to the arch -# command (and that's an Apple-only thing, and only when /usr/bin/python is -# used, yet /usr/bin/pythonw2.6 DOES respond to arch). The most universal -# and reliable method is probably to not depend on Apple's customizations and -# execute pythonw directly, 32bit if necessary. - -if [ -z "$GISBASE" ] ; then - echo "You must be in GRASS GIS to run this program." >&2 - exit 1 -fi - -SYSARCH=`uname -p` -SYSVER=`uname -r | cut -d . -f 1` - -if [ ! "$GRASS_PYTHONWX" ] ; then - GRASS_PYTHONWX="pythonw" -fi -# can't run python 64bit if wx not 64bit, assume OSX 10.5+ possible 64bit -if [ $(($SYSVER)) -gt 5 ] && [ "$GRASS_WX64BIT" = "0" ] ; then - case $SYSARCH in - powerpc) pyarch="-ppc" ;; - i386) pyarch="-i386" ;; - *) pyarch="" ;; - esac - exec /usr/bin/arch $pyarch "$GRASS_PYTHONWX" "$@" -else - exec "$GRASS_PYTHONWX" "$@" -fi diff --git a/macos/pkg/resources/Description.plist.in b/macos/pkg/resources/Description.plist.in deleted file mode 100644 index a61f2fec235..00000000000 --- a/macos/pkg/resources/Description.plist.in +++ /dev/null @@ -1,10 +0,0 @@ - - - - - IFPkgDescriptionDescription - GRASS GIS @GRASS_VER@ - IFPkgDescriptionTitle - GRASS-@GRASS_VER@ - - diff --git a/macos/pkg/resources/Info.plist.in b/macos/pkg/resources/Info.plist.in deleted file mode 100644 index becf807bc3b..00000000000 --- a/macos/pkg/resources/Info.plist.in +++ /dev/null @@ -1,40 +0,0 @@ - - - - - CFBundleGetInfoString - GRASS-@GRASS_VERSION_MAJOR@.@GRASS_VERSION_MINOR@.@GRASS_VERSION_RELEASE@ - CFBundleIdentifier - org.osgeo.grass@GRASS_VERSION_MAJOR@_@GRASS_VERSION_MINOR@ - CFBundleShortVersionString - @GRASS_VERSION_MAJOR@.@VER_MINOR_REL@.@VER_DATE@ - IFMajorVersion - @GRASS_VERSION_MAJOR@ - IFMinorVersion - @GRASS_VERSION_MINOR@ - IFPkgFlagAllowBackRev - - IFPkgFlagAuthorizationAction - AdminAuthorization - IFPkgFlagBackgroundAlignment - topleft - IFPkgFlagBackgroundScaling - none - IFPkgFlagDefaultLocation - @PKG_INST_DIR@ - IFPkgFlagFollowLinks - - IFPkgFlagIsRequired - - IFPkgFlagOverwritePermissions - - IFPkgFlagRelocatable - - IFPkgFlagRestartAction - NoRestart - IFPkgFlagRootVolumeOnly - - IFPkgFlagUpdateInstalledLanguages - - - diff --git a/macos/pkg/resources/License.rtf b/macos/pkg/resources/License.rtf deleted file mode 100644 index 1da0cb14ce9..00000000000 --- a/macos/pkg/resources/License.rtf +++ /dev/null @@ -1,374 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf949 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\margl1440\margr1440\vieww9880\viewh8140\viewkind0 -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ri1440\ql\qnatural - -\f0\fs24 \cf0 Copyright and License Statement\ -\ -The Geographic Resources Analysis and Support System (GRASS) Geographic Information System (GIS) is Copyright by the GRASS Development Team headquartered at ITC-irst, in Trento, Italy.\ -\ -This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\ -\ -Parts of GRASS are not copyright by the GRASS development team. The original authors hold the copyrights and you have to abide to their licensing terms where noted. (Keep in mind that code linking into GRASS can only be distributed if compatible with the GPL.) \ -\ -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (GPL) for more details.\ -\ -You should have received a copy of the GNU General Public License along with this program; if not, write to the\ -\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\fi360\ri1440\ql\qnatural -\cf0 Free Software Foundation, Inc.,\ -51 Franklin Street, Fifth Floor\ -Boston, MA 02110-1301 USA\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ri1440\ql\qnatural -\cf0 \ -Questions regarding GRASS GIS should be directed to the GRASS Development Team at the following address:\ -\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\fi360\ri1440\ql\qnatural -\cf0 GRASS Development Team\ - ITC-Irst\ - c/o M. Neteler\ - SSI/MPA\ - Via Sommarive, 18\ - 38050 Trento (Povo)\ - Italy\ - {\field{\*\fldinst{HYPERLINK "mailto:neteler@itc.it"}}{\fldrslt neteler@itc.it}}\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ri1440\ql\qnatural -\cf0 \ -Internet: {\field{\*\fldinst{HYPERLINK "https://grass.osgeo.org"}}{\fldrslt https://grass.osgeo.org}}\ -\ -\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ri1456\ql\qnatural -\cf0 GNU GENERAL PUBLIC LICENSE\ - Version 2, June 1991\ -\ - Copyright (C) 1989, 1991 Free Software Foundation, Inc.\ - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\ - Everyone is permitted to copy and distribute verbatim copies\ - of this license document, but changing it is not allowed.\ -\ - Preamble\ -\ - The licenses for most software are designed to take away your\ -freedom to share and change it. By contrast, the GNU General Public\ -License is intended to guarantee your freedom to share and change free\ -software--to make sure the software is free for all its users. This\ -General Public License applies to most of the Free Software\ -Foundation's software and to any other program whose authors commit\ -to using it. (Some other Free Software Foundation software is covered\ -by the GNU Library General Public License instead.) You can apply it to\ -your programs, too.\ -\ - When we speak of free software, we are referring to freedom, not\ -price. Our General Public Licenses are designed to make sure that you\ -have the freedom to distribute copies of free software (and charge for\ -this service if you wish), that you receive source code or can get it\ -if you want it, that you can change the software or use pieces of it\ -in new free programs; and that you know you can do these things.\ -\ - To protect your rights, we need to make restrictions that forbid\ -anyone to deny you these rights or to ask you to surrender the rights.\ -These restrictions translate to certain responsibilities for you if you\ -distribute copies of the software, or if you modify it.\ -\ - For example, if you distribute copies of such a program, whether\ -gratis or for a fee, you must give the recipients all the rights that\ -you have. You must make sure that they, too, receive or can get the\ -source code. And you must show them these terms so they know their\ -rights.\ -\ - We protect your rights with two steps: (1) copyright the software, and\ -(2) offer you this license which gives you legal permission to copy,\ -distribute and/or modify the software.\ -\ - Also, for each author's protection and ours, we want to make certain\ -that everyone understands that there is no warranty for this free\ -software. If the software is modified by someone else and passed on, we\ -want its recipients to know that what they have is not the original, so\ -that any problems introduced by others will not reflect on the original\ -authors' reputations.\ -\ - Finally, any free program is threatened constantly by software\ -patents. We wish to avoid the danger that redistributors of a free\ -program will individually obtain patent licenses, in effect making the\ -program proprietary. To prevent this, we have made it clear that any\ -patent must be licensed for everyone's free use or not licensed at all.\ -\ - The precise terms and conditions for copying, distribution and\ -modification follow.\ -\ -\ - GNU GENERAL PUBLIC LICENSE\ - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND\ - MODIFICATION\ -\ - 0. This License applies to any program or other work which contains\ -a notice placed by the copyright holder saying it may be distributed\ -under the terms of this General Public License. The "Program", below,\ -refers to any such program or work, and a "work based on the Program"\ -means either the Program or any derivative work under copyright law:\ -that is to say, a work containing the Program or a portion of it,\ -either verbatim or with modifications and/or translated into another\ -language. (Hereinafter, translation is included without limitation in\ -the term "modification".) Each licensee is addressed as "you".\ -\ -Activities other than copying, distribution and modification are not\ -covered by this License; they are outside its scope. The act of\ -running the Program is not restricted, and the output from the Program\ -is covered only if its contents constitute a work based on the\ -Program (independent of having been made by running the Program).\ -Whether that is true depends on what the Program does.\ -\ - 1. You may copy and distribute verbatim copies of the Program's\ -source code as you receive it, in any medium, provided that you\ -conspicuously and appropriately publish on each copy an appropriate\ -copyright notice and disclaimer of warranty; keep intact all the\ -notices that refer to this License and to the absence of any warranty;\ -and give any other recipients of the Program a copy of this License\ -along with the Program.\ -\ -You may charge a fee for the physical act of transferring a copy, and\ -you may at your option offer warranty protection in exchange for a fee.\ -\ - 2. You may modify your copy or copies of the Program or any portion\ -of it, thus forming a work based on the Program, and copy and\ -distribute such modifications or work under the terms of Section 1\ -above, provided that you also meet all of these conditions:\ -\ - a) You must cause the modified files to carry prominent notices\ - stating that you changed the files and the date of any change.\ -\ - b) You must cause any work that you distribute or publish, that in\ - whole or in part contains or is derived from the Program or any\ - part thereof, to be licensed as a whole at no charge to all third\ - parties under the terms of this License.\ -\ - c) If the modified program normally reads commands interactively\ - when run, you must cause it, when started running for such\ - interactive use in the most ordinary way, to print or display an\ - announcement including an appropriate copyright notice and a\ - notice that there is no warranty (or else, saying that you provide\ - a warranty) and that users may redistribute the program under\ - these conditions, and telling the user how to view a copy of this\ - License. (Exception: if the Program itself is interactive but\ - does not normally print such an announcement, your work based on\ - the Program is not required to print an announcement.)\ -\ -\ -These requirements apply to the modified work as a whole. If\ -identifiable sections of that work are not derived from the Program,\ -and can be reasonably considered independent and separate works in\ -themselves, then this License, and its terms, do not apply to those\ -sections when you distribute them as separate works. But when you\ -distribute the same sections as part of a whole which is a work based\ -on the Program, the distribution of the whole must be on the terms of\ -this License, whose permissions for other licensees extend to the\ -entire whole, and thus to each and every part regardless of who wrote it.\ -\ -Thus, it is not the intent of this section to claim rights or contest\ -your rights to work written entirely by you; rather, the intent is to\ -exercise the right to control the distribution of derivative or\ -collective works based on the Program.\ -\ -In addition, mere aggregation of another work not based on the Program\ -with the Program (or with a work based on the Program) on a volume of\ -a storage or distribution medium does not bring the other work under\ -the scope of this License.\ -\ - 3. You may copy and distribute the Program (or a work based on it,\ -under Section 2) in object code or executable form under the terms of\ -Sections 1 and 2 above provided that you also do one of the following:\ -\ - a) Accompany it with the complete corresponding machine-readable\ - source code, which must be distributed under the terms of Sections\ - 1 and 2 above on a medium customarily used for software\ - interchange; or,\ -\ - b) Accompany it with a written offer, valid for at least three\ - years, to give any third party, for a charge no more than your\ - cost of physically performing source distribution, a complete\ - machine-readable copy of the corresponding source code, to be\ - distributed under the terms of Sections 1 and 2 above on a medium\ - customarily used for software interchange; or,\ -\ - c) Accompany it with the information you received as to the offer\ - to distribute corresponding source code. (This alternative is\ - allowed only for noncommercial distribution and only if you\ - received the program in object code or executable form with such\ - an offer, in accord with Subsection b above.)\ -\ -The source code for a work means the preferred form of the work for\ -making modifications to it. For an executable work, complete source\ -code means all the source code for all modules it contains, plus any\ -associated interface definition files, plus the scripts used to\ -control compilation and installation of the executable. However, as a\ -special exception, the source code distributed need not include\ -anything that is normally distributed (in either source or binary\ -form) with the major components (compiler, kernel, and so on) of the\ -operating system on which the executable runs, unless that component\ -itself accompanies the executable.\ -\ -If distribution of executable or object code is made by offering\ -access to copy from a designated place, then offering equivalent\ -access to copy the source code from the same place counts as\ -distribution of the source code, even though third parties are not\ -compelled to copy the source along with the object code.\ -\ -\ - 4. You may not copy, modify, sublicense, or distribute the Program\ -except as expressly provided under this License. Any attempt\ -otherwise to copy, modify, sublicense or distribute the Program is\ -void, and will automatically terminate your rights under this License.\ -However, parties who have received copies, or rights, from you under\ -this License will not have their licenses terminated so long as such\ -parties remain in full compliance.\ -\ - 5. You are not required to accept this License, since you have not\ -signed it. However, nothing else grants you permission to modify or\ -distribute the Program or its derivative works. These actions are\ -prohibited by law if you do not accept this License. Therefore, by\ -modifying or distributing the Program (or any work based on the\ -Program), you indicate your acceptance of this License to do so, and\ -all its terms and conditions for copying, distributing or modifying\ -the Program or works based on it.\ -\ - 6. Each time you redistribute the Program (or any work based on the\ -Program), the recipient automatically receives a license from the\ -original licensor to copy, distribute or modify the Program subject to\ -these terms and conditions. You may not impose any further\ -restrictions on the recipients' exercise of the rights granted herein.\ -You are not responsible for enforcing compliance by third parties to\ -this License.\ -\ - 7. If, as a consequence of a court judgment or allegation of patent\ -infringement or for any other reason (not limited to patent issues),\ -conditions are imposed on you (whether by court order, agreement or\ -otherwise) that contradict the conditions of this License, they do not\ -excuse you from the conditions of this License. If you cannot\ -distribute so as to satisfy simultaneously your obligations under this\ -License and any other pertinent obligations, then as a consequence you\ -may not distribute the Program at all. For example, if a patent\ -license would not permit royalty-free redistribution of the Program by\ -all those who receive copies directly or indirectly through you, then\ -the only way you could satisfy both it and this License would be to\ -refrain entirely from distribution of the Program.\ -\ -If any portion of this section is held invalid or unenforceable under\ -any particular circumstance, the balance of the section is intended to\ -apply and the section as a whole is intended to apply in other\ -circumstances.\ -\ -It is not the purpose of this section to induce you to infringe any\ -patents or other property right claims or to contest validity of any\ -such claims; this section has the sole purpose of protecting the\ -integrity of the free software distribution system, which is\ -implemented by public license practices. Many people have made\ -generous contributions to the wide range of software distributed\ -through that system in reliance on consistent application of that\ -system; it is up to the author/donor to decide if he or she is willing\ -to distribute software through any other system and a licensee cannot\ -impose that choice.\ -\ -This section is intended to make thoroughly clear what is believed to\ -be a consequence of the rest of this License.\ -\ -\ - 8. If the distribution and/or use of the Program is restricted in\ -certain countries either by patents or by copyrighted interfaces, the\ -original copyright holder who places the Program under this License\ -may add an explicit geographical distribution limitation excluding\ -those countries, so that distribution is permitted only in or among\ -countries not thus excluded. In such case, this License incorporates\ -the limitation as if written in the body of this License.\ -\ - 9. The Free Software Foundation may publish revised and/or new\ -versions of the General Public License from time to time. Such new\ -versions will be similar in spirit to the present version, but may differ in\ -detail to address new problems or concerns.\ -\ -Each version is given a distinguishing version number. If the Program\ -specifies a version number of this License which applies to it and "any\ -later version", you have the option of following the terms and conditions\ -either of that version or of any later version published by the Free\ -Software Foundation. If the Program does not specify a version number\ -of this License, you may choose any version ever published by the Free\ -Software Foundation.\ -\ - 10. If you wish to incorporate parts of the Program into other free\ -programs whose distribution conditions are different, write to the author\ -to ask for permission. For software which is copyrighted by the Free\ -Software Foundation, write to the Free Software Foundation; we\ -sometimes make exceptions for this. Our decision will be guided by the\ -two goals of preserving the free status of all derivatives of our free\ -software and of promoting the sharing and reuse of software generally.\ -\ - NO WARRANTY\ -\ - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\ -\ - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\ -\ - END OF TERMS AND CONDITIONS\ -\ -\ - How to Apply These Terms to Your New Programs\ -\ - If you develop a new program, and you want it to be of the greatest\ -possible use to the public, the best way to achieve this is to make it\ -free software which everyone can redistribute and change under these terms.\ -\ - To do so, attach the following notices to the program. It is safest\ -to attach them to the start of each source file to most effectively\ -convey the exclusion of warranty; and each file should have at least\ -the "copyright" line and a pointer to where the full notice is found.\ -\ - \ - Copyright (C) \ -\ - This program is free software; you can redistribute it and/or modify\ - it under the terms of the GNU General Public License as published by\ - the Free Software Foundation; either version 2 of the License, or\ - (at your option) any later version.\ -\ - This program is distributed in the hope that it will be useful,\ - but WITHOUT ANY WARRANTY; without even the implied warranty of\ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\ - See the GNU General Public License for more details.\ -\ - You should have received a copy of the GNU General Public License\ - along with this program; if not, write to the Free Software\ - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA \ - 02110-1301 USA\ -\ -\ -Also add information on how to contact you by electronic and paper mail.\ -\ -If the program is interactive, make it output a short notice like this\ -when it starts in an interactive mode:\ -\ - Gnomovision version 69, Copyright (C) year name of author\ - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\ - This is free software, and you are welcome to redistribute it\ - under certain conditions; type `show c' for details.\ -\ -The hypothetical commands `show w' and `show c' should show the\ -appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits\ -your program.\ -\ -You should also get your employer (if you work as a programmer) or your\ -school, if any, to sign a "copyright disclaimer" for the program, if\ -necessary. Here is a sample; alter the names:\ -\ - Yoyodyne, Inc., hereby disclaims all copyright interest in the program\ - `Gnomovision' (which makes passes at compilers) written by James\ - Hacker.\ -\ - , 1 April 1989\ - Ty Coon, President of Vice\ -\ -This General Public License does not permit incorporating your program\ -into proprietary programs. If your program is a subroutine library, you\ -may consider it more useful to permit linking proprietary applications with\ -the library. If this is what you want to do, use the GNU Library General\ -Public License instead of this License.\ -} diff --git a/macos/pkg/resources/ReadMe.rtf b/macos/pkg/resources/ReadMe.rtf deleted file mode 100644 index c18857bf849..00000000000 --- a/macos/pkg/resources/ReadMe.rtf +++ /dev/null @@ -1,258 +0,0 @@ -{\rtf1\ansi\deff3\adeflang1025 -{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset0 Liberation Sans{\*\falt Arial};}{\f5\froman\fprq0\fcharset1 Helvetica{\*\falt Arial};}{\f6\froman\fprq0\fcharset1 Monaco;}{\f7\fnil\fprq2\fcharset0 WenQuanYi Zen Hei Sharp;}{\f8\fnil\fprq2\fcharset0 DejaVu Sans;}{\f9\fswiss\fprq0\fcharset1 DejaVu Sans;}} -{\colortbl;\red0\green0\blue0;\red0\green0\blue128;\red128\green128\blue128;} -{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033 Normal;} -{\*\cs15\snext15\cf2\ul\ulc0\langfe255\alang255\lang255 Internet Link;} -{\s16\sbasedon0\snext17\sb240\sa120\keepn\dbch\af7\dbch\af8\afs28\loch\f4\fs28 Heading;} -{\s17\sbasedon0\snext17\sl288\slmult1\sb0\sa140 Text Body;} -{\s18\sbasedon17\snext18\sl288\slmult1\sb0\sa140\dbch\af9 List;} -{\s19\sbasedon0\snext19\sb120\sa120\noline\i\dbch\af9\afs24\ai\fs24 Caption;} -{\s20\sbasedon0\snext20\noline\dbch\af9 Index;} -}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67240962}}\deftab720 -\viewscale120 -{\*\pgdsctbl -{\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\pgdscnxt0 Default Style;}} -\formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1440\margr1440\margt1440\margb1440\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc -\pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\qc\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\b\rtlch \ltrch\loch\fs48\loch\f5 -GRASS GIS} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ul\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -Starting GRASS}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - - there are a few different ways to start GRASS:} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -- Double-click GRASS.app.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -- Drag a mapset folder onto GRASS.app to start GRASS in that mapset.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -- In a Terminal, type (substitute the correct application name if a different version is installed), the mapset path is optional:} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -open -a "GRASS-}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -7}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -.}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -1}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -.app" \{/path/to/db/location/mapset\}} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -GRASS.app opens a Terminal window to start GRASS in the normal commandline way. After starting the Terminal it quits, leaving GRASS running in the Terminal. While a GRASS session is running you can run GRASS.app again to start another session.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -On Panther and Tiger, X11 is also started regardless of the GUI you use. On Leopard and above, X11 is started when it's needed, not immediately.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -Setup} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -See GRASS }{{\field{\*\fldinst HYPERLINK "http://grass.gdf-hannover.de/" }{\fldrslt \cf2\ul\ulc0\langfe255\alang255\lang255\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -documentation}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -}} for details on setup and use. See Apple's }{\cf1\ul\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -Help Viewer}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - (from most any application's Help menu) for command documentation.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -By default the startup uses the included X11 Tcl/Tk for the GUI. If you have used GRASS before, }{\cf1\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -it will pick up your preferences for GUI/Text}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -, so you should make sure they are set correctly. So if the GUI doesn't start, check your GRASS_GUI setting.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -Note:}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - if you use the Apple default }{\cf1\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -bash}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - shell, make sure you don't have a }{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -.cshrc}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - init hanging around. This could be from a previous version of OS X, or installed software might add one for some reason. Some commands might not run correctly if this file exists, yet you are using bash, so delete it if it exists.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -If you don't like the }{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -xterm}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - that opens when you start X11 (you don't need it since GRASS starts in the Terminal), do the following:} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -On Panther or Tiger, edit }{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -/etc/X11/xinit/xinitrc}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - and near the bottom add a }{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -#}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - to the beginning of the }{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -xterm &}{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - line.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -On Leopard and above, type this in a Terminal:} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs20\loch\f6 -defaults write org.x.X11_launcher app_to_run /usr/X11/bin/xlsclients} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -Something must be set for app_to_run, or X11 will not function properly, and xlsclients is regarded as safe and inconspicuous.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -After running GRASS the first time, you can change your preference for whether the GUI or Terminal-only starts by using g.gisenv.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -g.gisenv set="GRASS_GUI=val"} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -Where }{\cf1\i\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -val}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - is '}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -tcltk}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -' for the GUI or '}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -text}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -' for a plain Terminal.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -Addon Modules} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -To install extra modules and user scripts, see the }{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -modbuild}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - folder in }{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -/Library/GRASS/$VERSION}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -. (}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -$VERSION}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - is the major.minor GRASS version.)} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -R} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -Using R with GRASS.app needs a bit of simple setup. Install R for Mac OS X, at least v2.3.0. Install the GDAL R package from the GDAL framework (there are install instructions included with that), not from a repository. Remember to use a user level install location for extra packages.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -Next, install the }{\cf1\i0\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -maptools}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - package from CRAN binary repository with the R.app Package Installer.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -Finally, use the Package Installer to install the }{\cf1\i0\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -spgrass6}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - package from the CRAN source repository.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -See the GRASS }{{\field{\*\fldinst HYPERLINK "http://grass.itc.it/statsgrass/grass_geostats.html" }{\fldrslt \cf2\ul\ulc0\langfe255\alang255\lang255\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -stats}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -}} page for info on how to use R with GRASS.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -MPEG} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -The OGSF GRASS library can be built with mpeg support using the ffmpeg libraries, this is used only in NVIZ. ffmpeg is a difficult one to build on any platform because it is in constant flux, and none of the binaries available include the libraries. Without ffmpeg, NVIZ can only generate a series of images which can then be run through any mpeg program. This package may have ffmpeg support.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -The last option built into GRASS, r.out.mpeg, starts with rasters and generates an mpeg1 video using an external program mpeg-encode (aka ppmtompeg). The two problems with this are: mpeg1 is low quality, and you can't use it on an NVIZ image sequence, just rasters. A copy of ppmtompeg may be included in the GRASS application package.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -There is also a completely external option. There are many mpeg encoding programs available. Pick one of your choice and feed the NVIZ image sequence to that outside of GRASS. }{{\field{\*\fldinst HYPERLINK "http://ffmpegx.com/" }{\fldrslt \cf2\ul\ulc0\langfe255\alang255\lang255\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -ffmpegX}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -}} is a handy package ready-made for Mac OS X. It includes commandline binaries for ffmpeg AND many other encoders, including the popular mencoder. You can either use the GUI, or run them from the Terminal - all the individual programs are in the app package's Resources folder, except a couple external ones in the ffmpegX Application Support.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b\rtlch \ltrch\loch\fs28\loch\f5 -GPS} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -A copy of gpsbabel may be included for v.in.gpsbabel to use. If not, you need to install a separate GPSBabel application. Serial ports (both old-style and USB) on OS X are named a little different than most 'nix systems, and they will all go thru USB, including old RS-232 serial. You need to use the }{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -cu.*}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - ports. All ports are in }{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -/dev}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -Old RS-232 serial will have to go thru a Serial-USB converter, like the Keyspan USA-19W. These will usually have a name like }{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -USA19QW3d1P1.1}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -, or }{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -/dev/cu.USA19QW3d1P1.1}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -.} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -To figure out your GPS port, you can try the following. With the GPS (including a serial-USB adaptor, if needed for your GPS) }{\cf1\i\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -not}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - connected, type this in a Terminal:} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -ls /dev/cu.*} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -Then connect the GPS (with the serial-USB adaptor, if needed), and type that }{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -ls}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - command again. Note what was added, that should be the port to use (with }{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f6 -/dev/}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - prefixed to it).} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f5 -\u169\'a9 2006-20}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f5 -14}{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f5 - by the GRASS Development Team} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs24\loch\f5 -This program is free software under the GNU General Public License (>=v2).} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 - -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -- William Kyngesburye} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{{\field{\*\fldinst HYPERLINK "mailto:kyngchaos@kyngchaos.com" }{\fldrslt \cf2\ul\ulc0\langfe255\alang255\lang255\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -kyngchaos@kyngchaos.com}}} -\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af7\langfe2052\dbch\af8\afs24\alang1081\loch\f3\fs24\lang1033\ql\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640{{\field{\*\fldinst HYPERLINK "https://www.kyngchaos.com" }{\fldrslt \cf2\ul\ulc0\langfe255\alang255\lang255\cf1\i0\ulnone\ulc0\b0\rtlch \ltrch\loch\fs28\loch\f5 -https://www.kyngchaos.com/}}} -\par } diff --git a/macos/pkg/resources/postflight.in b/macos/pkg/resources/postflight.in deleted file mode 100755 index 1a25c22a891..00000000000 --- a/macos/pkg/resources/postflight.in +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/sh - -# configured - -INST_DIR="@INST_DIR@" -MACOSX_SUPPDIR="@MACOSX_SUPPDIR@" -GRASS_VER="@GRASS_VER@" - -# support folder - -mkdir -p "$MACOSX_SUPPDIR" -mkdir -p "$MACOSX_SUPPDIR/Modules/bin" -mkdir -p "$MACOSX_SUPPDIR/Modules/lib" -mkdir -p "$MACOSX_SUPPDIR/Modules/etc" -mkdir -p "$MACOSX_SUPPDIR/Modules/docs/html" - -# compile python - use python version GRASS was compiled for - -pyver_want="@PYVER@" -py=`type -p python` -if [ "$py" ] ; then - pyver=`python -V 2>&1 | grep " $pyver_want"` - if [ ! "$pyver" ] ; then - py="" - else - pyconf="python-config" - fi -fi -# try standard framework -if [ ! "$py" ] ; then - py="/Library/Frameworks/Python.framework/Versions/$pyver_want/bin/python" - if [ ! -x "$py" ] ; then - py="" - else - pyconf="/Library/Frameworks/Python.framework/Versions/$pyver_want/bin/python-config" - fi -fi -# try system (may be the same as in shell path) -if [ ! "$py" ] ; then - py="/usr/bin/python" - pyver=`$py -V 2>&1 | grep " $pyver_want"` - if [ ! "$pyver" ] ; then - py="" - else - pyconf="/usr/bin/python-config" - fi -fi -if [ "$py" ] ; then - pycompile=`$pyconf --prefix`/lib/python$pyver_want/compileall.py - if [ ! -e "$pycompile" ] ; then - pycompile=`$pyconf --prefix`/lib/python$pyver_want/compileall.pyc - fi - $py $pycompile "$INST_DIR" -fi - -# readme -# needs a better home? - -cp -f "$PACKAGE_PATH/Contents/Resources/ReadMe.rtf" "/Users/Shared/GRASS-$GRASS_VER-ReadMe.rtf" - -exit 0