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,\
|
||||
crashrep_com \
|
||||
gengal \
|
||||
gcc-wrapper \
|
||||
g++-wrapper \
|
||||
guiloader \
|
||||
guistdio \
|
||||
langsupport \
|
||||
@@ -138,6 +140,7 @@ $(eval $(call gb_Helper_register_static_libraries,PLAINLIBS, \
|
||||
directxcanvas \
|
||||
winextendloaderenv \
|
||||
winlauncher \
|
||||
wrapper \
|
||||
))
|
||||
|
||||
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 \
|
||||
))
|
||||
|
||||
ifneq ($(OS),WNT)
|
||||
ifneq ($(OS),IOS)
|
||||
ifneq ($(OS),ANDROID)
|
||||
ifeq ($(COM),MSC)
|
||||
$(eval $(call gb_Module_add_targets,solenv,\
|
||||
StaticLibrary_wrapper \
|
||||
Executable_gcc-wrapper \
|
||||
Executable_g++-wrapper \
|
||||
))
|
||||
endif
|
||||
|
||||
|
||||
ifneq ($(filter-out WNT IOS ANDROID,$(OS)),)
|
||||
$(eval $(call gb_Module_add_targets,solenv,\
|
||||
CustomTarget_gdb \
|
||||
Package_gdb \
|
||||
))
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# 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
|
||||
|
||||
# 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
|
||||
#
|
||||
@@ -190,8 +200,17 @@ endef
|
||||
# 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
|
||||
$(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
|
||||
|
||||
# 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