Skip to content

Commit 30ed4ad

Browse files
committed
Merge branch 'master' of https://github.com/mm2/Little-CMS
2 parents e04b023 + 028f08e commit 30ed4ad

10 files changed

Lines changed: 787 additions & 0 deletions

CMakeLists.txt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
cmake_minimum_required(VERSION 3.5)
2+
3+
project(lcms2
4+
VERSION 2.18
5+
LANGUAGES C
6+
)
7+
8+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
9+
10+
include(Lcms2Options)
11+
include(Lcms2Features)
12+
include(Lcms2Library)
13+
include(Lcms2Tools)
14+
include(Lcms2Plugins)
15+
include(Lcms2Tests)
16+
include(Lcms2Packaging)
17+
18+
lcms2_setup_options()
19+
lcms2_detect_features()
20+
21+
if(LCMS2_BUILD_TESTS)
22+
enable_testing()
23+
endif()
24+
25+
lcms2_add_library()
26+
27+
if(LCMS2_BUILD_TOOLS)
28+
lcms2_add_tools()
29+
endif()
30+
31+
lcms2_add_plugins()
32+
33+
if(LCMS2_BUILD_TESTS)
34+
lcms2_add_tests()
35+
endif()
36+
37+
lcms2_setup_packaging()
38+
39+

cmake/Lcms2Features.cmake

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
include(CheckCCompilerFlag)
2+
include(CheckCSourceCompiles)
3+
include(CheckFunctionExists)
4+
include(TestBigEndian)
5+
6+
function(lcms2_detect_features)
7+
# Endianness
8+
test_big_endian(LCMS2_WORDS_BIGENDIAN)
9+
if(LCMS2_WORDS_BIGENDIAN)
10+
set(LCMS2_DEFINE_WORDS_BIGENDIAN 1 PARENT_SCOPE)
11+
else()
12+
set(LCMS2_DEFINE_WORDS_BIGENDIAN 0 PARENT_SCOPE)
13+
endif()
14+
15+
# gmtime_r / gmtime_s
16+
set(CMAKE_REQUIRED_DEFINITIONS "")
17+
set(CMAKE_REQUIRED_LIBRARIES "")
18+
19+
check_function_exists(gmtime_r LCMS2_HAVE_GMTIME_R)
20+
21+
set(_gmtime_s_src "
22+
#include <time.h>
23+
int main(void) {
24+
time_t t = (time_t)0;
25+
struct tm m;
26+
(void)gmtime_s(&m, &t);
27+
return 0;
28+
}
29+
")
30+
check_c_source_compiles("${_gmtime_s_src}" LCMS2_HAVE_GMTIME_S)
31+
32+
set(LCMS2_DEFINE_HAVE_GMTIME_R ${LCMS2_HAVE_GMTIME_R} PARENT_SCOPE)
33+
set(LCMS2_DEFINE_HAVE_GMTIME_S ${LCMS2_HAVE_GMTIME_S} PARENT_SCOPE)
34+
35+
# Visibility attribute support (GCC/Clang).
36+
set(_vis_src "
37+
__attribute__((visibility(\"default\"))) int foo(void) { return 0; }
38+
int main(void) { return foo(); }
39+
")
40+
check_c_source_compiles("${_vis_src}" LCMS2_HAVE_FUNC_ATTRIBUTE_VISIBILITY)
41+
set(LCMS2_DEFINE_HAVE_FUNC_ATTRIBUTE_VISIBILITY ${LCMS2_HAVE_FUNC_ATTRIBUTE_VISIBILITY} PARENT_SCOPE)
42+
43+
# -fvisibility=hidden support (non-Windows, GCC/Clang).
44+
check_c_compiler_flag("-fvisibility=hidden" LCMS2_HAVE_FLAG_FVISIBILITY_HIDDEN)
45+
set(LCMS2_USE_FLAG_FVISIBILITY_HIDDEN ${LCMS2_HAVE_FLAG_FVISIBILITY_HIDDEN} PARENT_SCOPE)
46+
47+
# SSE2 intrinsics
48+
set(_sse2_src "
49+
#include <emmintrin.h>
50+
int main(void) {
51+
__m128i n = _mm_set1_epi8(42);
52+
(void)n;
53+
return 0;
54+
}
55+
")
56+
check_c_source_compiles("${_sse2_src}" LCMS2_COMPILER_SUPPORTS_SSE2)
57+
if(LCMS2_COMPILER_SUPPORTS_SSE2)
58+
set(LCMS2_DEFINE_CMS_DONT_USE_SSE2 0 PARENT_SCOPE)
59+
else()
60+
set(LCMS2_DEFINE_CMS_DONT_USE_SSE2 1 PARENT_SCOPE)
61+
endif()
62+
63+
# libm detection (for Linux and similar platforms).
64+
find_library(LCMS2_MATH_LIB m)
65+
if(LCMS2_MATH_LIB)
66+
set(LCMS2_LINK_LIBM 1 PARENT_SCOPE)
67+
else()
68+
set(LCMS2_LINK_LIBM 0 PARENT_SCOPE)
69+
endif()
70+
endfunction()
71+
72+

cmake/Lcms2Library.cmake

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
include(GNUInstallDirs)
2+
3+
function(_lcms2_collect_sources out_var)
4+
set(_src
5+
"${PROJECT_SOURCE_DIR}/src/cmsalpha.c"
6+
"${PROJECT_SOURCE_DIR}/src/cmscam02.c"
7+
"${PROJECT_SOURCE_DIR}/src/cmscgats.c"
8+
"${PROJECT_SOURCE_DIR}/src/cmscnvrt.c"
9+
"${PROJECT_SOURCE_DIR}/src/cmserr.c"
10+
"${PROJECT_SOURCE_DIR}/src/cmsgamma.c"
11+
"${PROJECT_SOURCE_DIR}/src/cmsgmt.c"
12+
"${PROJECT_SOURCE_DIR}/src/cmsintrp.c"
13+
"${PROJECT_SOURCE_DIR}/src/cmsio0.c"
14+
"${PROJECT_SOURCE_DIR}/src/cmsio1.c"
15+
"${PROJECT_SOURCE_DIR}/src/cmslut.c"
16+
"${PROJECT_SOURCE_DIR}/src/cmsplugin.c"
17+
"${PROJECT_SOURCE_DIR}/src/cmssm.c"
18+
"${PROJECT_SOURCE_DIR}/src/cmsmd5.c"
19+
"${PROJECT_SOURCE_DIR}/src/cmsmtrx.c"
20+
"${PROJECT_SOURCE_DIR}/src/cmspack.c"
21+
"${PROJECT_SOURCE_DIR}/src/cmspcs.c"
22+
"${PROJECT_SOURCE_DIR}/src/cmswtpnt.c"
23+
"${PROJECT_SOURCE_DIR}/src/cmsxform.c"
24+
"${PROJECT_SOURCE_DIR}/src/cmssamp.c"
25+
"${PROJECT_SOURCE_DIR}/src/cmsnamed.c"
26+
"${PROJECT_SOURCE_DIR}/src/cmsvirt.c"
27+
"${PROJECT_SOURCE_DIR}/src/cmstypes.c"
28+
"${PROJECT_SOURCE_DIR}/src/cmsps2.c"
29+
"${PROJECT_SOURCE_DIR}/src/cmsopt.c"
30+
"${PROJECT_SOURCE_DIR}/src/cmshalf.c"
31+
"${PROJECT_SOURCE_DIR}/src/lcms2_internal.h"
32+
)
33+
set(${out_var} "${_src}" PARENT_SCOPE)
34+
endfunction()
35+
36+
function(_lcms2_apply_common_settings tgt)
37+
target_include_directories(${tgt}
38+
PUBLIC
39+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
40+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
41+
)
42+
43+
# Feature defines derived from configure.ac parity.
44+
if(LCMS2_DEFINE_HAVE_GMTIME_R)
45+
target_compile_definitions(${tgt} PRIVATE HAVE_GMTIME_R=1)
46+
endif()
47+
if(LCMS2_DEFINE_HAVE_GMTIME_S)
48+
target_compile_definitions(${tgt} PRIVATE HAVE_GMTIME_S=1)
49+
endif()
50+
51+
if(LCMS2_DEFINE_WORDS_BIGENDIAN)
52+
target_compile_definitions(${tgt} PRIVATE WORDS_BIGENDIAN=1)
53+
endif()
54+
55+
if(LCMS2_DEFINE_CMS_DONT_USE_SSE2)
56+
target_compile_definitions(${tgt} PRIVATE CMS_DONT_USE_SSE2=1)
57+
endif()
58+
59+
if(LCMS2_DEFINE_HAVE_FUNC_ATTRIBUTE_VISIBILITY)
60+
target_compile_definitions(${tgt} PRIVATE HAVE_FUNC_ATTRIBUTE_VISIBILITY=1)
61+
endif()
62+
63+
if(LCMS2_USE_FLAG_FVISIBILITY_HIDDEN AND NOT WIN32)
64+
target_compile_options(${tgt} PRIVATE "-fvisibility=hidden")
65+
endif()
66+
67+
# libm (primarily needed on Linux). Make it PUBLIC so dependents (tools)
68+
# also link it, matching autotools *_DEPLIBS behavior.
69+
find_library(_lcms2_math_lib m)
70+
if(_lcms2_math_lib)
71+
target_link_libraries(${tgt} PUBLIC "${_lcms2_math_lib}")
72+
endif()
73+
endfunction()
74+
75+
function(_lcms2_apply_thread_settings tgt)
76+
# Autotools defines HasTHREADS (0/1) on non-Windows only. On Windows, upstream
77+
# VC projects do not define HasTHREADS, leaving Win32 critical-section path.
78+
if(WIN32)
79+
return()
80+
endif()
81+
82+
if(NOT LCMS2_WITH_THREADS)
83+
target_compile_definitions(${tgt} PRIVATE HasTHREADS=0)
84+
return()
85+
endif()
86+
87+
find_package(Threads)
88+
if(Threads_FOUND)
89+
target_compile_definitions(${tgt} PRIVATE HasTHREADS=1)
90+
if(TARGET Threads::Threads)
91+
# PUBLIC so dependents also pick up pthread flags/libs when needed.
92+
target_link_libraries(${tgt} PUBLIC Threads::Threads)
93+
elseif(CMAKE_THREAD_LIBS_INIT)
94+
target_link_libraries(${tgt} PUBLIC "${CMAKE_THREAD_LIBS_INIT}")
95+
endif()
96+
else()
97+
target_compile_definitions(${tgt} PRIVATE HasTHREADS=0)
98+
endif()
99+
endfunction()
100+
101+
function(lcms2_add_library)
102+
_lcms2_collect_sources(_lcms2_sources)
103+
104+
set(_lcms2_shared_target "")
105+
set(_lcms2_static_target "")
106+
107+
if(LCMS2_BUILD_SHARED)
108+
add_library(lcms2 SHARED ${_lcms2_sources})
109+
set(_lcms2_shared_target lcms2)
110+
111+
if(WIN32)
112+
target_compile_definitions(lcms2 PRIVATE CMS_DLL_BUILD)
113+
target_compile_definitions(lcms2 INTERFACE CMS_DLL)
114+
endif()
115+
116+
set_target_properties(lcms2 PROPERTIES
117+
VERSION "${PROJECT_VERSION}.0"
118+
SOVERSION "2"
119+
)
120+
121+
_lcms2_apply_common_settings(lcms2)
122+
_lcms2_apply_thread_settings(lcms2)
123+
endif()
124+
125+
if(LCMS2_BUILD_STATIC)
126+
if(LCMS2_BUILD_SHARED AND WIN32)
127+
add_library(lcms2_static STATIC ${_lcms2_sources})
128+
set(_lcms2_static_target lcms2_static)
129+
set_target_properties(lcms2_static PROPERTIES OUTPUT_NAME "lcms2_static")
130+
else()
131+
if(LCMS2_BUILD_SHARED)
132+
add_library(lcms2_static STATIC ${_lcms2_sources})
133+
set(_lcms2_static_target lcms2_static)
134+
set_target_properties(lcms2_static PROPERTIES OUTPUT_NAME "lcms2")
135+
else()
136+
add_library(lcms2 STATIC ${_lcms2_sources})
137+
set(_lcms2_static_target lcms2)
138+
endif()
139+
endif()
140+
141+
set(_static_tgt "${_lcms2_static_target}")
142+
set_target_properties(${_static_tgt} PROPERTIES
143+
VERSION "${PROJECT_VERSION}.0"
144+
SOVERSION "2"
145+
)
146+
147+
_lcms2_apply_common_settings(${_static_tgt})
148+
_lcms2_apply_thread_settings(${_static_tgt})
149+
endif()
150+
151+
# Expose target names for other modules.
152+
if(_lcms2_shared_target)
153+
set(LCMS2_LIBRARY_TARGET "${_lcms2_shared_target}" PARENT_SCOPE)
154+
else()
155+
set(LCMS2_LIBRARY_TARGET "${_lcms2_static_target}" PARENT_SCOPE)
156+
endif()
157+
158+
if(_lcms2_static_target)
159+
set(LCMS2_STATIC_LIBRARY_TARGET "${_lcms2_static_target}" PARENT_SCOPE)
160+
endif()
161+
endfunction()
162+
163+

cmake/Lcms2Options.cmake

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
function(lcms2_setup_options)
2+
# Core build toggles (explicitly support building both shared and static).
3+
option(LCMS2_BUILD_SHARED "Build shared library" ON)
4+
option(LCMS2_BUILD_STATIC "Build static library" ON)
5+
6+
option(LCMS2_BUILD_TOOLS "Build command-line tools" ON)
7+
option(LCMS2_BUILD_TESTS "Build tests (testbed)" ON)
8+
9+
# Tool-specific toggles (only meaningful when LCMS2_BUILD_TOOLS=ON).
10+
option(LCMS2_BUILD_JPGICC "Build jpgicc tool (requires JPEG)" ON)
11+
option(LCMS2_BUILD_TIFICC "Build tificc tool (requires TIFF, optionally ZLIB)" ON)
12+
13+
# Dependency toggles (only consulted when the dependent tool is enabled).
14+
option(LCMS2_WITH_JPEG "Enable JPEG support for tools (find_package only when needed)" ON)
15+
option(LCMS2_WITH_TIFF "Enable TIFF support for tools (find_package only when needed)" ON)
16+
option(LCMS2_WITH_ZLIB "Enable ZLIB support for tools (find_package only when needed)" ON)
17+
18+
# Threads (POSIX pthreads on non-Windows).
19+
option(LCMS2_WITH_THREADS "Enable thread support where applicable" ON)
20+
21+
# Plugins (GPL).
22+
option(LCMS2_WITH_FASTFLOAT "Build and install fast_float plugin (GPL-3.0)" OFF)
23+
option(LCMS2_WITH_THREADED_PLUGIN "Build and install threaded plugin (GPL-3.0)" OFF)
24+
25+
# Default debug postfix for MSVC builds.
26+
if(MSVC AND NOT DEFINED CMAKE_DEBUG_POSTFIX)
27+
set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Debug postfix for binaries and libraries")
28+
endif()
29+
30+
if(NOT LCMS2_BUILD_SHARED AND NOT LCMS2_BUILD_STATIC)
31+
message(FATAL_ERROR "At least one of LCMS2_BUILD_SHARED or LCMS2_BUILD_STATIC must be ON")
32+
endif()
33+
endfunction()
34+
35+

0 commit comments

Comments
 (0)