emscripten-core / emscripten-core/emscripten

find_package not works in emcmake

Open
#13,310 12 comments 4 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
27.6k
Forks
3.6k
Avg merge
1d 1h
Merged PRs (30d)
105

Description

I am using Cmake for build large project and want to migrate to WebAssembly and the project have some dependencies. When I build the project using my CMakeLists.txt, I just got some errors of `find_package`

```sh
-- Could NOT find PIXMAN, try to set the path to PIXMAN root folder in the system variable PIXMAN (missing: PIXMAN_LIBRARIES PIXMAN_INCLUDE_DIRS)
-- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
CMake Error at /usr/local/Cellar/cmake/3.19.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/local/Cellar/cmake/3.19.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:582 (_FPHSA_FAILURE_MESSAGE)
/usr/local/Cellar/cmake/3.19.2/share/cmake/Modules/FindPNG.cmake:156 (find_package_handle_standard_args)
external/cairo/CMakeLists.txt:7 (find_package)
```

Here is the `cairo` CMakeLists.txt
```CMake
project(cairo)
cmake_minimum_required(VERSION 2.9)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

find_package(Pixman REQUIRED)
find_package(PNG REQUIRED)
find_package(ZLIB REQUIRED)
find_package(Freetype)
find_package(Threads)
find_package(Fontconfig)

include(Configure_config.cmake)
include(Configure_features.cmake)
include_directories(${CMAKE_BINARY_DIR})

if(CAIRO_HAS_PTHREAD)
list(APPEND CAIRO_LIBS -lpthread)
endif()

if (WIN32)
set(CAIRO_LIBS gdi32 msimg32 user32 winmm)
endif()

include_directories(${PIXMAN_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
list(APPEND CAIRO_LIBS ${PIXMAN_LIBRARY} ${PNG_LIBRARY} ${ZLIB_LIBRARY})

if(FONTCONFIG_FOUND)
list(APPEND CAIRO_LIBS ${FONTCONFIG_LIBRARY})
endif()

if(FREETYPE_FOUND)
find_package(BZip2)
include_directories(${FREETYPE_INCLUDE_DIRS})
include_directories(${BZIP2_INCLUDE_DIR})
list(APPEND CAIRO_LIBS ${FREETYPE_LIBRARIES} ${BZIP2_LIBRARIES})
endif()

include_directories(src)
add_subdirectory(src)

cmake_policy (SET CMP0072 NEW)
```

And some cmake file like `FindPixman` is
```CMake
# - Try to find PIXMAN
# Once done this will define
#
# PIXMAN_ROOT_DIR - Set this variable to the root installation of PIXMAN
# PIXMAN_FOUND - system has PIXMAN
# PIXMAN_INCLUDE_DIRS - the PIXMAN include directory
# PIXMAN_LIBRARIES - Link these to use PIXMAN
#
# Copyright (c) 2008 Joshua L. Blocher
# Copyright (c) 2011 Ralf Habacker,
# Copyright (c) 2012 Dmitry Baryshnikov
# Copyright (c) 2015 Mikhail Paulyshka
#
# Distributed under the OSI-approved BSD License
#
if (NOT WIN32)
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
pkg_check_modules(_PIXMAN pixman)
SET(PIXMAN_VERSION ${_PIXMAN_VERSION})
endif (PKG_CONFIG_FOUND)
endif (NOT WIN32)

SET(_PIXMAN_ROOT_HINTS
$ENV{PIXMAN}
${CMAKE_FIND_ROOT_PATH}
${PIXMAN_ROOT_DIR}
)

SET(_PIXMAN_ROOT_PATHS
$ENV{PIXMAN}/src
/usr
/usr/local
)

SET(_PIXMAN_ROOT_HINTS_AND_PATHS
HINTS ${_PIXMAN_ROOT_HINTS}
PATHS ${_PIXMAN_ROOT_PATHS}
)

FIND_PATH(PIXMAN_INCLUDE_DIR
NAMES
"pixman.h"
HINTS
${_PIXMAN_INCLUDEDIR}
${_PIXMAN_ROOT_HINTS_AND_PATHS}
PATH_SUFFIXES
include
"include/pixman-1"
)

FIND_LIBRARY(PIXMAN_LIBRARY
NAMES
pixman-1
pixman-1d
pixman-1_static
pixman-1_staticd
HINTS
${_PIXMAN_LIBDIR}
${_PIXMAN_ROOT_HINTS_AND_PATHS}
PATH_SUFFIXES
"lib"
"local/lib"
)

SET(PIXMAN_LIBRARIES
${PIXMAN_LIBRARY}
)

SET(PIXMAN_INCLUDE_DIRS
${PIXMAN_INCLUDE_DIR}
)

if (NOT PIXMAN_VERSION)
if (EXISTS "${PIXMAN_INCLUDE_DIRS}/pixman-version.h")
file(READ "${PIXMAN_INCLUDE_DIRS}/pixman-version.h" PIXMAN_VERSION_CONTENT)

string(REGEX MATCH "#define +PIXMAN_VERSION_MAJOR +([0-9]+)" _dummy "${PIXMAN_VERSION_CONTENT}")
set(PIXMAN_VERSION_MAJOR "${CMAKE_MATCH_1}")

string(REGEX MATCH "#define +PIXMAN_VERSION_MINOR +([0-9]+)" _dummy "${PIXMAN_VERSION_CONTENT}")
set(PIXMAN_VERSION_MINOR "${CMAKE_MATCH_1}")

string(REGEX MATCH "#define +PIXMAN_VERSION_MICRO +([0-9]+)" _dummy "${PIXMAN_VERSION_CONTENT}")
set(PIXMAN_VERSION_MICRO "${CMAKE_MATCH_1}")

set(PIXMAN_VERSION "${PIXMAN_VERSION_MAJOR}.${PIXMAN_VERSION_MINOR}.${PIXMAN_VERSION_MICRO}")
endif (EXISTS "${PIXMAN_INCLUDE_DIRS}/pixman-version.h")
endif(NOT PIXMAN_VERSION)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PIXMAN
REQUIRED_VARS PIXMAN_LIBRARIES PIXMAN_INCLUDE_DIRS
VERSION_VAR PIXMAN_VERSION
FAIL_MESSAGE "Could NOT find PIXMAN, try to set the path to PIXMAN root folder in the system variable PIXMAN"
)

MARK_AS_ADVANCED(PIXMAN_CONFIG_INCLUDE_DIR PIXMAN_INCLUDE_DIR PIXMAN_INCLUDE_DIRS PIXMAN_LIBRARY PIXMAN_LIBRARIES)

```
**But It works when I just used cmake to build.**

What's the solution for that?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.