CMakeLists.txt
author Ryan C. Gordon <icculus@icculus.org>
Wed, 18 Apr 2012 00:19:32 -0400
changeset 1095 bc3d2c6e06cf
parent 1036 8a3597b44ff7
child 1134 be31bd0ee0a2
permissions -rw-r--r--
glsl: Implemented most of the missing srcmods. Reread the GLSL spec, and it turns out that "vec3(x,y,z) - 3.0" is legal syntactic sugar: the compiler knows to subtract 3.0 from each of the three components in that vec3. This made this simpler than having to tapdance to generate correct constant vectors ourselves, and it's easier to read.

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(MojoShader)

INCLUDE_DIRECTORIES(.)

FIND_PROGRAM(HG hg DOC "Path to hg command line app: http://www.selenic.com/mercurial/")
IF(NOT HG)
    MESSAGE(STATUS "Mercurial (hg) not found. You can go on, but version info will be wrong.")
    SET(MOJOSHADER_VERSION -1)
    SET(MOJOSHADER_CHANGESET "???")
ELSE(NOT HG)
    MARK_AS_ADVANCED(HG)
    EXECUTE_PROCESS(
        COMMAND hg tip --template {rev}
        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
        RESULT_VARIABLE HGVERSION_RC
        OUTPUT_VARIABLE MOJOSHADER_VERSION
        ERROR_QUIET
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    EXECUTE_PROCESS(
        COMMAND hg tip --template hg-{rev}:{node|short}
        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
        RESULT_VARIABLE HGVERSION_RC
        OUTPUT_VARIABLE MOJOSHADER_CHANGESET
        ERROR_QUIET
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
ENDIF(NOT HG)

WRITE_FILE(
    "${CMAKE_CURRENT_SOURCE_DIR}/mojoshader_version.h"
    "/* This file was autogenerated. Do not edit! */\n"
    "#ifndef _INCL_MOJOSHADER_VERSION_H_\n"
    "#define _INCL_MOJOSHADER_VERSION_H_\n"
    "#define MOJOSHADER_VERSION ${MOJOSHADER_VERSION}\n"
    "#define MOJOSHADER_CHANGESET \"${MOJOSHADER_CHANGESET}\"\n"
    "#endif\n"
)

IF(CMAKE_COMPILER_IS_GNUCC)
    ADD_DEFINITIONS(-Wall -ggdb3)
ENDIF(CMAKE_COMPILER_IS_GNUCC)

# testparse uses this when I'm looking at memory usage patterns.
#ADD_DEFINITIONS(-DMOJOSHADER_DEBUG_MALLOC=1)

IF(MSVC)
    ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS=1)
    ADD_DEFINITIONS(-TP)  # force .c files to compile as C++.
ENDIF(MSVC)

# We build lemon, then use it to generate parser C code.
ADD_EXECUTABLE(lemon "misc/lemon.c")
GET_TARGET_PROPERTY(LEMON lemon LOCATION)
ADD_CUSTOM_COMMAND(
    OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/mojoshader_parser_hlsl.h"
    MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/mojoshader_parser_hlsl.lemon"
    DEPENDS lemon "${CMAKE_CURRENT_SOURCE_DIR}/misc/lempar.c"
    COMMAND "${LEMON}"
    ARGS -q "-T${CMAKE_CURRENT_SOURCE_DIR}/misc/lempar.c" "${CMAKE_CURRENT_SOURCE_DIR}/mojoshader_parser_hlsl.lemon"
)

ADD_LIBRARY(mojoshader STATIC
    mojoshader.c
    mojoshader_common.c
    mojoshader_effects.c
    mojoshader_compiler.c
    mojoshader_preprocessor.c
    mojoshader_lexer.c
    mojoshader_assembler.c
    mojoshader_opengl.c
)

IF(UNIX)
    SET(LIBM -lm)
ENDIF(UNIX)

SET_SOURCE_FILES_PROPERTIES(
    mojoshader_compiler.c
    PROPERTIES OBJECT_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/mojoshader_parser_hlsl.h"
)

FIND_PROGRAM(RE2C re2c DOC "Path to re2c command line app: http://re2c.org/")
IF(NOT RE2C)
    MESSAGE(STATUS "re2c missing. You can go on, but can't rebuild the lexer.")
ELSE(NOT RE2C)
    MARK_AS_ADVANCED(RE2C)
    ADD_CUSTOM_COMMAND(
        OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/mojoshader_lexer.c"
        DEPENDS mojoshader_lexer.re
        COMMAND "${RE2C}"
        ARGS -is --no-generation-date -o "${CMAKE_CURRENT_SOURCE_DIR}/mojoshader_lexer.c" "${CMAKE_CURRENT_SOURCE_DIR}/mojoshader_lexer.re"
    )
ENDIF(NOT RE2C)

FIND_PACKAGE(SDL)
IF(SDL_FOUND)
    INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR})
    ADD_EXECUTABLE(glcaps utils/glcaps.c)
    TARGET_LINK_LIBRARIES(glcaps ${SDL_LIBRARY} ${LIBM})
    ADD_EXECUTABLE(bestprofile utils/bestprofile.c)
    TARGET_LINK_LIBRARIES(bestprofile mojoshader ${SDL_LIBRARY} ${LIBM})
    ADD_EXECUTABLE(availableprofiles utils/availableprofiles.c)
    TARGET_LINK_LIBRARIES(availableprofiles mojoshader ${SDL_LIBRARY} ${LIBM})
ENDIF(SDL_FOUND)

ADD_EXECUTABLE(finderrors utils/finderrors.c)
TARGET_LINK_LIBRARIES(finderrors mojoshader ${SDL_LIBRARY} ${LIBM})
IF(SDL_FOUND)
    SET_SOURCE_FILES_PROPERTIES(
        utils/finderrors.c
        PROPERTIES COMPILE_FLAGS "-DFINDERRORS_COMPILE_SHADERS=1"
    )
ENDIF(SDL_FOUND)

ADD_EXECUTABLE(testparse utils/testparse.c)
TARGET_LINK_LIBRARIES(testparse mojoshader ${LIBM})
ADD_EXECUTABLE(testoutput utils/testoutput.c)
TARGET_LINK_LIBRARIES(testoutput mojoshader ${LIBM})
ADD_EXECUTABLE(mojoshader-compiler utils/mojoshader-compiler.c)
TARGET_LINK_LIBRARIES(mojoshader-compiler mojoshader ${LIBM})

# Unit tests...
ADD_CUSTOM_TARGET(
    test
    COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/unit_tests/run_tests.pl"
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
    DEPENDS mojoshader-compiler
    COMMENT "Running unit tests..."
    VERBATIM
)

# End of CMakeLists.txt ...