Message ID | 20200224160132.21037-1-mbakke@fastmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [bug#39767,core-updates] gnu: ld-wrapper: Preserve quoted arguments from response files. | expand |
Context | Check | Description |
---|---|---|
cbaines/comparison | success | View comparision |
cbaines/git branch | success | View Git branch |
cbaines/applying patch | success | View Laminar job |
Hi Marius! Marius Bakke <mbakke@fastmail.com> skribis: > * gnu/packages/ld-wrapper.in (expand-arguments): Add TOKENIZE procedure, and > use that to parse the response file. LGTM! > Currently the ld-wrapper will fail inscrutably if a response file > contains double quotes. This patch fixes that, and also preserves > whitespaces between quotes. Out of curiosity, where did you stumble upon response files with quotes? Was it GHC? Thanks, Ludo’.
Ludovic Courtès <ludo@gnu.org> writes: > Hi Marius! > > Marius Bakke <mbakke@fastmail.com> skribis: > >> * gnu/packages/ld-wrapper.in (expand-arguments): Add TOKENIZE procedure, and >> use that to parse the response file. > > LGTM! > >> Currently the ld-wrapper will fail inscrutably if a response file >> contains double quotes. This patch fixes that, and also preserves >> whitespaces between quotes. > > Out of curiosity, where did you stumble upon response files with quotes? > Was it GHC? A variant of this wrapper will (hopefully!) soon show up on the 'master' branch, required for version 80 of ungoogled-chromium. It generates response files where all "-lfoo" "-lbar" arguments are quoted, even though they contain no spaces. Thanks for the quick review, will merge it on core-updates after it hits 'master'. :-)
Marius Bakke <mbakke@fastmail.com> writes: > * gnu/packages/ld-wrapper.in (expand-arguments): Add TOKENIZE procedure, and > use that to parse the response file. I simplified it a bit and also discarded newlines and pushed to core-updates in feb8c5dac30294d72205ee21b3afcf1cf7a04675.
diff --git a/gnu/packages/ld-wrapper.in b/gnu/packages/ld-wrapper.in index 16780c58f6..5d5756f6a3 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,28 @@ 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 ((words '())) + (let* ((word (read-delimited " '\"" port 'split)) + (token (car word)) + (delim (cdr word))) + (if (eof-object? delim) + (reverse words) + (case delim + ((#\") (loop (cons (read-delimited "\"" port) words))) + ((#\') (loop (cons (read-delimited "'" port) words))) + ((#\ ) (if (> 0 (string-length token)) + (loop (cons token words)) + (loop words))) + (else (loop words))))))) + (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)