Nano Hash - криптовалюты, майнинг, программирование

С++ makefile добавляет префикс к списку элементов в двойных кавычках с пробелами

Допустим, у меня есть это в моем make-файле:

FOLDERS = "C:\Program Files\some3rdpartytool\inc\thing1.h" \
          "C:\Program Files\some3rdpartytool\lib\libthing.lib" \
          "C:\data\data1.h" \

Теперь я хочу, чтобы INCLUDE содержал:

INCLUDE = -I"C:\Program Files\some3rdpartytool\inc" \
          -I"C:\Program Files\some3rdpartytool\lib" \
          -I"C:\data" \

Обычно это легко - вы просто что-то вроде:

INCLUDE = $(addprefix -I, $(FOLDERS))
# you can also use the standard makefile function to take the folder path
# only - I just forget what it is off the top of my head...

Но независимо от того, что я делаю, это всегда работает только в списках, разделенных пробелами (как это и задумано), поэтому я получаю что-то вроде этого:

INCLUDE = -I"C:\Program \
          -IFiles\some3rdpartytool\inc" \
          -I"C:\Program \
          -IFiles\some3rdpartytool\lib" \
          -I"C:\data" \

Есть ли стандартный способ makefile для этого? (стандартный == портативный), я хочу, чтобы это идеально работало на Windows и Linux.

Примечание Я думал о замене любого ' "' --> ' -I"', но я не могу использовать пробел в команде subst... Я борюсь за продвижение вперед с этим...


  • Какую make программу вы используете? Сделать ГНУ? 05.04.2018
  • @Someprogrammerdude Я использую различные производители: Cygwin, mingw и Linux (gmake) ... Я думаю, что все они gmake или gmake-подобные ... 05.04.2018
  • Не помещайте свои источники в Program Files 05.04.2018
  • @igagis - это всего лишь пример, на самом деле он включает пути к файлам libs или h, которые находятся в программных файлах ... так что ваше предложение на самом деле не работает :( ... я обновлю пример, чтобы он не был таким глупым: ) 05.04.2018
  • @code_fodder помещать библиотеки в Program Files - плохая идея. Использование пробелов в именах каталогов — плохая идея. Для этого, AFAIK, нет хорошего решения. 05.04.2018
  • @igagis - вам не нужно говорить мне об этом, я ненавижу иметь дело с пробелами в пути ... но, как я уже упоминал в новом примере, они предназначены для инструментов сторонних, т.е. я выбора нет :( Отсюда и вопрос. 05.04.2018
  • Решит ли символическая ссылка на Program Files/ проблему? Я думаю, что чистое решение Make возможно, но оно уродливо. 05.04.2018
  • @Beta мм... символическая ссылка?... в окнах?, теоретически да, это может быть возможно. Но я действительно не думаю, что доверяю win-sym-links... если бы это был Linux, я был бы во всем этом (но тогда у меня не было бы пробелов). Причина, по которой я хочу обслуживать пробелы, заключается в том, чтобы сделать это более общим/защитным на будущее, поэтому даже с символическими ссылками мне пришлось бы предостерегать будущих пользователей от их добавления - т.е. новый пользователь проверяет проект, и он не работает из коробки :( 05.04.2018

Ответы:


1

Хорошо, поехали.

FOLDERS = "C:\Program Files\blah\thing1.h" \
          "C:\Program Files\blah\libthing.lib" \
          "C:\data\data1.h"

Теперь мы используем трюк, который я узнал от @MadScientist, определяя переменную, содержащую пробел, и используя заполнитель, который, как вы уверены, не встречается в ваших путях, например «ПРОБЕЛ».

E :=
S := $E $E

X1 := $(subst $(S),SPACE,$(FOLDERS))
# "C:\ProgramSPACEFiles\blah\thing1.h"SPACE"C:\ProgramSPACEFiles\...

Кажется, это заменяет все экземпляры ' ', включая те, что между путями, поэтому мы вернем их обратно:

X2 := $(subst "SPACE","$(S)",$(X1))
# "C:\ProgramSPACEFiles\blah\thing1.h" "C:\ProgramSPACEFiles\...

Затем добавьте «-I»:

X3 := $(addprefix -I,$(X2))
# -I"C:\ProgramSPACEFiles\blah\thing1.h" -I"C:\ProgramSPACEFiles\...

Затем измените «ПРОБЕЛ» обратно на ' ':

X4 := $(subst SPACE,$(S),$(X3))
# -I"C:\Program Files\blah\thing1.h" -I"C:\Program Files...
05.04.2018
  • Это хороший трюк с двойной заменой пробела ... так как я прячу это правило в общем файле make (пользователь не должен редактировать этот код), то я, вероятно, могу превратить это в одно большее ужасное правило: o ... хорошо сделано, вероятно, стоит больше, чем +1 :p 06.04.2018

  • 2

    Решение @Beta красивое и общее. Другой вариант, более конкретный, но, возможно, более простой, — использовать что-то вроде:

    FOLDERS = "C:\Program Files\some3rdpartytool\inc" \
              "C:\Program Files\some3rdpartytool\lib" \
              "C:\data"
    
    INCLUDES := $(patsubst "C:%,-I"C:%,$(FOLDERS))
    

    но, конечно, это не удается, если у вас есть папки за пределами диска C:.

    Последний вариант, который является более общим, но все еще имеет несколько проблем (он уменьшает пробелы, является основным, но я никогда не слышал о путях с несколькими последовательными пробелами, так что, возможно, это нормально) будет примерно таким:

    INCLUDES := -I$(subst " "," -I",$(strip $(FOLDERS)))
    
    05.04.2018
  • У меня была попытка заменить начальную строку только как в $(patsubst "%,-I"C:%,$(FOLDERS)), но мне нужно было указать пробел перед первой кавычкой. возможно, я могу использовать там переменную $(S) Beta?... У меня будет поиграйте с этим позже :) ... +1, потому что, как вы упомянули, это также работает ограниченно 06.04.2018
  • Я не понимаю твоего патсубста... это не сработает. Вам не нужно сопоставлять пробел перед первой кавычкой, ЕСЛИ вы включаете достаточно начала строки, чтобы сделать ее уникальной. Вот почему я использовал "C: в качестве строки соответствия (в первом аргументе для patsubst), а не только ". Если вы это сделаете, это будет работать, и вам не нужно сопоставлять пробелы. Однако, как я уже сказал, это не поможет, если вы используете разные буквы дисков. Если у вас ограниченное количество букв дисков, вы можете написать несколько замен. Или вы можете использовать второй метод, который не требует этого. 06.04.2018
  • да, вот почему я хотел сопоставить пробел, за которым следует кавычка :) 06.04.2018
  • Верно. Более полный пример в вопросе прояснил бы это. Второй вариант выше (с subst) будет работать для нескольких дисков. 06.04.2018
  • Когда я прочитал Я никогда не слышал о путях с несколькими последовательными пробелами, так что, возможно, это нормально, я почувствовал странный холод. Интересно, почему... 06.04.2018
  • Ну, я признаю, что практически никогда не использую Windows (или MacOS). Может безумие действительно существует... :p 06.04.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..