PROJECT(libjs)

INCLUDE(CheckSymbolExists)

# Check for va_copy() and __va_copy()
CHECK_SYMBOL_EXISTS(va_copy stdarg.h STD_VA_COPY)
CHECK_SYMBOL_EXISTS(__va_copy stdarg.h OLD_VA_COPY)
IF(STD_VA_COPY)
	ADD_DEFINITIONS(-DHAVE_VA_COPY -DVA_COPY=va_copy)
ELSEIF(OLD_VA_COPY)
	ADD_DEFINITIONS(-DHAVE_VA_COPY -DVA_COPY=__va_copy)
ENDIF(STD_VA_COPY)


INCLUDE_DIRECTORIES("${libjs_BINARY_DIR}" "${libjs_SOURCE_DIR}")

ADD_SUBDIRECTORY(fdlibm)
ADD_SUBDIRECTORY(nspr_impl)


IF(APPLE)
	ADD_CUSTOM_COMMAND(
		OUTPUT "${libjs_BINARY_DIR}/jsautocfg.h"
		COMMAND ${CMAKE_COMMAND} -E copy
		"${libjs_SOURCE_DIR}/osx/jsautocfg.h" "${libjs_BINARY_DIR}/jsautocfg.h"
		DEPENDS "${libjs_SOURCE_DIR}/osx/jsautocfg.h"
	)
ELSE(APPLE)
	ADD_EXECUTABLE(jscpucfg jscpucfg.c)
	GET_TARGET_PROPERTY(jscpucfg_exe jscpucfg LOCATION)
	ADD_CUSTOM_COMMAND(
		OUTPUT "${libjs_BINARY_DIR}/jsautocfg.h"
		COMMAND "${jscpucfg_exe}" > "${libjs_BINARY_DIR}/jsautocfg.h"
		DEPENDS jscpucfg
	)	
ENDIF(APPLE)

SET_SOURCE_FILES_PROPERTIES(
	"${libjs_BINARY_DIR}/jsautocfg.h" PROPERTIES
	GENERATED TRUE
	HEADER_FILE_ONLY TRUE
)

ADD_EXECUTABLE(jskwgen jskwgen.c)
GET_TARGET_PROPERTY(jskwgen_exe jskwgen LOCATION)
ADD_CUSTOM_COMMAND(
	OUTPUT "${libjs_BINARY_DIR}/jsautokw.h"
	COMMAND "${jskwgen_exe}" > "${libjs_BINARY_DIR}/jsautokw.h"
	DEPENDS jskwgen
)
SET_SOURCE_FILES_PROPERTIES(
	"${libjs_BINARY_DIR}/jskwgen.h" PROPERTIES
	GENERATED TRUE
	HEADER_FILE_ONLY TRUE
)


IF(MSVC)
	# There is a problem with jsinterp.c where two identical functions get folded
	# into one, causing problems when comparing pointers to these functions.
	# Mozilla solves it by disabling COMDAT folding (/OPT:NOICF), while we use
	# /Gy- if its available, and /Od if its not.
	IF(MSVC71)
		SET_SOURCE_FILES_PROPERTIES(jsinterp.c PROPERTIES COMPILE_FLAGS "/Od")
	ELSE(MSVC71) # assuming a later version
		SET_SOURCE_FILES_PROPERTIES(jsinterp.c PROPERTIES COMPILE_FLAGS "/Gy-")
	ENDIF(MSVC71)
ENDIF(MSVC)

ADD_DEFINITIONS(-DEXPORT_JS_API -DJS_VERSION=150)
INCLUDE_DIRECTORIES(${libjs_BINARY_DIR} fdlibm nspr_impl)

SET(
	generic_sources
	jsapi.c jsapi.h jsarena.c jsarena.h jsarray.c jsarray.h jsatom.c jsatom.h
	jsbool.c jsbool.h jscntxt.c jscntxt.h jsdate.c jsdate.h jsdbgapi.c jsdbgapi.h
	jsdhash.c jsdhash.h jsdtoa.c jsdtoa.h jsemit.c jsemit.h jsexn.c jsexn.h
	jsfun.c jsfun.h jsgc.c jsgc.h jshash.c jshash.h jsinterp.c jsinterp.h
	jslock.c jslock.h jslog2.c jslong.c jslong.h jsmath.c jsmath.h
	jsiter.c jsiter.h jsnum.c jsnum.h jsobj.c jsobj.h jsopcode.c jsopcode.h
	jsparse.c jsparse.h jsprf.c jsprf.h jsregexp.c jsregexp.h
	jsscan.c jsscan.h jsscope.c jsscope.h jsscript.c jsscript.h
	jsstr.c jsstr.h jsutil.c jsutil.h jsxdrapi.c jsxdrapi.h
	prmjtime.c prmjtime.h jsbit.h jsclist.h jscompat.h
	jsconfig.h jslibmath.h jsosdep.h jsotypes.h jsprvtd.h jspubtd.h
	jsstddef.h jstypes.h
)

SET(
	generated_sources
	"${libjs_BINARY_DIR}/jsautocfg.h" "${libjs_BINARY_DIR}/jsautokw.h"
)

SOURCE_GROUP("Generic Sources" FILES ${generic_sources})
SOURCE_GROUP("Generated Sources" FILES ${generated_sources})

ADD_LIBRARY(js STATIC ${generic_sources} ${generated_sources})

ADD_SUBDIRECTORY(environment)
