... and so configureapp.exe disappeareth

Change-Id: I3fd9f2b0d4cf05a625484fce21532da8563cd62c
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Oswald Buddenhagen 2016-11-18 16:24:31 +01:00
parent 9b68bc4147
commit 8f49da6c18
11 changed files with 193 additions and 1441 deletions

View File

@ -28,13 +28,35 @@
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
set ARGS=%*
set QTSRC=%~dp0
set QTSRC=%QTSRC:~0,-1%
set QTDIR=%CD%
rem Parse command line
set TOPLEVEL=false
set TOPQTSRC=%QTSRC%
set TOPQTDIR=%QTDIR%
if /i not "%~1" == "-top-level" goto notoplevel
set ARGS=%ARGS:~10%
set TOPLEVEL=true
for %%P in ("%TOPQTSRC%") do set TOPQTSRC=%%~dpP
set TOPQTSRC=%TOPQTSRC:~0,-1%
for %%P in ("%QTDIR%") do set TOPQTDIR=%%~dpP
set TOPQTDIR=%TOPQTDIR:~0,-1%
:notoplevel
set SYNCQT=
set PLATFORM=
set MAKE=
call :doargs %ARGS%
if errorlevel 1 exit /b
goto doneargs
:doargs
if "%~1" == "" goto doneargs
if "%~1" == "" exit /b
if "%~1" == "/?" goto help
if "%~1" == "-?" goto help
@ -44,25 +66,118 @@ set QTDIR=%CD%
if /i "%~1" == "-help" goto help
if /i "%~1" == "--help" goto help
if /i "%~1" == "-redo" goto redo
if /i "%~1" == "--redo" goto redo
if /i "%~1" == "-platform" goto platform
if /i "%~1" == "--platform" goto platform
if /i "%~1" == "-no-syncqt" goto nosyncqt
if /i "%~1" == "--no-syncqt" goto nosyncqt
if /i "%~1" == "-make-tool" goto maketool
if /i "%~1" == "--make-tool" goto maketool
:nextarg
shift
goto doargs
:help
type %QTSRC%\config_help.txt
exit /b 1
:redo
if not exist "%TOPQTDIR%\config.opt" goto redoerr
set rargs=
for /f "usebackq delims=" %%i in ("%TOPQTDIR%\config.opt") do set rargs=!rargs! "%%i"
call :doargs %rargs%
goto nextarg
:redoerr
echo No config.opt present - cannot redo configuration. >&2
exit /b 1
:platform
shift
if "%~1" == "win32-msvc2012" goto msvc
if "%~1" == "win32-msvc2013" goto msvc
if "%~1" == "win32-msvc2015" goto msvc
if "%~1" == "win32-msvc2017" goto msvc
set PLATFORM=%~1
goto nextarg
:msvc
echo. >&2
echo Notice: re-mapping requested qmake spec to unified 'win32-msvc'. >&2
echo. >&2
set PLATFORM=win32-msvc
goto nextarg
:nosyncqt
set SYNCQT=false
goto nextarg
:maketool
shift
set MAKE=%~1
goto nextarg
:doneargs
echo Please wait while bootstrapping configure ...
rem Find various executables
for %%C in (clang-cl.exe cl.exe icl.exe g++.exe perl.exe jom.exe) do set %%C=%%~$PATH:C
if "%perl.exe%" == "" (
echo Perl not found in PATH. Aborting. >&2
rem Determine host spec
if "%PLATFORM%" == "" (
if not "%icl.exe%" == "" (
set PLATFORM=win32-icc
) else if not "%clang-cl.exe%" == "" (
set PLATFORM=win32-clang-msvc
) else if not "%cl.exe%" == "" (
set PLATFORM=win32-msvc
) else if not "%g++.exe%" == "" (
set PLATFORM=win32-g++
) else (
echo Cannot detect host toolchain. Please use -platform. Aborting. >&2
exit /b 1
)
)
if not exist "%QTSRC%\mkspecs\%PLATFORM%\qmake.conf" (
echo Host platform '%PLATFORM%' is invalid. Aborting. >&2
exit /b 1
)
if "%PLATFORM:win32-g++=%" == "%PLATFORM%" (
if "%MAKE%" == "" (
if not "%jom.exe%" == "" (
set MAKE=jom
) else (
set MAKE=nmake
)
)
set tmpl=win32
) else (
if "%MAKE%" == "" (
set MAKE=mingw32-make
)
set tmpl=unix
)
rem Prepare build dir
if not exist mkspecs (
md mkspecs
if errorlevel 1 goto exit
if errorlevel 1 exit /b
)
if not exist bin (
md bin
if errorlevel 1 exit /b
)
if not exist qmake (
md qmake
if errorlevel 1 exit /b
)
rem Extract Qt's version from .qmake.conf
for /f "eol=# tokens=1,2,3,4 delims=.= " %%i in (%QTSRC%.qmake.conf) do (
for /f "eol=# tokens=1,2,3,4 delims=.= " %%i in (%QTSRC%\.qmake.conf) do (
if %%i == MODULE_VERSION (
set QTVERMAJ=%%j
set QTVERMIN=%%k
@ -71,69 +186,85 @@ for /f "eol=# tokens=1,2,3,4 delims=.= " %%i in (%QTSRC%.qmake.conf) do (
)
set QTVERSION=%QTVERMAJ%.%QTVERMIN%.%QTVERPAT%
perl %QTSRC%bin\syncqt.pl -minimal -version %QTVERSION% -module QtCore -outdir "%QTDIR%" %QTSRC%
if errorlevel 1 goto exit
rem Create forwarding headers
if not exist tools\configure (
md tools\configure
if errorlevel 1 goto exit
if "%SYNCQT%" == "" (
if exist "%QTSRC%\.git" (
set SYNCQT=true
) else (
set SYNCQT=false
)
)
if "%SYNCQT%" == "true" (
if not "%perl.exe%" == "" (
echo Running syncqt ...
"%perl.exe%" -w "%QTSRC%\bin\syncqt.pl" -minimal -version %QTVERSION% -module QtCore -outdir "%QTDIR%" %QTSRC%
if errorlevel 1 exit /b
) else (
echo Perl not found in PATH. Aborting. >&2
exit /b 1
)
)
cd tools\configure
if errorlevel 1 goto exit
set make=nmake
if not "%jom.exe%" == "" set make=jom
rem Build qmake
echo Bootstrapping qmake ...
cd qmake
if errorlevel 1 exit /b
echo #### Generated by configure.bat - DO NOT EDIT! ####> Makefile
echo/>> Makefile
echo QTVERSION = %QTVERSION%>> Makefile
rem These must have trailing spaces to avoid misinterpretation as 5>>, etc.
echo QT_VERSION_MAJOR = %QTVERMAJ% >> Makefile
echo QT_VERSION_MINOR = %QTVERMIN% >> Makefile
echo QT_VERSION_PATCH = %QTVERPAT% >> Makefile
if not "%icl.exe%" == "" (
echo CXX = icl>>Makefile
echo EXTRA_CXXFLAGS = /Qstd=c++11 /Zc:forScope>>Makefile
rem This must have a trailing space.
echo QTSRC = %QTSRC% >> Makefile
set tmpl=win32
) else if not "%cl.exe%" == "" (
echo CXX = cl>>Makefile
echo EXTRA_CXXFLAGS =>>Makefile
rem This must have a trailing space.
echo QTSRC = %QTSRC% >> Makefile
set tmpl=win32
) else if not "%clang-cl.exe%" == "" (
echo CXX = clang-cl>>Makefile
echo EXTRA_CXXFLAGS = -fms-compatibility-version=19.00.23506 -Wno-microsoft-enum-value>>Makefile
rem This must have a trailing space.
echo QTSRC = %QTSRC% >> Makefile
set tmpl=win32
) else if not "%g++.exe%" == "" (
echo CXX = g++>>Makefile
echo EXTRA_CXXFLAGS =>>Makefile
rem This must NOT have a trailing space.
echo QTSRC = %QTSRC:\=/%>> Makefile
set tmpl=mingw
set make=mingw32-make
echo BUILD_PATH = ..>> Makefile
if "%tmpl%" == "win32" (
echo SOURCE_PATH = %QTSRC%>> Makefile
) else (
echo No suitable compiler found in PATH. Aborting. >&2
cd ..\..
exit /b 1
echo SOURCE_PATH = %QTSRC:\=/%>> Makefile
)
if exist "%QTSRC%\.git" (
echo INC_PATH = ../include>> Makefile
) else (
echo INC_PATH = $^(SOURCE_PATH^)/include>> Makefile
)
echo QT_VERSION = %QTVERSION%>> Makefile
rem These must have trailing spaces to avoid misinterpretation as 5>>, etc.
echo QT_MAJOR_VERSION = %QTVERMAJ% >> Makefile
echo QT_MINOR_VERSION = %QTVERMIN% >> Makefile
echo QT_PATCH_VERSION = %QTVERPAT% >> Makefile
if "%tmpl%" == "win32" (
echo QMAKESPEC = %PLATFORM%>> Makefile
) else (
echo QMAKESPEC = $^(SOURCE_PATH^)/mkspecs/%PLATFORM%>> Makefile
echo CONFIG_CXXFLAGS = -std=c++11 -ffunction-sections>> Makefile
echo CONFIG_LFLAGS = -Wl,--gc-sections>> Makefile
type "%QTSRC%\qmake\Makefile.unix.win32" >> Makefile
type "%QTSRC%\qmake\Makefile.unix.mingw" >> Makefile
)
echo/>> Makefile
type %QTSRC%tools\configure\Makefile.%tmpl% >> Makefile
type "%QTSRC%\qmake\Makefile.%tmpl%" >> Makefile
%make%
if errorlevel 1 (cd ..\.. & exit /b 1)
%MAKE%
if errorlevel 1 (cd .. & exit /b 1)
cd ..\..
cd ..
:conf
configureapp.exe -srcdir %QTSRC% %ARGS%
goto exit
rem Generate qt.conf
:help
type %QTSRC%config_help.txt
> "%QTDIR%\bin\qt.conf" (
@echo [EffectivePaths]
@echo Prefix=..
@echo [Paths]
@echo TargetSpec=dummy
@echo HostSpec=%PLATFORM%
)
if not "%QTDIR%" == "%QTSRC%" (
>> "%QTDIR%\bin\qt.conf" (
@echo [EffectiveSourcePaths]
@echo Prefix=%QTSRC:\=/%
)
)
:exit
rem Launch qmake-based configure
cd "%TOPQTDIR%"
"%QTDIR%\bin\qmake.exe" "%TOPQTSRC%" -- %ARGS%

View File

@ -84,10 +84,11 @@
#define QT_FEATURE_translation -1
#define QT_NO_GEOM_VARIANT
#if defined(QT_BUILD_QMAKE) || defined(QT_BUILD_CONFIGURE)
#ifdef QT_BUILD_QMAKE
#define QT_FEATURE_commandlineparser -1
#define QT_NO_COMPRESS
#define QT_JSON_READONLY
#define QT_NO_STANDARDPATHS
#define QT_NO_TEXTCODEC
#define QT_FEATURE_textcodec -1
#else
@ -97,8 +98,4 @@
#define QT_FEATURE_textcodec 1
#endif
#if defined(QT_BUILD_QMAKE)
#define QT_NO_STANDARDPATHS
#endif
#endif // QT_BOOTSTRAPPED

View File

@ -1,125 +0,0 @@
CORESRC = $(QTSRC)src/corelib
CONFSRC = $(QTSRC)tools/configure
RAW_PCH = configure_pch.h
PCH = $(RAW_PCH).gch/c++
DEFINES = -DUNICODE -D_CRT_SECURE_NO_DEPRECATE -DQT_BOOTSTRAPPED -DQT_BUILD_CONFIGURE -DQT_USE_QSTRINGBUILDER -DQT_VERSION_STR=\"$(QTVERSION)\" -DQT_VERSION_MAJOR=$(QT_VERSION_MAJOR) -DQT_VERSION_MINOR=$(QT_VERSION_MINOR) -DQT_VERSION_PATCH=$(QT_VERSION_PATCH)
INCPATH = -I"../../include" -I"../../include/QtCore" -I"../../include/QtCore/$(QTVERSION)" -I"../../include/QtCore/$(QTVERSION)/QtCore" -I"$(QTSRC)mkspecs/win32-g++"
CXXFLAGS_BARE = -std=c++11 -fno-rtti -fno-exceptions -mthreads -Wall -Wextra $(DEFINES) $(INCPATH)
CXXFLAGS = -include $(RAW_PCH) $(CXXFLAGS_BARE)
LINK = g++
LFLAGS = -Wl,-subsystem,console -mthreads
LIBS = -lole32 -ladvapi32 -luuid
TARGET = ../../configureapp.exe
OBJECTS = \
main.o \
configureapp.o \
environment.o \
qarraydata.o \
qbytearray.o \
qbytearraymatcher.o \
qhash.o \
qlist.o \
qlocale.o \
qlocale_win.o \
qlocale_tools.o \
qvector.o \
qutfcodec.o \
qtextcodec.o \
qglobal.o \
qnumeric.o \
qbuffer.o \
qdatastream.o \
qdir.o \
qdiriterator.o \
qfiledevice.o \
qfile.o \
qfileinfo.o \
qabstractfileengine.o \
qfilesystementry.o \
qfilesystemengine.o \
qfilesystemengine_win.o \
qfilesystemiterator_win.o \
qfsfileengine.o \
qfsfileengine_win.o \
qfsfileengine_iterator.o \
qiodevice.o \
qringbuffer.o \
qdebug.o \
qtextstream.o \
qlogging.o \
qtemporaryfile.o \
qstandardpaths.o \
qstandardpaths_win.o \
qsystemlibrary.o \
qbitarray.o \
qdatetime.o \
qmap.o \
qregexp.o \
qstring.o \
qstring_compat.o \
qstringbuilder.o \
qstringlist.o \
qvsnprintf.o \
qvariant.o \
qsystemerror.o \
qmetatype.o \
qmalloc.o \
qxmlstream.o \
qxmlutils.o \
quuid.o
$(TARGET): $(OBJECTS)
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)
$(OBJECTS): $(PCH)
# SHELL is the full path of sh.exe, unless
# 1) it is found in the current directory
# 2) it is not found at all
# 3) it is overridden on the command line with an existing file
# ... otherwise it is always sh.exe. Specifically, SHELL from the
# environment has no effect.
#
# This check will fail if SHELL is explicitly set to a not
# sh-compatible shell. This is not a problem, because configure.bat
# will not do that.
ifeq ($(SHELL), sh.exe)
ifeq ($(wildcard "$(CURDIR)/sh.exe"), )
SH = 0
else
SH = 1
endif
else
SH = 1
endif
ifeq ($(SH), 1)
CHK_DIR_EXISTS = test -d
CHK_DIR_EXISTS_GLUE = ||
MKDIR = mkdir -p
else
CHK_DIR_EXISTS = if not exist
CHK_DIR_EXISTS_GLUE =
MKDIR = md
endif
$(PCH): $(CONFSRC)/configure_pch.h
@$(CHK_DIR_EXISTS) $(RAW_PCH).gch $(CHK_DIR_EXISTS_GLUE) $(MKDIR) $(RAW_PCH).gch
$(CXX) -x c++-header -c $(CXXFLAGS_BARE) -o $@ $<
VPATH = $(CONFSRC):$(CORESRC)/global:$(CORESRC)/kernel:$(CORESRC)/tools:$(CORESRC)/codecs:$(CORESRC)/io:$(CORESRC)/xml:$(CORESRC)/plugin
main.o: $(CONFSRC)/configureapp.h
configureapp.o: $(CONFSRC)/configureapp.h $(CONFSRC)/environment.h
environment.o: $(CONFSRC)/environment.h
# Make sure qstring_compat.obj isn't compiled with PCH enabled
qstring_compat.o: $(CORESRC)/tools/qstring_compat.cpp
$(CXX) -c $(CXXFLAGS_BARE) -o $@ $<
clean:
-rm -f *.o
-rm -rf *.gch

View File

@ -1,174 +0,0 @@
CORESRC = $(QTSRC)src\corelib
CONFSRC = $(QTSRC)tools\configure
DEFINES = -DUNICODE -D_CRT_SECURE_NO_DEPRECATE -DQT_BOOTSTRAPPED -DQT_BUILD_CONFIGURE -DQT_USE_QSTRINGBUILDER -DQT_VERSION_STR=\"$(QTVERSION)\" -DQT_VERSION_MAJOR=$(QT_VERSION_MAJOR) -DQT_VERSION_MINOR=$(QT_VERSION_MINOR) -DQT_VERSION_PATCH=$(QT_VERSION_PATCH)
INCPATH = -I"..\..\include" -I"..\..\include\QtCore" -I"..\..\include\QtCore\$(QTVERSION)" -I"..\..\include\QtCore\$(QTVERSION)\QtCore" -I"$(QTSRC)mkspecs\win32-msvc"
CXXFLAGS_BARE = -nologo -Zc:wchar_t -W3 -GR -EHsc -w34100 -w34189 -wd4577 $(CFLAGS_CRT) $(EXTRA_CXXFLAGS) $(DEFINES) $(INCPATH)
!IF ("$(CXX)" != "clang-cl")
PCH = configure_pch.pch
PCH_OBJECT = configure_pch.obj
CXXFLAGS = -FIconfigure_pch.h -Yuconfigure_pch.h -Fp$(PCH) -MP $(CXXFLAGS_BARE)
!ELSE
PCH =
CXXFLAGS = -Wmicrosoft $(CXXFLAGS_BARE)
!ENDIF
LINK = link
LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:"configure.intermediate.manifest"
LIBS = ole32.lib advapi32.lib shell32.lib
TARGET = ..\..\configureapp.exe
OBJECTS = \
main.obj \
configureapp.obj \
environment.obj \
qarraydata.obj \
qbytearray.obj \
qbytearraymatcher.obj \
qhash.obj \
qlist.obj \
qlocale.obj \
qlocale_win.obj \
qlocale_tools.obj \
qvector.obj \
qutfcodec.obj \
qtextcodec.obj \
qglobal.obj \
qnumeric.obj \
qbuffer.obj \
qdatastream.obj \
qdir.obj \
qdiriterator.obj \
qfiledevice.obj \
qfile.obj \
qfileinfo.obj \
qabstractfileengine.obj \
qfilesystementry.obj \
qfilesystemengine.obj \
qfilesystemengine_win.obj \
qfilesystemiterator_win.obj \
qfsfileengine.obj \
qfsfileengine_win.obj \
qfsfileengine_iterator.obj \
qiodevice.obj \
qringbuffer.obj \
qdebug.obj \
qtextstream.obj \
qlogging.obj \
qtemporaryfile.obj \
qstandardpaths.obj \
qstandardpaths_win.obj \
qsystemlibrary.obj \
qbitarray.obj \
qdatetime.obj \
qmap.obj \
qregexp.obj \
qstring.obj \
qstring_compat.obj \
qstringbuilder.obj \
qstringlist.obj \
qvsnprintf.obj \
qvariant.obj \
qsystemerror.obj \
qmetatype.obj \
qmalloc.obj \
qxmlstream.obj \
qxmlutils.obj \
quuid.obj \
$(PCH_OBJECT)
$(TARGET): $(OBJECTS)
$(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
$(OBJECTS) $(LIBS)
<<
mt.exe -nologo -manifest "configure.intermediate.manifest" -outputresource:$(TARGET);1
clean:
-del *.obj
-del *.pch
-del configure.intermediate.manifest
$(PCH): $(CONFSRC)\configure_pch.h
$(CXX) -c -Yc $(CXXFLAGS_BARE) -Fp$@ -Foconfigure_pch.obj -TP $**
$(OBJECTS): $(PCH)
main.obj: $(CONFSRC)\main.cpp $(CONFSRC)\configureapp.h $(PCH)
configureapp.obj: $(CONFSRC)\configureapp.cpp $(CONFSRC)\configureapp.h $(CONFSRC)\environment.h $(PCH)
environment.obj: $(CONFSRC)\environment.cpp $(CONFSRC)\environment.h $(PCH)
qarraydata.obj: $(CORESRC)\tools\qarraydata.cpp $(PCH)
qbytearray.obj: $(CORESRC)\tools\qbytearray.cpp $(PCH)
qbytearraymatcher.obj: $(CORESRC)\tools\qbytearraymatcher.cpp $(PCH)
qhash.obj: $(CORESRC)\tools\qhash.cpp $(PCH)
qlist.obj: $(CORESRC)\tools\qlist.cpp $(PCH)
qlocale.obj: $(CORESRC)\tools\qlocale.cpp $(PCH)
qlocale_win.obj: $(CORESRC)\tools\qlocale_win.cpp $(PCH)
qlocale_tools.obj: $(CORESRC)\tools\qlocale_tools.cpp $(PCH)
qvector.obj: $(CORESRC)\tools\qvector.cpp $(PCH)
qutfcodec.obj: $(CORESRC)\codecs\qutfcodec.cpp $(PCH)
qtextcodec.obj: $(CORESRC)\codecs\qtextcodec.cpp $(PCH)
qglobal.obj: $(CORESRC)\global\qglobal.cpp $(PCH)
qnumeric.obj: $(CORESRC)\global\qnumeric.cpp $(PCH)
qbuffer.obj: $(CORESRC)\io\qbuffer.cpp $(PCH)
qdatastream.obj: $(CORESRC)\io\qdatastream.cpp $(PCH)
qdir.obj: $(CORESRC)\io\qdir.cpp $(PCH)
qdiriterator.obj: $(CORESRC)\io\qdiriterator.cpp $(PCH)
qfiledevice.obj: $(CORESRC)\io\qfiledevice.cpp $(PCH)
qfile.obj: $(CORESRC)\io\qfile.cpp $(PCH)
qfileinfo.obj: $(CORESRC)\io\qfileinfo.cpp $(PCH)
qabstractfileengine.obj: $(CORESRC)\io\qabstractfileengine.cpp $(PCH)
qfilesystementry.obj: $(CORESRC)\io\qfilesystementry.cpp $(PCH)
qfilesystemengine.obj: $(CORESRC)\io\qfilesystemengine.cpp $(PCH)
qfilesystemengine_win.obj: $(CORESRC)\io\qfilesystemengine_win.cpp $(PCH)
qfilesystemiterator_win.obj: $(CORESRC)\io\qfilesystemiterator_win.cpp $(PCH)
qfsfileengine.obj: $(CORESRC)\io\qfsfileengine.cpp $(PCH)
qfsfileengine_win.obj: $(CORESRC)\io\qfsfileengine_win.cpp $(PCH)
qfsfileengine_iterator.obj: $(CORESRC)\io\qfsfileengine_iterator.cpp $(PCH)
qiodevice.obj: $(CORESRC)\io\qiodevice.cpp $(PCH)
qringbuffer.obj: $(CORESRC)\tools\qringbuffer.cpp $(PCH)
qdebug.obj: $(CORESRC)\io\qdebug.cpp $(PCH)
qtextstream.obj: $(CORESRC)\io\qtextstream.cpp $(PCH)
qtemporaryfile.obj: $(CORESRC)\io\qtemporaryfile.cpp $(PCH)
qstandardpaths.obj: $(CORESRC)\io\qstandardpaths.cpp $(PCH)
qstandardpaths_win.obj: $(CORESRC)\io\qstandardpaths_win.cpp $(PCH)
qsystemlibrary.obj: $(CORESRC)\plugin\qsystemlibrary.cpp $(PCH)
qbitarray.obj: $(CORESRC)\tools\qbitarray.cpp $(PCH)
qdatetime.obj: $(CORESRC)\tools\qdatetime.cpp $(PCH)
qmap.obj: $(CORESRC)\tools\qmap.cpp $(PCH)
qregexp.obj: $(CORESRC)\tools\qregexp.cpp $(PCH)
qstring.obj: $(CORESRC)\tools\qstring.cpp $(PCH)
qstringbuilder.obj: $(CORESRC)\tools\qstringbuilder.cpp $(PCH)
qstringlist.obj: $(CORESRC)\tools\qstringlist.cpp $(PCH)
qvsnprintf.obj: $(CORESRC)\tools\qvsnprintf.cpp $(PCH)
qvariant.obj: $(CORESRC)\kernel\qvariant.cpp $(PCH)
qsystemerror.obj: $(CORESRC)\kernel\qsystemerror.cpp $(PCH)
qline.obj: $(CORESRC)\tools\qline.cpp $(PCH)
qsize.obj: $(CORESRC)\tools\qsize.cpp $(PCH)
qpoint.obj: $(CORESRC)\tools\qpoint.cpp $(PCH)
qrect.obj: $(CORESRC)\tools\qrect.cpp $(PCH)
qmetatype.obj: $(CORESRC)\kernel\qmetatype.cpp $(PCH)
qmalloc.obj: $(CORESRC)\global\qmalloc.cpp $(PCH)
qxmlstream.obj: $(CORESRC)\xml\qxmlstream.cpp $(PCH)
qxmlutils.obj: $(CORESRC)\xml\qxmlutils.cpp $(PCH)
quuid.obj: $(CORESRC)\plugin\quuid.cpp $(PCH)
{$(CONFSRC)}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $<
{$(CORESRC)\tools}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $<
{$(CORESRC)\codecs}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $<
{$(CORESRC)\global}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $<
{$(CORESRC)\io}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $<
{$(CORESRC)\kernel}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $<
{$(CORESRC)\plugin}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $<
{$(CORESRC)\xml}.cpp{}.obj::
$(CXX) -c $(CXXFLAGS) $<
# Make sure qstring_compat.obj isn't compiled with PCH enabled
qstring_compat.obj: $(CORESRC)\tools\qstring_compat.cpp
$(CXX) -c $(CXXFLAGS_BARE) $(CORESRC)\tools\qstring_compat.cpp

View File

@ -1,135 +0,0 @@
TARGET = configureapp
DESTDIR = $$PWD/../.. # build directly in source dir
CONFIG += console flat stl rtti_off
CONFIG -= moc qt
DEFINES = UNICODE _CRT_SECURE_NO_DEPRECATE QT_USE_QSTRINGBUILDER
DEFINES += QT_BOOTSTRAPPED QT_BUILD_CONFIGURE
win32 : LIBS += -lole32 -ladvapi32
mingw : LIBS += -luuid
win32-msvc* {
QMAKE_CFLAGS_RELEASE -= -MD
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CFLAGS_RELEASE += -MT -O1 -Os
QMAKE_CFLAGS_DEBUG -= -MDd
QMAKE_CFLAGS_DEBUG += -MTd
QMAKE_CXXFLAGS_RELEASE -= -MD
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE += -MT -O1 -Os
QMAKE_CXXFLAGS_DEBUG -= -MDd
QMAKE_CXXFLAGS_DEBUG += -MTd
}
PRECOMPILED_HEADER = configure_pch.h
INCLUDEPATH += \
$$QT_BUILD_TREE/include \
$$QT_BUILD_TREE/include/QtCore \
$$QT_BUILD_TREE/include/QtCore/$$QT.core.VERSION \
$$QT_BUILD_TREE/include/QtCore/$$QT.core.VERSION/QtCore \
$$QT_SOURCE_TREE/tools/shared
HEADERS = configureapp.h environment.h \
$$QT_SOURCE_TREE/src/corelib/tools/qarraydata.h \
$$QT_SOURCE_TREE/src/corelib/tools/qbytearray.h \
$$QT_SOURCE_TREE/src/corelib/tools/qarraydatapointer.h \
$$QT_SOURCE_TREE/src/corelib/tools/qarraydataops.h \
$$QT_SOURCE_TREE/src/corelib/tools/qbytearraymatcher.h \
$$QT_SOURCE_TREE/src/corelib/tools/qchar.h \
$$QT_SOURCE_TREE/src/corelib/tools/qhash.h \
$$QT_SOURCE_TREE/src/corelib/tools/qlist.h \
$$QT_SOURCE_TREE/src/corelib/tools/qlocale.h \
$$QT_SOURCE_TREE/src/corelib/tools/qvector.h \
$$QT_SOURCE_TREE/src/corelib/codecs/qutfcodec_p.h \
$$QT_SOURCE_TREE/src/corelib/codecs/qtextcodec.h \
$$QT_SOURCE_TREE/src/corelib/global/qglobal.h \
$$QT_SOURCE_TREE/src/corelib/global/qnumeric.h \
$$QT_SOURCE_TREE/src/corelib/global/qlogging.h \
$$QT_SOURCE_TREE/src/corelib/io/qbuffer.h \
$$QT_SOURCE_TREE/src/corelib/io/qdatastream.h \
$$QT_SOURCE_TREE/src/corelib/io/qdir.h \
$$QT_SOURCE_TREE/src/corelib/io/qdiriterator.h \
$$QT_SOURCE_TREE/src/corelib/io/qfiledevice.h \
$$QT_SOURCE_TREE/src/corelib/io/qfile.h \
$$QT_SOURCE_TREE/src/corelib/io/qfileinfo.h \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystementry_p.h \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystemengine_p.h \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystemmetadata_p.h \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystemiterator_p.h \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine.h \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_iterator_p.h \
$$QT_SOURCE_TREE/src/corelib/io/qiodevice.h \
$$QT_SOURCE_TREE/src/corelib/io/qtextstream.h \
$$QT_SOURCE_TREE/src/corelib/io/qtemporaryfile.h \
$$QT_SOURCE_TREE/src/corelib/io/qstandardpaths.h \
$$QT_SOURCE_TREE/src/corelib/tools/qbitarray.h \
$$QT_SOURCE_TREE/src/corelib/tools/qdatetime.h \
$$QT_SOURCE_TREE/src/corelib/tools/qmap.h \
$$QT_SOURCE_TREE/src/corelib/tools/qregexp.h \
$$QT_SOURCE_TREE/src/corelib/tools/qringbuffer_p.h \
$$QT_SOURCE_TREE/src/corelib/tools/qstring.h \
$$QT_SOURCE_TREE/src/corelib/tools/qstringbuilder.h \
$$QT_SOURCE_TREE/src/corelib/tools/qstringlist.h \
$$QT_SOURCE_TREE/src/corelib/tools/qstringmatcher.h \
$$QT_SOURCE_TREE/src/corelib/tools/qunicodetables_p.h \
$$QT_SOURCE_TREE/src/corelib/kernel/qsystemerror_p.h \
$$QT_SOURCE_TREE/src/corelib/xml/qxmlstream.h \
$$QT_SOURCE_TREE/src/corelib/xml/qxmlutils_p.h
SOURCES = main.cpp configureapp.cpp environment.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qbytearray.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qarraydata.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qbytearraymatcher.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qhash.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qlist.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qlocale.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qlocale_win.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qlocale_tools.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qvector.cpp \
$$QT_SOURCE_TREE/src/corelib/codecs/qutfcodec.cpp \
$$QT_SOURCE_TREE/src/corelib/codecs/qtextcodec.cpp \
$$QT_SOURCE_TREE/src/corelib/global/qglobal.cpp \
$$QT_SOURCE_TREE/src/corelib/global/qnumeric.cpp \
$$QT_SOURCE_TREE/src/corelib/global/qlogging.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qbuffer.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qdatastream.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qdir.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qdiriterator.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfiledevice.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfile.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfileinfo.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qabstractfileengine.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystementry.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystemengine.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystemengine_win.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystemiterator_win.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_win.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_iterator.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qiodevice.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qdebug.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qtextstream.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qtemporaryfile.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qstandardpaths.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qstandardpaths_win.cpp \
$$QT_SOURCE_TREE/src/corelib/plugin/qsystemlibrary.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qbitarray.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qdatetime.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qmap.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qregexp.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qringbuffer.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qstring.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qstringbuilder.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qstring_compat.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qstringlist.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qvsnprintf.cpp \
$$QT_SOURCE_TREE/src/corelib/kernel/qvariant.cpp \
$$QT_SOURCE_TREE/src/corelib/kernel/qsystemerror.cpp \
$$QT_SOURCE_TREE/src/corelib/kernel/qmetatype.cpp \
$$QT_SOURCE_TREE/src/corelib/global/qmalloc.cpp \
$$QT_SOURCE_TREE/src/corelib/xml/qxmlstream.cpp \
$$QT_SOURCE_TREE/src/corelib/xml/qxmlutils.cpp \
$$QT_SOURCE_TREE/src/corelib/plugin/quuid.cpp \
$$QT_SOURCE_TREE/src/corelib/tools/qcryptographichash.cpp

View File

@ -1,41 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
// for rand_s, _CRT_RAND_S must be #defined before #including stdlib.h.
// put it at the beginning so some indirect inclusion doesn't break it
#ifndef _CRT_RAND_S
#define _CRT_RAND_S
#endif
#include <qplatformdefs.h>
#include <qglobal.h>
#include <qlist.h>
#include <qvariant.h> // All moc genereated code has this include
#include <qregexp.h>
#include <qstring.h>
#include <qstringlist.h>
#include <qtextcodec.h>

View File

@ -1,380 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "configureapp.h"
#include "environment.h"
#include <qdir.h>
#include <qdiriterator.h>
#include <qtemporaryfile.h>
#include <qstandardpaths.h>
#include <qstack.h>
#include <qdebug.h>
#include <qfileinfo.h>
#include <qtextstream.h>
#include <qregexp.h>
#include <qhash.h>
#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
QT_BEGIN_NAMESPACE
std::ostream &operator<<(std::ostream &s, const QString &val) {
s << val.toLocal8Bit().data();
return s;
}
using namespace std;
Configure::Configure(int& argc, char** argv)
{
int i;
for (i = 1; i < argc; i++)
configCmdLine += argv[ i ];
if (configCmdLine.size() >= 2 && configCmdLine.at(0) == "-srcdir") {
sourcePath = QDir::cleanPath(configCmdLine.at(1));
sourceDir = QDir(sourcePath);
configCmdLine.erase(configCmdLine.begin(), configCmdLine.begin() + 2);
} else {
// Get the path to the executable
wchar_t module_name[MAX_PATH];
GetModuleFileName(0, module_name, sizeof(module_name) / sizeof(wchar_t));
QFileInfo sourcePathInfo = QString::fromWCharArray(module_name);
sourcePath = sourcePathInfo.absolutePath();
sourceDir = sourcePathInfo.dir();
}
buildPath = QDir::currentPath();
if (sourceDir != buildDir) { //shadow builds!
QDir(buildPath).mkpath("bin");
buildDir.mkpath("mkspecs");
}
if (dictionary[ "QMAKESPEC" ].size() == 0) {
dictionary[ "QMAKESPEC" ] = Environment::detectQMakeSpec();
dictionary[ "QMAKESPEC_FROM" ] = "detected";
}
dictionary[ "SYNCQT" ] = "auto";
QString tmp = dictionary[ "QMAKESPEC" ];
if (tmp.contains("\\")) {
tmp = tmp.mid(tmp.lastIndexOf("\\") + 1);
} else {
tmp = tmp.mid(tmp.lastIndexOf("/") + 1);
}
dictionary[ "QMAKESPEC" ] = tmp;
}
Configure::~Configure()
{
}
void Configure::parseCmdLine()
{
sourcePathMangled = sourcePath;
buildPathMangled = buildPath;
if (configCmdLine.size() && configCmdLine.at(0) == "-top-level") {
dictionary[ "TOPLEVEL" ] = "yes";
configCmdLine.removeAt(0);
sourcePathMangled = QFileInfo(sourcePath).path();
buildPathMangled = QFileInfo(buildPath).path();
}
qmakeCmdLine = configCmdLine;
int argCount = configCmdLine.size();
int i = 0;
// Look first for -redo
for (int k = 0 ; k < argCount; ++k) {
if (configCmdLine.at(k) == "-redo") {
configCmdLine.removeAt(k);
if (!reloadCmdLine(k)) {
dictionary["DONE"] = "error";
return;
}
argCount = configCmdLine.size();
break;
}
}
for (; i<configCmdLine.size(); ++i) {
if (configCmdLine.at(i) == "-platform") {
++i;
if (i == argCount)
break;
dictionary[ "QMAKESPEC" ] = configCmdLine.at(i);
dictionary[ "QMAKESPEC_FROM" ] = "commandline";
}
else if (configCmdLine.at(i) == "-no-syncqt")
dictionary[ "SYNCQT" ] = "no";
else if (configCmdLine.at(i) == "-make-tool") {
++i;
if (i == argCount)
break;
dictionary[ "MAKE" ] = configCmdLine.at(i);
}
}
// Ensure that QMAKESPEC exists in the mkspecs folder
const QString mkspecPath(sourcePath + "/mkspecs");
QDirIterator itMkspecs(mkspecPath, QDir::AllDirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
QStringList mkspecs;
while (itMkspecs.hasNext()) {
QString mkspec = itMkspecs.next();
// Remove base PATH
mkspec.remove(0, mkspecPath.length() + 1);
mkspecs << mkspec;
}
if (dictionary[ "QMAKESPEC" ] == "win32-msvc2012"
|| dictionary[ "QMAKESPEC" ] == "win32-msvc2013"
|| dictionary[ "QMAKESPEC" ] == "win32-msvc2015"
|| dictionary[ "QMAKESPEC" ] == "win32-msvc2017") {
cout << "\nNotice: re-mapping requested qmake spec to unified 'win32-msvc'.\n\n";
dictionary[ "QMAKESPEC" ] = "win32-msvc";
}
if (dictionary["QMAKESPEC"].toLower() == "features"
|| !mkspecs.contains(dictionary["QMAKESPEC"], Qt::CaseInsensitive)) {
dictionary[ "DONE" ] = "error";
if (dictionary ["QMAKESPEC_FROM"] == "commandline") {
cout << "Invalid option \"" << dictionary["QMAKESPEC"] << "\" for -platform." << endl;
} else { // was autodetected from environment
cout << "Unable to detect the platform from environment. Use -platform command line" << endl
<< "argument and run configure again." << endl;
}
cout << "See the README file for a list of supported operating systems and compilers." << endl;
} else {
if (dictionary[ "QMAKESPEC" ].endsWith("-icc") ||
dictionary[ "QMAKESPEC" ].contains("-msvc")) {
if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "nmake";
dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32";
} else if (dictionary[ "QMAKESPEC" ].startsWith(QLatin1String("win32-g++"))) {
if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "mingw32-make";
dictionary[ "QMAKEMAKEFILE" ] = "Makefile.unix";
} else {
if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "make";
dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32";
}
}
}
void Configure::generateHeaders()
{
if (dictionary["SYNCQT"] == "auto")
dictionary["SYNCQT"] = QFile::exists(sourcePath + "/.git") ? "yes" : "no";
if (dictionary["SYNCQT"] == "yes") {
if (!QStandardPaths::findExecutable(QStringLiteral("perl.exe")).isEmpty()) {
cout << "Running syncqt..." << endl;
QStringList args;
args << "perl" << "-w";
args += sourcePath + "/bin/syncqt.pl";
args << "-version" << QT_VERSION_STR << "-minimal" << "-module" << "QtCore";
args += sourcePath;
int retc = Environment::execute(args, QStringList(), QStringList());
if (retc) {
cout << "syncqt failed, return code " << retc << endl << endl;
dictionary["DONE"] = "error";
}
} else {
cout << "Perl not found in environment - cannot run syncqt." << endl;
dictionary["DONE"] = "error";
}
}
}
void Configure::buildQmake()
{
{
QStringList args;
// Build qmake
QString pwd = QDir::currentPath();
if (!QDir(buildPath).mkpath("qmake")) {
cout << "Cannot create qmake build dir." << endl;
dictionary[ "DONE" ] = "error";
return;
}
if (!QDir::setCurrent(buildPath + "/qmake")) {
cout << "Cannot enter qmake build dir." << endl;
dictionary[ "DONE" ] = "error";
return;
}
QString makefile = "Makefile";
{
QFile out(makefile);
if (out.open(QFile::WriteOnly | QFile::Text)) {
QTextStream stream(&out);
stream << "#AutoGenerated by configure.exe" << endl
<< "BUILD_PATH = .." << endl
<< "SOURCE_PATH = " << QDir::toNativeSeparators(sourcePath) << endl
<< "INC_PATH = " << QDir::toNativeSeparators(
(QFile::exists(sourcePath + "/.git") ? ".." : sourcePath)
+ "/include") << endl;
stream << "QT_VERSION = " QT_VERSION_STR << endl
<< "QT_MAJOR_VERSION = " QT_STRINGIFY(QT_VERSION_MAJOR) << endl
<< "QT_MINOR_VERSION = " QT_STRINGIFY(QT_VERSION_MINOR) << endl
<< "QT_PATCH_VERSION = " QT_STRINGIFY(QT_VERSION_PATCH) << endl;
if (dictionary[ "QMAKESPEC" ].startsWith("win32-g++")) {
stream << "QMAKESPEC = $(SOURCE_PATH)\\mkspecs\\" << dictionary[ "QMAKESPEC" ] << endl
<< "CONFIG_CXXFLAGS = -std=c++11 -ffunction-sections" << endl
<< "CONFIG_LFLAGS = -Wl,--gc-sections" << endl;
QFile in(sourcePath + "/qmake/Makefile.unix.win32");
if (in.open(QFile::ReadOnly | QFile::Text))
stream << in.readAll();
QFile in2(sourcePath + "/qmake/Makefile.unix.mingw");
if (in2.open(QFile::ReadOnly | QFile::Text))
stream << in2.readAll();
} else {
stream << "QMAKESPEC = " << dictionary["QMAKESPEC"] << endl;
}
stream << "\n\n";
QFile in(sourcePath + "/qmake/" + dictionary["QMAKEMAKEFILE"]);
if (in.open(QFile::ReadOnly | QFile::Text)) {
QString d = in.readAll();
//### need replaces (like configure.sh)? --Sam
stream << d << endl;
}
stream.flush();
out.close();
}
}
args += dictionary[ "MAKE" ];
args += "-f";
args += makefile;
cout << "Creating qmake..." << endl;
int exitCode = Environment::execute(args, QStringList(), QStringList());
if (exitCode) {
args.clear();
args += dictionary[ "MAKE" ];
args += "-f";
args += makefile;
args += "clean";
exitCode = Environment::execute(args, QStringList(), QStringList());
if (exitCode) {
cout << "Cleaning qmake failed, return code " << exitCode << endl << endl;
dictionary[ "DONE" ] = "error";
} else {
args.clear();
args += dictionary[ "MAKE" ];
args += "-f";
args += makefile;
exitCode = Environment::execute(args, QStringList(), QStringList());
if (exitCode) {
cout << "Building qmake failed, return code " << exitCode << endl << endl;
dictionary[ "DONE" ] = "error";
}
}
}
QDir::setCurrent(pwd);
}
// Generate qt.conf
QFile confFile(buildPath + "/bin/qt.conf");
if (confFile.open(QFile::WriteOnly | QFile::Text)) { // Truncates any existing file.
QTextStream confStream(&confFile);
confStream << "[EffectivePaths]" << endl
<< "Prefix=.." << endl
<< "[Paths]" << endl
<< "TargetSpec=dummy" << endl
<< "HostSpec=" << dictionary["QMAKESPEC"] << endl;
if (sourcePath != buildPath)
confStream << "[EffectiveSourcePaths]" << endl
<< "Prefix=" << sourcePath << endl;
confStream.flush();
confFile.close();
}
}
void Configure::configure()
{
QStringList args;
args << buildPath + "/bin/qmake"
<< sourcePathMangled
<< "--" << qmakeCmdLine;
QString pwd = QDir::currentPath();
QDir::setCurrent(buildPathMangled);
if (int exitCode = Environment::execute(args, QStringList(), QStringList())) {
cout << "Qmake failed, return code " << exitCode << endl << endl;
dictionary[ "DONE" ] = "error";
}
QDir::setCurrent(pwd);
}
bool Configure::reloadCmdLine(int idx)
{
QFile inFile(buildPathMangled + "/config.opt");
if (!inFile.open(QFile::ReadOnly)) {
inFile.setFileName(buildPath + "/config.opt");
if (!inFile.open(QFile::ReadOnly)) {
inFile.setFileName(buildPath + "/configure.cache");
if (!inFile.open(QFile::ReadOnly)) {
cout << "No config.opt present - cannot redo configuration." << endl;
return false;
}
}
}
QTextStream inStream(&inFile);
while (!inStream.atEnd())
configCmdLine.insert(idx++, inStream.readLine().trimmed());
return true;
}
bool Configure::isDone()
{
return !dictionary["DONE"].isEmpty();
}
bool Configure::isOk()
{
return (dictionary[ "DONE" ] != "error");
}
QT_END_NAMESPACE

View File

@ -1,74 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <qmap.h>
#include <qstring.h>
#include <qstringlist.h>
#include <qlist.h>
#include <qbuffer.h>
#include <qtextstream.h>
#include <qdir.h>
QT_BEGIN_NAMESPACE
class Configure
{
public:
Configure( int& argc, char** argv );
~Configure();
void parseCmdLine();
void buildQmake();
void prepareConfigureInput();
void configure();
void generateHeaders();
bool isDone();
bool isOk();
private:
int verbose;
// Our variable dictionaries
QMap<QString,QString> dictionary;
QStringList configCmdLine, qmakeCmdLine;
QString outputLine;
QTextStream outStream;
QString sourcePath, buildPath;
QString sourcePathMangled, buildPathMangled;
QDir sourceDir, buildDir;
bool reloadCmdLine(int idx);
};
QT_END_NAMESPACE

View File

@ -1,318 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "environment.h"
#include <qdebug.h>
#include <qstringlist.h>
#include <qmap.h>
#include <qdir.h>
#include <qfile.h>
#include <qfileinfo.h>
#include <qstandardpaths.h>
#include <qtemporaryfile.h>
#include <process.h>
#include <errno.h>
#include <iostream>
//#define CONFIGURE_DEBUG_EXECUTE
//#define CONFIGURE_DEBUG_CP_DIR
using namespace std;
#ifdef Q_OS_WIN32
#include <qt_windows.h>
#endif
QT_BEGIN_NAMESPACE
struct CompilerInfo{
Compiler compiler;
const char *compilerStr;
const char *executable;
} compiler_info[] = {
// The compilers here are sorted in a reversed-preferred order
{CC_MINGW, "MinGW (Minimalist GNU for Windows)", "g++.exe"},
{CC_INTEL, "Intel(R) C++ Compiler for 32-bit applications", "icl.exe"}, // xilink.exe, xilink5.exe, xilink6.exe, xilib.exe
{CC_MSVC, "Microsoft (R) Visual Studio C/C++ Compiler", "cl.exe"}, // link.exe, lib.exe
{CC_UNKNOWN, "Unknown", 0},
};
// Initialize static variables
Compiler Environment::detectedCompiler = CC_UNKNOWN;
/*!
Returns the pointer to the CompilerInfo for a \a compiler.
*/
CompilerInfo *Environment::compilerInfo(Compiler compiler)
{
int i = 0;
while(compiler_info[i].compiler != compiler && compiler_info[i].compiler != CC_UNKNOWN)
++i;
return &(compiler_info[i]);
}
/*!
Returns the qmakespec for the compiler detected on the system.
*/
QString Environment::detectQMakeSpec()
{
QString spec;
switch (detectCompiler()) {
case CC_MSVC:
spec = "win32-msvc";
break;
case CC_INTEL:
spec = "win32-icc";
break;
case CC_MINGW:
spec = "win32-g++";
break;
default:
break;
}
return spec;
}
/*!
Returns the enum of the compiler which was detected on the system.
The compilers are detected in the order as entered into the
compiler_info list.
If more than one compiler is found, CC_UNKNOWN is returned.
*/
Compiler Environment::detectCompiler()
{
if(detectedCompiler != CC_UNKNOWN)
return detectedCompiler;
int installed = 0;
for (int i = 0; compiler_info[i].compiler; ++i) {
if (!QStandardPaths::findExecutable(compiler_info[i].executable).isEmpty()) {
if (detectedCompiler == CC_UNKNOWN)
detectedCompiler = compiler_info[i].compiler;
++installed;
}
}
if (installed > 1) {
cout << "Found more than one known compiler! Using \"" << compilerInfo(detectedCompiler)->compilerStr << "\"" << endl;
detectedCompiler = CC_UNKNOWN;
}
return detectedCompiler;
};
/*!
Creates a commandling from \a program and it \a arguments,
escaping characters that needs it.
*/
static QString qt_create_commandline(const QString &program, const QStringList &arguments)
{
QString programName = program;
if (!programName.startsWith("\"") && !programName.endsWith("\"") && programName.contains(" "))
programName = "\"" + programName + "\"";
programName.replace("/", "\\");
QString args;
// add the prgram as the first arrg ... it works better
args = programName + " ";
for (int i=0; i<arguments.size(); ++i) {
QString tmp = arguments.at(i);
// in the case of \" already being in the string the \ must also be escaped
tmp.replace( "\\\"", "\\\\\"" );
// escape a single " because the arguments will be parsed
tmp.replace( "\"", "\\\"" );
if (tmp.isEmpty() || tmp.contains(' ') || tmp.contains('\t')) {
// The argument must not end with a \ since this would be interpreted
// as escaping the quote -- rather put the \ behind the quote: e.g.
// rather use "foo"\ than "foo\"
QString endQuote("\"");
int i = tmp.length();
while (i>0 && tmp.at(i-1) == '\\') {
--i;
endQuote += "\\";
}
args += QString(" \"") + tmp.left(i) + endQuote;
} else {
args += ' ' + tmp;
}
}
return args;
}
/*!
Creates a QByteArray of the \a environment.
*/
static QByteArray qt_create_environment(const QStringList &environment)
{
QByteArray envlist;
if (environment.isEmpty())
return envlist;
int pos = 0;
// add PATH if necessary (for DLL loading)
QByteArray path = qgetenv("PATH");
if (environment.filter(QRegExp("^PATH=",Qt::CaseInsensitive)).isEmpty() && !path.isNull()) {
QString tmp = QString(QLatin1String("PATH=%1")).arg(QString::fromLocal8Bit(path));
uint tmpSize = sizeof(wchar_t) * (tmp.length() + 1);
envlist.resize(envlist.size() + tmpSize);
memcpy(envlist.data() + pos, tmp.utf16(), tmpSize);
pos += tmpSize;
}
// add the user environment
foreach (const QString &tmp, environment) {
uint tmpSize = sizeof(wchar_t) * (tmp.length() + 1);
envlist.resize(envlist.size() + tmpSize);
memcpy(envlist.data() + pos, tmp.utf16(), tmpSize);
pos += tmpSize;
}
// add the 2 terminating 0 (actually 4, just to be on the safe side)
envlist.resize(envlist.size() + 4);
envlist[pos++] = 0;
envlist[pos++] = 0;
envlist[pos++] = 0;
envlist[pos++] = 0;
return envlist;
}
/*!
Executes the command described in \a arguments, in the
environment inherited from the parent process, with the
\a additionalEnv settings applied.
\a removeEnv removes the specified environment variables from
the environment of the executed process.
Returns the exit value of the process, or -1 if the command could
not be executed.
This function uses _(w)spawnvpe to spawn a process by searching
through the PATH environment variable.
*/
int Environment::execute(QStringList arguments, const QStringList &additionalEnv, const QStringList &removeEnv)
{
#ifdef CONFIGURE_DEBUG_EXECUTE
qDebug() << "About to Execute: " << arguments;
qDebug() << " " << QDir::currentPath();
qDebug() << " " << additionalEnv;
qDebug() << " " << removeEnv;
#endif
// Create the full environment from the current environment and
// the additionalEnv strings, then remove all variables defined
// in removeEnv
QMap<QString, QString> fullEnvMap;
LPWSTR envStrings = GetEnvironmentStrings();
if (envStrings) {
int strLen = 0;
for (LPWSTR envString = envStrings; *(envString); envString += strLen + 1) {
strLen = int(wcslen(envString));
QString str = QString((const QChar*)envString, strLen);
if (!str.startsWith("=")) { // These are added by the system
int sepIndex = str.indexOf('=');
fullEnvMap.insert(str.left(sepIndex).toUpper(), str.mid(sepIndex +1));
}
}
}
FreeEnvironmentStrings(envStrings);
// Add additionalEnv variables
for (int i = 0; i < additionalEnv.count(); ++i) {
const QString &str = additionalEnv.at(i);
int sepIndex = str.indexOf('=');
fullEnvMap.insert(str.left(sepIndex).toUpper(), str.mid(sepIndex +1));
}
// Remove removeEnv variables
for (int j = 0; j < removeEnv.count(); ++j)
fullEnvMap.remove(removeEnv.at(j).toUpper());
// Add all variables to a QStringList
QStringList fullEnv;
QMapIterator<QString, QString> it(fullEnvMap);
while (it.hasNext()) {
it.next();
fullEnv += QString(it.key() + "=" + it.value());
}
// ----------------------------
QString program = arguments.takeAt(0);
QString args = qt_create_commandline(program, arguments);
QByteArray envlist = qt_create_environment(fullEnv);
DWORD exitCode = DWORD(-1);
PROCESS_INFORMATION procInfo;
memset(&procInfo, 0, sizeof(procInfo));
STARTUPINFO startInfo;
memset(&startInfo, 0, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
bool couldExecute = CreateProcess(0, (wchar_t*)args.utf16(),
0, 0, true, CREATE_UNICODE_ENVIRONMENT,
envlist.isEmpty() ? 0 : envlist.data(),
0, &startInfo, &procInfo);
if (couldExecute) {
WaitForSingleObject(procInfo.hProcess, INFINITE);
GetExitCodeProcess(procInfo.hProcess, &exitCode);
CloseHandle(procInfo.hThread);
CloseHandle(procInfo.hProcess);
}
if (exitCode == DWORD(-1)) {
switch(GetLastError()) {
case E2BIG:
cerr << "execute: Argument list exceeds 1024 bytes" << endl;
foreach (const QString &arg, arguments)
cerr << " (" << arg.toLocal8Bit().constData() << ")" << endl;
break;
case ENOENT:
cerr << "execute: File or path is not found (" << program.toLocal8Bit().constData() << ")" << endl;
break;
case ENOEXEC:
cerr << "execute: Specified file is not executable or has invalid executable-file format (" << program.toLocal8Bit().constData() << ")" << endl;
break;
case ENOMEM:
cerr << "execute: Not enough memory is available to execute new process." << endl;
break;
default:
cerr << "execute: Unknown error" << endl;
foreach (const QString &arg, arguments)
cerr << " (" << arg.toLocal8Bit().constData() << ")" << endl;
break;
}
}
return exitCode;
}
QT_END_NAMESPACE

View File

@ -1,57 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <qstringlist.h>
QT_BEGIN_NAMESPACE
enum Compiler {
CC_UNKNOWN = 0,
CC_MINGW = 0x02,
CC_INTEL = 0x03,
CC_MSVC = 0x04
};
struct CompilerInfo;
class Environment
{
public:
static Compiler detectCompiler();
static QString detectQMakeSpec();
static int execute(QStringList arguments, const QStringList &additionalEnv, const QStringList &removeEnv);
private:
static Compiler detectedCompiler;
static CompilerInfo *compilerInfo(Compiler compiler);
};
QT_END_NAMESPACE

View File

@ -1,72 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
/*
** Configure tool
**
*/
#include "configureapp.h"
QT_BEGIN_NAMESPACE
int runConfigure( int argc, char** argv )
{
Configure app( argc, argv );
if (!app.isOk())
return 3;
app.parseCmdLine();
if (!app.isOk())
return 3;
// Bootstrapped includes. Needed by qmake.
app.generateHeaders();
if (!app.isOk())
return 3;
// Bootstrap qmake. Needed by config tests.
app.buildQmake();
if (!app.isOk())
return 3;
// run qmake based configure
app.configure();
if (!app.isOk())
return 3;
return 0;
}
QT_END_NAMESPACE
int main( int argc, char** argv )
{
QT_USE_NAMESPACE
return runConfigure(argc, argv);
}