From: Michael Schroeder Date: Wed, 20 May 2015 13:05:05 +0000 (+0200) Subject: Fix linker checks X-Git-Tag: 0.6.11~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1eb60cf95fbe284f8a82bd82973df7042d457d28;p=thirdparty%2Flibsolv.git Fix linker checks --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b43fd3d..53721d32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -206,16 +206,21 @@ CHECK_FUNCTION_EXISTS (fopencookie HAVE_FOPENCOOKIE) CHECK_FUNCTION_EXISTS (funopen HAVE_FUNOPEN) TEST_BIG_ENDIAN (WORDS_BIGENDIAN) +IF (${CMAKE_MAJOR_VERSION} GREATER 2) INCLUDE (CMakePushCheckState) INCLUDE (CheckCCompilerFlag) MACRO (check_linker_flag FLAG VAR) - cmake_push_check_state(RESET) - set(CMAKE_REQUIRED_FLAGS "${FLAG}") - check_c_compiler_flag("" "${VAR}") - cmake_pop_check_state() + CMAKE_PUSH_CHECK_STATE (RESET) + SET (CMAKE_REQUIRED_FLAGS "${FLAG}") + CHECK_C_COMPILER_FLAG ("" "${VAR}") + CMAKE_POP_CHECK_STATE () ENDMACRO (check_linker_flag) -check_linker_flag("-Wl,--as-needed" HAS_LINKER_AS_NEEDED) -check_linker_flag("-Wl,--version-script=${CMAKE_SOURCE_DIR}/src/libsolv.ver" HAS_LINKER_VERSION_SCRIPT) +check_linker_flag("-Wl,--as-needed" HAVE_LINKER_AS_NEEDED) +check_linker_flag("-Wl,--version-script=${CMAKE_SOURCE_DIR}/src/libsolv.ver" HAVE_LINKER_VERSION_SCRIPT) +ELSE (${CMAKE_MAJOR_VERSION} GREATER 2) +SET (HAVE_LINKER_AS_NEEDED 1) +SET (HAVE_LINKER_VERSION_SCRIPT 1) +ENDIF (${CMAKE_MAJOR_VERSION} GREATER 2) # should create config.h with #cmakedefine instead... FOREACH (VAR HAVE_STRCHRNUL HAVE_FOPENCOOKIE HAVE_FUNOPEN WORDS_BIGENDIAN @@ -318,9 +323,9 @@ ENDIF (ENABLE_RPMDB) IF (ENABLE_HAIKU) SET (SYSTEM_LIBRARIES ${HAIKU_SYSTEM_LIBRARIES} ${SYSTEM_LIBRARIES}) ENDIF (ENABLE_HAIKU) -IF (HAS_LINKER_AS_NEEDED) +IF (HAVE_LINKER_AS_NEEDED) SET (SYSTEM_LIBRARIES "-Wl,--as-needed" ${SYSTEM_LIBRARIES}) -ENDIF (HAS_LINKER_AS_NEEDED) +ENDIF (HAVE_LINKER_AS_NEEDED) ADD_SUBDIRECTORY (src) ADD_SUBDIRECTORY (ext) diff --git a/src/cplxdeps.c b/src/cplxdeps.c index 8dac0d4b..1be68688 100644 --- a/src/cplxdeps.c +++ b/src/cplxdeps.c @@ -158,11 +158,11 @@ normalize_dep(Pool *pool, Id dep, Queue *bq, int flags) r = normalize_dep(pool, rd->name, bq, flags); if (r == 0) { - if (rdflags == REL_AND) + if (rdflags == REL_AND && (flags & CPLXDEPS_DONTFIX) == 0) return 0; if (rdflags == REL_COND) { - r = normalize_dep(pool, rd->evr, bq, flags ^ CPLXDEPS_TODNF); + r = normalize_dep(pool, rd->evr, bq, (flags ^ CPLXDEPS_TODNF) & ~CPLXDEPS_DONTFIX); if (r == 0 || r == 1) return r == 0 ? 1 : 0; invert_depblocks(pool, bq, bqcnt); /* invert block for COND */ @@ -180,11 +180,13 @@ normalize_dep(Pool *pool, Id dep, Queue *bq, int flags) /* get blocks of second argument */ bqcnt2 = bq->count; /* COND is OR with NEG on evr block, so we invert the todnf flag in that case */ - r = normalize_dep(pool, rd->evr, bq, rdflags == REL_COND ? (flags ^ CPLXDEPS_TODNF) : flags); + r = normalize_dep(pool, rd->evr, bq, rdflags == REL_COND ? ((flags ^ CPLXDEPS_TODNF) & ~CPLXDEPS_DONTFIX) : flags); if (r == 0) { if (rdflags == REL_OR) return -1; + if (rdflags == REL_AND && (flags & CPLXDEPS_DONTFIX) != 0) + return -1; queue_truncate(bq, bqcnt); return rdflags == REL_COND ? 1 : 0; } diff --git a/src/cplxdeps.h b/src/cplxdeps.h index 38b668a7..b5533054 100644 --- a/src/cplxdeps.h +++ b/src/cplxdeps.h @@ -28,10 +28,11 @@ pool_is_complex_dep(Pool *pool, Id dep) extern int pool_normalize_complex_dep(Pool *pool, Id dep, Queue *bq, int flags); -#define CPLXDEPS_TODNF (1 << 0) -#define CPLXDEPS_EXPAND (1 << 1) -#define CPLXDEPS_INVERT (1 << 2) -#define CPLXDEPS_NAME (1 << 3) +#define CPLXDEPS_TODNF (1 << 0) +#define CPLXDEPS_EXPAND (1 << 1) +#define CPLXDEPS_INVERT (1 << 2) +#define CPLXDEPS_NAME (1 << 3) +#define CPLXDEPS_DONTFIX (1 << 4) #endif diff --git a/src/rules.c b/src/rules.c index 1b256272..0888fb0d 100644 --- a/src/rules.c +++ b/src/rules.c @@ -498,13 +498,16 @@ add_complex_deprules(Solver *solv, Id p, Id dep, int type, int dontfix, Queue *w { Pool *pool = solv->pool; Repo *installed = solv->installed; - int i, j; + int i, j, flags; Queue bq; queue_init(&bq); - + flags = dontfix ? CPLXDEPS_DONTFIX : 0; /* CNF expansion for requires, DNF + INVERT expansion for conflicts */ - i = pool_normalize_complex_dep(pool, dep, &bq, type == SOLVER_RULE_PKG_REQUIRES ? 0 : (CPLXDEPS_TODNF | CPLXDEPS_EXPAND | CPLXDEPS_INVERT)); + if (type == SOLVER_RULE_PKG_CONFLICTS) + flags |= CPLXDEPS_TODNF | CPLXDEPS_EXPAND | CPLXDEPS_INVERT; + + i = pool_normalize_complex_dep(pool, dep, &bq, flags); /* handle special cases */ if (i == 0) {