8

I am trying to install xgboost on Mac. I followed the instructions on github, but when I run make -j4 I get an error:

c++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -DDISABLE_OPENMP -o xgboost  build/cli_main.o build/learner.o build/logging.o build/c_api/c_api.o build/c_api/c_api_error.o build/common/common.o build/data/data.o build/data/simple_csr_source.o build/data/simple_dmatrix.o build/data/sparse_page_dmatrix.o build/data/sparse_page_raw_format.o build/data/sparse_page_source.o build/data/sparse_page_writer.o build/gbm/gblinear.o build/gbm/gbm.o build/gbm/gbtree.o build/metric/elementwise_metric.o build/metric/metric.o build/metric/multiclass_metric.o build/metric/rank_metric.o build/objective/multiclass_obj.o build/objective/objective.o build/objective/rank_obj.o build/objective/regression_obj.o build/tree/tree_model.o build/tree/tree_updater.o build/tree/updater_colmaker.o build/tree/updater_histmaker.o build/tree/updater_prune.o build/tree/updater_refresh.o build/tree/updater_skmaker.o build/tree/updater_sync.o dmlc-core/libdmlc.a rabit/lib/librabit_empty.a  -pthread -lm   
ar crv lib/libxgboost.a 
c++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -DDISABLE_OPENMP -shared -o lib/libxgboost.so build/learner.o build/logging.o build/c_api/c_api.o build/c_api/c_api_error.o build/common/common.o build/data/data.o build/data/simple_csr_source.o build/data/simple_dmatrix.o build/data/sparse_page_dmatrix.o build/data/sparse_page_raw_format.o build/data/sparse_page_source.o build/data/sparse_page_writer.o build/gbm/gblinear.o build/gbm/gbm.o build/gbm/gbtree.o build/metric/elementwise_metric.o build/metric/metric.o build/metric/multiclass_metric.o build/metric/rank_metric.o build/objective/multiclass_obj.o build/objective/objective.o build/objective/rank_obj.o build/objective/regression_obj.o build/tree/tree_model.o build/tree/tree_updater.o build/tree/updater_colmaker.o build/tree/updater_histmaker.o build/tree/updater_prune.o build/tree/updater_refresh.o build/tree/updater_skmaker.o build/tree/updater_sync.o dmlc-core/libdmlc.a rabit/lib/librabit_empty.a -pthread -lm   
ar: no archive members specified
usage:  ar -d [-TLsv] archive file ...
    ar -m [-TLsv] archive file ...
    ar -m [-abiTLsv] position archive file ...
    ar -p [-TLsv] archive [file ...]
    ar -q [-cTLsv] archive file ...
    ar -r [-cuTLsv] archive file ...
    ar -r [-abciuTLsv] position archive file ...
    ar -t [-TLsv] archive [file ...]
    ar -x [-ouTLsv] archive [file ...]
make: *** [lib/libxgboost.a] Error 1
make: *** Waiting for unfinished jobs....
clang: warning: argument unused during compilation: '-pthread'
clang: warning: argument unused during compilation: '-pthread'

If I run just make (without -j4) I get:

$ make
ar crv lib/libxgboost.a 
ar: no archive members specified
usage:  ar -d [-TLsv] archive file ...
    ar -m [-TLsv] archive file ...
    ar -m [-abiTLsv] position archive file ...
    ar -p [-TLsv] archive [file ...]
    ar -q [-cTLsv] archive file ...
    ar -r [-cuTLsv] archive file ...
    ar -r [-abciuTLsv] position archive file ...
    ar -t [-TLsv] archive [file ...]
    ar -x [-ouTLsv] archive [file ...]
make: *** [lib/libxgboost.a] Error 1

Any idea what is causing this and how I can fix it?

Although I might be wrong I think is because archive utility ar on mac is too old (from 2005):

$ man ar

AR(1)                     BSD General Commands Manual                    AR(1)

NAME
     ar -- create and maintain library archives

SYNOPSIS

...
...

Darwin                           July 27, 2005                          Darwin

Any ideas how to update ar to the newest version on OS X?

Here is the makefile for your reference:

ifndef config
ifneq ("$(wildcard ./config.mk)","")
        config = config.mk
else
        config = make/config.mk
endif
endif

ifndef DMLC_CORE
        DMLC_CORE = dmlc-core
endif

ifndef RABIT
        RABIT = rabit
endif

ROOTDIR = $(CURDIR)

ifeq ($(OS), Windows_NT)
        UNAME="Windows"
else
        UNAME=$(shell uname)
endif

include $(config)
ifeq ($(USE_OPENMP), 0)
        export NO_OPENMP = 1
endif
include $(DMLC_CORE)/make/dmlc.mk

# include the plugins
include $(XGB_PLUGINS)

# use customized config file
ifndef CC
export CC  = $(if $(shell which gcc-5),gcc-5,gcc)
endif
ifndef CXX
export CXX = $(if $(shell which g++-5),g++-5,g++)
endif

export LDFLAGS= -pthread -lm $(ADD_LDFLAGS) $(DMLC_LDFLAGS) $(PLUGIN_LDFLAGS)
export CFLAGS=  -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude $(ADD_CFLAGS) $(PLUGIN_CFLAGS)
CFLAGS += -I$(DMLC_CORE)/include -I$(RABIT)/include
#java include path
export JAVAINCFLAGS = -I${JAVA_HOME}/include -I./java

ifndef LINT_LANG
        LINT_LANG= "all"
endif

ifneq ($(UNAME), Windows)
        CFLAGS += -fPIC
        XGBOOST_DYLIB = lib/libxgboost.so
else
        XGBOOST_DYLIB = lib/libxgboost.dll
endif

ifeq ($(UNAME), Linux)
        LDFLAGS += -lrt
        JAVAINCFLAGS += -I${JAVA_HOME}/include/linux
endif

ifeq ($(UNAME), Darwin)
        JAVAINCFLAGS += -I${JAVA_HOME}/include/darwin
endif

ifeq ($(USE_OPENMP), 1)
        CFLAGS += -fopenmp
else
        CFLAGS += -DDISABLE_OPENMP
endif


# specify tensor path
.PHONY: clean all lint clean_all doxygen rcpplint pypack Rpack Rbuild Rcheck java


all: lib/libxgboost.a $(XGBOOST_DYLIB) xgboost

$(DMLC_CORE)/libdmlc.a: $(wildcard $(DMLC_CORE)/src/*.cc $(DMLC_CORE)/src/*/*.cc)
        + cd $(DMLC_CORE); make libdmlc.a config=$(ROOTDIR)/$(config); cd $(ROOTDIR)

$(RABIT)/lib/$(LIB_RABIT): $(wildcard $(RABIT)/src/*.cc)
        + cd $(RABIT); make lib/$(LIB_RABIT); cd $(ROOTDIR)

jvm: jvm-packages/lib/libxgboost4j.so

SRC = $(wildcard src/*.cc src/*/*.cc)
ALL_OBJ = $(patsubst src/%.cc, build/%.o, $(SRC)) $(PLUGIN_OBJS)
AMALGA_OBJ = amalgamation/xgboost-all0.o
LIB_DEP = $(DMLC_CORE)/libdmlc.a $(RABIT)/lib/$(LIB_RABIT)
ALL_DEP = $(filter-out build/cli_main.o, $(ALL_OBJ)) $(LIB_DEP)
CLI_OBJ = build/cli_main.o

build/%.o: src/%.cc
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) -MM -MT build/$*.o $< >build/$*.d
        $(CXX) -c $(CFLAGS) -c $< -o $@

build_plugin/%.o: plugin/%.cc
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) -MM -MT build_plugin/$*.o $< >build_plugin/$*.d
        $(CXX) -c $(CFLAGS) -c $< -o $@

# The should be equivalent to $(ALL_OBJ)  except for build/cli_main.o
amalgamation/xgboost-all0.o: amalgamation/xgboost-all0.cc
        $(CXX) -c $(CFLAGS) -c $< -o $@

# Equivalent to lib/libxgboost_all.so
lib/libxgboost_all.so: $(AMALGA_OBJ) $(LIB_DEP)
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) -shared -o $@ $(filter %.o %.a, $^) $(LDFLAGS)

lib/libxgboost.a: $(ALL_DEP)
        @mkdir -p $(@D)
        ar crv $@ $(filter %.o, $?)

lib/libxgboost.dll lib/libxgboost.so: $(ALL_DEP)
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) -shared -o $@ $(filter %.o %a,  $^) $(LDFLAGS)

jvm-packages/lib/libxgboost4j.so: jvm-packages/xgboost4j/src/native/xgboost4j.cpp $(ALL_DEP)
        @mkdir -p $(@D)
        $(CXX) $(CFLAGS) $(JAVAINCFLAGS) -shared -o $@ $(filter %.cpp %.o %.a, $^) $(LDFLAGS)

xgboost: $(CLI_OBJ) $(ALL_DEP)
        $(CXX) $(CFLAGS) -o $@  $(filter %.o %.a, $^)  $(LDFLAGS)

rcpplint:
        python2 dmlc-core/scripts/lint.py xgboost ${LINT_LANG} R-package/src

lint: rcpplint
        python2 dmlc-core/scripts/lint.py xgboost ${LINT_LANG} include src plugin

clean:
        $(RM) -rf build build_plugin lib bin *~ */*~ */*/*~ */*/*/*~ */*.o */*/*.o */*/*/*.o xgboost

clean_all: clean
        cd $(DMLC_CORE); make clean; cd $(ROODIR)
        cd $(RABIT); make clean; cd $(ROODIR)

doxygen:
        doxygen doc/Doxyfile

# create standalone python tar file.
pypack: ${XGBOOST_DYLIB}
pypack: ${XGBOOST_DYLIB}
        cp ${XGBOOST_DYLIB} python-package/xgboost
        cd python-package; tar cf xgboost.tar xgboost; cd ..

# Script to make a clean installable R package.
Rpack:
        make clean_all
        rm -rf xgboost xgboost*.tar.gz
        cp -r R-package xgboost
        rm -rf xgboost/src/*.o xgboost/src/*.so xgboost/src/*.dll
        rm -rf xgboost/src/*/*.o
        rm -rf xgboost/demo/*.model xgboost/demo/*.buffer xgboost/demo/*.txt
        rm -rf xgboost/demo/runall.R
        cp -r src xgboost/src/src
        cp -r include xgboost/src/include
        cp -r amalgamation xgboost/src/amalgamation
        mkdir -p xgboost/src/rabit
        cp -r rabit/include xgboost/src/rabit/include
        cp -r rabit/src xgboost/src/rabit/src
        rm -rf xgboost/src/rabit/src/*.o
        mkdir -p xgboost/src/dmlc-core
        cp -r dmlc-core/include xgboost/src/dmlc-core/include
        cp -r dmlc-core/src xgboost/src/dmlc-core/src
        cp ./LICENSE xgboost
        cat R-package/src/Makevars|sed '2s/.*/PKGROOT=./' | sed '3s/.*/ENABLE_STD_THREAD=0/' > xgboost/src/Makevars
        cp xgboost/src/Makevars xgboost/src/Makevars.win

Rbuild:
        make Rpack
        R CMD build --no-build-vignettes xgboost
        rm -rf xgboost

Rcheck:
        make Rbuild
        R CMD check  xgboost*.tar.gz

-include build/*.d
-include build/*/*.d
-include build_plugin/*/*.d

Thanks a lot.

user2725109
  • 2,286
  • 4
  • 27
  • 46
  • 1
    The `Makefile` looks broken. As you can see `ar crv lib/libxgboost.a` doesn't specify any object files to add to the library. – trojanfoe Mar 16 '16 at 16:19
  • Thanks for the comment. Can you give me some tips on how to proceed? I am not an advanced linux user ... – user2725109 Mar 16 '16 at 16:29
  • Run without `-j4` and see if it works? Many poorly written makefiles aren't parallel build safe. Also what on earth happened to that github link? Did you paste the wrong thing? – Etan Reisner Mar 16 '16 at 17:59
  • It doesn't work without `-j4` either. I put the error message above. Also corrected the github link, I think hyperlink doesn't work if I put `https`. – user2725109 Mar 16 '16 at 18:19
  • Can you show the full make output (after running `make clean` if running `make` at this point doesn't do much beyond show that error)? – Etan Reisner Mar 22 '16 at 12:33
  • The answer is here: http://stackoverflow.com/questions/36038836/install-xgboost-on-mac-ld-library-not-found – user2725109 Apr 07 '16 at 23:16

2 Answers2

1
brew install clang-omp
export CC=clang-omp
export CXX=clang-omp++
cd python-package
sudo python setup.py install
pip install xgboost
user2725109
  • 2,286
  • 4
  • 27
  • 46
0

i successfully installed it on my linux machine, there is nothing wrong with the make file, my ar version is 2.24, so you got it right, your binutils is very old, to update it go to https://www.gnu.org/software/binutils/ download the 2.24 version.
extract and change the directory:

./configure 
make
sudo make install
Baroudi Safwen
  • 803
  • 6
  • 17
  • Hi, I am trying to install on OS X, not linux. I installed binutils using the link you sent, but still receive an error when I try run `make`. Also although I installed binutils, I think the `ar` version hasn't changed (shows the same version/date as above) – user2725109 Apr 07 '16 at 22:54