Raised This Month: $32 Target: $400
 8% 

[Help] Compiling Extensions in Linux


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Chief149
Member
Join Date: Sep 2010
Old 05-31-2016 , 19:32   [Help] Compiling Extensions in Linux
Reply With Quote #1

Hey guys! So I plan on making my own extensions to help with plugin making. I am not a C++ expert, but I have enough experience under my belt to follow along.

I have successfully compiled a working .dll of the sample extension and have even made a tiny test extension which I successfully used in a local Windows hl2mp server. I used Visual Studio 2013 and the tutorials to accomplish this, and things are working out wonderfully!

The problem I am having now is with compiling for Linux since this extension will almost always be ran in a Linux environment. In this case I am using Cygwin. I know I installed the proper packages in order for this to be possible, but clearly I am doing something wrong here...

Here is my Makefile, it's the same as the original Makefile, but I plugged in my paths. I only added the orangebox and sourcemod sdk paths since I am not compiling a metamod extension nor am I compiling anything specific to a particular game.

Cloned the hl2sdk from:
https://github.com/alliedmodders/hl2sdk

The sourcemod sdk was cloned from:
https://github.com/alliedmodders/sourcemod

Btw I am compiling from my own directory. I copied the sample_ext project files into another directory. My plan was to simply get it to compile in Windows and Linux before adding on and making my own full extension from it.

Here is my Makefile:
Code:
# (C)2004-2010 SourceMod Development Team
# Makefile written by David "BAILOPAN" Anderson

###########################################
### EDIT THESE PATHS FOR YOUR OWN SETUP ###
###########################################

SMSDK = "/cygdrive/c/Users/Clayton/Google_Drive/Code_Libraries/alliedmods/sourcemod"
HL2SDK_ORIG = ../../../hl2sdk
HL2SDK_OB = "/cygdrive/c/Users/Clayton/Google_Drive/Code_Libraries/hl2sdk-ob"
HL2SDK_CSS = ../../../hl2sdk-css
HL2SDK_OB_VALVE = ../../../hl2sdk-ob-valve
HL2SDK_L4D = ../../../hl2sdk-l4d
HL2SDK_L4D2 = ../../../hl2sdk-l4d2
HL2SDK_CSGO = ../../../hl2sdk-csgo
MMSOURCE19 = ../../../mmsource-1.9

#####################################
### EDIT BELOW FOR OTHER PROJECTS ###
#####################################

PROJECT = BlueRPLib

#Uncomment for Metamod: Source enabled extension
USEMETA = false
ENGINE = "orangebox"

##############################################
### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ###
##############################################

C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -pipe -fno-strict-aliasing
C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3
C_GCC4_FLAGS = -fvisibility=hidden
CPP_GCC4_FLAGS = -fvisibility-inlines-hidden
CPP = g++
CPP_OSX = clang
OBJECTS = extension.cpp
##########################
### SDK CONFIGURATIONS ###
##########################

override ENGSET = false

# Check for valid list of engines
ifneq (,$(filter original orangebox orangeboxvalve css left4dead left4dead2 csgo,$(ENGINE)))
	override ENGSET = true
endif

ifeq "$(ENGINE)" "original"
	HL2SDK = $(HL2SDK_ORIG)
	CFLAGS += -DSOURCE_ENGINE=1
endif
ifeq "$(ENGINE)" "orangebox"
	HL2SDK = $(HL2SDK_OB)
	CFLAGS += -DSOURCE_ENGINE=3
endif
ifeq "$(ENGINE)" "css"
	HL2SDK = $(HL2SDK_CSS)
	CFLAGS += -DSOURCE_ENGINE=6
endif
ifeq "$(ENGINE)" "orangeboxvalve"
	HL2SDK = $(HL2SDK_OB_VALVE)
	CFLAGS += -DSOURCE_ENGINE=7
endif
ifeq "$(ENGINE)" "left4dead"
	HL2SDK = $(HL2SDK_L4D)
	CFLAGS += -DSOURCE_ENGINE=8
endif
ifeq "$(ENGINE)" "left4dead2"
	HL2SDK = $(HL2SDK_L4D2)
	CFLAGS += -DSOURCE_ENGINE=9
endif
ifeq "$(ENGINE)" "csgo"
	HL2SDK = $(HL2SDK_CSGO)
	CFLAGS += -DSOURCE_ENGINE=12
endif

HL2PUB = $(HL2SDK)/public

ifeq "$(ENGINE)" "original"
	INCLUDE += -I$(HL2SDK)/public/dlls
	METAMOD = $(MMSOURCE19)/core-legacy
else
	INCLUDE += -I$(HL2SDK)/public/game/server
	METAMOD = $(MMSOURCE19)/core
endif

OS := $(shell uname -s)

ifeq "$(OS)" "Darwin"
	LIB_EXT = dylib
	HL2LIB = $(HL2SDK)/lib/mac
else
	LIB_EXT = so
	ifeq "$(ENGINE)" "original"
		HL2LIB = $(HL2SDK)/linux_sdk
	else
		HL2LIB = $(HL2SDK)/lib/linux
	endif
endif

# if ENGINE is original or OB
ifneq (,$(filter original orangebox,$(ENGINE)))
	LIB_SUFFIX = _i486.$(LIB_EXT)
else
	LIB_PREFIX = lib
	LIB_SUFFIX = .$(LIB_EXT)
endif

#INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/sourcepawn/include
INCLUDE += -I$(SMSDK)/public -I$(SMSDK)/sourcepawn/include -I$(SMSDK)/extensions -I$(SMSDK)/sourcepawn

ifeq "$(USEMETA)" "true"
	LINK_HL2 = $(HL2LIB)/tier1_i486.a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) $(LIB_PREFIX)tier0$(LIB_SUFFIX)
	ifeq "$(ENGINE)" "csgo"
		LINK_HL2 += $(HL2LIB)/interfaces_i486.a
	endif

	LINK += $(LINK_HL2)

	INCLUDE += -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I$(METAMOD) \
		-I$(METAMOD)/sourcehook 
	CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_BLOODYGOODTIME=4 -DSE_EYE=5 \
		-DSE_CSS=6 -DSE_ORANGEBOXVALVE=7 -DSE_LEFT4DEAD=8 -DSE_LEFT4DEAD2=9 -DSE_ALIENSWARM=10 \
		-DSE_PORTAL2=11 -DSE_CSGO=12
endif

LINK += -m32 -lm -ldl

CFLAGS += -DPOSIX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \
	-D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -DCOMPILER_GCC -Wall -Werror \
	-Wno-overloaded-virtual -Wno-switch -Wno-unused -msse -DSOURCEMOD_BUILD -DHAVE_STDINT_H -m32
CPPFLAGS += -Wno-non-virtual-dtor -fno-exceptions -fno-rtti -std=c++11

################################################
### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ###
################################################

BINARY = $(PROJECT).ext.$(LIB_EXT)

ifeq "$(DEBUG)" "true"
	BIN_DIR = Debug
	CFLAGS += $(C_DEBUG_FLAGS)
else
	BIN_DIR = Release
	CFLAGS += $(C_OPT_FLAGS)
endif

ifeq "$(USEMETA)" "true"
	BIN_DIR := $(BIN_DIR).$(ENGINE)
endif

ifeq "$(OS)" "Darwin"
	CPP = $(CPP_OSX)
	LIB_EXT = dylib
	CFLAGS += -DOSX -D_OSX
	LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5
else
	LIB_EXT = so
	CFLAGS += -D_LINUX
	LINK += -shared
endif

IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0")

ifeq "$(IS_CLANG)" "1"
	CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/")
	CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/")
else
	CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1)
	CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3)
endif

# If not clang
ifeq "$(IS_CLANG)" "0"
	CFLAGS += -mfpmath=sse
endif

# Clang || GCC >= 4
ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1"
	CFLAGS += $(C_GCC4_FLAGS)
	CPPFLAGS += $(CPP_GCC4_FLAGS)
endif

# Clang >= 3 || GCC >= 4.7
ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1"
	CFLAGS += -Wno-delete-non-virtual-dtor
endif

# OS is Linux and not using clang
ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1"
	LINK += -static-libgcc
endif

OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o)

# This will break if we include other Makefiles, but is fine for now. It allows
#  us to make a copy of this file that uses altered paths (ie. Makefile.mine)
#  or other changes without mucking up the original.
MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))

$(BIN_DIR)/%.o: %.cpp
	$(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<

all: check
	mkdir -p $(BIN_DIR)
	ln -sf ../smsdk_ext.cpp
	if [ "$(USEMETA)" = "true" ]; then \
		ln -sf $(HL2LIB)/$(LIB_PREFIX)vstdlib$(LIB_SUFFIX); \
		ln -sf $(HL2LIB)/$(LIB_PREFIX)tier0$(LIB_SUFFIX); \
	fi
	$(MAKE) -f $(MAKEFILE_NAME) extension

check:
	if [ "$(USEMETA)" = "true" ] && [ "$(ENGSET)" = "false" ]; then \
		echo "You must supply one of the following values for ENGINE:"; \
		echo "csgo, left4dead2, left4dead, css, orangeboxvalve, orangebox, or original"; \
		exit 1; \
	fi

extension: check $(OBJ_BIN)
	$(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY)

debug:
	$(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true

default: all

clean: check
	rm -rf $(BIN_DIR)/*.o
	rm -rf $(BIN_DIR)/$(BINARY)
And when I am in the project directory in cygwin, I use the following:
make ENGINE=orangebox

Doing so gives me the following output:
Code:
expr: syntax error
if [ "false" = "true" ] && [ "false" = "false" ]; then \
        echo "You must supply one of the following values for ENGINE:"; \
        echo "csgo, left4dead2, left4dead, css, orangeboxvalve, orangebox, or original"; \
        exit 1; \
fi
mkdir -p Release
ln -sf ../smsdk_ext.cpp
if [ "false" = "true" ]; then \
        ln -sf /lib/linux/libvstdlib.so; \
        ln -sf /lib/linux/libtier0.so; \
fi
make -f /cygdrive/c/Users/Clayton/Google_Drive/Programming_Projects/BlueRPLib/Makefile extension
make[1]: Entering directory '/cygdrive/c/Users/Clayton/Google_Drive/Programming_Projects/BlueRPLib'
expr: syntax error
if [ "false" = "true" ] && [ "false" = "false" ]; then \
        echo "You must supply one of the following values for ENGINE:"; \
        echo "csgo, left4dead2, left4dead, css, orangeboxvalve, orangebox, or original"; \
        exit 1; \
fi
g++ -I/public/game/server -I"/cygdrive/c/Users/Clayton/Google_Drive/Code_Libraries/alliedmods/sourcemod"/public -I"/cygdrive/c/Users/Clayton/Google_Drive/Code_Libraries/alliedmods/sourcemod"/sourcepawn/include -I"/cygdrive/c/Users/Clayton/Google_Drive/Code_Libraries/alliedmods/sourcemod"/extensions -I"/cygdrive/c/Users/Clayton/Google_Drive/Code_Libraries/alliedmods/sourcemod"/sourcepawn -DPOSIX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -DCOMPILER_GCC -Wall -Werror -Wno-overloaded-virtual -Wno-switch -Wno-unused -msse -DSOURCEMOD_BUILD -DHAVE_STDINT_H -m32 -DNDEBUG -O3 -funroll-loops -pipe -fno-strict-aliasing -D_LINUX -mfpmath=sse -fvisibility=hidden -Wno-non-virtual-dtor -fno-exceptions -fno-rtti -std=c++11 -fvisibility-inlines-hidden -o Release/extension.o -c extension.cpp
In file included from extension.h:40:0,
                 from extension.cpp:32:
smsdk_ext.h:41:27: fatal error: IExtensionSys.h: No such file or directory
 #include <IExtensionSys.h>
                           ^
compilation terminated.
make[1]: *** [/cygdrive/c/Users/Clayton/Google_Drive/Programming_Projects/BlueRPLib/Makefile:204: Release/extension.o] Error 1
make[1]: Leaving directory '/cygdrive/c/Users/Clayton/Google_Drive/Programming_Projects/BlueRPLib'
make: *** [Makefile:210: all] Error 2
So I have edited this post a couple times. I have managed to think my way through some of the issues that have come up, but for some reason it still can't find certain files even though I have included the directories.

Also it still corrupts smsdk_ext.cpp for some reason. I keep Visual Studio open that way I can resave the correct file after each attempt at a linux compile.

Last edited by Chief149; 05-31-2016 at 23:05.
Chief149 is offline
psychonic

BAFFLED
Join Date: May 2008
Old 06-01-2016 , 10:13   Re: [Help] Compiling Extensions in Linux
Reply With Quote #2

Unless you have a specific cross compiler, just using cygwin on Windows will not produce binaries that will run on Linux.

Your best bet is to just use a VM with Linux to compile.

Last edited by psychonic; 06-01-2016 at 10:13.
psychonic is offline
Chief149
Member
Join Date: Sep 2010
Old 06-01-2016 , 18:19   Re: [Help] Compiling Extensions in Linux
Reply With Quote #3

Yeah. I began to learn that. I did manage to get the compiler to work, but then the issue ended up being things that were undefined that are already defined in the standard library. It was at that point that I decided to get VirtualBox running. I got back from work an hour ago and my virtual Ubuntu environment is almost ready. At least everything else is pretty much prepared and set up.
Chief149 is offline
Chief149
Member
Join Date: Sep 2010
Old 06-05-2016 , 14:47   Re: [Help] Compiling Extensions in Linux
Reply With Quote #4

Btw all is working with no problems now using VirtualBox. I was just originally hard-set on using Cygwin because it's just lighter and less the fuss with. VirtualBox is easy to work with, but it's just annoying switching between operating systems.

Unfortunately I've now run into a totally different problem that might not even be fixable. I want to use AcceptEntityInput (and possibly other SdkTools functions) in my extension, but the only interface I found is ISDKTools.h and it doesn't seem to expose any of the big sdktools functions sadly Idk if there's a way to make it work or not.
Chief149 is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 01:39.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode