[HN Gopher] Cosmopolitan Third Edition
       ___________________________________________________________________
        
       Cosmopolitan Third Edition
        
       Author : jart
       Score  : 364 points
       Date   : 2023-11-01 17:25 UTC (5 hours ago)
        
 (HTM) web link (justine.lol)
 (TXT) w3m dump (justine.lol)
        
       | eatonphil wrote:
       | > The end result is that if you switch your Linux build process
       | to use cosmocc instead of cc then the programs you build, e.g.
       | Bash and Emacs, will just work on the command prompts of totally
       | different platforms like Windows and MacOS, and when you run your
       | programs there, it'll feel like you're on Linux. However
       | portability isn't the only selling point. Cosmo Libc will make
       | your software faster and use less memory too. For example, when I
       | build Emacs using the cosmocc toolchain, Emacs thinks it's
       | building for Linux. Then, when I run it on Windows:
       | 
       | > It actually goes 2x faster than the native WIN32 port that the
       | Emacs authors wrote on their own. Cosmo Emacs loads my dotfiles
       | in 1.2 seconds whereas GNU Emacs on Windows loads them in 2.3
       | seconds.
       | 
       | Impressive stuff.
        
         | AYoung010 wrote:
         | That was the most interesting part of the article for me. I
         | don't understand how it can be faster, given that there's
         | syscall translation going on. Is this more of a commentary on
         | the quality of the `libc` available on Windows? Or on the
         | quality of the GNU Emacs Windows port?
        
           | PrivateButts wrote:
           | Could be like the improvements seen when running applications
           | using DXVK. My understanding is that sometimes these
           | translation layers can use newer and more efficient methods
           | than the path that a native implement for the time would use.
           | I'm not a subject matter expert though, and could be
           | completely off base.
        
           | vitiral wrote:
           | IIUC there is no syscall translation, it's more like there
           | are separate libc implementations and the correct one gets
           | selected at program start based on the OS.
        
         | stephc_int13 wrote:
         | This is all super impressive especially for such a small team.
         | 
         | But we should keep in mind that this project is what POSIX
         | should have been, this is a big patch to make things right, as
         | they should have been more than 20 years ago.
         | 
         | It seems magical because of the failure of numerous other teams
         | and people who never managed to tackle the portability issue
         | with the right mindset and skills.
        
       | smusamashah wrote:
       | Will it allow native like bash script support on Windows? I use
       | windows as my main OS and use cmder for CLI things but really
       | miss proper bash script support.
       | 
       | Other than bash itself, does it mean it can be used to make whole
       | set of GNU tools cross platform?
        
         | jart wrote:
         | Absolutely. cosmos-3.0.1.zip contains bash, GNU coreutils,
         | Emacs, and a whole lot more. All of which run great on the
         | Windows console. On our github release page, there's also a
         | cosmocc zip of a GNU/Linux style GCC compiler. Cosmo provides a
         | refreshing way to build Windows software, because we use the
         | System V ABI (i.e. long is actually 64-bit) when we build
         | Windows software. So there's a much more consistent cross
         | platform development experience.
        
           | smusamashah wrote:
           | Tried running bash by renaming it to bash.exe using both CMD
           | and Powershell and both return "Access denied.
           | 
           | Even though Windows 10 already has Terminal and I was getting
           | [error 2147942405 (0x80070005) when launching `C:\bin\bash
           | -l']
           | 
           | I downloaded Terminal Preview which still throws the same
           | error. Is Terminal or Terminal Preview the only way to run
           | bash? There might be a way to configure cmder to use bash in
           | a similar way you suggested for Terminal. Don't know how yet.
        
             | jart wrote:
             | Try whitelisting the folder with Windows Defender.
             | Sometimes when I get EACCES style errors on Windows
             | mysteriously, it's because I need to recalibrate the
             | security on the folder. Here's an example of something I
             | ran once which fixed it.                   PS
             | C:\WINDOWS\system32> $ACL = Get-ACL -Path C:\Users\jtunn
             | PS C:\WINDOWS\system32> $ACL | Set-ACL -Path C:\bin
             | 
             | I also just uploaded cosmos-3.0.1.zip to Microsoft Security
             | Intelligence to make sure they get whitelisted with their
             | cloud security.
        
             | AMICABoard wrote:
             | Discuss here:
             | https://github.com/jart/cosmopolitan/discussions Add issues
             | here: https://github.com/jart/cosmopolitan/issues
        
         | paulclinger wrote:
         | Yes and yes.
        
       | NeutralForest wrote:
       | That's some pretty amazing stuff considering how difficult C/C++
       | portability is.
        
       | simonw wrote:
       | There's so much cool stuff in this post.
       | 
       | https://github.com/jart/cosmopolitan/releases/download/3.0.1...
       | is 213MB file which contains "fat binaries" (single binaries that
       | execute on a bewildering array of hardware platforms and
       | operating systems) for dozens of programs, including zip, curl,
       | git, wget, python, ctags and even my own Datasette Python
       | application!
       | 
       | It's absolutely wild that this works.
       | 
       | I just tried it out (on macOS). I downloaded and extracted that
       | zip and did this:                   cd
       | ~/Downloads/cosmos-3.0.1/bin         ./python -c 'print(4 + 5)'
       | 
       | It refused the first time because of macOS security settings. I
       | had to open the security panel and click "allow"... and then it
       | worked!
       | 
       | Likewise, this worked:                   ./datasette -m datasette
       | -p 8000
       | 
       | That started a https://datasette.io/ server running on port 8000.
       | 
       | Git works too:                   ./git clone
       | https://github.com/simonw/sqlite-utils
       | 
       | That git binary is 6.3MB, and I believe that same exact file can
       | be copied to a Linux or Windows machine and will work the same
       | way.
        
         | simonw wrote:
         | Here's a bit of a clue to how it works:
         | ./python          Python 3.11.4 (heads/pypack1:65ac8ac, Oct 16
         | 2023, 02:35:05) [GCC 11.2.0] on linux         Type "help",
         | "copyright", "credits" or "license" for more information.
         | >>> import sqlite3         >>> sqlite3         <module
         | 'sqlite3' from '/zip/Lib/sqlite3/__init__.pyc'>         >>>
         | import pathlib         >>> list(pathlib.Path("/zip").glob("*"))
         | [PosixPath('/zip/.symtab.amd64'),
         | PosixPath('/zip/.symtab.arm64'), PosixPath('/zip/usr'),
         | PosixPath('/zip/.cosmo'), PosixPath('/zip/Lib'),
         | PosixPath('/zip/build')]
         | 
         | From Python's point of view there a "/zip/" folder with stuff
         | in it, presumably stuff that's hidden inside the fat binary.
        
           | mhink wrote:
           | Yup, this is basically it. If you check out the "Actually
           | Portable Executable" blogpost by the same author [1] and go
           | to the "PKZIP Executables Make Pretty Good Containers"
           | section there's a note on the approach.
           | 
           | 1: https://justine.lol/ape.html
        
             | ForHackernews wrote:
             | absolutely impressive
        
           | ahgamut wrote:
           | The "/zip/" folder refers to the ZIP store inside the
           | actually portable executable -- you can run `unzip -vl
           | ./python` to see what's inside.
           | 
           | Also, to add new pure-python packages, you just need to unzip
           | them into a local folder "./Lib", and add that folder to the
           | APE.
        
         | skybrian wrote:
         | I wonder if llm would work?
        
           | simonw wrote:
           | Base https://llm.datasette.io/ should work just fine, but
           | it's basically a thin Python wrapper around the OpenAI Python
           | library which then makes HTTP requests to their API.
           | 
           | The bigger challenge would be LLM with plugins. Those add all
           | sorts of extra dependencies to help LLM run models directly -
           | PyTorch, Transformers, llama-cpp-python etc.
           | 
           | I'd be surprised to see "llm install llm-gpt4all" work for
           | example, since that pulls in compiled Python wheels and I'm
           | not sure it would know which architecture to use.
           | 
           | pip install DOES work:                   $ ./python -m pip
           | install httpx         Defaulting to user installation because
           | normal site-packages is not writeable         Collecting
           | httpx           Downloading httpx-0.25.0-py3-none-any.whl (75
           | kB)             ----------------------------------------
           | 75.7/75.7 kB 2.7 MB/s eta 0:00:00         ...
           | Successfully installed anyio-4.0.0 h11-0.14.0 httpcore-0.18.0
           | httpx-0.25.0 sniffio-1.3.0              $ ./python
           | Python 3.11.4 (heads/pypack1:65ac8ac, Oct 16 2023, 02:35:05)
           | [GCC 11.2.0] on linux         Type "help", "copyright",
           | "credits" or "license" for more information.         >>>
           | import httpx         >>> httpx         <module 'httpx' from
           | '/Users/simon/.local/lib/python3.11/site-
           | packages/httpx/__init__.py'>              $ ls
           | ~/.local/lib/python3.11/site-packages         anyio
           | anyio-4.0.0.dist-info         h11         h11-0.14.0.dist-
           | info         httpcore         httpcore-0.18.0.dist-info
           | httpx         httpx-0.25.0.dist-info         sniffio
           | sniffio-1.3.0.dist-info
           | 
           | That ~/.local/lib/python3.11/ directory didn't exist until I
           | ran the ./python -m pip install command.
           | 
           | Unfortunately "./python -m pip install llm" didn't quite
           | work, I got this:                   ./python -m pip install
           | llm                            Defaulting to user
           | installation because normal site-packages is not writeable
           | Collecting llm           Downloading llm-0.11.1-py3-none-
           | any.whl (36 kB)         Requirement already satisfied: click
           | in /zip/Lib/site-packages (from llm) (8.1.6)
           | Collecting openai (from llm)           Downloading
           | openai-0.28.1-py3-none-any.whl (76 kB)
           | ---------------------------------------- 77.0/77.0 kB 31.0
           | MB/s eta 0:00:00         Collecting click-default-
           | group>=1.2.3 (from llm)           Downloading
           | click_default_group-1.2.4-py2.py3-none-any.whl (4.1 kB)
           | Collecting sqlite-utils>=3.35.0 (from llm)
           | Downloading sqlite_utils-3.35.1-py3-none-any.whl (67 kB)
           | ---------------------------------------- 67.2/67.2 kB 4.9
           | MB/s eta 0:00:00         Collecting sqlite-migrate>=0.1a2
           | (from llm)           Downloading
           | sqlite_migrate-0.1b0-py3-none-any.whl (10.0 kB)
           | Requirement already satisfied: pydantic>=1.10.2 in
           | /zip/Lib/site-packages (from llm) (1.10.12)
           | Requirement already satisfied: PyYAML in /zip/Lib/site-
           | packages (from llm) (6.0)         Collecting pluggy (from
           | llm)           Downloading pluggy-1.3.0-py3-none-any.whl (18
           | kB)         Collecting python-ulid (from llm)
           | Downloading python_ulid-2.2.0-py3-none-any.whl (9.4 kB)
           | Requirement already satisfied: setuptools in /zip/Lib/site-
           | packages (from llm) (68.0.0)         Requirement already
           | satisfied: pip in /zip/Lib/site-packages (from llm) (23.1.2)
           | Requirement already satisfied: typing-extensions>=4.2.0 in
           | /zip/Lib/site-packages (from pydantic>=1.10.2->llm) (4.7.1)
           | Collecting sqlite-fts4 (from sqlite-utils>=3.35.0->llm)
           | Downloading sqlite_fts4-1.0.3-py3-none-any.whl (10.0 kB)
           | Collecting tabulate (from sqlite-utils>=3.35.0->llm)
           | Downloading tabulate-0.9.0-py3-none-any.whl (35 kB)
           | Requirement already satisfied: python-dateutil in
           | /zip/Lib/site-packages (from sqlite-utils>=3.35.0->llm)
           | (2.8.2)         Requirement already satisfied: requests>=2.20
           | in /zip/Lib/site-packages (from openai->llm) (2.31.0)
           | Collecting tqdm (from openai->llm)           Downloading
           | tqdm-4.66.1-py3-none-any.whl (78 kB)
           | ---------------------------------------- 78.3/78.3 kB 41.9
           | MB/s eta 0:00:00         Collecting aiohttp (from
           | openai->llm)           Downloading
           | aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl (343 kB)
           | ---------------------------------------- 343.5/343.5 kB 3.5
           | MB/s eta 0:00:00         Requirement already satisfied:
           | charset-normalizer<4,>=2 in /zip/Lib/site-packages (from
           | requests>=2.20->openai->llm) (3.2.0)         Requirement
           | already satisfied: idna<4,>=2.5 in /zip/Lib/site-packages
           | (from requests>=2.20->openai->llm) (3.4)         Requirement
           | already satisfied: urllib3<3,>=1.21.1 in /zip/Lib/site-
           | packages (from requests>=2.20->openai->llm) (2.0.4)
           | Requirement already satisfied: certifi>=2017.4.17 in
           | /zip/Lib/site-packages (from requests>=2.20->openai->llm)
           | (2023.7.22)         Collecting attrs>=17.3.0 (from
           | aiohttp->openai->llm)           Downloading
           | attrs-23.1.0-py3-none-any.whl (61 kB)
           | ---------------------------------------- 61.2/61.2 kB 41.9
           | MB/s eta 0:00:00         Collecting multidict<7.0,>=4.5 (from
           | aiohttp->openai->llm)           Downloading
           | multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl (29 kB)
           | Collecting async-timeout<5.0,>=4.0.0a3 (from
           | aiohttp->openai->llm)           Downloading
           | async_timeout-4.0.3-py3-none-any.whl (5.7 kB)
           | Collecting yarl<2.0,>=1.0 (from aiohttp->openai->llm)
           | Downloading yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl (61
           | kB)             ----------------------------------------
           | 61.3/61.3 kB 427.1 kB/s eta 0:00:00         Collecting
           | frozenlist>=1.1.1 (from aiohttp->openai->llm)
           | Downloading
           | frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl (46 kB)
           | ---------------------------------------- 46.7/46.7 kB 14.8
           | MB/s eta 0:00:00         Collecting aiosignal>=1.1.2 (from
           | aiohttp->openai->llm)           Downloading
           | aiosignal-1.3.1-py3-none-any.whl (7.6 kB)         Requirement
           | already satisfied: six>=1.5 in /zip/Lib/site-packages (from
           | python-dateutil->sqlite-utils>=3.35.0->llm) (1.16.0)
           | Installing collected packages: sqlite-fts4, tqdm, tabulate,
           | python-ulid, pluggy, multidict, frozenlist, click-default-
           | group, attrs, async-timeout, yarl, sqlite-utils, aiosignal,
           | sqlite-migrate, aiohttp, openai, llm         ERROR: Could not
           | install packages due to an OSError: [Errno 2] ENOENT/2/No
           | such file or directory: '/Users/simon/.local/bin/sqlite-
           | utils'
        
             | ahgamut wrote:
             | Yes, so pip works because the Python APE has OpenSSL built-
             | in.
             | 
             | pip install requires modifying the APE, so I end up
             | installing pure-Python libraries as follows:
             | mkdir Lib         ./python -m pip download httpx
             | unzip ./*.whl -d ./Lib         mv python python.com # in
             | case the next step doesn't work         zip -r ./python.com
             | Lib         mv python.com python
             | 
             | Installing CPython extensions like this is an unsolved
             | problem, but I think there might be some interesting
             | workarounds possible.
        
           | AMICABoard wrote:
           | Yes they do!
           | 
           | https://github.com/jart/cosmopolitan/tree/master/third_party.
           | ..
           | 
           | and
           | 
           | https://github.com/trholding/llama2.c
        
         | BiteCode_dev wrote:
         | Now imagine nuitka and gcc bundled as a standalone cross
         | plateform binary so you can basically compile a cross plaform
         | python exe from any script.
        
         | summarity wrote:
         | sudo xattr -rd com.apple.quarantine /path/to/binary/or/app
         | 
         | should also allow anything to run without opening settings
        
       | sgammon wrote:
       | Mind blowing, excited to play with Cosmo 3.
        
       | AMICABoard wrote:
       | I swear this is the coolest project ever!!! I am using cosmo for
       | our stuff too. jart & the team is super dedicated and responsive.
       | 
       | Kinda feels like they are super intelligent alien beings from
       | another planet trying to save us from software bloat and
       | fragmentation.
       | 
       | > POSIX even changed their rules about binary in shell scripts
       | specifically to let us do it.
       | 
       | I don't know what to say.
        
       | 1970-01-01 wrote:
       | Its not immediately clear what this is. The quick description is
       | completely off on another part of the website on another webpage.
       | TLDR: "Cosmopolitan" makes C a build-once run-anywhere language.
       | So here's your very easy tip of the day: Describe what your thing
       | does on the very same webpage you announce it. Very easy to do,
       | but not done nearly enough.
        
         | neogodless wrote:
         | I _kind of_ felt that way, as it starts with the assumption you
         | know what it is.
         | 
         | The first sub-title headline tells you, but it isn't clear to
         | someone new if this is "one of the features of something" or
         | "the thing."
         | 
         | > Build Once Anywhere, Run Anywhere C/C++
         | 
         | I clicked to the home page and then to here:
         | https://justine.lol/cosmopolitan/
         | 
         | Then I understood!
         | 
         | > Cosmopolitan Libc makes C a build-once run-anywhere language,
         | like Java, except it doesn't need an interpreter or virtual
         | machine.
         | 
         | While anyone familiar probably finds these comments "stupid",
         | just some helpful advice to the author - if it matters to you,
         | there are people discovering this for the first time who might
         | not realize what "it" is until you tell them!
        
           | 1970-01-01 wrote:
           | >it starts with the assumption you know what it is.
           | 
           | That's the gripe! It's all context! Here it is with SUNSHINE
           | 3.0.1:                    After nearly one year of
           | development, I'm pleased to announce our version 3.0.1
           | release of Sunshine. The project is an entirely new day. For
           | starters, Apple sponsored our work as part of their FLOWER
           | program. Google also awarded me an open source peer bonus for
           | my work on Sunshine, which is a rare honor, and it's nice to
           | see our project listed up there among the greats, e.g. OPEN,
           | QUIT, etc. In terms of this release, we're living up to the
           | great expectations you've all held for this project in a
           | number of ways. The first is we invented a new widget that
           | lets you grow large dirt which...
        
         | compiler-guy wrote:
         | An announcement on someone's project web site is not targeted
         | at the random folks on Hacker News, or even random folks in
         | general. They know their audience, and folks showing up from
         | random places should do at least a little bit of work to figure
         | out the context and surrounding pages.
         | 
         | If you've never read their blog or announcements before, I
         | don't know why you would expect them to cater to you.
         | 
         | HN's headline policy makes it especially hard here, because the
         | submitter can't provide context.
        
           | 1970-01-01 wrote:
           | >I don't know why you would expect them to cater to you.
           | 
           | Its odd to think someone should not expect new user interest
           | when they've made a new thing. Announcements are for new
           | users and old users alike.
        
       | gaucheries wrote:
       | The author might be interested to know that this page might be
       | displaying in an undesired way on iPhone mini screens:
       | 
       | https://i.ibb.co/v4s0Xpj/IMG-1221.png
        
         | jart wrote:
         | Eek. If anyone has a quick CSS fix for mobile I'll happily add
         | it. I'm talking to some of my people too. Thanks for bringing
         | it to my attention.
        
           | imiric wrote:
           | I'm amused by the fact that even authors of the most
           | technically brilliant projects in recent memory also struggle
           | with CSS, just like us mere mortals. :)
           | 
           | Love your work! <3
        
           | _jackdk_ wrote:
           | This is the only concession to mobile that I have on my
           | website, and it seems to do okay:                   <meta
           | name="viewport" content="width=device-width, initial-
           | scale=1">
        
       | mamcx wrote:
       | This could work with Rust? I have a great use case for it and
       | could slash half of my CI if is true!
        
         | vitiral wrote:
         | The trick could definitely work with rust since fundamentally
         | it's "just" a hack on how the various scripts work on different
         | systems. Actually getting the rust compiler to produce
         | cosmopolitan binaries would likely be a heavy lift though.
         | 
         | Also it says it supports WASM (wasi?) so some applications
         | might work out of the box with that.
        
         | ahgamut wrote:
         | https://github.com/ahgamut/rust-ape-example
         | 
         | My above repo contains example with the Rust standard library
         | that build as fat executables with Cosmopolitan Libc.
         | 
         | I also got ripgrep to build
         | https://github.com/ahgamut/ripgrep/tree/cosmopolitan, but it
         | wasn't part of the cosmocc binaries because some crates that
         | are part of the build require `#!feature(rustc_private)]` to be
         | added to their source code. Same goes for bat and fd.
         | 
         | To summarize, Rust CLI tools can be built with Cosmopolitan
         | Libc, but to build them like we can build gcc/emacs/git right
         | now, we will need some support and Rust expertise.
        
           | Georgelemental wrote:
           | Last time I looked into Rust-on-Cosmopolitan, I couldn't make
           | it work as Cosmopolitan determined syscall numbers, signal
           | numbers, and such at runtime, but Rust standard library
           | assumes compile-time constants (basically the same issue that
           | C switch-case has). How did you get around that? Have you
           | tested these binaries on non-Linux platforms?
        
             | jart wrote:
             | [delayed]
        
       | Alifatisk wrote:
       | Can I recompile Ruby with this and make the ruby runtime
       | portable?
        
         | ahgamut wrote:
         | Try it out! We got Lua/LuaJIT, Python, PHP, and Rust building
         | (the latter two are not fully automatic yet), so Ruby might be
         | possible even now.
        
       | NotSammyHagar wrote:
       | It says arm64 linux support, I will have to try this on a
       | raspberry pi. It's kind of amazing and magical that this person
       | pulled it off. We need a MacArther genius award for software. And
       | this should be the first award.
        
       | mprovost wrote:
       | Every time I see an update from Justine I get so excited. It's
       | like watching the future of computing unfold in real time. It
       | makes me wish we could send them back in time - all of the pieces
       | to make this work have been in place for a long long time but
       | nobody connected all the dots. The funniest part of this post are
       | the instructions to integrate it with autoconf. All of that
       | autotools nonsense wouldn't have had to exist if this had been
       | around!
        
       | haptic wrote:
       | This is a neat trick and clever technical work, but is it useful
       | in practical terms?
       | 
       | Like, wouldn't you just download the binary that's been compiled
       | specifically for the platform and architecture that you're using?
       | Rather than relying on a potentially quite fragile method of
       | cross-platform execution.
       | 
       | In a way it kind of reminds me of Urbit. Very clever, very cool,
       | but also very niche and more of a hobbyist showcase project than
       | anything else. Not that there's anything wrong with that of
       | course.
        
         | pie_flavor wrote:
         | Write once, run anywhere has been a slogan for coming up on
         | thirty years. Except all implementations of it have acceded to
         | reality in one or more important aspects, such as needing to
         | install Java separately. And it's not just platform-specific
         | compilation, it's everything that could _support_ platform-
         | specific compilation (if you 've never tried to cross-compile
         | from Linux to MSVC, you should), and also all sorts of
         | platform-specific code (like console functions vs terminal
         | sequences, or even stuff as banal as $HOME vs $USERPROFILE).
         | Cosmopolitan still isn't perfect, because it doesn't emulate
         | _all_ of Linux, so you still need kernel32.dll here and there.
         | But it is still the best of any attempts.
        
           | jart wrote:
           | I agree. You sound like you're speaking from experience. If
           | so, I'd love to hear what sort of stuff you're building with
           | Cosmo, if you're able to share! Feel free to reach out
           | anytime (privately or discord) and let me know what the
           | project can be doing to better serve your needs.
        
         | piaste wrote:
         | For the consumer it's a simple switch(arch) statement to
         | download the right binary.
         | 
         | But for the _developer_ , it means setting up 9 different build
         | pipelines and artifacts (and realistically, most won't bother
         | with BSD builds and a lot still don't bother with arm64
         | builds).
         | 
         | It's not necessarily a huge hurdle or an unbearable expense
         | with modern CI services, but it's still a massive deal that
         | this project can make it all unnecessary for every single C/C++
         | developer out there. If this were a paid product, literally
         | millions of companies would be happy to pay a small fee to save
         | on CI costs, time and maintenance.
        
       | gary_0 wrote:
       | Christmas came early! Thanks, jart-Claus, it's just what I
       | wanted!
        
       | pie_flavor wrote:
       | Is specific effort being put in to dodge antiviruses? I've been
       | unable to use redbean at work due to Crowdstrike deciding it's
       | malware.
        
       | dflock wrote:
       | Can we just put @jart in charge of computers now, please?
        
       | DrNosferatu wrote:
       | What would be the best/lightest GUI-via-the-browser framework to
       | employ with a program compiled as a Cosmopolitan fat binary?
       | 
       | (say, Qt WebAssembly? ...something else?)
       | 
       | Or is there a even better route to run-anywhere Cosmopolitan apps
       | with a GUI?
        
         | radiator wrote:
         | Perhaps, by the same authors, redbean, which "embeds Lua,
         | SQLite, and MbedTLS into a fork() driven application server"
         | ... " a great fit for when you want to build an app that's
         | vertically integrated into a single tiny file that runs on
         | nearly all PCs and servers". It looks like as of now, greenbean
         | exists as well.
        
       | spandextwins wrote:
       | Docker actually solved this quite a while ago with tags and
       | downloads of the correct architecture container. But this is
       | interesting even though it won't scale well.
        
         | vanderZwan wrote:
         | > Even though it won't scale well.
         | 
         | Why not?
        
         | holoduke wrote:
         | You cant compare these. And if you would then Docker would be
         | Mcafee alike.
        
       | c-c-c-c-c wrote:
       | > POSIX even changed their rules about binary in shell scripts
       | specifically to let us do it.
       | 
       | What does this refer to?
       | 
       | The latest POSIX standard was released 2007. [1]
       | 
       | 1: https://standards.ieee.org/ieee/1003.1/7101/
        
         | mananaysiempre wrote:
         | POSIX / SUS / the Open Group Base Specifications have issues
         | (pun not intended, but I'll take it), and then those issues
         | have editions. The last one of those is from 2018[1], being a
         | revision of (indeed) the 2008 issue. (I remember Landley being
         | more than a little acidic about this versioning scheme.)
         | 
         | I still have no idea what the quote is referring to, though,
         | and given Justine's slightly (deliberately?) unhinged manner of
         | writing, I'd give even odds the change is in fact from 2001 or
         | something like that.
         | 
         | [1]
         | https://pubs.opengroup.org/onlinepubs/9699919799.2018edition...
        
           | csande17 wrote:
           | [delayed]
        
         | jart wrote:
         | Author here. See https://austingroupbugs.net/view.php?id=1250
         | and https://austingroupbugs.net/view.php?id=1226
        
         | tedunangst wrote:
         | Don't think this is the bug they refer to, but it's one
         | affecting sh input rules. There are others.
         | 
         | https://austingroupbugs.net/view.php?id=1250
        
       | davikr wrote:
       | Trying to run Cosmos apps from the Windows Terminal opens a pop-
       | up saying "Select an app to open '<app>'". How can I execute
       | them?
       | 
       | I ended up finding a solution:
       | 
       | > If you want to run them on Windows, then you simply need to
       | rename the file so that it has the .com suffix. Better yet,
       | consider making that a symlink (a.k.a. reparse point).
        
         | jart wrote:
         | What I like to do is configure Windows Terminal Preview so it
         | launches `C:\bin\bash -l` as my command prompt. Once you're
         | inside bash, it doesn't care about the .com or .exe suffix
         | being there. Only CMD.EXE really cares about the suffix. So you
         | have to simply rename the files if you want to run it there.
        
       | NKosmatos wrote:
       | What kind of sorcery is this???
       | 
       | Just kidding, I've played around with some of the stuff @jart and
       | other contributors have created and it's mind blowing. Well done
       | and keep up the good work.
        
       | matheusmoreira wrote:
       | Congratulations on your release and sponsorships!
       | 
       | > In the Cosmos, every program is statically linked and contains
       | a PKZIP central directory where its /usr/share dependencies are
       | embedded.
       | 
       | Sounds really neat, even the data and configuration files are
       | linked into the executable. Can't wait to see what else you'll
       | come up with.
        
       | vanderZwan wrote:
       | > _However portability isn 't the only selling point. Cosmo Libc
       | will make your software faster and use less memory too._
       | 
       | With that in mind, is there a "slim binary" mode that lets me
       | only export the code to run the binaries on _my_ system, so that
       | I can reap these benefits for personal use without added  "bloat"
       | for a feature that I won't need? (where "bloat" is contextual,
       | with the current context being "not actually planning to make use
       | of portability")
        
         | jart wrote:
         | Author here. We've got you covered. Search for `MODE=tinylinux`
         | in the https://github.com/jart/cosmopolitan#getting-started
         | section of the README. If you use that build mode, then hello
         | world for x86 linux is only 8kb in size. It's very similar to
         | what you'd expect from Musl Libc. All the Windows / BSD / Mac /
         | BIOS stuff gets removed from the compilation.
         | 
         | That predefined mode is actually a friendly wrapper around a
         | more generalized platform support system Cosmopolitan offers,
         | which is called `-DSUPPORT_VECTOR` where you can define a
         | bitset of specifically what platforms you want to be supported.
         | Then dead code elimination takes care of the rest. The same
         | concept also generally applies to microarchitecture support,
         | where you can have as much or as little runtime dispatching as
         | you want.
        
         | mananaysiempre wrote:
         | I think you can subset supported systems, like you could only
         | compile for x86_64 ELF systems (aka Linux and *BSD) and have
         | the shim be much smaller; presumably a subset of one is also
         | acceptable. I don't know how (or if) you can do this with the
         | new build environment, though.
        
       | dataflow wrote:
       | As awesome as these are, they're not really portable
       | _executables_ if you can 't set their setuid bits and expect them
       | to run as root like with normal executables, right?
        
         | jart wrote:
         | There's a program that's part of cosmos called `assimilate`
         | which can turn any APE binary into a platform-specific binary.
         | jart@nightmare:~$ /opt/cosmos/bin/assimilate --help
         | assimilate: illegal option -- -         actually portable
         | executable assimilate v1.6         copyright 2023 justine
         | alexandra roberts tunney         usage: assimilate
         | [-xapembfchv] [-o PATH] FILE...         -h          show help
         | -v          show version         -f          ignore soft errors
         | -b          don't remove freebsd from elf os/abi         -c
         | clobber input path w/o making backup         -e
         | convert to elf regardless of host os         -m
         | convert to macho regardless of host os         -x
         | convert to amd64 regardless of host cpu         -a
         | convert to arm64 regardless of host cpu         -p
         | convert to ppc64 regardless of host cpu         -o PATH
         | write modified binary to different file
         | 
         | If you aren't using binfmt_misc then you can also pass the
         | `--assimilate` flag to your APE binary, to turn it into a
         | native executable, without having to use the tool. It's baked
         | into the shell script. Just use the `less` command on any APE
         | file and read the shell script.
         | 
         | Once assimilated, you're free to turn it into a setuid binary.
         | 
         | We also have patches in flight for the Linux Kernel as well as
         | BSDs, to make APE native. https://justine.lol/ape.patch
        
           | dataflow wrote:
           | Oh wow, that's very nice! Thanks for sharing!
        
       | Fraterkes wrote:
       | Very cool! What would the "gui-version" of this look like? Would
       | you write it once with linux bindings and the executable would
       | succesfully create a window in every operating system?
        
         | jart wrote:
         | I think it'd be pretty sweet to have a basically an APE
         | approach to having a blank GPU framebuffer canvas, and let high
         | level libraries do the rest. Other folks on my team have been
         | floating the idea of getting X to build as an APE binary. Who
         | knows what the future holds? We don't have any resources
         | devoted however to the problem at the moment.
        
       ___________________________________________________________________
       (page generated 2023-11-01 23:00 UTC)