I'm using macOS. Most of times, I can install the components via Homebrew successfully. But sometimes it isn't so stable because of some network problems. Also, I find some components are offered as pre-compiled files, like
CodePudding user response:
Homebrew usually links the necessary executables to /usr/local/bin
directory, which should be in your $PATH
. Thus, when you execute a command like sdcc
, your shell will seek through the $PATH
directories, and when it looks at /usr/local/bin
, it will find sdcc
, follow the link and execute it.
Some packages do not perform this linking, which means you cannot execute them without knowing where they are. You can ask Homebrew to tell you where a package is installed: brew --prefix <formula>
, where <formula>
is the package name (e.g. brew --prefix sdcc
). The executable files will normally be under a bin
subdirectory. For example, brew --prefix sdcc
would likely tell you something like /usr/local/opt/sdcc
; then you can invoke sdcc
using /usr/local/opt/sdcc/bin/sdcc
, without having to cd
there. You could also put /usr/local/opt/sdcc/bin
into your $PATH
directly, though I do not recommend it. Another alternative is to create your own bin
(mine is in $HOME/.local/bin
), put it in $PATH
, and link there (ln -s <source> $HOME/.local/bin/
) any executables you wish your shell to easily find.
However, with Homebrew packages, I strongly suggest you do not try to imitate Homebrew by yourself, by installing things in Homebrew's domain. You can confuse Homebrew and create problems. Instead, let Homebrew do it.
If you need to install a package on a different OS than the one you are downloading at, you may need to first find out the bottle tag for the target (installation) computer. For example, for Big Sur, it is
big_sur
. Seebrew info --json <formula>
, underbottle.stable.files
you should find the bottle tags. Use--bottle-tag <tag>
in step 1 and 2 to select the right OS.Use
brew fetch --deps <formula>
to download (but not install) a package, including its dependencies. If you use the--verbose
flag, Homebrew will tell you where it downloaded each of the files.If you haven't used
--verbose
and still want to know where the downloaded files are:brew deps <formula>
will list all the packages it depends on. If a package needs to be compiled, you may need to also use the--include-build
option.brew --cache <formula>
will show you where a package file is downloaded.If you need to copy a package file to another computer, you should find out where the Homebrew would expect to find it: use
brew --cache --force-bottle <formula>
on the target computer, and copy the package file there. Don't forget to do that for each dependency package as well.After that,
brew install <formula>
will install from cache.
The only part of this process that needs internet connection is the first step, brew fetch
.
CodePudding user response:
For Unix (which MacOS is a family member) and Unix-like (eg. Linux) operating systems the thing that controls this feature is the PATH
environment variable.
To know which folders allow you to run programs without cd
-ing into them or prefix ./
to your program name you can print out the value of PATH
:
echo $PATH
On my machine it prints out:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/slebetman/bin:/opt/homebrew/bin
There are two things to notice:
The string is a list of folder paths separated by
:
There is a path listed as
/opt/homebrew
. Presumably this is where homebrew installs command-line programs.
Copying your program/script into any of the folders listed in PATH
will allow you to use it like any installed/built-in command. This is what it means to install command-line programs on Unix. It's that simple.
There is another thing to notice: I have in my PATH
the folder /Users/slebetman/bin
. This is my own personal standard - probably not invented by me but one I adopted from my college days - for installing my own programs. I have this ~/bin
folder on all my Unix and Linux machines. It is where I keep my personal collection of scripts that I've written or collected over a lifetime.
Having a personal ~/bin
folder is nice because you don't need sudo permission to write to it. Also, if you buy a new PC/Mac you can just copy the folder to your new machine and all the scripts you've gotten used to now exist on the new machine. Better yet, you can manage the folder with git
and sync it with github/gitlab/bitbucket to make it easy to keep all your computers updated.
Since PATH
is a standard environment variable you can easily modify it to add your own folder. Just add the following in your .profile
or .zshrc
or .bashrc
file (depending on your shell) to add your own bin
folder to PATH
:
export PATH=$PATH:$HOME/bin
The command above simply says add $HOME/bin
to PATH
and export it so that other programs will inherit the new PATH
variable.
In your case you can even do something like:
export PATH=$PATH:/path/to/your/sdcc/bin
to have all your SDCC commands work like regular commands.