208

Is there a tool in the Cygwin package similar to apt-get on Debian or yum on redhat that allows me to install components from the command line?

Zombo
  • 1
  • 62
  • 391
  • 407
vy32
  • 28,461
  • 37
  • 122
  • 246

9 Answers9

160

Cygwin's setup accepts command-line arguments to install packages from the command-line.

e.g. setup-x86.exe -q -P packagename1,packagename2 to install packages without any GUI interaction ('unattended setup mode').

(Note that you need to use setup-x86.exe or setup-x86_64.exe as appropriate.)

See https://cygwin.com/packages/ for the package list.

AJM
  • 1,317
  • 2
  • 15
  • 30
jturney
  • 2,510
  • 1
  • 17
  • 24
  • 6
    Nice! setup.exe is now called setup-x86.exe - or a variant depending on cpu bits. Also see here for the package list http://cygwin.com/packages/ – ErichBSchulz Jan 18 '14 at 06:43
  • 3
    Also, to specify multiple packages, separate them with commas. e.g. in DOS, type `setup-x86_64 --packages="openssh,python"` – Michael Scheper Mar 19 '14 at 23:00
  • There doesn't seem to be a way of setting up specific versions. – CMCDragonkai May 26 '16 at 17:02
  • @jturney, Is this stable? – Pacerier Mar 04 '17 at 00:13
  • 1
    @Pacerier, It's unclear what you are asking. This should be a feature of setup that it's safe to rely on. – jturney Mar 05 '17 at 14:22
  • 1
    https://sourceware.org/git/?p=cygwin-setup.git;a=blob;f=package_meta.cc;h=1c6183c638d059a3236c76c18d5dc56d4be75e3c;hb=HEAD#l351 shows that -P accepts packageName=version pairs. And the feature announcement is at https://cygwin.com/pipermail/cygwin-announce/2021-April/010021.html – Mike Kaganski May 28 '21 at 16:09
  • 1
    Just to be clear, `-P packagename=version` is a new feature. Just `-P packagename` has been accepted for a long time (and still is) ... – jturney Jun 10 '21 at 18:53
143

For a more convenient installer, you may want to use apt-cyg as your package manager. Its syntax similar to apt-get, which is a plus. For this, follow the above steps and then use Cygwin Bash for the following steps

wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
chmod +x apt-cyg
mv apt-cyg /usr/local/bin

Now that apt-cyg is installed. Here are few examples of installing some packages

apt-cyg install nano
apt-cyg install git
apt-cyg install ca-certificates
Zombo
  • 1
  • 62
  • 391
  • 407
sagunms
  • 8,030
  • 5
  • 41
  • 43
  • 19
    Obviously use setup-x86_64.exe -q -P wget,tar,qawk,bzip2,subversion,vim for 64 bit windows. – Arun Dec 24 '13 at 16:46
  • 4
    Needed to add --no-check-certificate to the wget command. Otherwise, superb. – akauppi Mar 20 '14 at 11:31
  • 1
    And now it's a 404 (after a few redirects) – Shadow Jul 29 '14 at 23:27
  • Just tried `wget` and it downloads `apt-cyg` without problems. At what point does the 404 appear? – sagunms Jul 30 '14 at 00:18
  • 4
    wget is not installed by default with cygwin, meaning this needs to be bootstrapped with a manual and non-programmatic installation. –  Jan 30 '15 at 11:43
  • `apt-cyg` now allows fallback to `lynx` out-of-the-box. You could then use `apt-cyg` to install `wget` if you need that or simply don't want to see the warnings about the fallback. – underscore_d Sep 24 '15 at 09:50
  • 1
    `wget, lynx, setup-x86.exe, setup-x86_64.exe` **are not recognized as internal or external commands**. Now what? What is the first thing i should do after installing `cygwin` ? I'm super confused about all this steps. Any advice? – AIon Jul 24 '17 at 16:25
  • Re: akauppi's comment. Don't add `--no-check-certificate` unless you really know what you're doing. I would almost never recommend disabling certificate validation. It's a security risk. – ADJenks Aug 19 '22 at 19:18
  • apt-cyg does not seem to install dependencies. For example, if I install rsync it won't install libcyxxhash and it results in an error: `rsync.exe: error while loading shared libraries: cygxxhash-0.dll: cannot open shared object file: No such file or directory`. – szx Nov 07 '22 at 08:04
111

There is no tool specifically in the 'setup.exe' installer that offers the functionality of apt-get. There is, however, a command-line package installer for Cygwin that can be downloaded separately, but it is not entirely stable and relies on workarounds.

apt-cyg: http://github.com/transcode-open/apt-cyg

Check out the issues tab for the project to see the known problems.

Zorobabel
  • 1,211
  • 1
  • 10
  • 9
  • Thanks! Just what I wanted to know. I wonder why they aren't mature? – vy32 Feb 20 '12 at 02:53
  • Good question. I'm not entirely sure of the answer, actually. – Zorobabel Feb 25 '12 at 15:45
  • 4
    @vy32: because you didn't help to make them mature? :) They can't write themselves. Someone have to work on them. And since their usability is quite limited (to overwrite files currently in use on Windows you have to close Cygwin first, so it's not possible to execute any package manager in closed Cygwin :), there isn't many people interested. – David Ferenczy Rogožan Apr 17 '14 at 20:01
  • 15
    From another answer: `setup-x86.exe -q -P packagename1,packagename2`. Not as fancy as `apt-get` or even `apt-cyg` but it does the trick in most cases. And you can also run this from `cmd.exe` (after closing Cygwin). – the Jun 02 '15 at 16:40
  • 2
    @Steve , the answer by Dawid says it moved to "sage". http://stackoverflow.com/a/23143997/80772 – eel ghEEz Feb 05 '16 at 17:29
  • 3
    Since the original project is dead, I suggest looking at this (as of the time of this comment) active fork: https://github.com/kou1okada/apt-cyg – Vladimir Panteleev Aug 19 '17 at 17:37
  • @VladimirPanteleev Wow, wasn't aware of this and I've been using the transcode version for years - thanks! – Hashim Aziz Mar 24 '19 at 23:55
58

There exist some scripts, which can be used as simple package managers for Cygwin. But it’s important to know, that they always will be quite limited, because of...ehm...Windows.

Installing or removing packages is fine, each package manager for Cygwin can do that. But updating is a pain since Windows doesn’t allow you to overwrite an executable, which is currently running. So you can’t update e.g. Cygwin DLL or any package which contains the currently running executable from the Cygwin itself. There is also this note on the Cygwin Installation page:

"The basic reason for not having a more full-featured package manager is that such a program would need full access to all of Cygwin’s POSIX functionality. That is, however, difficult to provide in a Cygwin-free environment, such as exists on first installation. Additionally, Windows does not easily allow overwriting of in-use executables so installing a new version of the Cygwin DLL while a package manager is using the DLL is problematic."

Cygwin’s setup uses Windows registry to overwrite executables which are in use and this method requires a reboot of Windows. Therefore, it’s better to close all Cygwin processes before updating packages, so you don’t have to reboot your computer to actually apply the changes. Installation of a new package should be completely without any hassles. I don’t think any of package managers except of Cygwin’s setup.exe implements any method to overwrite files in use, so it would simply fail if it cannot overwrite them.


Some package managers for Cygwin:

apt-cyg

Update: the repository was disabled recently due to copyright issues (DMCA takedown). It looks like the owner of the repository issued the DMCA takedown on his own repository and created a new project called Sage (see bellow).

The best one for me. Simply because it’s one of the most recent. It doesn’t use Cygwin’s setup.exe, it rather re-implements, what setup.exe does. It works correctly for both platforms - x86 as well as x86_64. There are a lot of forks with more or less additional features. For example, the kou1okada fork is one of the improved versions, which is really great.

apt-cyg is just a shell script, there is no installation. Just download it (or clone the repository), make it executable and copy it somewhere to the PATH:

chmod +x apt-cyg # set executable bit
mv apt-cyg /usr/local/bin # move somewhere to PATH
# ...and use it:
apt-cyg install vim

There is also bunch of forks with different features.


sage

Another package manager implemented as a shell script. I didn't try it but it actually looks good.

It can search for packages in a repository, list packages in a category, check dependencies, list package files, and more. It has features which other package managers don't have.


cyg-apt

Fork of abandoned original cyg-apt with improvements and bugfixes. It has quite a lot of features and it's implemented in Python. Installation is made using make.


Chocolatey’s cyg-get

If you used Chocolatey to install Cygwin, you can install the package cyg-get, which is actually a simple wrapper around Cygwin’s setup.exe written in PowerShell.


Cygwin’s setup.exe

It also has a command line mode. Moreover, it allows you to upgrade all installed packages at once (as apt-get upgrade does on Debian based Linux).

Example use:

setup-x86_64.exe -q --packages=bash,vim

You can create an alias for easier use, for example:

alias cyg-get="/cygdrive/d/path/to/cygwin/setup-x86_64.exe -q -P"

Then you can, for example, install Vim package with:

cyg-get vim

AJM
  • 1,317
  • 2
  • 15
  • 30
David Ferenczy Rogožan
  • 23,966
  • 9
  • 79
  • 68
  • 5
    `sage` is a fork of `apt-cyg` by its most active contributors over the past year or two (Steven Penny). It appears that earlier this year he had some disagreement with the original `apt-cyg` author (Stephen Jungels) and issued the DMCA takedown when he forked the project. Since Jungels (aka Transcode) is verifiably the original author of the project, GitHub restored the original project soon after. Currently, both projects are available – though the original project hasn't had any new code updates since the split. It’s a messy situation, really. – Anthony Geoghegan Dec 09 '16 at 13:26
  • setup-x86_64.exe -q --packages=bash,vim. This approach has helped me in the past. Just run it from command line and it works smoothly. – TheWalkingData Jan 11 '17 at 21:13
  • The sage project is no longer hosted on GitHub, at least not at that URL. I've submitted an edit which replaces it with an archive URL, but I don't know whether the project still exists at a different location or not. – AJM May 05 '22 at 12:05
13

First, download installer at: https://cygwin.com/setup-x86_64.exe (Windows 64bit), then:

# move installer to cygwin folder
mv C:/Users/<you>/Downloads/setup-x86_64.exe C:/cygwin64/

# add alias to bash_aliases
echo "alias cygwin='C:/cygwin64/setup-x86_64.exe -q -P'" >> ~/.bash_aliases
source ~/.bash_aliases

# add bash_aliases to bashrc if missing
echo "source ~/.bash_aliases" >> ~/.profile

e.g.

# install vim
cygwin vim

# see other options
cygwin --help
Jason
  • 1,974
  • 24
  • 19
4

I wanted a solution for this similar to apt-get --print-uris, but unfortunately apt-cyg doesn't do this. The following is a solution that allowed me to download only the packages I needed, with their dependencies, and copy them to the target for installation. Here is a bash script that parses the output of apt-cyg into a list of URIs:

#!/usr/bin/bash

package=$1
depends=$( \
    apt-cyg depends $package \
    | perl -ne 'while ($x = /> ([^>\s]+)/g) { print "$1\n"; }' \
    | sort \
    | uniq)
depends=$(echo -e "$depends\n$package")
for curpkg in $depends; do
    if ! grep -q "^$curpkg " /etc/setup/installed.db; then
    apt-cyg show $curpkg \
        | perl -ne '
            if ($x = /install: ([^\s]+)/) { 
                print "$1\n"; 
            }
            if (/\[prev\]/) { 
                exit; 
            }'
    fi
done

The above will print out the paths of the packages that need downloading, relative to the cygwin mirror root, omitting any packages that are already installed. To download them, I wrote the output to a file cygwin-packages-list and then used wget:

mirror=http://cygwin.mirror.constant.com/
uris=$(for line in $(cat cygwin-packages-list); do echo "$mirror$line"; done)
wget -x $uris

The installer can then be used to install from a local cache directory. Note that for this to work I needed to copy setup.ini from a previous cygwin package cache to the directory with the downloaded files (otherwise the installer doesn't know what's what).

wakjah
  • 4,541
  • 1
  • 18
  • 23
4

Old question, but still relevant. Here is what worked for me today (6/26/16).

From the bash shell:

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin
Keith Thompson
  • 254,901
  • 44
  • 429
  • 631
  • 1
    `wget` or `curl` is probably a better tool for this. (And personally, I'd install it in some other directory in my `$PATH` rather than in `/bin`.) – Keith Thompson Jul 22 '16 at 21:34
4

Dawid Ferenczy's answer is pretty complete but after I tried almost all of his options I've found that the Chocolatey’s cyg-get was the best (at least the only one that I could get to work).

I was wanting to install wget, the steps was this:

choco install cyg-get

Then:

cyg-get wget
ostergaard
  • 3,377
  • 2
  • 30
  • 40
fabriciorissetto
  • 9,475
  • 5
  • 65
  • 73
1

Usually before installing a package one has to know its exact name:

# define a string to search
export to_srch=perl

# get html output of search and pick only the cygwin package names
wget -qO- "https://cygwin.com/cgi-bin2/package-grep.cgi?grep=$to_srch&arch=x86_64" | \
perl -l -ne 'm!(.*?)<\/a>\s+\-(.*?)\:(.*?)<\/li>!;print $2'

# and install 
# install multiple packages at once, note the
setup-x86_64.exe -q -s http://cygwin.mirror.constant.com -P "<<chosen_package_name>>"
Yordan Georgiev
  • 5,114
  • 1
  • 56
  • 53