2016-07-11 8 views
1

Ich habe ein R-Paket gebaut, das C/C++ - Code enthält. Ich versuche jetzt, dieses Paket auf win-builder zu testen. Leider wird der folgende Fehler in 00install.out zurückgegeben:gcc nicht gefunden von Win-Builder

* installing *source* package 'mypackage' ... 
** libs 
    running 'src/Makefile.win' ... 
/usr/bin/make --directory=lib/mylib/ 
gcc -g -Wall -fPIC -c mycode.c 
make[1]: gcc: Command not found 
make[1]: *** [mycode.o] Error 127 
make: *** [mylib] Error 2 
Warning: running command 'make --no-print-directory -f "Makefile.win"' had status 2 
ERROR: compilation failed for package 'mypackage' 
* removing 'd:/RCompile/CRANguest/R-release/lib/mypackage' 

mit gcc Probieren, gcc.exe und cc ergaben ähnliche Ergebnisse.

Dementsprechend habe ich eine Testumgebung auf einer virtuellen Windows-Maschine nach these instructions eingerichtet. Das Ausführen von R CMD INSTALL . auf dem Code von der Befehlszeile in dieser Umgebung führte zu dem Codekompilieren und dem Installieren des Pakets ohne Problem. (Running R CMD build . ergab auch keine Fehler.)

Was ist los mit Win-Builder, und wie kann ich Kompilation darauf erreichen?

Oder, was noch wichtiger ist, ist in der Lage, das Paket auf Windows ausreichend zu erstellen, unabhängig davon, ob es auf Win-Builder funktionierte?

Mein Makefile.win ist wie folgt:

export CCOMP = gcc 
export CPPCOMP = c++ 
export ADD_CC_FLAGS = -O3 
APP_DIR = ./apps/myapp 
LIB_DIR = ./lib/mylib 

.PHONY: all $(APP_DIR) $(LIB_DIR) 

all: $(APP_DIR) $(LIB_DIR) 

$(APP_DIR) $(LIB_DIR): mylib 
    $(MAKE) [email protected] 

$(APP_DIR): $(LIB_DIR) mylib 

mylib: 
    $(MAKE) --directory=lib/mylib 

Einfügen echo %PATH% in die Make-Datei unter dem mylib Ziel ergab:

Makefile.win:24: *** missing separator. Stop. 
+0

Können Sie Ihren Makefile.win-Inhalt aufnehmen? – nrussell

+0

@nrussell: Hinzugefügt. – Richard

Antwort

3

Sie erhalten einen obskuren Fehler hier, weil Sie eine Datei Makefile.win enthielten.

Aber die Semantik von make, wenn eine solche Datei gefunden wird, wird es verwendet ... das ist nicht was Sie hier wollen. R baut sein eigenesMakefile.win und Sie sollen nur ein Schnipsel liefern, um eingeschlossen zu werden - das muss genannt Makevars.win sein.

Das ist die Regel Nummer eins. Regeln Nummer zwei ist nicht das gesamte Material enthalten, die Sie in einem Makefile enthalten würden - wie Sie Clobber, was R bereits an die Tabelle bringt. All dies ist in Schreiben von R-Erweiterungen aber könnte natürlich klarer sein.

Mein pragmatischer Vorschlag: Nehmen Sie ein Paket, das Sie kennen und mögen, das einen funktionierenden R-Build in win-builder enthält, und modifizieren Sie es. Sie können vor Ort testen, sollten Sie Zugriff auf ein R-System mit RTools etc pp haben


Bearbeiten von OP.

Ich brauchte eine ausführbare Datei zu erstellen, die auf mehrere Bibliotheken verlassen. Die Bibliothekscodes waren in src/libs und der Code der ausführbaren Datei war in src/apps. Ich habe sichergestellt, dass make innerhalb jedes Unterverzeichnisses funktioniert und setzen Sie src/apps/Makefile, um relative Pfade zu verwenden, um die Ergebnisse von src/libs zu ziehen. Das einzige Problem war, dass die ganze Kette lief.Dazu habe ich eine Datei src/Makevars.win, die die folgende Struktur hatte:

.PHONY: all myprogram sublib1 sublib2 

all: sublib1 sublib2 myprogram 

myprogram: sublib1 sublib2 
    @(cd apps/myprogram && $(MAKE) CXX="$(CXX)" CC="$(CC)" CFLAGS="$(CFLAGS) $(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)") 

sublib1: 
    @(cd lib/sublib1 && $(MAKE) CXX="$(CXX)" CC="$(CC)" CFLAGS="$(CFLAGS) $(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)") 

sublib2: 
    @(cd lib/sublib2 && $(MAKE) CXX="$(CXX)" CC="$(CC)" CFLAGS="$(CFLAGS) $(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)") 

Wie ich es verstehe, wird Makevars.win in einem dynamisch generierten eingebettet Makefile die R erzeugt. Also referenziert $(CC) tatsächlich diesen versteckten Code.

(Es gibt wahrscheinlich mehr clevere Möglichkeiten, dies zu tun.)

+0

Danke. Es ist in der Tat der Fall, dass * Writing R Extensions * könnte klarer sein. Ich habe mir ein anderes Paket angeschaut, das ich mag ('dplyr') und es scheint, dass der Code wesentlich einfacher ist als meiner. Mein Makefile ruft rekursiv sechs verschiedene Unterverzeichnisse auf, die eigene Makefiles haben. Diese erzeugen statische Bibliotheken, die dann in eine ausführbare Datei assembliert werden. Ich bin mir nicht sicher, wie ich das mit 'Makevars' aufnehmen soll, obwohl das vielleicht eine separate Frage ist. – Richard

+0

Es ist schwer. Einige Pakete machen das - und einige andere führen das auf "configure" und "configure.win" aus. –

+0

Lesen Sie [diesen Link] (http://www.hep.by/gnu/r-patched/r-exts/R-exts_14.html#SEC14) jetzt. – Richard