Ok, I recently switched to a new laptop and tried it out on a system without GNUstep installed. In the environment, you just need to install "clang=18" and "clang++=18" (those go as bullet points in the environment.yml file). I was able to build Gorm that way; I haven't tried building Objective-C++ code yet. I updated the guide - it should be at https://github.com/ethanc8/gnustep-forge-feedstocks/blob/master/guide.md.

On 12/26/24 17:26, Tom Sheffler wrote:
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
    <http://github.com/ethanc8/gnustep-forge-feedstocks/and> the binary
    packages are available athttps://prefix.dev/channels/gnustep-forge
    <http://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/
    <http://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
    <http://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
    <http://prefix.dev>:

     1. Sign in tohttps://prefix.dev/ <http://prefix.dev/>.
     2. Create a channel athttps://prefix.dev/channels/create
    <http://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
    <http://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
    
<http://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
    <http://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
    ************************************************

Reply via email to