Hello Ethan - I had a chance to try this out today to see how it all works together. Your instructions were very clear, and I had Miniforge installed easily and then created the gnustep environment. It all works as advertised! After enabling the gnustep environment with $ conda activate gnustep I typed $ openapp SystemPreferences and it fired right up. Also, $ gnustep-config showed all the flags and compilers used.
I wasn't sure if this process should result in a development environment though. I do not believe "clang" was installed as a by-product of installing the base packages. I wanted to try building some of my own code, so I installed clang. Another problem I ran into when compiling an ObjC++ file was a missing c++ header. (clang-18 seems to need g++-14 headers ...) The two dependencies I ended up needing were $ sudo apt install clang g++-14 and then I was able to compile my project code. Perhaps a "build" environment is a different type of beast anyway and there should be a separate package called "gnustep-developer" that ensures the compilers are all there. Thanks for this work and the nice writeup on how to use it! This is a very nice way to get an environment up and running quickly. Regards, Tom On Mon, Dec 23, 2024 at 7:04 PM <[email protected]> wrote: > Send Discuss-gnustep mailing list submissions to > [email protected] > > To subscribe or unsubscribe via the World Wide Web, visit > https://lists.gnu.org/mailman/listinfo/discuss-gnustep > or, via email, send a message with subject or body 'help' to > [email protected] > > You can reach the person managing the list at > [email protected] > > When replying, please edit your Subject line so it is more specific > than "Re: Contents of Discuss-gnustep digest..." > > > Today's Topics: > > 1. Conda packaging (Ethan C) > > > ---------------------------------------------------------------------- > > Message: 1 > Date: Mon, 23 Dec 2024 21:03:41 -0600 > From: Ethan C <[email protected]> > To: [email protected] > Subject: Conda packaging > Message-ID: <[email protected]> > Content-Type: text/plain; charset="utf-8"; Format="flowed" > > Hi everyone, > > I wanted to introduce my recent work on Conda packaging of GNUstep. > Conda, and its relatives|mamba|,|micromamba|, and|pixi|, are > cross-platform package managers which can manage "environments". These > environments are similar to Python's "virtual environments", as they > allow you to create environments that contain certain packages, which > will only be available after the environment is activated. This way, you > can install different versions of the same software in different > environments, reduce dependency hell, and share your environments with > others in order to allow them to easily get a working setup. Unlike > Python's "virtual environments", it is able to manage both Python > software and native software like shared objects, configuration files, > and native executables. This has made it very popular amongst Python > datascience and machine learning users which often need to manage Python > packages with C, Rust, and Fortran dependencies tightly coupled to the > Python packages and the Python interpreter. Conda, along > with|nix|and|guix|, are the only package managers I know of that are > able to have multiple environments which stack on top of the user's > operating system (as opposed to a chroot). > > For GNUstep, this can make it a lot easier for new users to get started, > and it could also make it easier to distribute GNUstep software. GNUstep > libraries could be distributed as conda packages, and GNUstep apps could > be distributed as conda packages which could then be turned into other > formats. Conda environments can already be converted into AppImages, but > the scripts to do so are kind of outdated and depend on the > Anaconda|defaults|channel and the Miniconda installer. I intend to work > on improving that and to make more output formats. > > I have packaged the core GNUstep software (in > the|ng-gnu-gnu|configuration; Clang 18 as compiler,|ld.gold|as > linker,|libdispatch|,|libobjc2|as linker, and using GNUstep Base for > Foundation and GNUstep GUI for AppKit) on top > of|conda-forge|for|linux-64|(glibc Linux on x86_64). glibc Linux on > arm64 and ppc64le, macOS on x86_64 and arm64, and Windows on x86_64 are > also supported by|conda-forge|. The package definitions are available > athttps://github.com/ethanc8/gnustep-forge-feedstocks/and the binary > packages are available athttps://prefix.dev/channels/gnustep-forge. > > > Remaining contents > > * More information on Conda ecosystem > * TODO > * Quick start/tutorial > * Packaging and distributing your own software > > > More information on Conda ecosystem > > There are two "distributions" of conda packages in the > package-repository sense. Anaconda, Inc. publishes the Anaconda and > Miniconda installers, and publish the|defaults|channel (package > repository). It is released with a EULA that prohibits certain > commercial uses, and is missing many useful packages. > Meanwhile,|conda-forge|is a community distribution which includes many > more packages and is quite popular, but is ABI-incompatible > with|defaults|. They publish the Miniforge installer. > > |conda|is written in Python, and is kind of slow.|mamba|is a faster > reimplementation of|conda|in C++.|micromamba|is based on|mamba|but does > not need its own conda environment with Python installed in order to > work.|pixi|is a more|npm|/|cargo|-style package manager, which is very > fast and written in Rust, and which ties environments to specific projects. > > Packages are either specified in|meta.yaml|files (which include > semantically significant and Turing-complete comments!) and are built > by|conda-build|, or are specified in|recipe.yaml|files (which are much > saner) and built by|rattler-build|(implemented in Rust). > > > TODO > > * Figure out application bundling (fix AppImage, see if we can do > Flatpak, Snap, portable|.exe|,|.msi|, and|.msix|) > * Ensure runtime dependencies are properly specified > * Fix cross-compilation on GNU/Linux > * Support Windows (should we do MinGW or MSVC?) > * Support macOS (should we do|ng-gnu-gnu|,|apple-gnu-gnu|, > or|apple-apple-apple|?) > > > Quick start/tutorial > > This will guide you through setting up a basic GNUstep environment and > verifying that it works by installing SystemPreferences.app in it and > running it. Right now it only works on x86_64 glibc Linux. > > First you should download Miniforge: > > |wget > " > https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname > -m).sh" bash Miniforge3-$(uname)-$(uname -m).sh rm > Miniforge3-$(uname)-$(uname -m).sh | > > Close and reopen your shell, and run: > > |# Prevent Conda from polluting your environment when you're not working > on Conda-managed projects. conda config --set auto_activate_base false | > > Create a file named|environment.yml|and in it, write: (you can omit the > comments if you want) > > |name: gnustep channels: # package repositories - > https://repo.prefix.dev/gnustep-forge # My GNUstep packages - > conda-forge # Community distribution of conda packages - nodefaults # > Disable the `defaults` channel if for some reason it's enabled > dependencies: - gnustep-make - gnustep-libdispatch - gnustep-libobjc2 - > libgnustep-base - libgnustep-gui - libgnustep-back - > gnustep-systempreferences - imagemagick # This is here because I need to > fix the dependency list | > > Now, you can use|conda|or|mamba|to install the dependencies: > > |mamba env create -f environment.yml mamba activate gnustep | > > If you modify|environment.yml|after creating the environment, you need > to run > > |mamba env update -f environment.yml | > > Now, you can test out SystemPreferences: > > |SystemPreferences | > > Remember that the environment must be activated using|mamba activate > gnustep|every time you open a new shell. > > You can deactivate the environment using|mamba deactivate|. Then GNUstep > should no longer be present. (I set it up to call|GNUstep-reset.sh|; > this might not work exactly as expected. It's better to simply open a > new shell.) > > All the packages are built with debug symbols and headers included, so > you can try them out. > > The GNUstep installation is located at|$CONDA_PREFIX/GNUstep|. On my > system, that's|~/miniforge3/envs/gnustep/GNUstep|. > > > Packaging and distributing your own software > > Clone my repositoryhttps://github.com/ethanc8/gnustep-forge-feedstocks/, > and copy the|gnustep-systempreferences|directory into a new directory > with the name of your software. > > These are the requirements I usually specify in|recipe.yaml|: > > |requirements: build: - ${{ compiler('c') }} - ${{ compiler('cxx') }} - > ${{ stdlib('c') }} - ninja # only for CMake projects host: - ${{ > stdlib('c') }} - gnustep-make - gnustep-libobjc2 - gnustep-libdispatch - > libgnustep-base - libgnustep-gui - libgnustep-back | > > If you have more dependencies, specify them in the|host|section in > addition to the ones above. > > Most of the changes you'll need to make are in|recipe.yaml|: the name, > the GitHub URLs (or the homepage and source tarball download URL if you > don't use GitHub), the version number, and the Git tag (or commit hash, > etc). Also remember to change the metadata at the bottom > of|recipe.yaml|, and make sure that the|about.license_file|is properly > specified (this is usually|COPYING|or|LICENSE|). > > If you need to add more build steps, such as running|./configure|, just > modify|build-systempreferences.sh|(you can rename this if you want, but > you'll also have to change the name of the build script in|recipe.yaml|). > > You can now build the package using > > |rattler-build build -c conda-forge -c https://prefix.dev/gnustep-forge | > > The built package will be in|output/linux-64|. > > If you want to publish it tohttps://prefix.dev/gnustep-forge, submit > your package as a pull request to my repo and I will look over and merge > it. If you want to make your own channel and host it at prefix.dev: > > 1. Sign in tohttps://prefix.dev/. > 2. Create a channel athttps://prefix.dev/channels/create. > 3. Modify|.github/workflows/build.yml|: > > |- name: Run code in changed subdirectories shell: bash env: > TARGET_PLATFORM: ${{ matrix.target }} run: | rattler-build build > --recipe-dir . \ --skip-existing=all --target-platform=$TARGET_PLATFORM > \ -c conda-forge -c https://prefix.dev/gnustep-forge -c > https://prefix.dev/<<<NAME OF YOUR CHANNEL>>> # --experimental $(for > file in **/variants.yaml; do echo "-m$file"; done) # no longer necessary > because it should be discovered by default - name: Upload all packages > shell: bash # do not upload on PR if: github.event_name == 'push' env: > PREFIX_API_KEY: ${{ secrets.PREFIX_API_KEY }} run: | # ignore errors > because we want to ignore duplicate packages for file in > output/**/*.conda; do rattler-build upload prefix -c gnustep-forge -c > <<<NAME OF YOUR CHANNEL>>> "$file" || true done | > > 4. Commit your changes and push them to a GitHub repository. > 5. Grab an API key fromhttps://prefix.dev/settings/api_keysand set it > as a repository secret named|PREFIX_API_KEY|in the GitHub repository > (for me, the appropriate settings page is > athttps:// > github.com/ethanc8/gnustep-forge-feedstocks/settings/secrets/actions) > 6. Enable GitHub Actions on your GitHub repository. > > You can also self-host the channel or host it at anaconda.org, but I > don't know how to do that. You should be able to find instructions > online on how to do it. > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: < > https://lists.gnu.org/archive/html/discuss-gnustep/attachments/20241223/02ef625c/attachment.htm > > > > ------------------------------ > > Subject: Digest Footer > > _______________________________________________ > Discuss-gnustep mailing list > [email protected] > https://lists.gnu.org/mailman/listinfo/discuss-gnustep > > > ------------------------------ > > End of Discuss-gnustep Digest, Vol 265, Issue 24 > ************************************************ >
