LINUX.ORG.RU

Как в .pro-файле определить, какой битности компилятор используется для сборки?

 


0

1

Всем привет!

Собственно, сабж. Нужно для 32-битного компилера линковаться с 32-битной библиотекой, а для 64-битного - с 64-битной соответственно.

Пробовал так, ничего не дало:

message($$[QMAKE_TARGET])
contains(QMAKE_TARGET.arch, x86_64) {
    BOTAN_ARCH=x86_64
    QMAKE_CXXFLAGS+=-m64 -pthread
    QMAKE_LFLAGS+=-m64 -pthread
   } else {
    BOTAN_ARCH=i686
}
BOTAN_PREFIX=/home/builder/mxe/usr/$$BOTAN_ARCH-w64-mingw32.static

Мессага тоже не кидается, так что я даже посмотреть не могу, что идет не так.

★★

Решено. переменная QT_ARCH

aido ★★
() автор топика

заряжай в проект отдельный модуль типа библиотека, в котором создай config.h.in. В pro- файл пишешь:

win32-msvc* {
    SYNTAX_ONLY = /Zs /EHsc /nologo
    LINK_TEST =
    CXX11 =
    CXX14 =
    QMAKE_CXXFLAGS += /FI $$OUT_PWD/../config/config.h
    ENABLE_SSSE3 =
    ENABLE_AVX   =
    ENABLE_AVX2  =
    ENABLE_NEON  =
} else:*-g++ {
    CXX11 = -std=c++0x
    CXX14 = -std=c++1y
    SYNTAX_ONLY = -fsyntax-only
    QMAKE_CXXFLAGS += -include $$OUT_PWD/../config/config.h
    ENABLE_SSSE3 = -mssse3
    ENABLE_AVX   = -mavx
    ENABLE_AVX2  = -mavx2
    ENABLE_NEON  = -mfloat-abi=hard -mfpu=neon
} else {
    error("unsupported compiler")
}

equals(QT_MAJOR_VERSION, 5) {
    QT       -= gui widgets
    CONFIG   += c++14
    QMAKE_CXXFLAGS += -g
}
equals(QT_MAJOR_VERSION, 4) {
    QT       -= widgets
    QMAKE_CXXFLAGS += $$CXX14 -g
}


defineTest(syntaxTest) {
    CMD = $${QMAKE_CXX} $${CXX14} $${SYNTAX_ONLY} $${PWD}/$${1}/main.cpp 2>&1
    TEXT = $$system($$CMD)
    #for debugging uncomment the following to figure out wtf gone wrong
    #message($$CMD)
    #message($$TEXT)

    win32-msvc* {
        equals(TEXT,"main.cpp") {
            return(true)
        } else {
            return(false)
        }
    } else {
        isEmpty(TEXT) {
            return(true)
        } else {
            return(false)
        }
    }
}
defineTest(compileTest) {
    CMD = $${QMAKE_CXX} $${CXX14} $${PWD}/$${1}/main.cpp 2>&1
    TEXT = $$system($$CMD)
    #for debugging uncomment the following
    #message($$CMD)
    #message($$TEXT)

    win32-msvc* {
        equals(TEXT,"main.cpp") {
            return(true)
        } else {
            return(false)
        }
    } else {
        isEmpty(TEXT) {
            return(true)
        } else {
            return(false)
        }
    }
}
далее я добавил тесты которые я гоняю, у тебя могут быть свои:
CONFIG_FUNCTIONAL_ = 0
if (syntaxTest(functional)) {
    CONFIG_FUNCTIONAL_ = 1
}
CONFIG_TR1_FUNCTIONAL_ = 0
if (syntaxTest(tr1_functional)) {
    CONFIG_TR1_FUNCTIONAL_ = 1
}
CONFIG_X86_SSSE3_ = 0
if (syntaxTest(x86_ssse3)) {
    CONFIG_X86_SSSE3_ = 1
}
CONFIG_X86_AVX_ = 0
if (syntaxTest(x86_avx)) {
    CONFIG_X86_AVX_ = 1
}
CONFIG_X86_AVX2_ = 0
if (syntaxTest(x86_avx2)) {
    CONFIG_X86_AVX2_ = 1
}
CONFIG_ARM_NEON = 0
if (syntaxTest(arm_neon)) {
    CONFIG_X86_SSSE3_ = 1
    CONFIG_ARCH = $$ENABLE_NEON
}
ниже тоже в pro файл идет код, который и построит тебе config.h:
HEADERS += \
    config.h.in \
    m128i.h

config_h.input  = config.h.in
config_h.output = config.h
QMAKE_SUBSTITUTES += config_h
не перемещай его выше по проектному файлу, иначе он сломается. далее, все тесты лучше совать в OTHER_FILES чтоб их видел креатор, но они не пытались собраться сами по себе:
OTHER_FILES += \
    functional/main.cpp \
    tr1_functional/main.cpp \
    x86_ssse3/main.cpp \
    x86_avx/main.cpp \
    x86_avx2/main.cpp \
    arm_neon/main.cpp
Ну и собственно config.h.in:
#pragma once

#define CONFIG_FUNCTIONAL $$CONFIG_FUNCTIONAL_
#define CONFIG_TR1_FUNCTIONAL $$CONFIG_TR1_FUNCTIONAL_
#define CONFIG_X86_SSSE3 $$CONFIG_X86_SSSE3_
#define CONFIG_X86_AVX $$CONFIG_X86_AVX_
#define CONFIG_X86_AVX2 $$CONFIG_X86_AVX2_
#define CONFIG_ARM_NEON $$CONFIG_ARM_NEON_

#if CONFIG_FUNCTIONAL_VAL

    #include <functional>
    namespace K {
        using std::function;
        using std::bind;
    }

#elif CONFIG_TR1_FUNCTIONAL_VAL

    #include <tr1/functional>
    namespace K {
        using std::tr1::function;
        using std::tr1::bind;
    }

#else

    #error "no usable implementation for std::functional"

#endif

ckotinko ☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.