diff options
author | Marius Bakke <mbakke@fastmail.com> | 2020-03-05 18:09:29 +0100 |
---|---|---|
committer | Marius Bakke <mbakke@fastmail.com> | 2020-03-05 23:36:06 +0100 |
commit | feb8c5dac30294d72205ee21b3afcf1cf7a04675 (patch) | |
tree | bb31c4a670276a1174ac554b2299943db97622cc /gnu/packages | |
parent | 4a50e983bade29792076975092fec60df5cca59d (diff) |
gnu: ld-wrapper: Add support for quoted arguments in response files.
* gnu/packages/ld-wrapper.in (expand-arguments): Add TOKENIZE procedure, and
use that to parse the response file.
Diffstat (limited to 'gnu/packages')
-rw-r--r-- | gnu/packages/ld-wrapper.in | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/gnu/packages/ld-wrapper.in b/gnu/packages/ld-wrapper.in index 16780c58f6..2b68b87fb9 100644 --- a/gnu/packages/ld-wrapper.in +++ b/gnu/packages/ld-wrapper.in @@ -16,6 +16,7 @@ exec @GUILE@ -c "(load-compiled \"@SELF@.go\") (apply $main (cdr (command-line)) !# ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org> +;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -35,7 +36,7 @@ exec @GUILE@ -c "(load-compiled \"@SELF@.go\") (apply $main (cdr (command-line)) (define-module (gnu build-support ld-wrapper) #:use-module (srfi srfi-1) #:use-module (ice-9 match) - #:autoload (ice-9 rdelim) (read-string) + #:autoload (ice-9 rdelim) (read-delimited) #:export (ld-wrapper)) ;;; Commentary: @@ -239,13 +240,27 @@ library outside of ~a: ~s~%" ;; Expand ARGS such that "response file" arguments, such as "@args.txt", are ;; expanded (info "(gcc) Overall Options"). (define (response-file-arguments file) + (define (tokenize port) + ;; Return a list of all strings found in PORT. Quote characters are + ;; removed, but whitespaces within quoted strings are preserved. + (let loop ((tokens '())) + (let* ((token+delimiter (read-delimited " '\"\n" port 'split)) + (token (car token+delimiter)) + (delim (cdr token+delimiter))) + (if (eof-object? token) + (reverse tokens) + (case delim + ((#\") (loop (cons (read-delimited "\"" port) tokens))) + ((#\') (loop (cons (read-delimited "'" port) tokens))) + (else (if (> (string-length token) 0) + (loop (cons token tokens)) + (loop tokens)))))))) + (when %debug? (format (current-error-port) "ld-wrapper: attempting to read arguments from '~a'~%" file)) - ;; FIXME: Options can contain whitespace if they are protected by single - ;; or double quotes; this is not implemented here. - (string-tokenize (call-with-input-file file read-string))) + (call-with-input-file file tokenize)) (define result (fold-right (lambda (arg result) |