There is no spec, but the man page has info on what you asked

http://linux.die.net/man/1/pkg-config

> Hi Max,
> 
> The proposal refers to "the pkg-config specification", can you add a link to 
> that? In particular, I am curious how SwiftPM will know where to look for 
> those files.
> 
>  - Daniel
> 
>> On Mar 31, 2016, at 4:04 PM, Max Howell via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> I have updated the proposal with everyone’s feedback:
>> 
>> SwiftPM System Module Search Paths
>> Proposal: SE-NNNN 
>> <https://github.com/apple/swift-evolution/blob/master/proposals/NNNN-swiftpm-system-module-search-paths.md>
>> Author: Max Howell <https://github.com/mxcl>
>> Status: Awaiting review
>> Review manager: Anders Bertelrud
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#introduction>Introduction
>> 
>> Swift is able to import C libraries in the same manner as Swift libraries.
>> 
>> For this to occur the library must be represented by a clang module-map file.
>> 
>> The current system for using these module-map files with SwiftPM works, but 
>> with a number of caveats that must be addressed.
>> 
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#motivation>Motivation
>> 
>> The current implementation of system module packages have a number of 
>> problems:
>> 
>> Install locations vary across platforms and modulemap files require absolute 
>> paths
>> /usr/lib:/usr/local/lib is not always a sufficient -L search path
>> /usr/include:/usr/local/include is not always a sufficient -I C compiler 
>> search path
>> Installing the system library is left up to the end-user to figure out
>> For example to import a module map representing the GTK library, the include 
>> search path must be supplemented with -I/usr/include/gtk so that a number of 
>> includes in the gtk.h header can be sourced for the complete modular 
>> definition of GTK.
>> 
>> For example to import a module map representing the GTK library a user must 
>> first have a copy of GTK and its headers installed. On Debian based systems 
>> the install name for this system package is libgtk-3-0-dev which is not 
>> entirely intuitive.
>> 
>> For example, Homebrew and MacPorts on OS X install to prefixes other than 
>> /usr. .modulemap files must specify headers with absolute paths. The 
>> standard we encourage with modulemaps is for the headers to be specified 
>> with an assumed prefix of /usr, but you will not find eg. jpeglib.h at 
>> /usr/include/jpeglib.h if it is installed with Homebrew or MacPorts.
>> 
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#proposed-solution>Proposed
>>  Solution
>> 
>> We propose that SwiftPM gains the ability to use the cross-platform 
>> pkg-config tool so that it can query pkg-config for the missing path and 
>> flag arguments.
>> 
>> We propose that SwiftPM gains the ability to use the cross-platform 
>> pkg-config tool to identify when the system package is not installed to a 
>> /usr and in such a case preprocess the modulemap changing the prefix it uses.
>> 
>> We propose that Package.swift is supplemented with metadata that provides 
>> the package-install-name for specific platforms.
>> 
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#detailed-design>Detailed
>>  Design
>> 
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#solving-pathflags-issues>Solving
>>  Path/Flags Issues
>> 
>> Some of our problems can be solved by using the cross platform tool: 
>> pkg-config.
>> 
>> A C package can provide a pkg-config file (.pc) which describes:
>> 
>> Its install location
>> Supplementary C-flags that should be used when compiling against this library
>> Supplementary C-flags that should be used when linking against this library
>> If SwiftPM used the .pc file that comes with packages, this solves problems 
>> 1 through 3.
>> 
>> Of the tickets we currently have open describing issues using 
>> Swift-system-module-packages, reading the .pc file would fix all of them.
>> 
>> It is a convention to name the .pc file after the library link-name, so we 
>> can determine which .pc file to ask pkg-configfor by parsing the .modulemap 
>> file in the Swift package. However sometimes this is not true, (eg. GTK-3 on 
>> Ubuntu), so we will make it possible to specify the .pc file name in 
>> Package.swift.
>> 
>> pkg-config is not currently a dependency of the Swift toolchain, and thus to 
>> avoid depending on it we will schedule work to interpret .pc files without 
>> requiring pkg-config to be installed. The file format for .pc files is 
>> simple and standard so despite reinventing the wheel, this is a low risk 
>> choice.
>> 
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#providing-package-install-names>Providing
>>  Package Install Names
>> 
>> Package.swift would be supplemented like so:
>> 
>> let package = Package(
>>     name: "CFoo",
>>     providers: .Brew(installName: "foo"),
>>                 .Apt(installName: "libfoo-dev"),
>>           .PkgConfig("foo.pc"),
>> )
>> Thus, in the event of build failure for modules that depend on this package 
>> we provide additional help to the user:
>> 
>> error: failed to build module `bar'
>> note: you may need to install `foo' using your system-packager:
>> 
>>     apt-get install libfoo-dev
>> Since the syntax to provide this information uses an explicit enum we can 
>> add code for each enum to detect which system packagers should be 
>> recommended. The community will need to write the code for their own 
>> platforms. It also means that if a specific packager requires additional 
>> parameters, they can be added on a per enum basis.
>> 
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#install-names-are-not-standard>Install-names
>>  are not standard
>> 
>> apt is used across multiple distirbutions and the install-names for tools 
>> vary. Even for the same distribution install-names may vary across releases 
>> (eg. from Ubuntu 15.04 to Ubuntu 15.10) or even on ocassion at finer 
>> granularity.
>> 
>> We will not add explicit handling for this, but one can imagine the enums 
>> for different system packagers could be supplemented in a backwards 
>> compatible way to provide specific handling as real-world uses emerge, eg:
>> 
>> case Apt(installName: String)
>> 
>> // …could be adapted to:
>> 
>> struct Debian: Linux {}
>> struct Ubuntu: Debian {
>>     enum Variant {
>>         case Gubuntu
>>         case Kubuntu(Version)
>>     }
>>     enum Version {
>>         case v1510
>>         case v1504
>>     }
>> }
>> case Apt(installName: String, distribution: Linux? = nil)
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#impact-on-existing-code>Impact
>>  on Existing Code
>> 
>> There will be no impact on existing code as this feature simply improves an 
>> existing feature making new code possible.
>> 
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#alternatives-considered>Alternatives
>>  Considered
>> 
>> A clear alternative is allowing additional flags to be specified in a 
>> system-module package’s Package.swift.
>> 
>> However since these paths and flags will vary by platform this would because 
>> a large matrix that is quite a maintenance burden. Really this information 
>> is recorded already, in the system package itself, and in fact almost all 
>> packages nowadays provide it in a .pc pkg-config file.
>> 
>> Also we do not want to allow arbitrary flags to be specified in 
>> Package.swift, this allows packages too much power to break a large 
>> dependency graph with bad compiles. The only entity that understands the 
>> whole graph and can manage the build without breakage is SwiftPM, and 
>> allowing packages themselves to add arbitrary flags prevents SwiftPM from 
>> being able to understand and control the build ensuring reliability and 
>> preventing “Dependency Hell”.
>> 
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#unsolved-problems>Unsolved
>>  Problems
>> 
>> Some (usually more legacy) C libraries do not provide .pc files instead they 
>> may provide a tool named eg. foo-configthat can be queried for compile and 
>> link flags. We do not yet support these tools, and would prefer to take a 
>> wait and see approach to determine how important supporting them may be.
>> 
>> Some libraries on OS X do not come with .pc files. Again we'd like to see 
>> which libraries are affected before potentially offering a solution here.
>> 
>>  
>> <https://github.com/mxcl/swift-evolution/blob/system-module-search-paths/proposals/NNNN-swiftpm-system-module-search-paths.md#future-directions>Future
>>  Directions
>> 
>> The build system could be made more reliable by having the specific packager 
>> provide the information that this proposal garners from pkg-config. For 
>> example, Homebrew installs everything into independent directories, using 
>> these directories instead of more general POSIX search paths means there is 
>> no danger of edge-case search path collisions and the wrong libraries being 
>> picked up.
>> 
>> If this was done pkg-config could become just one option for providing this 
>> data, and be used only as a fallback.
>> 
>> We do not wish to provide a flag to automatically install dependencies via 
>> the system packager. We feel this opens us up to security implications 
>> beyond the scope of this tool.
>> 
>> Instead we can provide JSON output that can be parsed and executed by some 
>> other tooling developed outside of Apple.
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to