проблема построения универсального бинарного с автоинструментами - PullRequest
1 голос
/ 24 мая 2011

У меня есть проект, который я строю на OS X с использованием автоинструментов.Я хотел бы создать универсальный двоичный файл, но размещение нескольких -arch параметров в OBJCFLAGS конфликтует с gcc -M (который automake использует для отслеживания зависимостей).Я вижу пару обходных путей, но ни один не кажется простым.

Есть ли способ заставить предварительную обработку отделиться от компиляции (поэтому -M задается CPP, а -arch - OBJC)?

Я вижу, что automake поддерживает опции для отключения отслеживания зависимостей и включения его, когда это невозможно сделать как побочный эффект.Есть ли способ заставить использовать более старый стиль отслеживания, даже если отслеживание на основе побочных эффектов доступно?

У меня нет опыта работы с lipo.Есть ли хороший способ связать его с рабочим процессом autotools?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Здесь есть несколько решений;и, вероятно, тот, который уклонился от меня.

  1. Самый простой и быстрый способ - добавить --disable-dependency-tracking к вашему запуску ./configure.

    Это скажет негенерировать зависимости вообще.Фаза зависимости - это то, что вас убивает, потому что параметры -M используются во время генерации кода;что нельзя сделать, если нацелено несколько архитектур.

    Так что это нормально, если вы делаете чистую сборку на чужом пакете;или вы не против делать «чистку» перед каждой сборкой.Если вы взламываете исходный код, особенно заголовочные файлы, это не очень хорошо, так как make, вероятно, не будет знать, что пересобирать, и у вас останутся устаревшие двоичные файлы.

  2. Лучше, но большеопасно делать что-то вроде:

    CC=clang CXX=clang++ ./configure

    Это заставит компилятор звенеть вместо gcc.У вас есть лязг, если у вас есть недавний Xcode.Configure поймет, что clang отвечает требованиям компиляции, но также решит, что это небезопасно для генерации автозависимостей.Вместо того, чтобы отключить автозависимость gen, он выполнит генерацию в два прохода в старом стиле.

    Одно предостережение: это может или не может работать, как я описал, в зависимости от того, как вы устанавливаете свои флаги архитектуры.Если у вас есть флаги, которые вы хотите передать всем вызовам компилятора (то есть: -I для путей включения), вы должны установить CPPFLAGS.Для генерации кода установите CFLAGS и CXXFLAGS для C и C ++ (и я полагаю, COBJFLAGS для ObjC).Обычно вы добавляете $ CPPFLAGS к ним.Обычно я запускаю сценарий оболочки что-то вроде:

    #!/bin/bash
    
    export CC=clang
    export CXX=clang
    
    export CPPFLAGS="-isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -fvisibility=hidden"
    export CFLAGS="-arch i386 -arch x86_64 -O3 -fomit-frame-pointer -momit-leaf-frame-pointer -ffast-math $CPPFLAGS"
    export CXXFLAGS=$CFLAGS
    
    ./configure
    

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

  3. lipo,Вы были на этом пути, это звучит как.Я нашел лучший способ заключается в следующем:

    а.Создайте каталоги верхнего уровня, такие как .X86_64 и .i386.Обратите внимание '.'спереди.Если вы нацеливаете сборку на каталоги с исходными текстами, обычно нужно начинать с точки, чтобы потом не испортить 'make clean'.

    b.Запустите ./configure с чем-то вроде: --prefix = `pwd` / .i386` и, тем не менее, вы установите архитектуру (в данном случае i386).

    c.Сделайте make, и make install, и при условии, что все прошло хорошо make clean и убедитесь, что материал все еще в .i386 Повторите для каждой архитектуры.make clean в конце каждого этапа очень важен, так как перенастройка может изменить то, что очищается, и вы действительно хотите убедиться, что вы не загрязняете архитектуру старыми файлами архитектуры.

    d.Предполагая, что у вас есть все ваши сборки, как вы хотите, я обычно делаю сценарий оболочки, который выглядит и чувствует что-то вроде этого, чтобы запускаться в конце, что подстерегает вас.

    # move the working builds for posterity and debugging
    mv .i386 ./Build/i386
    mv .x86_64 ./Build/x86_64
    
    for path in ./Build/i386/lib/*
    do
        file=${path##*/}
        # only convert 'real' files                                                                                                   
        if [ -f "$file" -a ! -L "$file" ]; then
            partner="./Build/x86_64/Lib/$file"
            if [ -f $partner -a ! -L $partner ]; then
                target="./Build/Lib/$file"
                lipo -create "$file" "$partner" -output "$target" || { echo "Lipo failed to get phat"; exit 5; }
                echo Universal Binary Created: $target
            else
                echo Skipping: $file, no valid architecture pairing at: $partner
            fi
        else
            # this is a pretty common case, openssl creates symlinks                                                                  
            # echo Skipping: $file, NOT a regular file                                                                                
            true
        fi
    done
    
  4. Что я НЕ понял, так это магия, которая позволила бы мне использовать gcc и старый школьный двухпроходный депе.Честно говоря, меня все меньше и меньше волнует каждый день, так как я все больше и больше впечатляюсь clang / llvm.

Удачи!

2 голосов
/ 26 мая 2011

Это Техническое примечание Apple выглядит многообещающе, но я этого не делал.Я бы подумал, что вам нужно только сделать универсальную сборку при подготовке релиза, так что, возможно, вы можете обойтись без отслеживания зависимостей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...