add gcc-wrapper
Change-Id: I961bd23d1ec382d247a489cda42194ce9f4fe1da Reviewed-on: https://gerrit.libreoffice.org/2715 Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org> Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
This commit is contained in:
committed by
Fridrich Strba
parent
77cc0cb72f
commit
357ace566d
@@ -110,6 +110,8 @@ ifeq ($(OS),WNT)
|
|||||||
$(eval $(call gb_Helper_register_executables,OOO,\
|
$(eval $(call gb_Helper_register_executables,OOO,\
|
||||||
crashrep_com \
|
crashrep_com \
|
||||||
gengal \
|
gengal \
|
||||||
|
gcc-wrapper \
|
||||||
|
g++-wrapper \
|
||||||
guiloader \
|
guiloader \
|
||||||
guistdio \
|
guistdio \
|
||||||
langsupport \
|
langsupport \
|
||||||
@@ -138,6 +140,7 @@ $(eval $(call gb_Helper_register_static_libraries,PLAINLIBS, \
|
|||||||
directxcanvas \
|
directxcanvas \
|
||||||
winextendloaderenv \
|
winextendloaderenv \
|
||||||
winlauncher \
|
winlauncher \
|
||||||
|
wrapper \
|
||||||
))
|
))
|
||||||
|
|
||||||
else
|
else
|
||||||
|
20
solenv/Executable_g++-wrapper.mk
Executable file
20
solenv/Executable_g++-wrapper.mk
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
|
||||||
|
#
|
||||||
|
# This file is part of the LibreOffice project.
|
||||||
|
#
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
#
|
||||||
|
|
||||||
|
$(eval $(call gb_Executable_Executable,g++-wrapper))
|
||||||
|
|
||||||
|
$(eval $(call gb_Executable_add_exception_objects,g++-wrapper,\
|
||||||
|
solenv/gcc-wrappers/g++ \
|
||||||
|
))
|
||||||
|
|
||||||
|
$(eval $(call gb_Executable_use_static_libraries,g++-wrapper,\
|
||||||
|
wrapper \
|
||||||
|
))
|
||||||
|
|
||||||
|
# vim:set noet sw=4 ts=4:
|
20
solenv/Executable_gcc-wrapper.mk
Normal file
20
solenv/Executable_gcc-wrapper.mk
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
|
||||||
|
#
|
||||||
|
# This file is part of the LibreOffice project.
|
||||||
|
#
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
#
|
||||||
|
|
||||||
|
$(eval $(call gb_Executable_Executable,gcc-wrapper))
|
||||||
|
|
||||||
|
$(eval $(call gb_Executable_add_exception_objects,gcc-wrapper,\
|
||||||
|
solenv/gcc-wrappers/gcc \
|
||||||
|
))
|
||||||
|
|
||||||
|
$(eval $(call gb_Executable_use_static_libraries,gcc-wrapper,\
|
||||||
|
wrapper \
|
||||||
|
))
|
||||||
|
|
||||||
|
# vim:set noet sw=4 ts=4:
|
@@ -31,15 +31,20 @@ $(eval $(call gb_Module_add_targets_for_build,solenv,\
|
|||||||
Executable_concat-deps \
|
Executable_concat-deps \
|
||||||
))
|
))
|
||||||
|
|
||||||
ifneq ($(OS),WNT)
|
ifeq ($(COM),MSC)
|
||||||
ifneq ($(OS),IOS)
|
$(eval $(call gb_Module_add_targets,solenv,\
|
||||||
ifneq ($(OS),ANDROID)
|
StaticLibrary_wrapper \
|
||||||
|
Executable_gcc-wrapper \
|
||||||
|
Executable_g++-wrapper \
|
||||||
|
))
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
ifneq ($(filter-out WNT IOS ANDROID,$(OS)),)
|
||||||
$(eval $(call gb_Module_add_targets,solenv,\
|
$(eval $(call gb_Module_add_targets,solenv,\
|
||||||
CustomTarget_gdb \
|
CustomTarget_gdb \
|
||||||
Package_gdb \
|
Package_gdb \
|
||||||
))
|
))
|
||||||
endif
|
endif
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# vim: set shiftwidth=4 tabstop=4 noexpandtab:
|
# vim: set shiftwidth=4 tabstop=4 noexpandtab:
|
||||||
|
16
solenv/StaticLibrary_wrapper.mk
Executable file
16
solenv/StaticLibrary_wrapper.mk
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
|
||||||
|
#
|
||||||
|
# This file is part of the LibreOffice project.
|
||||||
|
#
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
#
|
||||||
|
|
||||||
|
$(eval $(call gb_StaticLibrary_StaticLibrary,wrapper))
|
||||||
|
|
||||||
|
$(eval $(call gb_StaticLibrary_add_exception_objects,wrapper,\
|
||||||
|
solenv/gcc-wrappers/wrapper \
|
||||||
|
))
|
||||||
|
|
||||||
|
# vim:set noet sw=4 ts=4:
|
@@ -180,6 +180,16 @@ $(call gb_ExternalProject_get_preparation_target,$(1)) : \
|
|||||||
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
# Use the gcc wrappers for a autoconf based project
|
||||||
|
#
|
||||||
|
# gb_ExternalProject_register_targets project state_target
|
||||||
|
define gb_ExternalProject_use_autoconf
|
||||||
|
ifeq ($(COM),MSC)
|
||||||
|
$(call gb_ExternalProject_get_preparation_target,$(1)) : $(call gb_Executable_get_runtime_dependencies,gcc-wrapper) \
|
||||||
|
$(call gb_Executable_get_runtime_dependencies,g++-wrapper)
|
||||||
|
$(call gb_ExternalProject_get_state_target,$(1),$(2)): WRAPPERS := $(AUTOCONF_WRAPPERS)
|
||||||
|
endif
|
||||||
|
endef
|
||||||
|
|
||||||
# Run a target command
|
# Run a target command
|
||||||
#
|
#
|
||||||
@@ -190,8 +200,17 @@ endef
|
|||||||
# default log_filename is <run_target>.log
|
# default log_filename is <run_target>.log
|
||||||
#
|
#
|
||||||
|
|
||||||
|
AUTOCONF_WRAPPERS := \
|
||||||
|
REAL_CC="$(shell cygpath -w $(CC))" \
|
||||||
|
CC="$(call gb_Executable_get_target,gcc-wrapper)" \
|
||||||
|
REAL_CXX="$(shell cygpath -w $(CXX))" \
|
||||||
|
CXX="$(call gb_Executable_get_target,g++-wrapper)" \
|
||||||
|
LD="$(shell cygpath -w $(COMPATH)/bin/link.exe) -nologo"
|
||||||
|
|
||||||
define gb_ExternalProject_run
|
define gb_ExternalProject_run
|
||||||
$(call gb_Helper_print_on_error,cd $(EXTERNAL_WORKDIR)/$(3) && $(2) && touch $@,$(EXTERNAL_WORKDIR)/$(if $(3),$(3)/,)$(if $(4),$(4),$(1).log))
|
$(call gb_Helper_print_on_error,cd $(EXTERNAL_WORKDIR)/$(3) && \
|
||||||
|
$(if $(filter MSC,$(COM)),$(if $(WRAPPERS),export $(WRAPPERS) &&)) \
|
||||||
|
$(2) && touch $@,$(EXTERNAL_WORKDIR)/$(if $(3),$(3)/,)$(if $(4),$(4),$(1).log))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# vim: set noet sw=4 ts=4:
|
# vim: set noet sw=4 ts=4:
|
||||||
|
25
solenv/gcc-wrappers/g++.cxx
Executable file
25
solenv/gcc-wrappers/g++.cxx
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||||
|
/*
|
||||||
|
* This file is part of the LibreOffice project.
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wrapper.hxx"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
vector<string> rawargs(argv + 1, argv + argc);
|
||||||
|
|
||||||
|
string command=getexe("REAL_CXX");
|
||||||
|
|
||||||
|
string args=processccargs(rawargs);
|
||||||
|
|
||||||
|
setupccenv();
|
||||||
|
|
||||||
|
return startprocess(command,args);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
25
solenv/gcc-wrappers/gcc.cxx
Executable file
25
solenv/gcc-wrappers/gcc.cxx
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||||
|
/*
|
||||||
|
* This file is part of the LibreOffice project.
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wrapper.hxx"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
vector<string> rawargs(argv + 1, argv + argc);
|
||||||
|
|
||||||
|
string command=getexe("REAL_CC");
|
||||||
|
|
||||||
|
string args=processccargs(rawargs);
|
||||||
|
|
||||||
|
setupccenv();
|
||||||
|
|
||||||
|
return startprocess(command,args);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
168
solenv/gcc-wrappers/wrapper.cxx
Normal file
168
solenv/gcc-wrappers/wrapper.cxx
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||||
|
/*
|
||||||
|
* This file is part of the LibreOffice project.
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wrapper.hxx"
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#define BUFLEN 2048
|
||||||
|
|
||||||
|
string getexe(string exename) {
|
||||||
|
char* cmdbuf;
|
||||||
|
size_t cmdlen;
|
||||||
|
_dupenv_s(&cmdbuf,&cmdlen,exename.c_str());
|
||||||
|
if(!cmdbuf) {
|
||||||
|
cout << "Error " << exename << " not defined. Did you forget to source the enviroment?" << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
string command(cmdbuf);
|
||||||
|
free(cmdbuf);
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupccenv() {
|
||||||
|
// Set-up library path
|
||||||
|
string libpath="LIB=";
|
||||||
|
char* libbuf;
|
||||||
|
size_t liblen;
|
||||||
|
_dupenv_s(&libbuf,&liblen,"ILIB");
|
||||||
|
libpath.append(libbuf);
|
||||||
|
free(libbuf);
|
||||||
|
if(_putenv(libpath.c_str())<0) {
|
||||||
|
cerr << "Error: could not export LIB" << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set-up include path
|
||||||
|
string includepath="INCLUDE=.;";
|
||||||
|
char* incbuf;
|
||||||
|
size_t inclen;
|
||||||
|
_dupenv_s(&incbuf,&inclen,"SOLARINC");
|
||||||
|
string inctmp(incbuf);
|
||||||
|
free(incbuf);
|
||||||
|
|
||||||
|
// 3 = strlen(" -I")
|
||||||
|
for(size_t pos=0; pos != string::npos;) {
|
||||||
|
size_t endpos=inctmp.find(" -I",pos+3);
|
||||||
|
size_t len=endpos-pos-3;
|
||||||
|
if(endpos==string::npos)
|
||||||
|
includepath.append(inctmp,pos+3,endpos);
|
||||||
|
else if(len>0) {
|
||||||
|
includepath.append(inctmp,pos+3,len);
|
||||||
|
includepath.append(";");
|
||||||
|
}
|
||||||
|
pos=inctmp.find(" -I",pos+len);
|
||||||
|
}
|
||||||
|
if(_putenv(includepath.c_str())<0) {
|
||||||
|
cerr << "Error: could not export INCLUDE" << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string processccargs(vector<string> rawargs) {
|
||||||
|
// suppress the msvc banner
|
||||||
|
string args=" -nologo";
|
||||||
|
// TODO: should these options be enabled globally?
|
||||||
|
args.append(" -EHsc");
|
||||||
|
args.append(" -MD");
|
||||||
|
|
||||||
|
for(vector<string>::iterator i = rawargs.begin(); i != rawargs.end(); ++i) {
|
||||||
|
args.append(" ");
|
||||||
|
if(*i == "-o") {
|
||||||
|
// TODO: handle more than just exe output
|
||||||
|
args.append("-Fe");
|
||||||
|
++i;
|
||||||
|
args.append(*i);
|
||||||
|
}
|
||||||
|
else if(*i == "-g")
|
||||||
|
args.append("-Zi");
|
||||||
|
else if(!(*i).compare(0,2,"-D")) {
|
||||||
|
// need to re-escape strings for preprocessor
|
||||||
|
for(size_t pos=(*i).find("\"",0); pos!=string::npos; pos=(*i).find("\"",pos)) {
|
||||||
|
(*i).replace(pos,0,"\\");
|
||||||
|
pos+=2;
|
||||||
|
}
|
||||||
|
args.append(*i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
args.append(*i);
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
int startprocess(string command, string args) {
|
||||||
|
STARTUPINFO si;
|
||||||
|
PROCESS_INFORMATION pi;
|
||||||
|
SECURITY_ATTRIBUTES sa;
|
||||||
|
|
||||||
|
HANDLE childout_read;
|
||||||
|
HANDLE childout_write;
|
||||||
|
|
||||||
|
memset(&sa,0,sizeof(sa));
|
||||||
|
memset(&si,0,sizeof(si));
|
||||||
|
memset(&pi,0,sizeof(pi));
|
||||||
|
|
||||||
|
sa.nLength=sizeof(sa);
|
||||||
|
sa.bInheritHandle=TRUE;
|
||||||
|
|
||||||
|
if(!CreatePipe(&childout_read,&childout_write,&sa,0)) {
|
||||||
|
cerr << "Error: could not create sdtout pipe" << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
si.cb=sizeof(si);
|
||||||
|
si.dwFlags |= STARTF_USESTDHANDLES;
|
||||||
|
si.hStdOutput=childout_write;
|
||||||
|
si.hStdError=childout_write;
|
||||||
|
|
||||||
|
// Commandline may be modified by CreateProcess
|
||||||
|
char* cmdline=_strdup(args.c_str());
|
||||||
|
|
||||||
|
if(!CreateProcess(command.c_str(), // Process Name
|
||||||
|
cmdline, // Command Line
|
||||||
|
NULL, // Process Handle not Inheritable
|
||||||
|
NULL, // Thread Handle not Inheritable
|
||||||
|
TRUE, // Handles are Inherited
|
||||||
|
0, // No creation flags
|
||||||
|
NULL, // Enviroment for process
|
||||||
|
NULL, // Use same starting directory
|
||||||
|
&si, // Startup Info
|
||||||
|
&pi) // Process Information
|
||||||
|
) {
|
||||||
|
cerr << "Error: could not create process" << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if you don't close this the process will hang
|
||||||
|
CloseHandle(childout_write);
|
||||||
|
|
||||||
|
// Get Process output
|
||||||
|
char buffer[BUFLEN];
|
||||||
|
DWORD readlen, writelen, ret;
|
||||||
|
HANDLE stdout_handle=GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
while(true) {
|
||||||
|
int success=ReadFile(childout_read,buffer,BUFLEN,&readlen,NULL);
|
||||||
|
// check if the child process has exited
|
||||||
|
if(GetLastError()==ERROR_BROKEN_PIPE)
|
||||||
|
break;
|
||||||
|
if(!success) {
|
||||||
|
cerr << "Error: could not read from subprocess stdout" << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if(readlen!=0) {
|
||||||
|
WriteFile(stdout_handle,buffer,readlen,&writelen,NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GetExitCodeProcess(pi.hProcess, &ret);
|
||||||
|
CloseHandle(pi.hThread);
|
||||||
|
CloseHandle(pi.hProcess);
|
||||||
|
return int(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
24
solenv/gcc-wrappers/wrapper.hxx
Executable file
24
solenv/gcc-wrappers/wrapper.hxx
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||||
|
/*
|
||||||
|
* This file is part of the LibreOffice project.
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
string getexe(string exename);
|
||||||
|
|
||||||
|
void setupccenv();
|
||||||
|
|
||||||
|
string processccargs(vector<string> rawargs);
|
||||||
|
|
||||||
|
int startprocess(string command, string args);
|
||||||
|
|
||||||
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
Reference in New Issue
Block a user