Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move away from setuptools #170

Open
virtuald opened this issue Nov 9, 2022 · 2 comments
Open

Move away from setuptools #170

virtuald opened this issue Nov 9, 2022 · 2 comments

Comments

@virtuald
Copy link
Member

virtuald commented Nov 9, 2022

Their implementation of PEP660 editable installations in setuptools 64 breaks a lot of my workflows. For now, I've pinned to setuptools < 64. Eventually that will be a bad idea (when python 3.12 gets rid of distutils?), so we should use something that isn't setuptools.

Notionally, we want to support building multiple projects from a single monorepo, so I think we'd have to move to our own custom build system anyways. Wrapping distutils was always a hack, but it's a really convenient hack!

Ideas welcome. I'm leaning towards something that wraps a real build system (like cmake or meson), but open to suggestions.

@auscompgeek
Copy link
Member

Maybe pants? Dunno how well it'll work with the flow we need.

@virtuald
Copy link
Member Author

virtuald commented Oct 6, 2023

I am definitely leaning towards meson these days. I put together a small demonstration for how we could dynamically generate source files and compile them from a single source (which is effectively what robotpy-build does).

meson.build:

project('gendemo', 'c')

keyval = import('keyval')

gen = find_program('./gen.py')
gensrc = find_program('./gensrc.py')

# determine which things need to be generated
l = configure_file(
    input: ['gen.list'],    # could be pyproject.toml
    output: 'out.list',
    command: [gen, '@INPUT0@', '@OUTPUT0@']
    # use depfile to indicate which files were read to generate the list? Might just be pyproject.toml
)

kv = keyval.load(l)
foreach k, v: kv

    # in some ways it might be useful to have a per-generated source configure_file that contains key/values to
    # be passed to the custom target (input headers, depfile, etc)... or this could be a configure_file instead of
    # a custom_target

    tgt = custom_target('gen-' + k,
        output: [k + '.c'], # could use str.split() on v?
        command: [gensrc, k, '@OUTPUT0@'],
    )

    # could use load kv to list outputs, etc?
    # - the rpy-include/{CLASS}.hpp files still present a problem here

    executable(k, tgt, install: true)
endforeach

gen.list:

a
b

gen.py:

#!/usr/bin/env python3

import sys

infile = sys.argv[1]
outfile = sys.argv[2]

with open(infile, "r") as rfp:
    with open(outfile, "w") as wfp:
        for line in rfp:
            line = line.strip()
            if line:
                wfp.write(f"{line}=1\n")

gensrc.py

#!/usr/bin/env python3

import sys

name = sys.argv[1]
outfile = sys.argv[2]

with open(outfile, "w") as fp:
    print(
    f"""
#include <stdio.h>
int main() {{
    printf("generated {name}\\n");
    return 0;
}}
""", file=fp
    )

The challenge would be making it so that this logic lived in robotpy-build, but could be included in the target project's meson.build (and maybe support some customization too?). I've used symlinks for this in the past, but that was when the build was executed by a support script. Not sure if meson-python would support such a thing, and likely would be problematic on Windows.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants