Przejdź do treści

🍏 macOS DevTools and PATH

macOS development tools and PATH management differ significantly from traditional Unix systems. This guide covers Xcode tools, package managers, and proper PATH configuration for development environments.


🎯 Xcode Command Line Tools

Installation and Management

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Install Xcode Command Line Tools
xcode-select --install     # Install command line tools

# Check installation status
xcode-select -p            # Show tools path
xcode-select --version     # Show version

# Switch between Xcode installations
sudo xcode-select -s /Applications/Xcode.app  # Select Xcode
sudo xcode-select -s /Library/Developer/CommandLineTools  # Select CLT

# Reset to default
sudo xcode-select --reset

# Accept Xcode license
sudo xcodebuild -license   # Show and accept license

Core Development Tools

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Compilers and linkers
clang                      # C/C++ compiler (default)
clang++                    # C++ compiler
gcc                        # GCC (if installed separately)
g++                        # G++ (if installed separately)

# Build tools
make                       # BSD make
cmake                      # CMake (if installed)
ninja                      # Ninja build system (if installed)

# Assemblers and linkers
as                         # Assembler
ld                         # Linker
ar                         # Archive tool
ranlib                     # Archive indexer

# Debugging tools
lldb                       # LLVM debugger
gdb                        # GNU debugger (if installed)
leaks                      # Memory leak detector
malloc_history         # Malloc history

# Performance analysis
iprofiler              # Instruments command line
sample                 # Process sampling
dtrace                 # Dynamic tracing (limited)

🔧 Package Managers

Homebrew - The Missing Package Manager

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Homebrew installation
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Basic Homebrew commands
brew list                  # List installed formulae
brew search package        # Search for packages
brew info package          # Show package information
brew install package       # Install package
brew uninstall package     # Remove package
brew upgrade               # Upgrade all packages
brew outdated              # List outdated packages
brew cleanup               # Remove old versions

# Homebrew taps (repositories)
brew tap                   # List taps
brew tap homebrew/cask     # Add cask tap for GUI apps
brew tap-pin owner/repo    # Pin tap to use shorter names

# Casks (GUI applications)
brew list --cask           # List installed casks
brew install --cask app    # Install GUI application
brew uninstall --cask app  # Remove GUI application

# Homebrew services
brew services list         # List managed services
brew services start service # Start service
brew services stop service  # Stop service
brew services restart service # Restart service

MacPorts - Alternative Package Manager

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# MacPorts installation (requires Xcode CLT)
# Download from https://www.macports.org/install.php

# Basic MacPorts commands
port installed             # List installed ports
port search package        # Search for packages
port info package          # Show package information
port install package       # Install package
port uninstall package     # Remove package
port upgrade installed     # Upgrade all packages
port outdated              # List outdated packages

# Port variants
port variants package      # Show available variants
port install package +variant  # Install with variant

# Port management
sudo port -v selfupdate    # Update MacPorts
sudo port uninstall inactive  # Remove inactive versions
sudo port reclaim          # Reclaim disk space

📋 PATH Management

Understanding macOS PATH

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# View current PATH
echo $PATH

# Typical macOS PATH components:
# /usr/local/bin          - Homebrew executables
# /usr/bin                - System binaries
# /bin                    - Essential binaries
# /usr/sbin               - System administration
# /sbin                   - System binaries
# /usr/local/sbin         - Local system binaries

# PATH precedence matters!
# First directory in PATH takes precedence

# Check which version of a command is used
which clang                # Show path to clang
type clang                 # Show command type and path
command -v clang           # POSIX way to check command

Configuring PATH

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# Shell-specific PATH configuration

# For Bash (~/.bash_profile or ~/.bashrc)
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bash_profile

# For Zsh (~/.zshrc) - default on macOS Catalina+
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.zshrc

# For Fish (~/.config/fish/config.fish)
echo 'set -gx PATH "/usr/local/bin" $PATH' >> ~/.config/fish/config.fish

# System-wide PATH configuration (requires root)
# /etc/paths - additional paths
# /etc/paths.d/ - directory for path files

# Add custom path system-wide
echo "/opt/mytools/bin" | sudo tee /etc/paths.d/mytools

# Verify PATH changes
source ~/.zshrc            # Reload configuration
echo $PATH                 # Check updated PATH

Advanced PATH Management

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# Intelligent PATH management
setup_development_path() {
    local paths_to_add=(
        "/usr/local/bin"
        "/usr/local/sbin"
        "$HOME/.local/bin"
        "$HOME/go/bin"
        "$HOME/.rbenv/bin"
        "$HOME/.nvm/versions/node/v$(cat ~/.nvm/alias/default 2>/dev/null || echo 'default')/bin"
    )

    # Add paths that exist and aren't already in PATH
    for path in "${paths_to_add[@]}"; do
        if [ -d "$path" ] && [[ ":$PATH:" != *":$path:"* ]]; then
            export PATH="$path:$PATH"
        fi
    done
}

# Call during shell initialization
setup_development_path

🛠️ Development Environment Setup

Language-Specific Tools

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Python development
# Using pyenv for Python version management
brew install pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

# Node.js development
# Using nvm for Node version management
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install node           # Install latest Node
nvm use node               # Use latest Node
nvm alias default node     # Set default version

# Ruby development
# Using rbenv for Ruby version management
brew install rbenv
rbenv init                # Follow instructions to add to shell
rbenv install 3.0.0       # Install Ruby version
rbenv global 3.0.0        # Set global version

# Go development
brew install go
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"

IDE and Editor Setup

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Visual Studio Code
brew install --cask visual-studio-code

# Vim/Neovim
brew install vim neovim

# Emacs
brew install emacs

# JetBrains IDEs
brew install --cask intellij-idea
brew install --cask pycharm
brew install --cask goland

# Configure editors with development tools
# VS Code settings for integrated terminal
# {
#     "terminal.integrated.shell.osx": "/bin/zsh",
#     "terminal.integrated.env.osx": {
#         "PATH": "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
#     }
# }

📊 Version Management Tools

Multiple Version Management

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# SDKMAN! for JVM-based tools
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk list java             # List Java versions
sdk install java 11.0.12  # Install Java version
sdk use java 11.0.12      # Use specific version
sdk default java 11.0.12  # Set default version

# asdf - Universal version manager
brew install asdf
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ~/.zshrc
asdf plugin-add python    # Add Python plugin
asdf install python 3.9.7 # Install Python version
asdf global python 3.9.7  # Set global version

# direnv for project-specific environments
brew install direnv
echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
# Create .envrc in project directory:
# export PYTHONPATH=./src
# export DATABASE_URL=postgresql://localhost/myapp

🔍 Tool Verification and Troubleshooting

Development Tool Verification

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# Verify toolchain installation
verify_dev_tools() {
    local required_tools=(
        "clang:Clang compiler"
        "make:Build tool"
        "git:Version control"
        "python3:Python interpreter"
        "node:Node.js"
    )

    echo "=== Development Tool Verification ==="

    for tool_info in "${required_tools[@]}"; do
        local tool="${tool_info%%:*}"
        local description="${tool_info#*:}"

        if command -v "$tool" >/dev/null 2>&1; then
            local version
            version=$($tool --version 2>&1 | head -1)
            echo "✓ $tool ($description): $version"
        else
            echo "✗ $tool ($description): NOT FOUND"
        fi
    done
}

# Check compiler capabilities
check_compiler_features() {
    echo "=== Compiler Feature Check ==="

    # C++ standard support
    clang++ -std=c++20 -E -x c++ - </dev/null >/dev/null 2>&1 && echo "✓ C++20 support"
    clang++ -std=c++17 -E -x c++ - </dev/null >/dev/null 2>&1 && echo "✓ C++17 support"

    # OpenMP support
    echo '#include <omp.h>' | clang -Xpreprocessor -fopenmp -lomp -x c - >/dev/null 2>&1 && echo "✓ OpenMP support"

    # Debug information
    clang -gdwarf-4 -E -x c - </dev/null >/dev/null 2>&1 && echo "✓ DWARF-4 debug info"
}

# PATH conflict detection
detect_path_conflicts() {
    echo "=== PATH Conflict Detection ==="

    local common_tools=("gcc" "make" "python" "pip" "node" "npm")

    for tool in "${common_tools[@]}"; do
        if command -v "$tool" >/dev/null 2>&1; then
            local path
            path=$(command -v "$tool")
            echo "$tool: $path"

            # Check if it's from expected location
            if [[ "$path" == /usr/bin/* ]] && command -v "g$tool" >/dev/null 2>&1; then
                echo "  Warning: Consider using g$tool from Homebrew"
            fi
        fi
    done
}

Common Issues and Solutions

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# Issue: Wrong tool version being used
# Solution: Check PATH order and use full paths
/usr/bin/python3 --version  # System Python
/usr/local/bin/python3 --version  # Homebrew Python

# Issue: Missing headers or libraries
# Solution: Install Xcode Command Line Tools
xcode-select --install

# Issue: Permission denied when installing packages
# Solution: Fix Homebrew permissions
sudo chown -R $(whoami) /usr/local/share/zsh /usr/local/share/zsh/site-functions

# Issue: Shell not recognizing newly installed tools
# Solution: Reload shell configuration
source ~/.zshrc

# Issue: Conflicting versions of tools
# Solution: Use version managers or specify full paths
/usr/local/opt/python@3.9/bin/python3  # Specific Python version

🎨 Advanced Configuration

Custom Development Environments

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Project-specific environment setup
setup_project_environment() {
    local project_dir="$1"
    local env_file="$project_dir/.env"

    # Create project environment file
    cat > "$env_file" << 'EOF'
# Project-specific environment variables
export PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export PATH="$PROJECT_ROOT/bin:$PATH"
export PYTHONPATH="$PROJECT_ROOT/src:$PYTHONPATH"

# Development flags
export DEBUG=1
export LOG_LEVEL=DEBUG
EOF

    # Create activation script
    cat > "$project_dir/activate" << 'EOF'
#!/bin/bash
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$PROJECT_ROOT/.env"

echo "Activated project environment: $PROJECT_ROOT"
echo "Deactivate with: deactivate"

deactivate() {
    unset PROJECT_ROOT
    unset PYTHONPATH
    unset DEBUG
    unset LOG_LEVEL
    unset -f deactivate
    echo "Deactivated project environment"
}
EOF

    chmod +x "$project_dir/activate"
    echo "Project environment setup complete"
    echo "Activate with: source $project_dir/activate"
}

Shell Integration

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Zsh integration for development
# Add to ~/.zshrc

# Auto-completion for development tools
if command -v brew >/dev/null 2>&1; then
    FPATH="$(brew --prefix)/share/zsh/site-functions:$FPATH"
fi

# Initialize completion
autoload -Uz compinit
compinit

# Homebrew completion
if type brew &>/dev/null; then
    HOMEBREW_PREFIX="$(brew --prefix)"
    if [[ -r "${HOMEBREW_PREFIX}/etc/profile.d/bash_completion.sh" ]]; then
        source "${HOMEBREW_PREFIX}/etc/profile.d/bash_completion.sh"
    fi
fi

# Custom development aliases
alias ll='ls -la'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias ..='cd ..'
alias ...='cd ../..'

# Development directory navigation
alias dev='cd ~/Development'
alias work='cd ~/Work'

# Quick project setup
mkproject() {
    mkdir -p ~/Projects/"$1"/{src,tests,docs,bin}
    cd ~/Projects/"$1"
    git init
    echo "# $1" > README.md
    echo "venv/" > .gitignore
}

🧾 Summary Commands

Essential Development Commands

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Xcode tools
xcode-select --install     # Install CLT
xcode-select -p            # Show tools path

# Homebrew
brew install package       # Install package
brew list                  # List installed
brew search term           # Search packages

# PATH management
echo $PATH                 # Show current PATH
export PATH="/new/path:$PATH"  # Add to PATH

# Tool verification
which tool                 # Show tool path
type tool                  # Show tool type
command -v tool            # POSIX tool check

Development Environment Setup

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Complete development setup
setup_macos_dev_environment() {
    # Install Xcode CLT
    xcode-select --install

    # Install Homebrew
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    # Install essential tools
    brew install git python node ruby go

    # Install editors
    brew install --cask visual-studio-code

    # Install version managers
    brew install pyenv rbenv nvm

    # Configure shell
    echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.zshrc
    echo 'eval "$(pyenv init -)"' >> ~/.zshrc
    echo 'eval "$(rbenv init -)"' >> ~/.zshrc

    echo "Development environment setup complete!"
    echo "Please restart your terminal or run: source ~/.zshrc"
}

🧾 See Also