# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.3.31] - 2024-09-23

### Fixed

- Remove double `cargo:` prefix from linker line (#168).

## [0.3.30] - 2024-02-14

### Changed

- Update documentation for cross-compilation (#161).

- Update GitHub Action CI (#160).

## [0.3.29] - 2024-01-17

### Fixed

- Detection and usage of Windows static libraries (#154).

- Passing `-Wl,-u` to the linker if specified in the pkg-config file (#154).

## [0.3.28] - 2023-12-20

### Fixed

- Pass -l:libfoo.a to linker directly (#149).

### Changed

- Improve error message when library not found (#158).

## [0.3.27] - 2023-05-03

### Added

- Support falling back to `pkgconf` if `pkg-config` is not available (#145).

### Changed

- Simplify running `pkg-config` (#144).

- Document MSRV in `Cargo.toml` via `rust-version`.

- Fix a couple of minor clippy warnings (#147).

## [0.3.26] - 2022-10-26

### Added

- Support for handling full paths to libraries in addition to normal `-l`
  linker flags (#134).

## [0.3.25] - 2022-03-31

### Added

- Support for parsing `-Wl` linker arguments from the `Libs` lines and
  passing them to the linker as well as making them available via
  `Library::ld_args` (#131).

### Changed

- Use SPDX license format and remove obsolete badge info (#129).

## [0.3.24] - 2021-12-11

### Fixed

- Re-add `target_supported()`, which was accidentally removed in 0.3.15 (#128).

## [0.3.23] - 2021-12-06

### Changed

- Improve error messages when a `pkg-config` package can't be found (#127).

## [0.3.22] - 2021-10-24

### Fixed

- `pkg-config` compiles again with Rust 1.30 or newer. 0.3.21 accidentally
  made use of API only available since 1.40 (#124, #125).

### Changed

- Switched from Travis to GitHub Actions for the CI. Travis is dysfunctional
  since quite some time (#126).

## [0.3.21] - 2021-10-22

### Fixed

- Tests succeed again on macOS (#122).

### Changed

- Improve error message in case of missing pkg-config and provide instructions
  how it can be installed (#121).

## [0.3.20] - 2021-09-25

### Fixed

- Use target-specific pkg-config consistently everywhere (#121, #118).

## [0.3.19] - 2020-10-13

### Added

- Add `README.md` to be displayed on crates.io (#111).

- Support for `-isystem`, `-iquote` and `-idirafter` include flags (#115).

### Changed

- Improve documentation for cross-compilation (#113).

- Allow overriding system root via the `PKG_CONFIG_SYSROOT_DIR` or `SYSROOT`
  environment variable (#82).

## [0.3.18] - 2020-07-11

### Fixed

- Use `env::var_os()` almost everywhere to handle non-UTF8 paths in
  environment variables, and also improve error handling around environment
  variable handling (#106).

### Changed

- Default the `env_metadata` build parameter to `true` instead of `false`.
  Whenever a pkg-config related environment variable changes it would make
  sense to rebuild crates that use pkg-config, or otherwise changes might not
  be picked up. As such the previous default didn't make much sense (#105).

## [0.3.17] - 2019-11-02

### Fixed

- Fix support for multiple version number constraints (#95)

## [0.3.16] - 2019-09-09

### Changed
- Stop using deprecated functions and require Rust 1.30 (#84)

### Fixed
- Fix repository URL in README.md
- Fix various clippy warnings

### Added
- Run `cargo fmt` as part of the CI (#89)
- Derive `Clone` for `Library` and `Debug` for `Config (#91)
- Add support for `PKG_CONFIG_ALLOW_SYSTEM_CFLAGS` and enable by default (#93)

## [0.3.15] - 2019-07-25

### Changed
- Changes minimum documented rust version to 1.28 (#76)

### Fixed
- Fix Travis CI badge url (#78)
- Fix project name in README.md (#81)

### Added
- Support specifying range of versions (#75)
- Allow cross-compilation if pkg-config is customized (#44, #86)

## [0.3.14] - 2018-08-28

### Fixed
- Don't append .lib suffix on MSVC builds (#72)

## [0.3.13] - 2018-08-06

### Fixed
- Fix MSVC support to actually work and consider library paths too (#71)

## [0.3.12] - 2018-06-18

### Added
- Support for MSVC (#70)
- Document and test Rust 1.13 as minimally supported version (#66)

## [0.3.11] - 2018-04-24

### Fixed
- Re-added AsciiExt import (#65)

## [0.3.10] - 2018-04-23

### Added
- Allow static linking of /usr/ on macOS (#42)
- Add support for parsing `-Wl,` style framework flags (#48)
- Parse defines in `pkg-config` output (#49)
- Rerun on `PKG_CONFIG_PATH` changes (#50)
- Introduce target-scoped variables (#58)
- Respect pkg-config escaping rules used with --cflags and --libs (#61)

### Changed
- Use `?` instead of `try!()` in the codebase (#63)
