Как я могу использовать синтаксис Bash в целях Make-файла?

ОБНОВЛЕНИЕ: Как я видел, вы не хотели выравнивать только второе поле. Но если вы жестко проводите поля, вы можете отформатировать их самостоятельно. Если они передаются вам как строки, они могут обрабатываться тем же методом, что и ваши двойники.

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

    #include <iomanip>
    #include <cmath>
    #include <iostream>

    struct buf
    {
        double val;
        buf(double val) :val(val) {}
        friend std::ostream& operator<< (std::ostream& os, buf b) {
            for (double i = b.val; i < 1000; i*=10) os << " ";
            return os << b.val;
        }
    };

int main() {
    //
    double gaslawPressure = 1.615;
    double pointDistance = 221.615;
    std::cout << std::setw(20) << std::left << std::setfill('.')
        << "Equation #01" << "Ideal Gas Law(Chemistry) : " << buf(gaslawPressure)<<" atm" << std::endl;

    //printing the calculated distance
    std::cout << std::setw(20) << std::left << std::setfill('.')
        << "Equation #02" << "Distance Formula(Math)   : "<< buf(pointDistance)<< std::endl;

        return 0;
}

Выход:

Equation #01........Ideal Gas Law(Chemistry) :    1.615 atm
Equation #02........Distance Formula(Math)   :  221.615
194
задан Peter Mortensen 27 June 2016 в 01:01
поделиться

4 ответа

От GNU Делают документацию,

5.3.1 Choosing the Shell
------------------------

The program used as the shell is taken from the variable `SHELL'.  If
this variable is not set in your makefile, the program `/bin/sh' is
used as the shell.

, Таким образом, помещает SHELL := /bin/bash во главе Вашего make-файла, и необходимо быть хорошими для движения.

BTW: можно также сделать, это для одной цели, по крайней мере, для GNU Делает. Каждая цель может иметь свои собственные переменные присвоения, как это:

all: a b

a:
    @echo "a is $0"

b: SHELL:=/bin/bash   # HERE: this is setting the shell for b only
b:
    @echo "b is $0"

Это распечатает:

a is /bin/sh
b is /bin/bash

См. "Целевые Значения переменных" в документации для получения дополнительной информации. Та строка может пойти куда угодно в Make-файле, это не должно сразу быть перед целью.

352
ответ дан derobert 23 November 2019 в 05:25
поделиться

Можно звонить bash непосредственно, использовать эти -c флаг:

bash -c "diff <(sort file1) <(sort file2) > $@"

, Конечно, Вы не можете быть в состоянии перенаправить к переменному $, но когда я пытался сделать это, я добрался -bash: $@: ambiguous redirect как сообщение об ошибке, таким образом, можно хотеть изучить это, прежде чем Вы доберетесь также в это (хотя я использую удар 3.2.something, поэтому возможно, Ваш работы по-другому).

17
ответ дан Chris Lutz 23 November 2019 в 05:25
поделиться

Можно назвать удар непосредственно в Make-файле вместо того, чтобы использовать оболочку по умолчанию:

bash -c "ls -al"

вместо:

ls -al
4
ответ дан paxdiablo 23 November 2019 в 05:25
поделиться

Если переносимость важно, вы можете не захотеть зависеть от конкретной оболочки в вашем Makefile. Не во всех средах доступен bash.

4
ответ дан 23 November 2019 в 05:25
поделиться